summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-22 03:01:48 +0000
committerNorbert Preining <norbert@preining.info>2020-07-22 03:01:48 +0000
commitd3e0375ca41ebad2625c6fedf57992a8db8cd0ac (patch)
treee9e945728ba1dd3a4f802253d34e2fabc56eef34
parentbd36712a3846fe8b17a13b5edfdcf10dc8787235 (diff)
CTAN sync 202007220301
-rw-r--r--FILES.byname1212
-rw-r--r--FILES.byname.gzbin2231219 -> 2231499 bytes
-rw-r--r--FILES.last07days895
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/alltt.pdfbin173077 -> 173079 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin220211 -> 220217 bytes
-rw-r--r--macros/latex-dev/base/changes.txt84
-rw-r--r--macros/latex-dev/base/classes.pdfbin520906 -> 520851 bytes
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin372505 -> 372555 bytes
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin264453 -> 264505 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin216976 -> 216997 bytes
-rw-r--r--macros/latex-dev/base/doc.dtx17
-rw-r--r--macros/latex-dev/base/doc.pdfbin629536 -> 631083 bytes
-rw-r--r--macros/latex-dev/base/docstrip.dtx180
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin470217 -> 479293 bytes
-rw-r--r--macros/latex-dev/base/encguide.pdfbin1532114 -> 1532144 bytes
-rw-r--r--macros/latex-dev/base/exscale.pdfbin195880 -> 195877 bytes
-rw-r--r--macros/latex-dev/base/fix-cm.pdfbin262051 -> 262059 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin361810 -> 417861 bytes
-rw-r--r--macros/latex-dev/base/fntguide.tex312
-rw-r--r--macros/latex-dev/base/format.ins2
-rw-r--r--macros/latex-dev/base/graphpap.pdfbin156280 -> 156277 bytes
-rw-r--r--macros/latex-dev/base/ifthen.pdfbin205205 -> 205213 bytes
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin294723 -> 294722 bytes
-rw-r--r--macros/latex-dev/base/latexchanges.pdfbin232380 -> 232390 bytes
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin246174 -> 246195 bytes
-rw-r--r--macros/latex-dev/base/latexsym.pdfbin192289 -> 192297 bytes
-rw-r--r--macros/latex-dev/base/lb2.pdfbin138223 -> 138219 bytes
-rw-r--r--macros/latex-dev/base/letter.pdfbin305750 -> 305975 bytes
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin101344 -> 101343 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin125828 -> 125830 bytes
-rw-r--r--macros/latex-dev/base/ltclass.dtx42
-rw-r--r--macros/latex-dev/base/ltdefns.dtx12
-rw-r--r--macros/latex-dev/base/ltexpl.dtx198
-rw-r--r--macros/latex-dev/base/ltfilehook-code.pdfbin0 -> 677281 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-code.tex10
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.pdfbin0 -> 512167 bytes
-rw-r--r--macros/latex-dev/base/ltfilehook-doc.tex12
-rw-r--r--macros/latex-dev/base/ltfilehook.dtx1161
-rw-r--r--macros/latex-dev/base/ltfiles.dtx68
-rw-r--r--macros/latex-dev/base/ltfinal.dtx251
-rw-r--r--macros/latex-dev/base/lthooks-code.pdfbin0 -> 914727 bytes
-rw-r--r--macros/latex-dev/base/lthooks-code.tex10
-rw-r--r--macros/latex-dev/base/lthooks-doc.pdfbin0 -> 588067 bytes
-rw-r--r--macros/latex-dev/base/lthooks-doc.tex12
-rw-r--r--macros/latex-dev/base/lthooks.dtx3925
-rw-r--r--macros/latex-dev/base/lthooks.ins76
-rw-r--r--macros/latex-dev/base/ltluatex.dtx19
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin304468 -> 304460 bytes
-rw-r--r--macros/latex-dev/base/ltmiscen.dtx29
-rw-r--r--macros/latex-dev/base/ltnews.cls4
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin972412 -> 980265 bytes
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin150020 -> 150020 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin134750 -> 134751 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin134730 -> 134742 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin128768 -> 128772 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin157174 -> 157181 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin133132 -> 133138 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin124028 -> 124029 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin144471 -> 144482 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin120208 -> 120222 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin147941 -> 147946 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin104942 -> 104936 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin137918 -> 137919 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin161066 -> 161065 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin150920 -> 150907 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin122088 -> 122092 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin130688 -> 130687 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin149835 -> 149838 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin36003 -> 36005 bytes
-rw-r--r--macros/latex-dev/base/ltnews19.pdfbin235068 -> 235073 bytes
-rw-r--r--macros/latex-dev/base/ltnews20.pdfbin283323 -> 283318 bytes
-rw-r--r--macros/latex-dev/base/ltnews21.pdfbin233491 -> 233492 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin302835 -> 302836 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin274453 -> 274459 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin252641 -> 252645 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin196325 -> 196326 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin362836 -> 362839 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin239755 -> 239758 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin368229 -> 368226 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin433006 -> 433004 bytes
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin491245 -> 491246 bytes
-rw-r--r--macros/latex-dev/base/ltnews31.pdfbin500199 -> 500191 bytes
-rw-r--r--macros/latex-dev/base/ltnews32.pdfbin476890 -> 519192 bytes
-rw-r--r--macros/latex-dev/base/ltnews32.tex160
-rw-r--r--macros/latex-dev/base/ltoutenc.dtx84
-rw-r--r--macros/latex-dev/base/ltshipout-code.pdfbin0 -> 723515 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-code.tex10
-rw-r--r--macros/latex-dev/base/ltshipout-doc.pdfbin0 -> 499777 bytes
-rw-r--r--macros/latex-dev/base/ltshipout-doc.tex12
-rw-r--r--macros/latex-dev/base/ltshipout.dtx1425
-rw-r--r--macros/latex-dev/base/ltvers.dtx2
-rw-r--r--macros/latex-dev/base/ltx3info.pdfbin191528 -> 191527 bytes
-rw-r--r--macros/latex-dev/base/ltxdoc.dtx13
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin215600 -> 215578 bytes
-rw-r--r--macros/latex-dev/base/makeindx.pdfbin160673 -> 160667 bytes
-rw-r--r--macros/latex-dev/base/manual.pdfbin151354 -> 151347 bytes
-rw-r--r--macros/latex-dev/base/modguide.pdfbin220384 -> 220388 bytes
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin202429 -> 202451 bytes
-rw-r--r--macros/latex-dev/base/proc.pdfbin216899 -> 216877 bytes
-rw-r--r--macros/latex-dev/base/slides.pdfbin351660 -> 351586 bytes
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin214708 -> 214710 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin3182847 -> 3220329 bytes
-rw-r--r--macros/latex-dev/base/source2e.tex4
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin181389 -> 181670 bytes
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin164949 -> 164947 bytes
-rw-r--r--macros/latex-dev/base/tulm.pdfbin156534 -> 156546 bytes
-rw-r--r--macros/latex-dev/base/unpack.ins1
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin398989 -> 399035 bytes
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin330713 -> 330836 bytes
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin136153 -> 136159 bytes
-rw-r--r--macros/latex-dev/required/graphics/README.md2
-rw-r--r--macros/latex-dev/required/graphics/changes.txt4
-rw-r--r--macros/latex-dev/required/graphics/color.pdfbin200935 -> 200892 bytes
-rw-r--r--macros/latex-dev/required/graphics/drivers.pdfbin263724 -> 263761 bytes
-rw-r--r--macros/latex-dev/required/graphics/epsfig.pdfbin154485 -> 154479 bytes
-rw-r--r--macros/latex-dev/required/graphics/graphics.pdfbin284646 -> 284616 bytes
-rw-r--r--macros/latex-dev/required/graphics/graphicx.pdfbin232495 -> 232479 bytes
-rw-r--r--macros/latex-dev/required/graphics/grfguide.pdfbin310565 -> 310565 bytes
-rw-r--r--macros/latex-dev/required/graphics/keyval.pdfbin222525 -> 222527 bytes
-rw-r--r--macros/latex-dev/required/graphics/lscape.dtx7
-rw-r--r--macros/latex-dev/required/graphics/lscape.pdfbin150104 -> 150615 bytes
-rw-r--r--macros/latex-dev/required/graphics/rotating.pdfbin245867 -> 246010 bytes
-rw-r--r--macros/latex-dev/required/graphics/rotex.pdfbin162248 -> 162268 bytes
-rw-r--r--macros/latex-dev/required/graphics/trig.pdfbin191692 -> 191692 bytes
-rw-r--r--macros/latex-dev/required/tools/README.md2
-rw-r--r--macros/latex-dev/required/tools/afterpage.pdfbin189848 -> 189846 bytes
-rw-r--r--macros/latex-dev/required/tools/array.dtx52
-rw-r--r--macros/latex-dev/required/tools/array.pdfbin481282 -> 483202 bytes
-rw-r--r--macros/latex-dev/required/tools/bm.pdfbin306775 -> 306728 bytes
-rw-r--r--macros/latex-dev/required/tools/calc.pdfbin340877 -> 340889 bytes
-rw-r--r--macros/latex-dev/required/tools/changes.txt19
-rw-r--r--macros/latex-dev/required/tools/dcolumn.pdfbin199221 -> 199218 bytes
-rw-r--r--macros/latex-dev/required/tools/delarray.pdfbin183432 -> 183426 bytes
-rw-r--r--macros/latex-dev/required/tools/enumerate.pdfbin199049 -> 199047 bytes
-rw-r--r--macros/latex-dev/required/tools/fileerr.pdfbin179548 -> 179839 bytes
-rw-r--r--macros/latex-dev/required/tools/fontsmpl.pdfbin138025 -> 138027 bytes
-rw-r--r--macros/latex-dev/required/tools/ftnright.pdfbin346379 -> 346683 bytes
-rw-r--r--macros/latex-dev/required/tools/hhline.pdfbin175678 -> 175673 bytes
-rw-r--r--macros/latex-dev/required/tools/indentfirst.pdfbin144779 -> 144779 bytes
-rw-r--r--macros/latex-dev/required/tools/layout.pdfbin246931 -> 246917 bytes
-rw-r--r--macros/latex-dev/required/tools/longtable.pdfbin349927 -> 349888 bytes
-rw-r--r--macros/latex-dev/required/tools/multicol.pdfbin491025 -> 491155 bytes
-rw-r--r--macros/latex-dev/required/tools/rawfonts.pdfbin135688 -> 135688 bytes
-rw-r--r--macros/latex-dev/required/tools/shellesc.pdfbin169757 -> 169765 bytes
-rw-r--r--macros/latex-dev/required/tools/showkeys.pdfbin242786 -> 242771 bytes
-rw-r--r--macros/latex-dev/required/tools/somedefs.pdfbin156511 -> 156506 bytes
-rw-r--r--macros/latex-dev/required/tools/tabularx.pdfbin254205 -> 254169 bytes
-rw-r--r--macros/latex-dev/required/tools/theorem.pdfbin322937 -> 323228 bytes
-rw-r--r--macros/latex-dev/required/tools/tools-overview.pdfbin68288 -> 68285 bytes
-rw-r--r--macros/latex-dev/required/tools/trace.pdfbin212730 -> 212721 bytes
-rw-r--r--macros/latex-dev/required/tools/varioref.dtx87
-rw-r--r--macros/latex-dev/required/tools/varioref.pdfbin354736 -> 358075 bytes
-rw-r--r--macros/latex-dev/required/tools/verbatim.dtx31
-rw-r--r--macros/latex-dev/required/tools/verbatim.pdfbin302233 -> 302925 bytes
-rw-r--r--macros/latex-dev/required/tools/xr.pdfbin163612 -> 163614 bytes
-rw-r--r--macros/latex-dev/required/tools/xspace.pdfbin238007 -> 237978 bytes
-rw-r--r--macros/latex/contrib/achemso/CHANGELOG.md14
-rw-r--r--macros/latex/contrib/achemso/achemso-demo.pdfbin359004 -> 358998 bytes
-rw-r--r--macros/latex/contrib/achemso/achemso.dtx180
-rw-r--r--macros/latex/contrib/achemso/achemso.ins41
-rw-r--r--macros/latex/contrib/achemso/achemso.pdfbin514502 -> 515534 bytes
-rw-r--r--macros/latex/contrib/horoscop/README28
-rw-r--r--macros/latex/contrib/horoscop/horoscop.dtx510
-rw-r--r--macros/latex/contrib/horoscop/horoscop.pdfbin696390 -> 701179 bytes
-rw-r--r--macros/latex/contrib/semantex/README.md2
-rw-r--r--macros/latex/contrib/semantex/semantex.pdfbin235556 -> 239643 bytes
-rw-r--r--macros/latex/contrib/semantex/semantex.sty3745
-rw-r--r--macros/latex/contrib/semantex/semantex.tex504
-rw-r--r--support/pkfix-helper/encoding-samples.pdfbin603227 -> 364761 bytes
-rwxr-xr-xsupport/pkfix-helper/pkfix-helper248
-rw-r--r--support/pkfix-helper/pkfix-helper.124
-rw-r--r--support/pkfix-helper/pkfix-helper.pdfbin70727 -> 86712 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl6
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb199
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.md52
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha5122
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc14
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb.xzbin2207516 -> 2208612 bytes
-rw-r--r--systems/win32/miktex/tm/packages/next/pr.ini8
-rw-r--r--systems/win32/miktex/tm/packages/pr.ini8
-rw-r--r--systems/win32/w32tex/ChangeLog22
-rw-r--r--timestamp2
183 files changed, 13112 insertions, 2895 deletions
diff --git a/FILES.byname b/FILES.byname
index 5b19333246..b26bed8ea2 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -5003,7 +5003,7 @@
1990/10/02 | 5440 | dviware/vutex/vaxvms.hlp
1990/10/02 | 812 | dviware/vutex/vaxvms.ins
1990/10/02 | 127576 | dviware/vutex/vutex.web
-2020/07/20 | 97062 | FILES.last07days
+2020/07/21 | 107758 | FILES.last07days
2018/06/27 | 99883 | fonts/academicons/academicons.pdf
2018/06/27 | 10779 | fonts/academicons/academicons.sty
2018/06/27 | 5774 | fonts/academicons/academicons.tex
@@ -163433,7 +163433,7 @@
2018/11/24 | 6522794 | install/macros/latex/contrib/abntex2.tds.zip
2009/09/02 | 160216 | install/macros/latex/contrib/abstract.tds.zip
2019/12/05 | 340781 | install/macros/latex/contrib/accsupp.tds.zip
-2020/05/27 | 997577 | install/macros/latex/contrib/achemso.tds.zip
+2020/07/21 | 1002380 | install/macros/latex/contrib/achemso.tds.zip
2010/11/19 | 165549 | install/macros/latex/contrib/acroterm.tds.zip
2019/01/04 | 821335 | install/macros/latex/contrib/adjustbox.tds.zip
2015/08/04 | 140785 | install/macros/latex/contrib/alertmessage.tds.zip
@@ -163759,10 +163759,10 @@
2020/04/09 | 806385 | install/macros/latex/contrib/zhlipsum.tds.zip
2020/05/01 | 293478 | install/macros/latex/contrib/zhnumber.tds.zip
2020/05/28 | 727408 | install/macros/latex/contrib/zref.tds.zip
-2020/05/27 | 22964254 | install/macros/latex-dev/latex-base-dev.tds.zip
+2020/07/21 | 27075721 | install/macros/latex-dev/latex-base-dev.tds.zip
2020/05/27 | 2642179 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip
-2020/05/27 | 2534097 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip
-2020/05/27 | 6952868 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
+2020/07/21 | 2534631 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip
+2020/07/21 | 6961126 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
2020/02/28 | 22237296 | install/macros/latex/latex-base.tds.zip
2020/06/01 | 1578753 | install/macros/latex/required/amscls.tds.zip
2013/03/08 | 2480846 | install/macros/latex/required/amslatex/math.tds.zip
@@ -179659,15 +179659,15 @@
2019/12/05 | 310 | macros/latex/contrib/accsupp/README.md
2019/12/05 | 331978 | macros/latex/contrib/accsupp.zip
2020/02/04 | 5245 | macros/latex/contrib/achemso/achemso-demo.bib
-2020/05/27 | 359004 | macros/latex/contrib/achemso/achemso-demo.pdf
+2020/07/21 | 358998 | macros/latex/contrib/achemso/achemso-demo.pdf
2020/02/04 | 16202 | macros/latex/contrib/achemso/achemso-demo.tex
-2020/05/27 | 149789 | macros/latex/contrib/achemso/achemso.dtx
-2020/05/06 | 6241 | macros/latex/contrib/achemso/achemso.ins
-2020/05/27 | 514502 | macros/latex/contrib/achemso/achemso.pdf
-2020/05/27 | 17998 | macros/latex/contrib/achemso/CHANGELOG.md
+2020/07/21 | 150585 | macros/latex/contrib/achemso/achemso.dtx
+2020/07/21 | 6431 | macros/latex/contrib/achemso/achemso.ins
+2020/07/21 | 515534 | macros/latex/contrib/achemso/achemso.pdf
+2020/07/21 | 18318 | macros/latex/contrib/achemso/CHANGELOG.md
2017/08/09 | 464 | macros/latex/contrib/achemso/LICENSE.md
2017/08/09 | 1333 | macros/latex/contrib/achemso/README.md
-2020/05/27 | 898098 | macros/latex/contrib/achemso.zip
+2020/07/21 | 899441 | macros/latex/contrib/achemso.zip
2019/12/16 | 2608 | macros/latex/contrib/acmart/acmart.bib
2020/05/03 | 238751 | macros/latex/contrib/acmart/acmart.dtx
2019/04/21 | 1016 | macros/latex/contrib/acmart/acmart.ins
@@ -191751,11 +191751,11 @@
2019/12/05 | 567626 | macros/latex/contrib/hologo/hologo.pdf
2019/12/05 | 115 | macros/latex/contrib/hologo/README.md
2019/12/06 | 570202 | macros/latex/contrib/hologo.zip
-2013/05/16 | 304398 | macros/latex/contrib/horoscop/horoscop.dtx
-2013/05/16 | 359 | macros/latex/contrib/horoscop/horoscop.ins
-2013/05/16 | 696390 | macros/latex/contrib/horoscop/horoscop.pdf
-2013/05/16 | 3867 | macros/latex/contrib/horoscop/README
-2013/05/16 | 767645 | macros/latex/contrib/horoscop.zip
+2020/07/21 | 316915 | macros/latex/contrib/horoscop/horoscop.dtx
+2020/07/21 | 359 | macros/latex/contrib/horoscop/horoscop.ins
+2020/07/21 | 701179 | macros/latex/contrib/horoscop/horoscop.pdf
+2020/07/21 | 4438 | macros/latex/contrib/horoscop/README
+2020/07/21 | 776547 | macros/latex/contrib/horoscop.zip
2000/10/27 | 41181 | macros/latex/contrib/hpsdiss/hpsdiss.dtx
2000/10/27 | 100 | macros/latex/contrib/hpsdiss/hpsdiss.ins
2000/10/27 | 217818 | macros/latex/contrib/hpsdiss/hpsdiss.pdf
@@ -202352,11 +202352,11 @@
2019/12/10 | 24550 | macros/latex/contrib/selinput/selinput.dtx
2019/12/10 | 537307 | macros/latex/contrib/selinput/selinput.pdf
2019/12/11 | 541126 | macros/latex/contrib/selinput.zip
-2020/07/07 | 1204 | macros/latex/contrib/semantex/README.md
-2020/07/07 | 235556 | macros/latex/contrib/semantex/semantex.pdf
-2020/07/07 | 162098 | macros/latex/contrib/semantex/semantex.sty
-2020/07/07 | 71044 | macros/latex/contrib/semantex/semantex.tex
-2020/07/07 | 268945 | macros/latex/contrib/semantex.zip
+2020/07/21 | 1197 | macros/latex/contrib/semantex/README.md
+2020/07/21 | 239643 | macros/latex/contrib/semantex/semantex.pdf
+2020/07/21 | 215621 | macros/latex/contrib/semantex/semantex.sty
+2020/07/21 | 74018 | macros/latex/contrib/semantex/semantex.tex
+2020/07/21 | 276040 | macros/latex/contrib/semantex.zip
2020/01/29 | 1014 | macros/latex/contrib/semantic-markup/README
2020/01/29 | 266707 | macros/latex/contrib/semantic-markup/semantic-markup.pdf
2020/01/29 | 4666 | macros/latex/contrib/semantic-markup/semantic-markup.sty
@@ -209019,244 +209019,260 @@
2020/02/28 | 475910 | macros/latex/contrib/zwpagelayout/zwpagelayout.pdf
2020/02/28 | 36153 | macros/latex/contrib/zwpagelayout/zwpagelayout.sty
2020/02/28 | 69481 | macros/latex/contrib/zwpagelayout/zwpagelayout.tex
-2020/05/27 | 6654 | macros/latex-dev/base/alltt.dtx
-2020/05/27 | 2892 | macros/latex-dev/base/alltt.ins
-2020/05/27 | 173077 | macros/latex-dev/base/alltt.pdf
-2020/05/27 | 3294 | macros/latex-dev/base/bugs.txt
-2020/05/27 | 220211 | macros/latex-dev/base/cfgguide.pdf
-2020/05/27 | 22457 | macros/latex-dev/base/cfgguide.tex
-2020/05/27 | 42708 | macros/latex-dev/base/changes.old.txt
-2020/05/27 | 350706 | macros/latex-dev/base/changes.txt
-2020/05/27 | 155735 | macros/latex-dev/base/classes.dtx
-2020/05/27 | 4089 | macros/latex-dev/base/classes.ins
-2020/05/27 | 520906 | macros/latex-dev/base/classes.pdf
-2020/05/27 | 372505 | macros/latex-dev/base/clsguide.pdf
-2020/05/27 | 69051 | macros/latex-dev/base/clsguide.tex
-2020/05/27 | 5275 | macros/latex-dev/base/cmextra.ins
-2020/05/27 | 43637 | macros/latex-dev/base/cmfonts.fdd
-2020/05/27 | 4326 | macros/latex-dev/base/cmfonts.ins
-2020/05/27 | 264453 | macros/latex-dev/base/cmfonts.pdf
-2020/05/27 | 216976 | macros/latex-dev/base/cyrguide.pdf
-2020/05/27 | 17496 | macros/latex-dev/base/cyrguide.tex
-2020/05/27 | 203514 | macros/latex-dev/base/doc.dtx
-2020/05/27 | 629536 | macros/latex-dev/base/doc.pdf
-2020/05/27 | 164376 | macros/latex-dev/base/docstrip.dtx
-2020/05/27 | 4223 | macros/latex-dev/base/docstrip.ins
-2020/05/27 | 470217 | macros/latex-dev/base/docstrip.pdf
-2020/05/27 | 4392 | macros/latex-dev/base/ec.ins
-2020/05/27 | 1532114 | macros/latex-dev/base/encguide.pdf
-2020/05/27 | 52814 | macros/latex-dev/base/encguide.tex
-2020/05/27 | 7222 | macros/latex-dev/base/exscale.dtx
-2020/05/27 | 3340 | macros/latex-dev/base/exscale.ins
-2020/05/27 | 195880 | macros/latex-dev/base/exscale.pdf
-2020/05/27 | 23521 | macros/latex-dev/base/fix-cm.dtx
-2020/05/27 | 2894 | macros/latex-dev/base/fix-cm.ins
-2020/05/27 | 262051 | macros/latex-dev/base/fix-cm.pdf
-2020/05/27 | 361810 | macros/latex-dev/base/fntguide.pdf
-2020/05/27 | 74810 | macros/latex-dev/base/fntguide.tex
-2020/05/27 | 60334 | macros/latex-dev/base/fontdef.dtx
-2020/05/27 | 8770 | macros/latex-dev/base/format.ins
-2020/05/27 | 5515 | macros/latex-dev/base/graphpap.dtx
-2020/05/27 | 2894 | macros/latex-dev/base/graphpap.ins
-2020/05/27 | 156280 | macros/latex-dev/base/graphpap.pdf
-2020/05/27 | 2706 | macros/latex-dev/base/idx.tex
-2020/05/27 | 18305 | macros/latex-dev/base/ifthen.dtx
-2020/05/27 | 2890 | macros/latex-dev/base/ifthen.ins
-2020/05/27 | 205205 | macros/latex-dev/base/ifthen.pdf
-2020/05/27 | 106914 | macros/latex-dev/base/inputenc.dtx
-2020/05/27 | 5716 | macros/latex-dev/base/inputenc.ins
-2020/05/27 | 294723 | macros/latex-dev/base/inputenc.pdf
-2020/05/27 | 4080 | macros/latex-dev/base/lablst.tex
-2020/05/27 | 38533 | macros/latex-dev/base/latex209.dtx
-2020/05/27 | 4221 | macros/latex-dev/base/latex209.ins
-2020/05/27 | 232380 | macros/latex-dev/base/latexchanges.pdf
-2020/05/27 | 37980 | macros/latex-dev/base/latexchanges.tex
-2020/05/27 | 32164 | macros/latex-dev/base/latexrelease.dtx
-2020/05/27 | 5354 | macros/latex-dev/base/latexrelease.ins
-2020/05/27 | 246174 | macros/latex-dev/base/latexrelease.pdf
-2020/05/27 | 6715 | macros/latex-dev/base/latexsym.dtx
-2020/05/27 | 5044 | macros/latex-dev/base/latexsym.ins
-2020/05/27 | 192289 | macros/latex-dev/base/latexsym.pdf
-2020/05/27 | 52532 | macros/latex-dev/base/lb2.err
-2020/05/27 | 138223 | macros/latex-dev/base/lb2.pdf
-2020/05/27 | 1381 | macros/latex-dev/base/legal.txt
-2020/05/27 | 62436 | macros/latex-dev/base/letter.dtx
-2020/05/27 | 3374 | macros/latex-dev/base/letter.ins
-2020/05/27 | 305750 | macros/latex-dev/base/letter.pdf
-2020/05/27 | 20434 | macros/latex-dev/base/lgc2.err
-2020/05/27 | 101344 | macros/latex-dev/base/lgc2.pdf
-2020/05/27 | 9068 | macros/latex-dev/base/lppl-1-0.txt
-2020/05/27 | 14341 | macros/latex-dev/base/lppl-1-1.txt
-2020/05/27 | 14421 | macros/latex-dev/base/lppl-1-2.txt
-2020/05/27 | 125828 | macros/latex-dev/base/lppl.pdf
-2020/05/27 | 23386 | macros/latex-dev/base/lppl.tex
-2020/05/27 | 19040 | macros/latex-dev/base/lppl.txt
-2020/05/27 | 4304 | macros/latex-dev/base/ltalloc.dtx
-2020/05/27 | 14440 | macros/latex-dev/base/ltbibl.dtx
-2020/05/27 | 40492 | macros/latex-dev/base/ltboxes.dtx
-2020/05/27 | 104693 | macros/latex-dev/base/ltclass.dtx
-2020/05/27 | 9562 | macros/latex-dev/base/ltcntrl.dtx
-2020/05/27 | 22676 | macros/latex-dev/base/ltcounts.dtx
-2020/05/27 | 57368 | macros/latex-dev/base/ltdefns.dtx
-2020/05/27 | 35162 | macros/latex-dev/base/ltdirchk.dtx
-2020/05/27 | 24016 | macros/latex-dev/base/lterror.dtx
-2020/05/27 | 4649 | macros/latex-dev/base/ltexpl.dtx
-2020/05/27 | 42214 | macros/latex-dev/base/ltfiles.dtx
-2020/05/27 | 40589 | macros/latex-dev/base/ltfinal.dtx
-2020/05/27 | 51314 | macros/latex-dev/base/ltfloat.dtx
-2020/05/27 | 29194 | macros/latex-dev/base/ltfntcmd.dtx
-2020/05/27 | 48875 | macros/latex-dev/base/ltfssaxes.dtx
-2020/05/27 | 79110 | macros/latex-dev/base/ltfssbas.dtx
-2020/05/27 | 10376 | macros/latex-dev/base/ltfsscmp.dtx
-2020/05/27 | 61221 | macros/latex-dev/base/ltfssdcl.dtx
-2020/05/27 | 69854 | macros/latex-dev/base/ltfssini.dtx
-2020/05/27 | 67333 | macros/latex-dev/base/ltfsstrc.dtx
-2020/05/27 | 4952 | macros/latex-dev/base/lthyphen.dtx
-2020/05/27 | 5865 | macros/latex-dev/base/ltidxglo.dtx
-2020/05/27 | 4762 | macros/latex-dev/base/ltlength.dtx
-2020/05/27 | 36154 | macros/latex-dev/base/ltlists.dtx
-2020/05/27 | 3731 | macros/latex-dev/base/ltlogos.dtx
-2020/05/27 | 63444 | macros/latex-dev/base/ltluatex.dtx
-2020/05/27 | 304468 | macros/latex-dev/base/ltluatex.pdf
-2020/05/27 | 38726 | macros/latex-dev/base/ltmath.dtx
-2020/05/27 | 47291 | macros/latex-dev/base/ltmiscen.dtx
-2020/05/27 | 150020 | macros/latex-dev/base/ltnews01.pdf
-2020/05/27 | 5239 | macros/latex-dev/base/ltnews01.tex
-2020/05/27 | 134750 | macros/latex-dev/base/ltnews02.pdf
-2020/05/27 | 5284 | macros/latex-dev/base/ltnews02.tex
-2020/05/27 | 134730 | macros/latex-dev/base/ltnews03.pdf
-2020/05/27 | 5201 | macros/latex-dev/base/ltnews03.tex
-2020/05/27 | 128768 | macros/latex-dev/base/ltnews04.pdf
-2020/05/27 | 5507 | macros/latex-dev/base/ltnews04.tex
-2020/05/27 | 157174 | macros/latex-dev/base/ltnews05.pdf
-2020/05/27 | 5609 | macros/latex-dev/base/ltnews05.tex
-2020/05/27 | 133132 | macros/latex-dev/base/ltnews06.pdf
-2020/05/27 | 5391 | macros/latex-dev/base/ltnews06.tex
-2020/05/27 | 124028 | macros/latex-dev/base/ltnews07.pdf
-2020/05/27 | 5426 | macros/latex-dev/base/ltnews07.tex
-2020/05/27 | 144471 | macros/latex-dev/base/ltnews08.pdf
-2020/05/27 | 5696 | macros/latex-dev/base/ltnews08.tex
-2020/05/27 | 120208 | macros/latex-dev/base/ltnews09.pdf
-2020/05/27 | 5294 | macros/latex-dev/base/ltnews09.tex
-2020/05/27 | 147941 | macros/latex-dev/base/ltnews10.pdf
-2020/05/27 | 5660 | macros/latex-dev/base/ltnews10.tex
-2020/05/27 | 104942 | macros/latex-dev/base/ltnews11.pdf
-2020/05/27 | 5530 | macros/latex-dev/base/ltnews11.tex
-2020/05/27 | 137918 | macros/latex-dev/base/ltnews12.pdf
-2020/05/27 | 5418 | macros/latex-dev/base/ltnews12.tex
-2020/05/27 | 161066 | macros/latex-dev/base/ltnews13.pdf
-2020/05/27 | 6872 | macros/latex-dev/base/ltnews13.tex
-2020/05/27 | 150920 | macros/latex-dev/base/ltnews14.pdf
-2020/05/27 | 6274 | macros/latex-dev/base/ltnews14.tex
-2020/05/27 | 122088 | macros/latex-dev/base/ltnews15.pdf
-2020/05/27 | 5840 | macros/latex-dev/base/ltnews15.tex
-2020/05/27 | 130688 | macros/latex-dev/base/ltnews16.pdf
-2020/05/27 | 5777 | macros/latex-dev/base/ltnews16.tex
-2020/05/27 | 149835 | macros/latex-dev/base/ltnews17.pdf
-2020/05/27 | 8864 | macros/latex-dev/base/ltnews17.tex
-2020/05/27 | 36003 | macros/latex-dev/base/ltnews18.pdf
-2020/05/27 | 1342 | macros/latex-dev/base/ltnews18.tex
-2020/05/27 | 235068 | macros/latex-dev/base/ltnews19.pdf
-2020/05/27 | 4171 | macros/latex-dev/base/ltnews19.tex
-2020/05/27 | 283323 | macros/latex-dev/base/ltnews20.pdf
-2020/05/27 | 7326 | macros/latex-dev/base/ltnews20.tex
-2020/05/27 | 233491 | macros/latex-dev/base/ltnews21.pdf
-2020/05/27 | 9810 | macros/latex-dev/base/ltnews21.tex
-2020/05/27 | 302835 | macros/latex-dev/base/ltnews22.pdf
-2020/05/27 | 10669 | macros/latex-dev/base/ltnews22.tex
-2020/05/27 | 274453 | macros/latex-dev/base/ltnews23.pdf
-2020/05/27 | 10688 | macros/latex-dev/base/ltnews23.tex
-2020/05/27 | 252641 | macros/latex-dev/base/ltnews24.pdf
-2020/05/27 | 12225 | macros/latex-dev/base/ltnews24.tex
-2020/05/27 | 196325 | macros/latex-dev/base/ltnews25.pdf
-2020/05/27 | 5474 | macros/latex-dev/base/ltnews25.tex
-2020/05/27 | 362836 | macros/latex-dev/base/ltnews26.pdf
-2020/05/27 | 10698 | macros/latex-dev/base/ltnews26.tex
-2020/05/27 | 239755 | macros/latex-dev/base/ltnews27.pdf
-2020/05/27 | 5507 | macros/latex-dev/base/ltnews27.tex
-2020/05/27 | 368229 | macros/latex-dev/base/ltnews28.pdf
-2020/05/27 | 14892 | macros/latex-dev/base/ltnews28.tex
-2020/05/27 | 433006 | macros/latex-dev/base/ltnews29.pdf
-2020/05/27 | 18941 | macros/latex-dev/base/ltnews29.tex
-2020/05/27 | 491245 | macros/latex-dev/base/ltnews30.pdf
-2020/05/27 | 23652 | macros/latex-dev/base/ltnews30.tex
-2020/05/27 | 500199 | macros/latex-dev/base/ltnews31.pdf
-2020/05/27 | 30463 | macros/latex-dev/base/ltnews31.tex
-2020/05/27 | 476890 | macros/latex-dev/base/ltnews32.pdf
-2020/05/27 | 23011 | macros/latex-dev/base/ltnews32.tex
-2020/05/27 | 20302 | macros/latex-dev/base/ltnews.cls
-2020/05/27 | 972412 | macros/latex-dev/base/ltnews.pdf
-2020/05/27 | 8100 | macros/latex-dev/base/ltnews.tex
-2020/05/27 | 143457 | macros/latex-dev/base/ltoutenc.dtx
-2020/05/27 | 3369 | macros/latex-dev/base/ltoutenc.ins
-2020/05/27 | 175355 | macros/latex-dev/base/ltoutput.dtx
-2020/05/27 | 11443 | macros/latex-dev/base/ltpage.dtx
-2020/05/27 | 2733 | macros/latex-dev/base/ltpageno.dtx
-2020/05/27 | 5854 | macros/latex-dev/base/ltpar.dtx
-2020/05/27 | 50893 | macros/latex-dev/base/ltpictur.dtx
-2020/05/27 | 47759 | macros/latex-dev/base/ltplain.dtx
-2020/05/27 | 31879 | macros/latex-dev/base/ltsect.dtx
-2020/05/27 | 45246 | macros/latex-dev/base/ltspace.dtx
-2020/05/27 | 47704 | macros/latex-dev/base/lttab.dtx
-2020/05/27 | 88411 | macros/latex-dev/base/lttextcomp.dtx
-2020/05/27 | 8737 | macros/latex-dev/base/ltthm.dtx
-2020/05/27 | 10365 | macros/latex-dev/base/ltvers.dtx
-2020/05/27 | 191528 | macros/latex-dev/base/ltx3info.pdf
-2020/05/27 | 18300 | macros/latex-dev/base/ltx3info.tex
-2020/05/27 | 27124 | macros/latex-dev/base/ltxcheck.tex
-2020/05/27 | 18558 | macros/latex-dev/base/ltxdoc.dtx
-2020/05/27 | 215600 | macros/latex-dev/base/ltxdoc.pdf
-2020/05/27 | 7526 | macros/latex-dev/base/ltxguide.cls
-2020/05/27 | 15474 | macros/latex-dev/base/ltxref.dtx
-2020/05/27 | 10606 | macros/latex-dev/base/makeindx.dtx
-2020/05/27 | 3436 | macros/latex-dev/base/makeindx.ins
-2020/05/27 | 160673 | macros/latex-dev/base/makeindx.pdf
-2020/05/27 | 10414 | macros/latex-dev/base/manifest.txt
-2020/05/27 | 12946 | macros/latex-dev/base/manual.err
-2020/05/27 | 151354 | macros/latex-dev/base/manual.pdf
-2020/05/27 | 1938 | macros/latex-dev/base/minimal.cls
-2020/05/27 | 220384 | macros/latex-dev/base/modguide.pdf
-2020/05/27 | 16234 | macros/latex-dev/base/modguide.tex
-2020/05/27 | 4256 | macros/latex-dev/base/newdc.ins
-2020/05/27 | 6363 | macros/latex-dev/base/newlfont.dtx
-2020/05/27 | 18407 | macros/latex-dev/base/nfssfont.dtx
-2020/05/27 | 2895 | macros/latex-dev/base/nfssfont.ins
-2020/05/27 | 202429 | macros/latex-dev/base/nfssfont.pdf
-2020/05/27 | 3962 | macros/latex-dev/base/olddc.ins
-2020/05/27 | 8632 | macros/latex-dev/base/oldlfont.dtx
-2020/05/27 | 9374 | macros/latex-dev/base/preload.dtx
-2020/05/27 | 13305 | macros/latex-dev/base/proc.dtx
-2020/05/27 | 3403 | macros/latex-dev/base/proc.ins
-2020/05/27 | 216899 | macros/latex-dev/base/proc.pdf
-2020/05/27 | 3514 | macros/latex-dev/base/README.md
-2020/05/27 | 7200 | macros/latex-dev/base/sample2e.tex
-2020/05/27 | 89720 | macros/latex-dev/base/slides.dtx
-2020/05/27 | 6764 | macros/latex-dev/base/slides.ins
-2020/05/27 | 351660 | macros/latex-dev/base/slides.pdf
-2020/05/27 | 15701 | macros/latex-dev/base/slifonts.fdd
-2020/05/27 | 214708 | macros/latex-dev/base/slifonts.pdf
-2020/05/27 | 1694 | macros/latex-dev/base/small2e.tex
-2020/05/27 | 3182847 | macros/latex-dev/base/source2e.pdf
-2020/05/27 | 14673 | macros/latex-dev/base/source2e.tex
-2020/05/27 | 9401 | macros/latex-dev/base/syntonly.dtx
-2020/05/27 | 2898 | macros/latex-dev/base/syntonly.ins
-2020/05/27 | 181389 | macros/latex-dev/base/syntonly.pdf
-2020/05/27 | 12521 | macros/latex-dev/base/testpage.tex
-2020/05/27 | 2738 | macros/latex-dev/base/tex2.txt
-2020/05/27 | 8493 | macros/latex-dev/base/texpert.txt
-2020/05/27 | 172216 | macros/latex-dev/base/tlc2.err
-2020/05/27 | 164949 | macros/latex-dev/base/tlc2.pdf
-2020/05/27 | 12120 | macros/latex-dev/base/tulm.fdd
-2020/05/27 | 3783 | macros/latex-dev/base/tulm.ins
-2020/05/27 | 156534 | macros/latex-dev/base/tulm.pdf
-2020/05/27 | 3183 | macros/latex-dev/base/unpack.ins
-2020/05/27 | 398989 | macros/latex-dev/base/usrguide.pdf
-2020/05/27 | 68428 | macros/latex-dev/base/usrguide.tex
-2020/05/27 | 89386 | macros/latex-dev/base/utf8ienc.dtx
-2020/05/27 | 330713 | macros/latex-dev/base/utf8ienc.pdf
-2020/05/27 | 10053 | macros/latex-dev/base/webcomp.err
-2020/05/27 | 136153 | macros/latex-dev/base/webcomp.pdf
-2020/05/27 | 22552209 | macros/latex-dev/base.zip
+2020/07/21 | 6654 | macros/latex-dev/base/alltt.dtx
+2020/07/21 | 2892 | macros/latex-dev/base/alltt.ins
+2020/07/21 | 173079 | macros/latex-dev/base/alltt.pdf
+2020/07/21 | 3294 | macros/latex-dev/base/bugs.txt
+2020/07/21 | 220217 | macros/latex-dev/base/cfgguide.pdf
+2020/07/21 | 22457 | macros/latex-dev/base/cfgguide.tex
+2020/07/21 | 42708 | macros/latex-dev/base/changes.old.txt
+2020/07/21 | 352969 | macros/latex-dev/base/changes.txt
+2020/07/21 | 155735 | macros/latex-dev/base/classes.dtx
+2020/07/21 | 4089 | macros/latex-dev/base/classes.ins
+2020/07/21 | 520851 | macros/latex-dev/base/classes.pdf
+2020/07/21 | 372555 | macros/latex-dev/base/clsguide.pdf
+2020/07/21 | 69051 | macros/latex-dev/base/clsguide.tex
+2020/07/21 | 5275 | macros/latex-dev/base/cmextra.ins
+2020/07/21 | 43637 | macros/latex-dev/base/cmfonts.fdd
+2020/07/21 | 4326 | macros/latex-dev/base/cmfonts.ins
+2020/07/21 | 264505 | macros/latex-dev/base/cmfonts.pdf
+2020/07/21 | 216997 | macros/latex-dev/base/cyrguide.pdf
+2020/07/21 | 17496 | macros/latex-dev/base/cyrguide.tex
+2020/07/21 | 204016 | macros/latex-dev/base/doc.dtx
+2020/07/21 | 631083 | macros/latex-dev/base/doc.pdf
+2020/07/21 | 170214 | macros/latex-dev/base/docstrip.dtx
+2020/07/21 | 4223 | macros/latex-dev/base/docstrip.ins
+2020/07/21 | 479293 | macros/latex-dev/base/docstrip.pdf
+2020/07/21 | 4392 | macros/latex-dev/base/ec.ins
+2020/07/21 | 1532144 | macros/latex-dev/base/encguide.pdf
+2020/07/21 | 52814 | macros/latex-dev/base/encguide.tex
+2020/07/21 | 7222 | macros/latex-dev/base/exscale.dtx
+2020/07/21 | 3340 | macros/latex-dev/base/exscale.ins
+2020/07/21 | 195877 | macros/latex-dev/base/exscale.pdf
+2020/07/21 | 23521 | macros/latex-dev/base/fix-cm.dtx
+2020/07/21 | 2894 | macros/latex-dev/base/fix-cm.ins
+2020/07/21 | 262059 | macros/latex-dev/base/fix-cm.pdf
+2020/07/21 | 417861 | macros/latex-dev/base/fntguide.pdf
+2020/07/21 | 90413 | macros/latex-dev/base/fntguide.tex
+2020/07/21 | 60334 | macros/latex-dev/base/fontdef.dtx
+2020/07/21 | 8770 | macros/latex-dev/base/format.ins
+2020/07/21 | 5515 | macros/latex-dev/base/graphpap.dtx
+2020/07/21 | 2894 | macros/latex-dev/base/graphpap.ins
+2020/07/21 | 156277 | macros/latex-dev/base/graphpap.pdf
+2020/07/21 | 2706 | macros/latex-dev/base/idx.tex
+2020/07/21 | 18305 | macros/latex-dev/base/ifthen.dtx
+2020/07/21 | 2890 | macros/latex-dev/base/ifthen.ins
+2020/07/21 | 205213 | macros/latex-dev/base/ifthen.pdf
+2020/07/21 | 106914 | macros/latex-dev/base/inputenc.dtx
+2020/07/21 | 5716 | macros/latex-dev/base/inputenc.ins
+2020/07/21 | 294722 | macros/latex-dev/base/inputenc.pdf
+2020/07/21 | 4080 | macros/latex-dev/base/lablst.tex
+2020/07/21 | 38533 | macros/latex-dev/base/latex209.dtx
+2020/07/21 | 4221 | macros/latex-dev/base/latex209.ins
+2020/07/21 | 232390 | macros/latex-dev/base/latexchanges.pdf
+2020/07/21 | 37980 | macros/latex-dev/base/latexchanges.tex
+2020/07/21 | 32164 | macros/latex-dev/base/latexrelease.dtx
+2020/07/21 | 5354 | macros/latex-dev/base/latexrelease.ins
+2020/07/21 | 246195 | macros/latex-dev/base/latexrelease.pdf
+2020/07/21 | 6715 | macros/latex-dev/base/latexsym.dtx
+2020/07/21 | 5044 | macros/latex-dev/base/latexsym.ins
+2020/07/21 | 192297 | macros/latex-dev/base/latexsym.pdf
+2020/07/21 | 52532 | macros/latex-dev/base/lb2.err
+2020/07/21 | 138219 | macros/latex-dev/base/lb2.pdf
+2020/07/21 | 1381 | macros/latex-dev/base/legal.txt
+2020/07/21 | 62436 | macros/latex-dev/base/letter.dtx
+2020/07/21 | 3374 | macros/latex-dev/base/letter.ins
+2020/07/21 | 305975 | macros/latex-dev/base/letter.pdf
+2020/07/21 | 20434 | macros/latex-dev/base/lgc2.err
+2020/07/21 | 101343 | macros/latex-dev/base/lgc2.pdf
+2020/07/21 | 9068 | macros/latex-dev/base/lppl-1-0.txt
+2020/07/21 | 14341 | macros/latex-dev/base/lppl-1-1.txt
+2020/07/21 | 14421 | macros/latex-dev/base/lppl-1-2.txt
+2020/07/21 | 125830 | macros/latex-dev/base/lppl.pdf
+2020/07/21 | 23386 | macros/latex-dev/base/lppl.tex
+2020/07/21 | 19040 | macros/latex-dev/base/lppl.txt
+2020/07/21 | 4304 | macros/latex-dev/base/ltalloc.dtx
+2020/07/21 | 14440 | macros/latex-dev/base/ltbibl.dtx
+2020/07/21 | 40492 | macros/latex-dev/base/ltboxes.dtx
+2020/07/21 | 106100 | macros/latex-dev/base/ltclass.dtx
+2020/07/21 | 9562 | macros/latex-dev/base/ltcntrl.dtx
+2020/07/21 | 22676 | macros/latex-dev/base/ltcounts.dtx
+2020/07/21 | 57722 | macros/latex-dev/base/ltdefns.dtx
+2020/07/21 | 35162 | macros/latex-dev/base/ltdirchk.dtx
+2020/07/21 | 24016 | macros/latex-dev/base/lterror.dtx
+2020/07/21 | 8014 | macros/latex-dev/base/ltexpl.dtx
+2020/07/21 | 677281 | macros/latex-dev/base/ltfilehook-code.pdf
+2020/07/21 | 243 | macros/latex-dev/base/ltfilehook-code.tex
+2020/07/21 | 512167 | macros/latex-dev/base/ltfilehook-doc.pdf
+2020/07/21 | 318 | macros/latex-dev/base/ltfilehook-doc.tex
+2020/07/21 | 39634 | macros/latex-dev/base/ltfilehook.dtx
+2020/07/21 | 44875 | macros/latex-dev/base/ltfiles.dtx
+2020/07/21 | 50086 | macros/latex-dev/base/ltfinal.dtx
+2020/07/21 | 51314 | macros/latex-dev/base/ltfloat.dtx
+2020/07/21 | 29194 | macros/latex-dev/base/ltfntcmd.dtx
+2020/07/21 | 48875 | macros/latex-dev/base/ltfssaxes.dtx
+2020/07/21 | 79110 | macros/latex-dev/base/ltfssbas.dtx
+2020/07/21 | 10376 | macros/latex-dev/base/ltfsscmp.dtx
+2020/07/21 | 61221 | macros/latex-dev/base/ltfssdcl.dtx
+2020/07/21 | 69854 | macros/latex-dev/base/ltfssini.dtx
+2020/07/21 | 67333 | macros/latex-dev/base/ltfsstrc.dtx
+2020/07/21 | 914727 | macros/latex-dev/base/lthooks-code.pdf
+2020/07/21 | 237 | macros/latex-dev/base/lthooks-code.tex
+2020/07/21 | 588067 | macros/latex-dev/base/lthooks-doc.pdf
+2020/07/21 | 312 | macros/latex-dev/base/lthooks-doc.tex
+2020/07/21 | 137531 | macros/latex-dev/base/lthooks.dtx
+2020/07/21 | 2332 | macros/latex-dev/base/lthooks.ins
+2020/07/21 | 4952 | macros/latex-dev/base/lthyphen.dtx
+2020/07/21 | 5865 | macros/latex-dev/base/ltidxglo.dtx
+2020/07/21 | 4762 | macros/latex-dev/base/ltlength.dtx
+2020/07/21 | 36154 | macros/latex-dev/base/ltlists.dtx
+2020/07/21 | 3731 | macros/latex-dev/base/ltlogos.dtx
+2020/07/21 | 63643 | macros/latex-dev/base/ltluatex.dtx
+2020/07/21 | 304460 | macros/latex-dev/base/ltluatex.pdf
+2020/07/21 | 38726 | macros/latex-dev/base/ltmath.dtx
+2020/07/21 | 48372 | macros/latex-dev/base/ltmiscen.dtx
+2020/07/21 | 150020 | macros/latex-dev/base/ltnews01.pdf
+2020/07/21 | 5239 | macros/latex-dev/base/ltnews01.tex
+2020/07/21 | 134751 | macros/latex-dev/base/ltnews02.pdf
+2020/07/21 | 5284 | macros/latex-dev/base/ltnews02.tex
+2020/07/21 | 134742 | macros/latex-dev/base/ltnews03.pdf
+2020/07/21 | 5201 | macros/latex-dev/base/ltnews03.tex
+2020/07/21 | 128772 | macros/latex-dev/base/ltnews04.pdf
+2020/07/21 | 5507 | macros/latex-dev/base/ltnews04.tex
+2020/07/21 | 157181 | macros/latex-dev/base/ltnews05.pdf
+2020/07/21 | 5609 | macros/latex-dev/base/ltnews05.tex
+2020/07/21 | 133138 | macros/latex-dev/base/ltnews06.pdf
+2020/07/21 | 5391 | macros/latex-dev/base/ltnews06.tex
+2020/07/21 | 124029 | macros/latex-dev/base/ltnews07.pdf
+2020/07/21 | 5426 | macros/latex-dev/base/ltnews07.tex
+2020/07/21 | 144482 | macros/latex-dev/base/ltnews08.pdf
+2020/07/21 | 5696 | macros/latex-dev/base/ltnews08.tex
+2020/07/21 | 120222 | macros/latex-dev/base/ltnews09.pdf
+2020/07/21 | 5294 | macros/latex-dev/base/ltnews09.tex
+2020/07/21 | 147946 | macros/latex-dev/base/ltnews10.pdf
+2020/07/21 | 5660 | macros/latex-dev/base/ltnews10.tex
+2020/07/21 | 104936 | macros/latex-dev/base/ltnews11.pdf
+2020/07/21 | 5530 | macros/latex-dev/base/ltnews11.tex
+2020/07/21 | 137919 | macros/latex-dev/base/ltnews12.pdf
+2020/07/21 | 5418 | macros/latex-dev/base/ltnews12.tex
+2020/07/21 | 161065 | macros/latex-dev/base/ltnews13.pdf
+2020/07/21 | 6872 | macros/latex-dev/base/ltnews13.tex
+2020/07/21 | 150907 | macros/latex-dev/base/ltnews14.pdf
+2020/07/21 | 6274 | macros/latex-dev/base/ltnews14.tex
+2020/07/21 | 122092 | macros/latex-dev/base/ltnews15.pdf
+2020/07/21 | 5840 | macros/latex-dev/base/ltnews15.tex
+2020/07/21 | 130687 | macros/latex-dev/base/ltnews16.pdf
+2020/07/21 | 5777 | macros/latex-dev/base/ltnews16.tex
+2020/07/21 | 149838 | macros/latex-dev/base/ltnews17.pdf
+2020/07/21 | 8864 | macros/latex-dev/base/ltnews17.tex
+2020/07/21 | 36005 | macros/latex-dev/base/ltnews18.pdf
+2020/07/21 | 1342 | macros/latex-dev/base/ltnews18.tex
+2020/07/21 | 235073 | macros/latex-dev/base/ltnews19.pdf
+2020/07/21 | 4171 | macros/latex-dev/base/ltnews19.tex
+2020/07/21 | 283318 | macros/latex-dev/base/ltnews20.pdf
+2020/07/21 | 7326 | macros/latex-dev/base/ltnews20.tex
+2020/07/21 | 233492 | macros/latex-dev/base/ltnews21.pdf
+2020/07/21 | 9810 | macros/latex-dev/base/ltnews21.tex
+2020/07/21 | 302836 | macros/latex-dev/base/ltnews22.pdf
+2020/07/21 | 10669 | macros/latex-dev/base/ltnews22.tex
+2020/07/21 | 274459 | macros/latex-dev/base/ltnews23.pdf
+2020/07/21 | 10688 | macros/latex-dev/base/ltnews23.tex
+2020/07/21 | 252645 | macros/latex-dev/base/ltnews24.pdf
+2020/07/21 | 12225 | macros/latex-dev/base/ltnews24.tex
+2020/07/21 | 196326 | macros/latex-dev/base/ltnews25.pdf
+2020/07/21 | 5474 | macros/latex-dev/base/ltnews25.tex
+2020/07/21 | 362839 | macros/latex-dev/base/ltnews26.pdf
+2020/07/21 | 10698 | macros/latex-dev/base/ltnews26.tex
+2020/07/21 | 239758 | macros/latex-dev/base/ltnews27.pdf
+2020/07/21 | 5507 | macros/latex-dev/base/ltnews27.tex
+2020/07/21 | 368226 | macros/latex-dev/base/ltnews28.pdf
+2020/07/21 | 14892 | macros/latex-dev/base/ltnews28.tex
+2020/07/21 | 433004 | macros/latex-dev/base/ltnews29.pdf
+2020/07/21 | 18941 | macros/latex-dev/base/ltnews29.tex
+2020/07/21 | 491246 | macros/latex-dev/base/ltnews30.pdf
+2020/07/21 | 23652 | macros/latex-dev/base/ltnews30.tex
+2020/07/21 | 500191 | macros/latex-dev/base/ltnews31.pdf
+2020/07/21 | 30463 | macros/latex-dev/base/ltnews31.tex
+2020/07/21 | 519192 | macros/latex-dev/base/ltnews32.pdf
+2020/07/21 | 27936 | macros/latex-dev/base/ltnews32.tex
+2020/07/21 | 20471 | macros/latex-dev/base/ltnews.cls
+2020/07/21 | 980265 | macros/latex-dev/base/ltnews.pdf
+2020/07/21 | 8100 | macros/latex-dev/base/ltnews.tex
+2020/07/21 | 145318 | macros/latex-dev/base/ltoutenc.dtx
+2020/07/21 | 3369 | macros/latex-dev/base/ltoutenc.ins
+2020/07/21 | 175355 | macros/latex-dev/base/ltoutput.dtx
+2020/07/21 | 11443 | macros/latex-dev/base/ltpage.dtx
+2020/07/21 | 2733 | macros/latex-dev/base/ltpageno.dtx
+2020/07/21 | 5854 | macros/latex-dev/base/ltpar.dtx
+2020/07/21 | 50893 | macros/latex-dev/base/ltpictur.dtx
+2020/07/21 | 47759 | macros/latex-dev/base/ltplain.dtx
+2020/07/21 | 31879 | macros/latex-dev/base/ltsect.dtx
+2020/07/21 | 723515 | macros/latex-dev/base/ltshipout-code.pdf
+2020/07/21 | 241 | macros/latex-dev/base/ltshipout-code.tex
+2020/07/21 | 499777 | macros/latex-dev/base/ltshipout-doc.pdf
+2020/07/21 | 316 | macros/latex-dev/base/ltshipout-doc.tex
+2020/07/21 | 49098 | macros/latex-dev/base/ltshipout.dtx
+2020/07/21 | 45246 | macros/latex-dev/base/ltspace.dtx
+2020/07/21 | 47704 | macros/latex-dev/base/lttab.dtx
+2020/07/21 | 88411 | macros/latex-dev/base/lttextcomp.dtx
+2020/07/21 | 8737 | macros/latex-dev/base/ltthm.dtx
+2020/07/21 | 10365 | macros/latex-dev/base/ltvers.dtx
+2020/07/21 | 191527 | macros/latex-dev/base/ltx3info.pdf
+2020/07/21 | 18300 | macros/latex-dev/base/ltx3info.tex
+2020/07/21 | 27124 | macros/latex-dev/base/ltxcheck.tex
+2020/07/21 | 18722 | macros/latex-dev/base/ltxdoc.dtx
+2020/07/21 | 215578 | macros/latex-dev/base/ltxdoc.pdf
+2020/07/21 | 7526 | macros/latex-dev/base/ltxguide.cls
+2020/07/21 | 15474 | macros/latex-dev/base/ltxref.dtx
+2020/07/21 | 10606 | macros/latex-dev/base/makeindx.dtx
+2020/07/21 | 3436 | macros/latex-dev/base/makeindx.ins
+2020/07/21 | 160667 | macros/latex-dev/base/makeindx.pdf
+2020/07/21 | 10414 | macros/latex-dev/base/manifest.txt
+2020/07/21 | 12946 | macros/latex-dev/base/manual.err
+2020/07/21 | 151347 | macros/latex-dev/base/manual.pdf
+2020/07/21 | 1938 | macros/latex-dev/base/minimal.cls
+2020/07/21 | 220388 | macros/latex-dev/base/modguide.pdf
+2020/07/21 | 16234 | macros/latex-dev/base/modguide.tex
+2020/07/21 | 4256 | macros/latex-dev/base/newdc.ins
+2020/07/21 | 6363 | macros/latex-dev/base/newlfont.dtx
+2020/07/21 | 18407 | macros/latex-dev/base/nfssfont.dtx
+2020/07/21 | 2895 | macros/latex-dev/base/nfssfont.ins
+2020/07/21 | 202451 | macros/latex-dev/base/nfssfont.pdf
+2020/07/21 | 3962 | macros/latex-dev/base/olddc.ins
+2020/07/21 | 8632 | macros/latex-dev/base/oldlfont.dtx
+2020/07/21 | 9374 | macros/latex-dev/base/preload.dtx
+2020/07/21 | 13305 | macros/latex-dev/base/proc.dtx
+2020/07/21 | 3403 | macros/latex-dev/base/proc.ins
+2020/07/21 | 216877 | macros/latex-dev/base/proc.pdf
+2020/07/21 | 3514 | macros/latex-dev/base/README.md
+2020/07/21 | 7200 | macros/latex-dev/base/sample2e.tex
+2020/07/21 | 89720 | macros/latex-dev/base/slides.dtx
+2020/07/21 | 6764 | macros/latex-dev/base/slides.ins
+2020/07/21 | 351586 | macros/latex-dev/base/slides.pdf
+2020/07/21 | 15701 | macros/latex-dev/base/slifonts.fdd
+2020/07/21 | 214710 | macros/latex-dev/base/slifonts.pdf
+2020/07/21 | 1694 | macros/latex-dev/base/small2e.tex
+2020/07/21 | 3220329 | macros/latex-dev/base/source2e.pdf
+2020/07/21 | 14673 | macros/latex-dev/base/source2e.tex
+2020/07/21 | 9401 | macros/latex-dev/base/syntonly.dtx
+2020/07/21 | 2898 | macros/latex-dev/base/syntonly.ins
+2020/07/21 | 181670 | macros/latex-dev/base/syntonly.pdf
+2020/07/21 | 12521 | macros/latex-dev/base/testpage.tex
+2020/07/21 | 2738 | macros/latex-dev/base/tex2.txt
+2020/07/21 | 8493 | macros/latex-dev/base/texpert.txt
+2020/07/21 | 172216 | macros/latex-dev/base/tlc2.err
+2020/07/21 | 164947 | macros/latex-dev/base/tlc2.pdf
+2020/07/21 | 12120 | macros/latex-dev/base/tulm.fdd
+2020/07/21 | 3783 | macros/latex-dev/base/tulm.ins
+2020/07/21 | 156546 | macros/latex-dev/base/tulm.pdf
+2020/07/21 | 3208 | macros/latex-dev/base/unpack.ins
+2020/07/21 | 399035 | macros/latex-dev/base/usrguide.pdf
+2020/07/21 | 68428 | macros/latex-dev/base/usrguide.tex
+2020/07/21 | 89386 | macros/latex-dev/base/utf8ienc.dtx
+2020/07/21 | 330836 | macros/latex-dev/base/utf8ienc.pdf
+2020/07/21 | 10053 | macros/latex-dev/base/webcomp.err
+2020/07/21 | 136159 | macros/latex-dev/base/webcomp.pdf
+2020/07/21 | 26642104 | macros/latex-dev/base.zip
2020/05/27 | 8654 | macros/latex-dev/required/amsmath/amsbsy.dtx
2020/05/27 | 1466 | macros/latex-dev/required/amsmath/amsbsy.ins
2020/05/27 | 161323 | macros/latex-dev/required/amsmath/amsbsy.pdf
@@ -209295,104 +209311,104 @@
2020/05/27 | 428947 | macros/latex-dev/required/amsmath/testmath.pdf
2020/05/27 | 82371 | macros/latex-dev/required/amsmath/testmath.tex
2020/05/27 | 2612146 | macros/latex-dev/required/amsmath.zip
-2020/05/27 | 15737 | macros/latex-dev/required/graphics/cat.eps
-2020/05/27 | 32057 | macros/latex-dev/required/graphics/changes.txt
-2020/05/27 | 31608 | macros/latex-dev/required/graphics/color.dtx
-2020/05/27 | 200935 | macros/latex-dev/required/graphics/color.pdf
-2020/05/27 | 50759 | macros/latex-dev/required/graphics/drivers.dtx
-2020/05/27 | 263724 | macros/latex-dev/required/graphics/drivers.pdf
-2020/05/27 | 4062 | macros/latex-dev/required/graphics/epsfig.dtx
-2020/05/27 | 154485 | macros/latex-dev/required/graphics/epsfig.pdf
-2020/05/27 | 15430 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty
-2020/05/27 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins
-2020/05/27 | 66967 | macros/latex-dev/required/graphics/graphics.dtx
-2020/05/27 | 1128 | macros/latex-dev/required/graphics/graphics.ins
-2020/05/27 | 284646 | macros/latex-dev/required/graphics/graphics.pdf
-2020/05/27 | 32247 | macros/latex-dev/required/graphics/graphicx.dtx
-2020/05/27 | 232495 | macros/latex-dev/required/graphics/graphicx.pdf
-2020/05/27 | 310565 | macros/latex-dev/required/graphics/grfguide.pdf
-2020/05/27 | 39395 | macros/latex-dev/required/graphics/grfguide.tex
-2020/05/27 | 13799 | macros/latex-dev/required/graphics/keyval.dtx
-2020/05/27 | 222525 | macros/latex-dev/required/graphics/keyval.pdf
-2020/05/27 | 3814 | macros/latex-dev/required/graphics/lscape.dtx
-2020/05/27 | 150104 | macros/latex-dev/required/graphics/lscape.pdf
-2020/05/27 | 2092 | macros/latex-dev/required/graphics/README.md
-2020/05/27 | 20994 | macros/latex-dev/required/graphics/rotating.dtx
-2020/05/27 | 245867 | macros/latex-dev/required/graphics/rotating.pdf
-2020/05/27 | 162248 | macros/latex-dev/required/graphics/rotex.pdf
-2020/05/27 | 14575 | macros/latex-dev/required/graphics/rotex.tex
-2020/05/27 | 10651 | macros/latex-dev/required/graphics/trig.dtx
-2020/05/27 | 191692 | macros/latex-dev/required/graphics/trig.pdf
-2020/05/27 | 2500887 | macros/latex-dev/required/graphics.zip
-2020/05/27 | 14078 | macros/latex-dev/required/tools/afterpage.dtx
-2020/05/27 | 2540 | macros/latex-dev/required/tools/afterpage.ins
-2020/05/27 | 189848 | macros/latex-dev/required/tools/afterpage.pdf
-2020/05/27 | 11750 | macros/latex-dev/required/tools/array-2016-10-06.sty
-2020/05/27 | 12560 | macros/latex-dev/required/tools/array-2020-02-10.sty
-2020/05/27 | 124717 | macros/latex-dev/required/tools/array.dtx
-2020/05/27 | 481282 | macros/latex-dev/required/tools/array.pdf
-2020/05/27 | 59410 | macros/latex-dev/required/tools/bm.dtx
-2020/05/27 | 2526 | macros/latex-dev/required/tools/bm.ins
-2020/05/27 | 306775 | macros/latex-dev/required/tools/bm.pdf
-2020/05/27 | 53174 | macros/latex-dev/required/tools/calc.dtx
-2020/05/27 | 340877 | macros/latex-dev/required/tools/calc.pdf
-2020/05/27 | 56717 | macros/latex-dev/required/tools/changes.txt
-2020/05/27 | 12715 | macros/latex-dev/required/tools/dcolumn.dtx
-2020/05/27 | 199221 | macros/latex-dev/required/tools/dcolumn.pdf
-2020/05/27 | 6795 | macros/latex-dev/required/tools/delarray.dtx
-2020/05/27 | 183432 | macros/latex-dev/required/tools/delarray.pdf
-2020/05/27 | 10650 | macros/latex-dev/required/tools/enumerate.dtx
-2020/05/27 | 199049 | macros/latex-dev/required/tools/enumerate.pdf
-2020/05/27 | 4965 | macros/latex-dev/required/tools/fileerr.dtx
-2020/05/27 | 179548 | macros/latex-dev/required/tools/fileerr.pdf
-2020/05/27 | 10777 | macros/latex-dev/required/tools/fontsmpl.dtx
-2020/05/27 | 138025 | macros/latex-dev/required/tools/fontsmpl.pdf
-2020/05/27 | 39702 | macros/latex-dev/required/tools/ftnright.dtx
-2020/05/27 | 346379 | macros/latex-dev/required/tools/ftnright.pdf
-2020/05/27 | 11154 | macros/latex-dev/required/tools/hhline.dtx
-2020/05/27 | 175678 | macros/latex-dev/required/tools/hhline.pdf
-2020/05/27 | 2226 | macros/latex-dev/required/tools/indentfirst.dtx
-2020/05/27 | 144779 | macros/latex-dev/required/tools/indentfirst.pdf
-2020/05/27 | 30962 | macros/latex-dev/required/tools/layout.dtx
-2020/05/27 | 246931 | macros/latex-dev/required/tools/layout.pdf
-2020/05/27 | 72225 | macros/latex-dev/required/tools/longtable.dtx
-2020/05/27 | 2540 | macros/latex-dev/required/tools/longtable.ins
-2020/05/27 | 349927 | macros/latex-dev/required/tools/longtable.pdf
-2020/05/27 | 3281 | macros/latex-dev/required/tools/manifest.txt
-2020/05/27 | 29714 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
-2020/05/27 | 182355 | macros/latex-dev/required/tools/multicol.dtx
-2020/05/27 | 2578 | macros/latex-dev/required/tools/multicol.ins
-2020/05/27 | 491025 | macros/latex-dev/required/tools/multicol.pdf
-2020/05/27 | 8982 | macros/latex-dev/required/tools/rawfonts.dtx
-2020/05/27 | 135688 | macros/latex-dev/required/tools/rawfonts.pdf
-2020/05/27 | 1666 | macros/latex-dev/required/tools/README.md
-2020/05/27 | 9494 | macros/latex-dev/required/tools/shellesc.dtx
-2020/05/27 | 169757 | macros/latex-dev/required/tools/shellesc.pdf
-2020/05/27 | 29571 | macros/latex-dev/required/tools/showkeys.dtx
-2020/05/27 | 242786 | macros/latex-dev/required/tools/showkeys.pdf
-2020/05/27 | 5797 | macros/latex-dev/required/tools/somedefs.dtx
-2020/05/27 | 156511 | macros/latex-dev/required/tools/somedefs.pdf
-2020/05/27 | 35881 | macros/latex-dev/required/tools/tabularx.dtx
-2020/05/27 | 2537 | macros/latex-dev/required/tools/tabularx.ins
-2020/05/27 | 254205 | macros/latex-dev/required/tools/tabularx.pdf
-2020/05/27 | 43454 | macros/latex-dev/required/tools/theorem.dtx
-2020/05/27 | 322937 | macros/latex-dev/required/tools/theorem.pdf
-2020/05/27 | 5682 | macros/latex-dev/required/tools/tools.ins
-2020/05/27 | 68288 | macros/latex-dev/required/tools/tools-overview.pdf
-2020/05/27 | 5213 | macros/latex-dev/required/tools/tools-overview.tex
-2020/05/27 | 24649 | macros/latex-dev/required/tools/trace.dtx
-2020/05/27 | 212730 | macros/latex-dev/required/tools/trace.pdf
-2020/05/27 | 33864 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
-2020/05/27 | 103573 | macros/latex-dev/required/tools/varioref.dtx
-2020/05/27 | 2533 | macros/latex-dev/required/tools/varioref.ins
-2020/05/27 | 354736 | macros/latex-dev/required/tools/varioref.pdf
-2020/05/27 | 71290 | macros/latex-dev/required/tools/verbatim.dtx
-2020/05/27 | 302233 | macros/latex-dev/required/tools/verbatim.pdf
-2020/05/27 | 6236 | macros/latex-dev/required/tools/xr.dtx
-2020/05/27 | 163612 | macros/latex-dev/required/tools/xr.pdf
-2020/05/27 | 17862 | macros/latex-dev/required/tools/xspace.dtx
-2020/05/27 | 238007 | macros/latex-dev/required/tools/xspace.pdf
-2020/05/27 | 6871586 | macros/latex-dev/required/tools.zip
+2020/07/21 | 15737 | macros/latex-dev/required/graphics/cat.eps
+2020/07/21 | 32174 | macros/latex-dev/required/graphics/changes.txt
+2020/07/21 | 31608 | macros/latex-dev/required/graphics/color.dtx
+2020/07/21 | 200892 | macros/latex-dev/required/graphics/color.pdf
+2020/07/21 | 50759 | macros/latex-dev/required/graphics/drivers.dtx
+2020/07/21 | 263761 | macros/latex-dev/required/graphics/drivers.pdf
+2020/07/21 | 4062 | macros/latex-dev/required/graphics/epsfig.dtx
+2020/07/21 | 154479 | macros/latex-dev/required/graphics/epsfig.pdf
+2020/07/21 | 15430 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty
+2020/07/21 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins
+2020/07/21 | 66967 | macros/latex-dev/required/graphics/graphics.dtx
+2020/07/21 | 1128 | macros/latex-dev/required/graphics/graphics.ins
+2020/07/21 | 284616 | macros/latex-dev/required/graphics/graphics.pdf
+2020/07/21 | 32247 | macros/latex-dev/required/graphics/graphicx.dtx
+2020/07/21 | 232479 | macros/latex-dev/required/graphics/graphicx.pdf
+2020/07/21 | 310565 | macros/latex-dev/required/graphics/grfguide.pdf
+2020/07/21 | 39395 | macros/latex-dev/required/graphics/grfguide.tex
+2020/07/21 | 13799 | macros/latex-dev/required/graphics/keyval.dtx
+2020/07/21 | 222527 | macros/latex-dev/required/graphics/keyval.pdf
+2020/07/21 | 3886 | macros/latex-dev/required/graphics/lscape.dtx
+2020/07/21 | 150615 | macros/latex-dev/required/graphics/lscape.pdf
+2020/07/21 | 2092 | macros/latex-dev/required/graphics/README.md
+2020/07/21 | 20994 | macros/latex-dev/required/graphics/rotating.dtx
+2020/07/21 | 246010 | macros/latex-dev/required/graphics/rotating.pdf
+2020/07/21 | 162268 | macros/latex-dev/required/graphics/rotex.pdf
+2020/07/21 | 14575 | macros/latex-dev/required/graphics/rotex.tex
+2020/07/21 | 10651 | macros/latex-dev/required/graphics/trig.dtx
+2020/07/21 | 191692 | macros/latex-dev/required/graphics/trig.pdf
+2020/07/21 | 2501420 | macros/latex-dev/required/graphics.zip
+2020/07/21 | 14078 | macros/latex-dev/required/tools/afterpage.dtx
+2020/07/21 | 2540 | macros/latex-dev/required/tools/afterpage.ins
+2020/07/21 | 189846 | macros/latex-dev/required/tools/afterpage.pdf
+2020/07/21 | 11750 | macros/latex-dev/required/tools/array-2016-10-06.sty
+2020/07/21 | 12560 | macros/latex-dev/required/tools/array-2020-02-10.sty
+2020/07/21 | 125675 | macros/latex-dev/required/tools/array.dtx
+2020/07/21 | 483202 | macros/latex-dev/required/tools/array.pdf
+2020/07/21 | 59410 | macros/latex-dev/required/tools/bm.dtx
+2020/07/21 | 2526 | macros/latex-dev/required/tools/bm.ins
+2020/07/21 | 306728 | macros/latex-dev/required/tools/bm.pdf
+2020/07/21 | 53174 | macros/latex-dev/required/tools/calc.dtx
+2020/07/21 | 340889 | macros/latex-dev/required/tools/calc.pdf
+2020/07/21 | 57283 | macros/latex-dev/required/tools/changes.txt
+2020/07/21 | 12715 | macros/latex-dev/required/tools/dcolumn.dtx
+2020/07/21 | 199218 | macros/latex-dev/required/tools/dcolumn.pdf
+2020/07/21 | 6795 | macros/latex-dev/required/tools/delarray.dtx
+2020/07/21 | 183426 | macros/latex-dev/required/tools/delarray.pdf
+2020/07/21 | 10650 | macros/latex-dev/required/tools/enumerate.dtx
+2020/07/21 | 199047 | macros/latex-dev/required/tools/enumerate.pdf
+2020/07/21 | 4965 | macros/latex-dev/required/tools/fileerr.dtx
+2020/07/21 | 179839 | macros/latex-dev/required/tools/fileerr.pdf
+2020/07/21 | 10777 | macros/latex-dev/required/tools/fontsmpl.dtx
+2020/07/21 | 138027 | macros/latex-dev/required/tools/fontsmpl.pdf
+2020/07/21 | 39702 | macros/latex-dev/required/tools/ftnright.dtx
+2020/07/21 | 346683 | macros/latex-dev/required/tools/ftnright.pdf
+2020/07/21 | 11154 | macros/latex-dev/required/tools/hhline.dtx
+2020/07/21 | 175673 | macros/latex-dev/required/tools/hhline.pdf
+2020/07/21 | 2226 | macros/latex-dev/required/tools/indentfirst.dtx
+2020/07/21 | 144779 | macros/latex-dev/required/tools/indentfirst.pdf
+2020/07/21 | 30962 | macros/latex-dev/required/tools/layout.dtx
+2020/07/21 | 246917 | macros/latex-dev/required/tools/layout.pdf
+2020/07/21 | 72225 | macros/latex-dev/required/tools/longtable.dtx
+2020/07/21 | 2540 | macros/latex-dev/required/tools/longtable.ins
+2020/07/21 | 349888 | macros/latex-dev/required/tools/longtable.pdf
+2020/07/21 | 3281 | macros/latex-dev/required/tools/manifest.txt
+2020/07/21 | 29714 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
+2020/07/21 | 182355 | macros/latex-dev/required/tools/multicol.dtx
+2020/07/21 | 2578 | macros/latex-dev/required/tools/multicol.ins
+2020/07/21 | 491155 | macros/latex-dev/required/tools/multicol.pdf
+2020/07/21 | 8982 | macros/latex-dev/required/tools/rawfonts.dtx
+2020/07/21 | 135688 | macros/latex-dev/required/tools/rawfonts.pdf
+2020/07/21 | 1666 | macros/latex-dev/required/tools/README.md
+2020/07/21 | 9494 | macros/latex-dev/required/tools/shellesc.dtx
+2020/07/21 | 169765 | macros/latex-dev/required/tools/shellesc.pdf
+2020/07/21 | 29571 | macros/latex-dev/required/tools/showkeys.dtx
+2020/07/21 | 242771 | macros/latex-dev/required/tools/showkeys.pdf
+2020/07/21 | 5797 | macros/latex-dev/required/tools/somedefs.dtx
+2020/07/21 | 156506 | macros/latex-dev/required/tools/somedefs.pdf
+2020/07/21 | 35881 | macros/latex-dev/required/tools/tabularx.dtx
+2020/07/21 | 2537 | macros/latex-dev/required/tools/tabularx.ins
+2020/07/21 | 254169 | macros/latex-dev/required/tools/tabularx.pdf
+2020/07/21 | 43454 | macros/latex-dev/required/tools/theorem.dtx
+2020/07/21 | 323228 | macros/latex-dev/required/tools/theorem.pdf
+2020/07/21 | 5682 | macros/latex-dev/required/tools/tools.ins
+2020/07/21 | 68285 | macros/latex-dev/required/tools/tools-overview.pdf
+2020/07/21 | 5213 | macros/latex-dev/required/tools/tools-overview.tex
+2020/07/21 | 24649 | macros/latex-dev/required/tools/trace.dtx
+2020/07/21 | 212721 | macros/latex-dev/required/tools/trace.pdf
+2020/07/21 | 33864 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
+2020/07/21 | 107404 | macros/latex-dev/required/tools/varioref.dtx
+2020/07/21 | 2533 | macros/latex-dev/required/tools/varioref.ins
+2020/07/21 | 358075 | macros/latex-dev/required/tools/varioref.pdf
+2020/07/21 | 72142 | macros/latex-dev/required/tools/verbatim.dtx
+2020/07/21 | 302925 | macros/latex-dev/required/tools/verbatim.pdf
+2020/07/21 | 6236 | macros/latex-dev/required/tools/xr.dtx
+2020/07/21 | 163614 | macros/latex-dev/required/tools/xr.pdf
+2020/07/21 | 17862 | macros/latex-dev/required/tools/xspace.dtx
+2020/07/21 | 237978 | macros/latex-dev/required/tools/xspace.pdf
+2020/07/21 | 6879584 | macros/latex-dev/required/tools.zip
1999/05/03 | 8998 | macros/latex/exptl/delimtxt/delimtxt.dtx
1999/03/28 | 143 | macros/latex/exptl/delimtxt/delimtxt.ins
2006/03/21 | 55074 | macros/latex/exptl/delimtxt/delimtxt.pdf
@@ -249721,13 +249737,13 @@
1991/07/25 | 54800 | support/pictex-converter/pictexte.exe
1991/07/25 | 43757 | support/pictex-converter/pictexte.pas
1991/07/29 | 27946 | support/pictex-converter/PiCUNIX.PASCAL
-2020/04/19 | 603227 | support/pkfix-helper/encoding-samples.pdf
-2020/04/19 | 64329 | support/pkfix-helper/encoding-samples.tex
-2020/04/19 | 65647 | support/pkfix-helper/pkfix-helper
-2020/04/19 | 25103 | support/pkfix-helper/pkfix-helper.1
-2020/04/19 | 70727 | support/pkfix-helper/pkfix-helper.pdf
+2020/07/21 | 364761 | support/pkfix-helper/encoding-samples.pdf
+2020/07/21 | 64329 | support/pkfix-helper/encoding-samples.tex
+2020/07/21 | 71863 | support/pkfix-helper/pkfix-helper
+2020/07/21 | 26603 | support/pkfix-helper/pkfix-helper.1
+2020/07/21 | 86712 | support/pkfix-helper/pkfix-helper.pdf
2020/04/19 | 2261 | support/pkfix-helper/README
-2020/04/19 | 695191 | support/pkfix-helper.zip
+2020/07/21 | 430876 | support/pkfix-helper.zip
2012/04/18 | 27484 | support/pkfix/pkfix.pl
2012/04/18 | 9740 | support/pkfix/README
2012/04/18 | 12122 | support/pkfix.zip
@@ -255033,8 +255049,8 @@
2019/02/28 | 2446888 | systems/texlive/tlnet/archive/aurical.r15878.tar.xz
2019/02/28 | 1052 | systems/texlive/tlnet/archive/aurl.doc.r41853.tar.xz
2019/02/28 | 13764 | systems/texlive/tlnet/archive/aurl.r41853.tar.xz
-2019/02/28 | 115360 | systems/texlive/tlnet/archive/authoraftertitle.doc.r24863.tar.xz
-2019/02/28 | 780 | systems/texlive/tlnet/archive/authoraftertitle.r24863.tar.xz
+2020/07/21 | 114940 | systems/texlive/tlnet/archive/authoraftertitle.doc.r55889.tar.xz
+2020/07/21 | 820 | systems/texlive/tlnet/archive/authoraftertitle.r55889.tar.xz
2020/03/24 | 1209504 | systems/texlive/tlnet/archive/authorarchive.doc.r54512.tar.xz
2020/03/24 | 3660 | systems/texlive/tlnet/archive/authorarchive.r54512.tar.xz
2019/10/30 | 2508 | systems/texlive/tlnet/archive/authordate.doc.r52564.tar.xz
@@ -256184,6 +256200,8 @@
2019/02/28 | 186732 | systems/texlive/tlnet/archive/chapterfolder.doc.r15878.tar.xz
2019/02/28 | 1588 | systems/texlive/tlnet/archive/chapterfolder.r15878.tar.xz
2019/02/28 | 2884 | systems/texlive/tlnet/archive/chapterfolder.source.r15878.tar.xz
+2020/07/21 | 759032 | systems/texlive/tlnet/archive/charissil.doc.r55888.tar.xz
+2020/07/21 | 4108688 | systems/texlive/tlnet/archive/charissil.r55888.tar.xz
2019/02/28 | 800 | systems/texlive/tlnet/archive/charter.doc.r15878.tar.xz
2019/02/28 | 175180 | systems/texlive/tlnet/archive/charter.r15878.tar.xz
2019/02/28 | 169552 | systems/texlive/tlnet/archive/chbibref.doc.r17120.tar.xz
@@ -256571,7 +256589,7 @@
2020/05/29 | 1224 | systems/texlive/tlnet/archive/collection-bibtexextra.r55339.tar.xz
2020/04/15 | 936 | systems/texlive/tlnet/archive/collection-binextra.r54732.tar.xz
2020/03/04 | 596 | systems/texlive/tlnet/archive/collection-context.r54074.tar.xz
-2020/07/13 | 1816 | systems/texlive/tlnet/archive/collection-fontsextra.r55820.tar.xz
+2020/07/21 | 1820 | systems/texlive/tlnet/archive/collection-fontsextra.r55888.tar.xz
2020/03/04 | 560 | systems/texlive/tlnet/archive/collection-fontsrecommended.r54074.tar.xz
2020/03/04 | 524 | systems/texlive/tlnet/archive/collection-fontutils.r54074.tar.xz
2020/03/04 | 568 | systems/texlive/tlnet/archive/collection-formatsextra.r54074.tar.xz
@@ -257386,8 +257404,8 @@
2020/06/08 | 1180 | systems/texlive/tlnet/archive/denisbdoc.doc.r55474.tar.xz
2020/06/08 | 14872 | systems/texlive/tlnet/archive/denisbdoc.r55474.tar.xz
2020/06/08 | 21208 | systems/texlive/tlnet/archive/denisbdoc.source.r55474.tar.xz
-2020/02/04 | 196992 | systems/texlive/tlnet/archive/derivative.doc.r53654.tar.xz
-2020/02/04 | 6960 | systems/texlive/tlnet/archive/derivative.r53654.tar.xz
+2020/07/21 | 198008 | systems/texlive/tlnet/archive/derivative.doc.r55890.tar.xz
+2020/07/21 | 6972 | systems/texlive/tlnet/archive/derivative.r55890.tar.xz
2020/03/02 | 46400 | systems/texlive/tlnet/archive/detex.aarch64-linux.r53999.tar.xz
2020/03/02 | 48288 | systems/texlive/tlnet/archive/detex.amd64-freebsd.r53999.tar.xz
2020/03/02 | 44416 | systems/texlive/tlnet/archive/detex.amd64-netbsd.r53995.tar.xz
@@ -261161,8 +261179,8 @@
2019/02/28 | 3228 | systems/texlive/tlnet/archive/lua-visual-debug.r49634.tar.xz
2020/06/02 | 94000 | systems/texlive/tlnet/archive/luavlna.doc.r55391.tar.xz
2020/06/02 | 7336 | systems/texlive/tlnet/archive/luavlna.r55391.tar.xz
-2019/09/21 | 101988 | systems/texlive/tlnet/archive/luaxml.doc.r52137.tar.xz
-2019/09/21 | 28332 | systems/texlive/tlnet/archive/luaxml.r52137.tar.xz
+2020/07/21 | 103144 | systems/texlive/tlnet/archive/luaxml.doc.r55891.tar.xz
+2020/07/21 | 28400 | systems/texlive/tlnet/archive/luaxml.r55891.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/lwarp.aarch64-linux.r46208.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/lwarp.amd64-freebsd.r43292.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/lwarp.amd64-netbsd.r43292.tar.xz
@@ -265169,8 +265187,8 @@
2020/03/24 | 280 | systems/texlive/tlnet/archive/texlive-cz.r54496.tar.xz
2020/03/29 | 1338300 | systems/texlive/tlnet/archive/texlive-de.doc.r54604.tar.xz
2020/03/29 | 272 | systems/texlive/tlnet/archive/texlive-de.r54604.tar.xz
-2020/07/19 | 167528 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55864.tar.xz
-2020/07/19 | 392 | systems/texlive/tlnet/archive/texlive-docindex.r55864.tar.xz
+2020/07/21 | 167624 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55884.tar.xz
+2020/07/21 | 392 | systems/texlive/tlnet/archive/texlive-docindex.r55884.tar.xz
2020/04/16 | 1891392 | systems/texlive/tlnet/archive/texlive-en.doc.r54755.tar.xz
2020/04/16 | 272 | systems/texlive/tlnet/archive/texlive-en.r54755.tar.xz
2020/03/22 | 3090144 | systems/texlive/tlnet/archive/texlive-es.doc.r54465.tar.xz
@@ -266578,9 +266596,9 @@
2019/02/28 | 1716 | systems/texlive/tlnet/archive/xellipsis.r47546.tar.xz
2019/02/28 | 7092 | systems/texlive/tlnet/archive/xellipsis.source.r47546.tar.xz
2020/05/18 | 987500 | systems/texlive/tlnet/archive/xepersian.doc.r55194.tar.xz
-2020/06/05 | 693336 | systems/texlive/tlnet/archive/xepersian-hm.doc.r55417.tar.xz
-2020/06/05 | 5688 | systems/texlive/tlnet/archive/xepersian-hm.r55417.tar.xz
-2020/06/05 | 6664 | systems/texlive/tlnet/archive/xepersian-hm.source.r55417.tar.xz
+2020/07/21 | 692804 | systems/texlive/tlnet/archive/xepersian-hm.doc.r55892.tar.xz
+2020/07/21 | 5700 | systems/texlive/tlnet/archive/xepersian-hm.r55892.tar.xz
+2020/07/21 | 6652 | systems/texlive/tlnet/archive/xepersian-hm.source.r55892.tar.xz
2020/05/18 | 58564 | systems/texlive/tlnet/archive/xepersian.r55194.tar.xz
2020/05/18 | 74624 | systems/texlive/tlnet/archive/xepersian.source.r55194.tar.xz
2019/08/20 | 614800 | systems/texlive/tlnet/archive/xesearch.doc.r51908.tar.xz
@@ -266892,16 +266910,16 @@
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2020/06/13 | 105829 | systems/texlive/tlnet/install-tl
-2020/07/20 | 5500745 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/20 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/21 | 5500758 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2020/05/31 | 4770 | systems/texlive/tlnet/install-tl-windows.bat
-2020/07/20 | 19379545 | systems/texlive/tlnet/install-tl-windows.exe
-2020/07/20 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/20 | 24269253 | systems/texlive/tlnet/install-tl.zip
-2020/07/20 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/21 | 19379565 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/21 | 24269253 | systems/texlive/tlnet/install-tl.zip
+2020/07/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
2020/03/05 | 1215 | systems/texlive/tlnet/README.md
2020/04/06 | 5961 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
2016/04/12 | 600 | systems/texlive/tlnet/tlpkg/gpg/random_seed
@@ -266957,12 +266975,12 @@
2020/05/17 | 20322 | systems/texlive/tlnet/tlpkg/TeXLive/TLCrypto.pm
2020/05/03 | 4786 | systems/texlive/tlnet/tlpkg/TeXLive/TLDownload.pm
2017/11/14 | 27560 | systems/texlive/tlnet/tlpkg/TeXLive/TLPaper.pm
-2020/07/20 | 16334930 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/20 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/21 | 16343394 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/05/13 | 86417 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2020/07/20 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/07/20 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/20 | 2207224 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/21 | 2207516 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2020/04/15 | 58761 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2020/03/20 | 41736 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2020/05/11 | 15010 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -271441,7 +271459,7 @@
2020/02/04 | 281488 | systems/win32/miktex/tm/packages/filehook.tar.lzma
2012/12/04 | 924573 | systems/win32/miktex/tm/packages/fileinfo.tar.lzma
2011/09/21 | 281409 | systems/win32/miktex/tm/packages/filemod.tar.lzma
-2020/07/20 | 541654 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/21 | 541654 | systems/win32/miktex/tm/packages/files.csv.lzma
2001/05/14 | 5617 | systems/win32/miktex/tm/packages/finbib.tar.lzma
2015/10/20 | 44379 | systems/win32/miktex/tm/packages/findhyph.tar.lzma
2011/10/21 | 89323 | systems/win32/miktex/tm/packages/fink.tar.lzma
@@ -272601,9 +272619,9 @@
2018/01/12 | 157226 | systems/win32/miktex/tm/packages/miktex-zip-bin-x64.tar.lzma
2020/06/30 | 39315 | systems/win32/miktex/tm/packages/miktex-zlib-bin-2.9.tar.lzma
2020/06/30 | 43053 | systems/win32/miktex/tm/packages/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/20 | 201869 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/07/20 | 1209106 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/20 | 1127569 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/21 | 201875 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/21 | 1208500 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/21 | 1127442 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
2020/06/30 | 13117 | systems/win32/miktex/tm/packages/miktex-zzip-bin-2.9.tar.lzma
2020/06/30 | 14123 | systems/win32/miktex/tm/packages/miktex-zzip-bin-x64-2.9.tar.lzma
2016/07/15 | 35914 | systems/win32/miktex/tm/packages/mil3.tar.lzma
@@ -272757,192 +272775,192 @@
2018/04/09 | 400132 | systems/win32/miktex/tm/packages/newunicodechar.tar.lzma
2011/09/19 | 101312 | systems/win32/miktex/tm/packages/newvbtm.tar.lzma
2019/09/11 | 231430 | systems/win32/miktex/tm/packages/newverbs.tar.lzma
-2020/07/20 | 541029 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/07/20 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/20 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/20 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/20 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/07/20 | 28618 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/07/20 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/20 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/07/20 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/07/20 | 49697 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/07/20 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/20 | 84388 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/07/20 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/07/20 | 65603 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/20 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/20 | 27036 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/20 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/07/20 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/20 | 392544 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/07/20 | 32135 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2020/07/20 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/07/20 | 72070 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/07/20 | 79201 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/20 | 203503 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/20 | 223962 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/07/20 | 169763 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/07/20 | 184501 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/07/20 | 51923 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/07/20 | 58610 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/20 | 20769 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/20 | 22970 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/07/20 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/20 | 460365 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/20 | 45499 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/20 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/20 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/07/20 | 310933 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/20 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/07/20 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/07/20 | 115819 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/07/20 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/07/20 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/07/20 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/07/20 | 95314 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/07/20 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/20 | 43304 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/20 | 48050 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2020/07/20 | 46286 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/20 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/20 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/20 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/20 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/07/20 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/07/20 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/20 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/20 | 68821 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/07/20 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/07/20 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/07/20 | 281692 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/20 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/20 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/07/20 | 100971 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2020/07/20 | 117132 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/20 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/20 | 72601 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/20 | 94265 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/20 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/07/20 | 58971 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/20 | 65576 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/07/20 | 462361 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/20 | 550403 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/20 | 141816 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/07/20 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/07/20 | 94529 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/20 | 109018 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/07/20 | 15924 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/07/20 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/20 | 27944 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/20 | 29632 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/07/20 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/20 | 676984 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/20 | 500485 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/07/20 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/20 | 544669 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/20 | 586878 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/20 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/20 | 102565 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/20 | 1751875 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2020/07/20 | 2028474 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/07/20 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/07/20 | 73670 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/20 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/20 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/07/20 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2020/07/20 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/07/20 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/07/20 | 187110 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/07/20 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/20 | 305169 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/07/20 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/20 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/07/20 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/07/20 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/07/20 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/07/20 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/07/20 | 159286 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/20 | 179907 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/07/20 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/07/20 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/20 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/20 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/20 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/20 | 35050 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/07/20 | 57247 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/20 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/20 | 63349 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/07/20 | 69874 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/20 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/20 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/20 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2020/07/20 | 210651 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/07/20 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/20 | 35315 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/20 | 39509 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/20 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/20 | 327001 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/07/20 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/07/20 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/20 | 194056 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/07/20 | 207509 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/07/20 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/20 | 78145 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/07/20 | 87406 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2020/07/20 | 922565 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/07/20 | 1021924 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/20 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/07/20 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/20 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/20 | 36862 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/07/20 | 63501 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/20 | 71535 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/07/20 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/07/20 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/07/20 | 1193675 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/20 | 1327713 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2020/07/20 | 42063 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/07/20 | 51416 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/20 | 76758 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/20 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/07/20 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/20 | 82761 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/07/20 | 26879 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2020/07/20 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/07/20 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/20 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/20 | 63494 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/07/20 | 69135 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/07/20 | 151032 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/07/20 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/07/20 | 77602 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/20 | 88016 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/20 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/07/20 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/20 | 2534429 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/20 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/07/20 | 55577 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/20 | 61817 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/07/20 | 33138 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/07/20 | 36966 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/20 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/20 | 32402 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2020/07/20 | 66119 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/20 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/07/20 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/20 | 279310 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/20 | 597673 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2020/07/20 | 638878 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/20 | 38946 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/07/20 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/20 | 201984 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/20 | 1208462 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/07/20 | 1128295 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/07/20 | 13135 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/07/20 | 14114 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/21 | 541029 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/21 | 59172 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/21 | 67326 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/21 | 957368 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/21 | 1060543 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/21 | 28621 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/21 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/21 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/21 | 34705 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/21 | 49695 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/21 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/21 | 84386 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/21 | 93648 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/21 | 65604 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/21 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/21 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/21 | 30877 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/21 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/21 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/21 | 32136 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/21 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/21 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/21 | 79200 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/21 | 203502 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/21 | 223961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/21 | 169761 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/21 | 184500 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/21 | 51922 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/21 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/21 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/21 | 22967 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/21 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/21 | 460368 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/21 | 45499 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/21 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/21 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/21 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/21 | 40788 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/21 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/21 | 115820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/21 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/21 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/21 | 1409380 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/21 | 95314 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/21 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/21 | 43306 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/21 | 48051 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/21 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/21 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/21 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/21 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/21 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/21 | 151907 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/21 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/21 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/21 | 68821 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/21 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/21 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/21 | 281691 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/21 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/21 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/21 | 100973 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/21 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/21 | 63525 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/21 | 72602 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/21 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/21 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/21 | 58972 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/21 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/21 | 462360 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/21 | 550401 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/21 | 141818 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/21 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/21 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/21 | 109018 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/21 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/21 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/21 | 27942 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/21 | 29633 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/21 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/21 | 676984 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/21 | 500485 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/21 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/21 | 544671 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/21 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/21 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/21 | 102564 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/21 | 1751873 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/21 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/21 | 67271 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/21 | 73666 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/21 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/21 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/21 | 7556 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/21 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/21 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/21 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/21 | 269062 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/21 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/21 | 96908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/21 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/21 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/21 | 88779 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/21 | 170233 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/21 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/21 | 159288 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/21 | 179906 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/21 | 196477 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/21 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/21 | 84818 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/21 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/21 | 31242 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/21 | 35050 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/21 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/21 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/21 | 63351 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/21 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/21 | 45735 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/21 | 52207 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/21 | 193350 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/21 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/21 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/21 | 35314 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/21 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/21 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/21 | 327004 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/21 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/21 | 187766 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/21 | 194054 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/21 | 207506 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/21 | 243026 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/21 | 78143 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/21 | 87408 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/21 | 922567 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/21 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/21 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/21 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/21 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/21 | 36863 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/21 | 63503 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/21 | 71535 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/21 | 42503 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/21 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/21 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/21 | 1327712 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/21 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/21 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/21 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/21 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/21 | 82831 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/21 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/21 | 26879 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/21 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/21 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/21 | 17728 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/21 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/21 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/21 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/21 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/21 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/21 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/21 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/21 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/21 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/21 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/21 | 55578 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/21 | 61819 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/21 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/21 | 36963 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/21 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/21 | 32403 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/21 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/21 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/21 | 249731 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/21 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/21 | 597670 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/21 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/21 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/21 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/21 | 201979 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/21 | 1208228 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/21 | 1127537 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/21 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/21 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
2019/03/12 | 1412 | systems/win32/miktex/tm/packages/nextpage.tar.lzma
-2020/07/20 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
2018/07/06 | 145915 | systems/win32/miktex/tm/packages/nexus-otf.tar.lzma
2017/03/30 | 191149 | systems/win32/miktex/tm/packages/nfssext-cfr.tar.lzma
2012/12/20 | 612251 | systems/win32/miktex/tm/packages/nicefilelist.tar.lzma
@@ -273259,7 +273277,7 @@
2008/11/07 | 35981 | systems/win32/miktex/tm/packages/prettyref.tar.lzma
2017/07/26 | 201385 | systems/win32/miktex/tm/packages/preview.tar.lzma
2019/06/20 | 375963 | systems/win32/miktex/tm/packages/prftree.tar.lzma
-2020/07/20 | 845 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/21 | 845 | systems/win32/miktex/tm/packages/pr.ini
2010/09/27 | 248469 | systems/win32/miktex/tm/packages/printlen.tar.lzma
2008/06/17 | 77313 | systems/win32/miktex/tm/packages/proba.tar.lzma
2017/07/12 | 988486 | systems/win32/miktex/tm/packages/probsoln.tar.lzma
@@ -274408,7 +274426,7 @@
2020/07/18 | 4918556 | systems/win32/w32tex/aleph-w32.tar.xz
2020/07/11 | 66314732 | systems/win32/w32tex/biblatex-biber.tar.xz
2016/12/13 | 65971452 | systems/win32/w32tex/cbfonts.tar.xz
-2020/07/19 | 686760 | systems/win32/w32tex/ChangeLog
+2020/07/20 | 687664 | systems/win32/w32tex/ChangeLog
2009/08/03 | 141221 | systems/win32/w32tex/ChangeLog.0
2009/08/03 | 221890 | systems/win32/w32tex/ChangeLog.1
2009/08/03 | 116462 | systems/win32/w32tex/ChangeLog.2
@@ -274416,7 +274434,7 @@
2017/06/24 | 644754 | systems/win32/w32tex/ChangeLog.4
2020/07/09 | 23424956 | systems/win32/w32tex/cjkzr.tar.xz
2013/04/27 | 15858676 | systems/win32/w32tex/context-doc.tar.xz
-2020/07/19 | 140448940 | systems/win32/w32tex/context.tar.xz
+2020/07/20 | 140450036 | systems/win32/w32tex/context.tar.xz
2020/06/13 | 910472 | systems/win32/w32tex/cweb-w32.tar.xz
2020/03/02 | 6281164 | systems/win32/w32tex/datetime2.tar.xz
2020/06/13 | 845760 | systems/win32/w32tex/dvi2ps-w32.tar.xz
@@ -274428,11 +274446,11 @@
2020/06/13 | 17351036 | systems/win32/w32tex/gregorio-w32.tar.xz
2009/08/03 | 1072620 | systems/win32/w32tex/gtftex.zip
2020/07/14 | 1830716 | systems/win32/w32tex/jtex-w32.tar.xz
-2020/07/18 | 41918280 | systems/win32/w32tex/latex-dev.tar.xz
+2020/07/20 | 41921232 | systems/win32/w32tex/latex-dev.tar.xz
2020/05/30 | 29268960 | systems/win32/w32tex/latex.tar.xz
2020/06/13 | 996116 | systems/win32/w32tex/lcdf-typetools-w32.tar.xz
2020/07/15 | 401021176 | systems/win32/w32tex/ltxpkgdocs.tar.xz
-2020/07/18 | 33723648 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/07/20 | 33737372 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/07/14 | 3836652 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
2020/07/14 | 3800308 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
2020/07/14 | 3835448 | systems/win32/w32tex/luajittex-w32.tar.xz
@@ -274449,21 +274467,21 @@
2020/06/22 | 9762648 | systems/win32/w32tex/newtxpx-boondoxfonts.tar.xz
2020/06/13 | 1235252 | systems/win32/w32tex/omegaj-w32.tar.xz
2020/03/01 | 355876 | systems/win32/w32tex/otfbeta.tar.xz
-2020/07/18 | 20732196 | systems/win32/w32tex/pdftex-w32.tar.xz
-2020/07/15 | 81485156 | systems/win32/w32tex/pgfcontrib.tar.xz
+2020/07/20 | 20776948 | systems/win32/w32tex/pdftex-w32.tar.xz
+2020/07/20 | 81485772 | systems/win32/w32tex/pgfcontrib.tar.xz
2015/01/26 | 189072 | systems/win32/w32tex/plain2-2.54-w32.tar.xz
2020/05/26 | 2823676 | systems/win32/w32tex/platex.tar.xz
2020/03/20 | 1598792 | systems/win32/w32tex/pmx.tar.xz
2020/06/13 | 1169008 | systems/win32/w32tex/pstoedit-w32.tar.xz
2020/07/15 | 274409012 | systems/win32/w32tex/pstricks.tar.xz
2020/06/13 | 517656 | systems/win32/w32tex/psutils-w32.tar.xz
-2020/07/19 | 6477172 | systems/win32/w32tex/ptex-ng-w32.tar.xz
-2020/07/18 | 10497988 | systems/win32/w32tex/ptex-w32.tar.xz
+2020/07/20 | 6477592 | systems/win32/w32tex/ptex-ng-w32.tar.xz
+2020/07/20 | 10483700 | systems/win32/w32tex/ptex-w32.tar.xz
2020/04/10 | 1784316 | systems/win32/w32tex/qpdf-w32.tar.xz
2019/04/15 | 499188 | systems/win32/w32tex/sam2p-w32.tar.xz
2020/01/24 | 24929772 | systems/win32/w32tex/t1fonts.tar.xz
2020/01/19 | 135584 | systems/win32/w32tex/t1utils-w32.tar.xz
-2020/07/18 | 2549304 | systems/win32/w32tex/tex4htk-w32.tar.xz
+2020/07/20 | 2556540 | systems/win32/w32tex/tex4htk-w32.tar.xz
2018/06/20 | 15940044 | systems/win32/w32tex/tex-gyre.tar.xz
2020/06/26 | 4485732 | systems/win32/w32tex/texinfo-w32.tar.xz
2020/04/20 | 2050855 | systems/win32/w32tex/texinstwin.zip
@@ -274480,11 +274498,11 @@
2020/01/19 | 5856 | systems/win32/w32tex/txtutil.tar.xz
2013/04/08 | 71588 | systems/win32/w32tex/ums.tar.xz
2012/05/28 | 233472 | systems/win32/w32tex/unzip.exe
-2020/07/18 | 8489160 | systems/win32/w32tex/uptex-w32.tar.xz
+2020/07/20 | 8502552 | systems/win32/w32tex/uptex-w32.tar.xz
2013/04/08 | 722652 | systems/win32/w32tex/utf.tar.xz
2013/04/08 | 13748 | systems/win32/w32tex/vf-n2bk.tar.xz
2020/03/27 | 38319492 | systems/win32/w32tex/w32tex-src.tar.xz
-2020/07/14 | 99293756 | systems/win32/w32tex/web2c-lib.tar.xz
+2020/07/20 | 99293960 | systems/win32/w32tex/web2c-lib.tar.xz
2020/07/12 | 44088388 | systems/win32/w32tex/web2c-w32.tar.xz
2020/07/07 | 810800 | systems/win32/w32tex/win64/aleph-w64.tar.xz
2019/12/09 | 22317480 | systems/win32/w32tex/win64/biblatex-biber-w64.tar.xz
@@ -274511,23 +274529,23 @@
2020/06/13 | 376316 | systems/win32/w32tex/win64/mftrace-w64.tar.xz
2020/01/18 | 362540 | systems/win32/w32tex/win64/m-tx-w64.tar.xz
2020/06/13 | 406920 | systems/win32/w32tex/win64/omegaj-w64.tar.xz
-2020/07/12 | 6329628 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
+2020/07/20 | 6331980 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
2015/01/26 | 41440 | systems/win32/w32tex/win64/plain2-2.54-w64.tar.xz
2020/03/20 | 557532 | systems/win32/w32tex/win64/pmx-w64.tar.xz
2020/06/13 | 789904 | systems/win32/w32tex/win64/pstoedit-w64.tar.xz
2020/06/13 | 385996 | systems/win32/w32tex/win64/psutils-w64.tar.xz
-2020/07/19 | 1706900 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
-2020/07/12 | 1879456 | systems/win32/w32tex/win64/ptex-w64.tar.xz
+2020/07/20 | 1706948 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
+2020/07/20 | 1880540 | systems/win32/w32tex/win64/ptex-w64.tar.xz
2020/01/18 | 40736 | systems/win32/w32tex/win64/t1utils-w64.tar.xz
2020/06/13 | 419688 | systems/win32/w32tex/win64/tex4htk-w64.tar.xz
2020/01/18 | 96788 | systems/win32/w32tex/win64/tiff2png-w64.tar.xz
2020/06/13 | 734084 | systems/win32/w32tex/win64/ttf2pk-w64.tar.xz
2020/06/13 | 695476 | systems/win32/w32tex/win64/ttf2pt1-w64.tar.xz
2020/01/18 | 42768 | systems/win32/w32tex/win64/txtutil-w64.tar.xz
-2020/07/12 | 1808732 | systems/win32/w32tex/win64/uptex-w64.tar.xz
+2020/07/20 | 1808868 | systems/win32/w32tex/win64/uptex-w64.tar.xz
2020/07/12 | 3392552 | systems/win32/w32tex/win64/web2c-w64.tar.xz
-2020/07/19 | 11007908 | systems/win32/w32tex/win64/xetex-w64.tar.xz
-2020/07/19 | 48814344 | systems/win32/w32tex/xetex-w32.tar.xz
+2020/07/20 | 11008088 | systems/win32/w32tex/win64/xetex-w64.tar.xz
+2020/07/20 | 48810648 | systems/win32/w32tex/xetex-w32.tar.xz
2020/05/29 | 2936068 | systems/win32/w32tex/xindy-w32.tar.xz
2013/11/19 | 11356248 | systems/win32/w32tex/xymtex.tar.xz
2016/09/09 | 4334636 | systems/win32/w32tex/xypic.tar.xz
@@ -274624,7 +274642,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2020/07/21 | 186 | timestamp
+2020/07/22 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2017/06/30 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index 1a0feb4806..635472ede2 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 9212bb5859..bb69dd4499 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,230 +1,693 @@
+2020/07/21 | 9810 | macros/latex-dev/base/ltnews21.tex
+2020/07/21 | 980265 | macros/latex-dev/base/ltnews.pdf
+2020/07/21 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/21 | 96908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/21 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/21 | 957368 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/21 | 9562 | macros/latex-dev/base/ltcntrl.dtx
+2020/07/21 | 95314 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/21 | 9494 | macros/latex-dev/required/tools/shellesc.dtx
+2020/07/21 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/21 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/21 | 9401 | macros/latex-dev/base/syntonly.dtx
+2020/07/21 | 9374 | macros/latex-dev/base/preload.dtx
+2020/07/21 | 93648 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/21 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/21 | 922567 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/21 | 914727 | macros/latex-dev/base/lthooks-code.pdf
+2020/07/21 | 9068 | macros/latex-dev/base/lppl-1-0.txt
+2020/07/21 | 90413 | macros/latex-dev/base/fntguide.tex
+2020/07/21 | 899441 | macros/latex/contrib/achemso.zip
+2020/07/21 | 8982 | macros/latex-dev/required/tools/rawfonts.dtx
+2020/07/21 | 89720 | macros/latex-dev/base/slides.dtx
+2020/07/21 | 89386 | macros/latex-dev/base/utf8ienc.dtx
+2020/07/21 | 88779 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/21 | 8864 | macros/latex-dev/base/ltnews17.tex
+2020/07/21 | 88411 | macros/latex-dev/base/lttextcomp.dtx
+2020/07/21 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/21 | 8770 | macros/latex-dev/base/format.ins
+2020/07/21 | 87408 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/21 | 8737 | macros/latex-dev/base/ltthm.dtx
+2020/07/21 | 86712 | support/pkfix-helper/pkfix-helper.pdf
+2020/07/21 | 8632 | macros/latex-dev/base/oldlfont.dtx
+2020/07/21 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/21 | 8493 | macros/latex-dev/base/texpert.txt
+2020/07/21 | 84818 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/21 | 845 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/21 | 84386 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/21 | 82831 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/21 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/21 | 820 | systems/texlive/tlnet/archive/authoraftertitle.r55889.tar.xz
+2020/07/21 | 8100 | macros/latex-dev/base/ltnews.tex
+2020/07/21 | 8014 | macros/latex-dev/base/ltexpl.dtx
+2020/07/21 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/21 | 79200 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/21 | 79110 | macros/latex-dev/base/ltfssbas.dtx
+2020/07/21 | 78143 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/21 | 776547 | macros/latex/contrib/horoscop.zip
+2020/07/21 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/21 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/21 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/21 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/21 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/21 | 759032 | systems/texlive/tlnet/archive/charissil.doc.r55888.tar.xz
+2020/07/21 | 7556 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/21 | 7526 | macros/latex-dev/base/ltxguide.cls
+2020/07/21 | 74018 | macros/latex/contrib/semantex/semantex.tex
+2020/07/21 | 73666 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/21 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/21 | 7326 | macros/latex-dev/base/ltnews20.tex
+2020/07/21 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/21 | 72602 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/21 | 723515 | macros/latex-dev/base/ltshipout-code.pdf
+2020/07/21 | 7222 | macros/latex-dev/base/exscale.dtx
+2020/07/21 | 72225 | macros/latex-dev/required/tools/longtable.dtx
+2020/07/21 | 72142 | macros/latex-dev/required/tools/verbatim.dtx
+2020/07/21 | 72071 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/21 | 7200 | macros/latex-dev/base/sample2e.tex
+2020/07/21 | 71863 | support/pkfix-helper/pkfix-helper
+2020/07/21 | 71535 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/21 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/21 | 701179 | macros/latex/contrib/horoscop/horoscop.pdf
+2020/07/21 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/21 | 69854 | macros/latex-dev/base/ltfssini.dtx
+2020/07/21 | 6972 | systems/texlive/tlnet/archive/derivative.r55890.tar.xz
+2020/07/21 | 6961126 | install/macros/latex-dev/required/latex-tools-dev.tds.zip
+2020/07/21 | 692804 | systems/texlive/tlnet/archive/xepersian-hm.doc.r55892.tar.xz
+2020/07/21 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/21 | 69051 | macros/latex-dev/base/clsguide.tex
+2020/07/21 | 68821 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/21 | 6879584 | macros/latex-dev/required/tools.zip
+2020/07/21 | 6872 | macros/latex-dev/base/ltnews13.tex
+2020/07/21 | 68428 | macros/latex-dev/base/usrguide.tex
+2020/07/21 | 68285 | macros/latex-dev/required/tools/tools-overview.pdf
+2020/07/21 | 6795 | macros/latex-dev/required/tools/delarray.dtx
+2020/07/21 | 677281 | macros/latex-dev/base/ltfilehook-code.pdf
+2020/07/21 | 676984 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/21 | 6764 | macros/latex-dev/base/slides.ins
+2020/07/21 | 67333 | macros/latex-dev/base/ltfsstrc.dtx
+2020/07/21 | 67326 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/21 | 67271 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/21 | 6715 | macros/latex-dev/base/latexsym.dtx
+2020/07/21 | 66967 | macros/latex-dev/required/graphics/graphics.dtx
+2020/07/21 | 6654 | macros/latex-dev/base/alltt.dtx
+2020/07/21 | 6652 | systems/texlive/tlnet/archive/xepersian-hm.source.r55892.tar.xz
+2020/07/21 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/21 | 65604 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/21 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/21 | 64329 | support/pkfix-helper/encoding-samples.tex
+2020/07/21 | 6431 | macros/latex/contrib/achemso/achemso.ins
+2020/07/21 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/21 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/21 | 63643 | macros/latex-dev/base/ltluatex.dtx
+2020/07/21 | 6363 | macros/latex-dev/base/newlfont.dtx
+2020/07/21 | 63525 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/21 | 63503 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/21 | 63495 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/21 | 63351 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/21 | 631083 | macros/latex-dev/base/doc.pdf
+2020/07/21 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/21 | 6274 | macros/latex-dev/base/ltnews14.tex
+2020/07/21 | 62436 | macros/latex-dev/base/letter.dtx
+2020/07/21 | 6236 | macros/latex-dev/required/tools/xr.dtx
+2020/07/21 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/21 | 61819 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/21 | 61221 | macros/latex-dev/base/ltfssdcl.dtx
+2020/07/21 | 60334 | macros/latex-dev/base/fontdef.dtx
+2020/07/21 | 597670 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/21 | 59410 | macros/latex-dev/required/tools/bm.dtx
+2020/07/21 | 59172 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/21 | 58972 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/21 | 588067 | macros/latex-dev/base/lthooks-doc.pdf
+2020/07/21 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/21 | 5865 | macros/latex-dev/base/ltidxglo.dtx
+2020/07/21 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/21 | 5854 | macros/latex-dev/base/ltpar.dtx
+2020/07/21 | 5840 | macros/latex-dev/base/ltnews15.tex
+2020/07/21 | 5797 | macros/latex-dev/required/tools/somedefs.dtx
+2020/07/21 | 5777 | macros/latex-dev/base/ltnews16.tex
+2020/07/21 | 57722 | macros/latex-dev/base/ltdefns.dtx
+2020/07/21 | 57283 | macros/latex-dev/required/tools/changes.txt
+2020/07/21 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/21 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/21 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/21 | 5716 | macros/latex-dev/base/inputenc.ins
+2020/07/21 | 5700 | systems/texlive/tlnet/archive/xepersian-hm.r55892.tar.xz
+2020/07/21 | 5696 | macros/latex-dev/base/ltnews08.tex
+2020/07/21 | 5682 | macros/latex-dev/required/tools/tools.ins
+2020/07/21 | 5660 | macros/latex-dev/base/ltnews10.tex
+2020/07/21 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/21 | 5609 | macros/latex-dev/base/ltnews05.tex
+2020/07/21 | 55578 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/21 | 5530 | macros/latex-dev/base/ltnews11.tex
+2020/07/21 | 5515 | macros/latex-dev/base/graphpap.dtx
+2020/07/21 | 5507 | macros/latex-dev/base/ltnews27.tex
+2020/07/21 | 5507 | macros/latex-dev/base/ltnews04.tex
+2020/07/21 | 550401 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/21 | 5500758 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/21 | 5474 | macros/latex-dev/base/ltnews25.tex
+2020/07/21 | 544671 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/21 | 5426 | macros/latex-dev/base/ltnews07.tex
+2020/07/21 | 5418 | macros/latex-dev/base/ltnews12.tex
+2020/07/21 | 541654 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/21 | 541029 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/21 | 5391 | macros/latex-dev/base/ltnews06.tex
+2020/07/21 | 5354 | macros/latex-dev/base/latexrelease.ins
+2020/07/21 | 53174 | macros/latex-dev/required/tools/calc.dtx
+2020/07/21 | 5294 | macros/latex-dev/base/ltnews09.tex
+2020/07/21 | 5284 | macros/latex-dev/base/ltnews02.tex
+2020/07/21 | 52814 | macros/latex-dev/base/encguide.tex
+2020/07/21 | 5275 | macros/latex-dev/base/cmextra.ins
+2020/07/21 | 52532 | macros/latex-dev/base/lb2.err
+2020/07/21 | 5239 | macros/latex-dev/base/ltnews01.tex
+2020/07/21 | 52207 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/21 | 5213 | macros/latex-dev/required/tools/tools-overview.tex
+2020/07/21 | 520851 | macros/latex-dev/base/classes.pdf
+2020/07/21 | 5201 | macros/latex-dev/base/ltnews03.tex
+2020/07/21 | 51922 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/21 | 519192 | macros/latex-dev/base/ltnews32.pdf
+2020/07/21 | 515534 | macros/latex/contrib/achemso/achemso.pdf
+2020/07/21 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/21 | 51314 | macros/latex-dev/base/ltfloat.dtx
+2020/07/21 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/21 | 512167 | macros/latex-dev/base/ltfilehook-doc.pdf
+2020/07/21 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/21 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/21 | 50893 | macros/latex-dev/base/ltpictur.dtx
+2020/07/21 | 50759 | macros/latex-dev/required/graphics/drivers.dtx
+2020/07/21 | 5044 | macros/latex-dev/base/latexsym.ins
+2020/07/21 | 50086 | macros/latex-dev/base/ltfinal.dtx
+2020/07/21 | 500485 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/21 | 500191 | macros/latex-dev/base/ltnews31.pdf
+2020/07/21 | 499777 | macros/latex-dev/base/ltshipout-doc.pdf
+2020/07/21 | 49695 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/21 | 4965 | macros/latex-dev/required/tools/fileerr.dtx
+2020/07/21 | 4952 | macros/latex-dev/base/lthyphen.dtx
+2020/07/21 | 491246 | macros/latex-dev/base/ltnews30.pdf
+2020/07/21 | 491155 | macros/latex-dev/required/tools/multicol.pdf
+2020/07/21 | 49098 | macros/latex-dev/base/ltshipout.dtx
+2020/07/21 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/21 | 48875 | macros/latex-dev/base/ltfssaxes.dtx
+2020/07/21 | 48372 | macros/latex-dev/base/ltmiscen.dtx
+2020/07/21 | 483202 | macros/latex-dev/required/tools/array.pdf
+2020/07/21 | 48051 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/21 | 479293 | macros/latex-dev/base/docstrip.pdf
+2020/07/21 | 47759 | macros/latex-dev/base/ltplain.dtx
+2020/07/21 | 47704 | macros/latex-dev/base/lttab.dtx
+2020/07/21 | 4762 | macros/latex-dev/base/ltlength.dtx
+2020/07/21 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/21 | 462360 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/21 | 460368 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/21 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/21 | 45735 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/21 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/21 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/21 | 45499 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/21 | 45246 | macros/latex-dev/base/ltspace.dtx
+2020/07/21 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/21 | 44875 | macros/latex-dev/base/ltfiles.dtx
+2020/07/21 | 4438 | macros/latex/contrib/horoscop/README
+2020/07/21 | 4392 | macros/latex-dev/base/ec.ins
+2020/07/21 | 43637 | macros/latex-dev/base/cmfonts.fdd
+2020/07/21 | 43454 | macros/latex-dev/required/tools/theorem.dtx
+2020/07/21 | 43306 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/21 | 433004 | macros/latex-dev/base/ltnews29.pdf
+2020/07/21 | 4326 | macros/latex-dev/base/cmfonts.ins
+2020/07/21 | 430876 | support/pkfix-helper.zip
+2020/07/21 | 4304 | macros/latex-dev/base/ltalloc.dtx
+2020/07/21 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/21 | 42708 | macros/latex-dev/base/changes.old.txt
+2020/07/21 | 4256 | macros/latex-dev/base/newdc.ins
+2020/07/21 | 42503 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/21 | 4223 | macros/latex-dev/base/docstrip.ins
+2020/07/21 | 4221 | macros/latex-dev/base/latex209.ins
+2020/07/21 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/21 | 417861 | macros/latex-dev/base/fntguide.pdf
+2020/07/21 | 4171 | macros/latex-dev/base/ltnews19.tex
+2020/07/21 | 4108688 | systems/texlive/tlnet/archive/charissil.r55888.tar.xz
+2020/07/21 | 4089 | macros/latex-dev/base/classes.ins
+2020/07/21 | 4080 | macros/latex-dev/base/lablst.tex
+2020/07/21 | 40788 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/21 | 4062 | macros/latex-dev/required/graphics/epsfig.dtx
+2020/07/21 | 40492 | macros/latex-dev/base/ltboxes.dtx
+2020/07/21 | 399035 | macros/latex-dev/base/usrguide.pdf
+2020/07/21 | 39702 | macros/latex-dev/required/tools/ftnright.dtx
+2020/07/21 | 39634 | macros/latex-dev/base/ltfilehook.dtx
+2020/07/21 | 3962 | macros/latex-dev/base/olddc.ins
+2020/07/21 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/21 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/21 | 39395 | macros/latex-dev/required/graphics/grfguide.tex
+2020/07/21 | 392 | systems/texlive/tlnet/archive/texlive-docindex.r55884.tar.xz
+2020/07/21 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/21 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/21 | 3886 | macros/latex-dev/required/graphics/lscape.dtx
+2020/07/21 | 38726 | macros/latex-dev/base/ltmath.dtx
+2020/07/21 | 38533 | macros/latex-dev/base/latex209.dtx
+2020/07/21 | 37980 | macros/latex-dev/base/latexchanges.tex
+2020/07/21 | 3783 | macros/latex-dev/base/tulm.ins
+2020/07/21 | 3731 | macros/latex-dev/base/ltlogos.dtx
+2020/07/21 | 372555 | macros/latex-dev/base/clsguide.pdf
+2020/07/21 | 36963 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/21 | 36863 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/21 | 368226 | macros/latex-dev/base/ltnews28.pdf
+2020/07/21 | 364761 | support/pkfix-helper/encoding-samples.pdf
+2020/07/21 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/21 | 362839 | macros/latex-dev/base/ltnews26.pdf
+2020/07/21 | 36154 | macros/latex-dev/base/ltlists.dtx
+2020/07/21 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/21 | 36005 | macros/latex-dev/base/ltnews18.pdf
+2020/07/21 | 359 | macros/latex/contrib/horoscop/horoscop.ins
+2020/07/21 | 358998 | macros/latex/contrib/achemso/achemso-demo.pdf
+2020/07/21 | 35881 | macros/latex-dev/required/tools/tabularx.dtx
+2020/07/21 | 358075 | macros/latex-dev/required/tools/varioref.pdf
+2020/07/21 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/21 | 35314 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/21 | 352969 | macros/latex-dev/base/changes.txt
+2020/07/21 | 35162 | macros/latex-dev/base/ltdirchk.dtx
+2020/07/21 | 351586 | macros/latex-dev/base/slides.pdf
+2020/07/21 | 3514 | macros/latex-dev/base/README.md
+2020/07/21 | 35050 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/21 | 349888 | macros/latex-dev/required/tools/longtable.pdf
+2020/07/21 | 34705 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/21 | 346683 | macros/latex-dev/required/tools/ftnright.pdf
+2020/07/21 | 3436 | macros/latex-dev/base/makeindx.ins
+2020/07/21 | 340889 | macros/latex-dev/required/tools/calc.pdf
+2020/07/21 | 3403 | macros/latex-dev/base/proc.ins
+2020/07/21 | 33864 | macros/latex-dev/required/tools/varioref-2016-02-16.sty
+2020/07/21 | 3374 | macros/latex-dev/base/letter.ins
+2020/07/21 | 3369 | macros/latex-dev/base/ltoutenc.ins
+2020/07/21 | 3340 | macros/latex-dev/base/exscale.ins
+2020/07/21 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/21 | 330836 | macros/latex-dev/base/utf8ienc.pdf
+2020/07/21 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/21 | 3294 | macros/latex-dev/base/bugs.txt
+2020/07/21 | 3281 | macros/latex-dev/required/tools/manifest.txt
+2020/07/21 | 327004 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/21 | 32403 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/21 | 323228 | macros/latex-dev/required/tools/theorem.pdf
+2020/07/21 | 32247 | macros/latex-dev/required/graphics/graphicx.dtx
+2020/07/21 | 3220329 | macros/latex-dev/base/source2e.pdf
+2020/07/21 | 32174 | macros/latex-dev/required/graphics/changes.txt
+2020/07/21 | 32164 | macros/latex-dev/base/latexrelease.dtx
+2020/07/21 | 32136 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/21 | 3208 | macros/latex-dev/base/unpack.ins
+2020/07/21 | 318 | macros/latex-dev/base/ltfilehook-doc.tex
+2020/07/21 | 31879 | macros/latex-dev/base/ltsect.dtx
+2020/07/21 | 316 | macros/latex-dev/base/ltshipout-doc.tex
+2020/07/21 | 316915 | macros/latex/contrib/horoscop/horoscop.dtx
+2020/07/21 | 31608 | macros/latex-dev/required/graphics/color.dtx
+2020/07/21 | 312 | macros/latex-dev/base/lthooks-doc.tex
+2020/07/21 | 31242 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/21 | 31242 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/21 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/21 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/21 | 310565 | macros/latex-dev/required/graphics/grfguide.pdf
+2020/07/21 | 30962 | macros/latex-dev/required/tools/layout.dtx
+2020/07/21 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/21 | 30877 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/21 | 306728 | macros/latex-dev/required/tools/bm.pdf
+2020/07/21 | 305975 | macros/latex-dev/base/letter.pdf
+2020/07/21 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/21 | 30463 | macros/latex-dev/base/ltnews31.tex
+2020/07/21 | 304460 | macros/latex-dev/base/ltluatex.pdf
+2020/07/21 | 302925 | macros/latex-dev/required/tools/verbatim.pdf
+2020/07/21 | 302836 | macros/latex-dev/base/ltnews22.pdf
+2020/07/21 | 2994 | macros/latex-dev/required/graphics/graphics-drivers.ins
+2020/07/21 | 29714 | macros/latex-dev/required/tools/multicol-2017-04-11.sty
+2020/07/21 | 29633 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/21 | 29571 | macros/latex-dev/required/tools/showkeys.dtx
+2020/07/21 | 294722 | macros/latex-dev/base/inputenc.pdf
+2020/07/21 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/21 | 29194 | macros/latex-dev/base/ltfntcmd.dtx
+2020/07/21 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/21 | 2898 | macros/latex-dev/base/syntonly.ins
+2020/07/21 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/21 | 2895 | macros/latex-dev/base/nfssfont.ins
+2020/07/21 | 2894 | macros/latex-dev/base/graphpap.ins
+2020/07/21 | 2894 | macros/latex-dev/base/fix-cm.ins
+2020/07/21 | 2892 | macros/latex-dev/base/alltt.ins
+2020/07/21 | 2890 | macros/latex-dev/base/ifthen.ins
+2020/07/21 | 28621 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/21 | 284616 | macros/latex-dev/required/graphics/graphics.pdf
+2020/07/21 | 28400 | systems/texlive/tlnet/archive/luaxml.r55891.tar.xz
+2020/07/21 | 283318 | macros/latex-dev/base/ltnews20.pdf
+2020/07/21 | 281691 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/21 | 27942 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/21 | 27936 | macros/latex-dev/base/ltnews32.tex
+2020/07/21 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/21 | 276040 | macros/latex/contrib/semantex.zip
+2020/07/21 | 274459 | macros/latex-dev/base/ltnews23.pdf
+2020/07/21 | 2738 | macros/latex-dev/base/tex2.txt
+2020/07/21 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/21 | 2733 | macros/latex-dev/base/ltpageno.dtx
+2020/07/21 | 27124 | macros/latex-dev/base/ltxcheck.tex
+2020/07/21 | 27075721 | install/macros/latex-dev/latex-base-dev.tds.zip
+2020/07/21 | 2706 | macros/latex-dev/base/idx.tex
+2020/07/21 | 27037 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/21 | 26955 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/21 | 269062 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/21 | 26879 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/21 | 26642104 | macros/latex-dev/base.zip
+2020/07/21 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/21 | 26603 | support/pkfix-helper/pkfix-helper.1
+2020/07/21 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/21 | 264505 | macros/latex-dev/base/cmfonts.pdf
+2020/07/21 | 263761 | macros/latex-dev/required/graphics/drivers.pdf
+2020/07/21 | 262059 | macros/latex-dev/base/fix-cm.pdf
+2020/07/21 | 2578 | macros/latex-dev/required/tools/multicol.ins
+2020/07/21 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/21 | 254169 | macros/latex-dev/required/tools/tabularx.pdf
+2020/07/21 | 2540 | macros/latex-dev/required/tools/longtable.ins
+2020/07/21 | 2540 | macros/latex-dev/required/tools/afterpage.ins
+2020/07/21 | 2537 | macros/latex-dev/required/tools/tabularx.ins
+2020/07/21 | 2534631 | install/macros/latex-dev/required/latex-graphics-dev.tds.zip
+2020/07/21 | 2534428 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/21 | 2533 | macros/latex-dev/required/tools/varioref.ins
+2020/07/21 | 2526 | macros/latex-dev/required/tools/bm.ins
+2020/07/21 | 252645 | macros/latex-dev/base/ltnews24.pdf
+2020/07/21 | 2501420 | macros/latex-dev/required/graphics.zip
+2020/07/21 | 249731 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/21 | 246917 | macros/latex-dev/required/tools/layout.pdf
+2020/07/21 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/21 | 24649 | macros/latex-dev/required/tools/trace.dtx
+2020/07/21 | 246195 | macros/latex-dev/base/latexrelease.pdf
+2020/07/21 | 246010 | macros/latex-dev/required/graphics/rotating.pdf
+2020/07/21 | 243 | macros/latex-dev/base/ltfilehook-code.tex
+2020/07/21 | 243026 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/21 | 242771 | macros/latex-dev/required/tools/showkeys.pdf
+2020/07/21 | 24269253 | systems/texlive/tlnet/install-tl.zip
+2020/07/21 | 241 | macros/latex-dev/base/ltshipout-code.tex
+2020/07/21 | 24016 | macros/latex-dev/base/lterror.dtx
+2020/07/21 | 239758 | macros/latex-dev/base/ltnews27.pdf
+2020/07/21 | 239643 | macros/latex/contrib/semantex/semantex.pdf
+2020/07/21 | 237 | macros/latex-dev/base/lthooks-code.tex
+2020/07/21 | 237978 | macros/latex-dev/required/tools/xspace.pdf
+2020/07/21 | 23652 | macros/latex-dev/base/ltnews30.tex
+2020/07/21 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/21 | 23521 | macros/latex-dev/base/fix-cm.dtx
+2020/07/21 | 235073 | macros/latex-dev/base/ltnews19.pdf
+2020/07/21 | 23386 | macros/latex-dev/base/lppl.tex
+2020/07/21 | 233492 | macros/latex-dev/base/ltnews21.pdf
+2020/07/21 | 2332 | macros/latex-dev/base/lthooks.ins
+2020/07/21 | 232479 | macros/latex-dev/required/graphics/graphicx.pdf
+2020/07/21 | 232390 | macros/latex-dev/base/latexchanges.pdf
+2020/07/21 | 22967 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/21 | 22676 | macros/latex-dev/base/ltcounts.dtx
+2020/07/21 | 22457 | macros/latex-dev/base/cfgguide.tex
+2020/07/21 | 223961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/21 | 2226 | macros/latex-dev/required/tools/indentfirst.dtx
+2020/07/21 | 222527 | macros/latex-dev/required/graphics/keyval.pdf
+2020/07/21 | 2207516 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/21 | 220388 | macros/latex-dev/base/modguide.pdf
+2020/07/21 | 220217 | macros/latex-dev/base/cfgguide.pdf
+2020/07/21 | 216997 | macros/latex-dev/base/cyrguide.pdf
+2020/07/21 | 216877 | macros/latex-dev/base/proc.pdf
+2020/07/21 | 215621 | macros/latex/contrib/semantex/semantex.sty
+2020/07/21 | 215578 | macros/latex-dev/base/ltxdoc.pdf
+2020/07/21 | 214710 | macros/latex-dev/base/slifonts.pdf
+2020/07/21 | 212721 | macros/latex-dev/required/tools/trace.pdf
+2020/07/21 | 210650 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/21 | 20994 | macros/latex-dev/required/graphics/rotating.dtx
+2020/07/21 | 2092 | macros/latex-dev/required/graphics/README.md
+2020/07/21 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/21 | 207506 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/21 | 205213 | macros/latex-dev/base/ifthen.pdf
+2020/07/21 | 20471 | macros/latex-dev/base/ltnews.cls
+2020/07/21 | 20434 | macros/latex-dev/base/lgc2.err
+2020/07/21 | 204016 | macros/latex-dev/base/doc.dtx
+2020/07/21 | 203502 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/21 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/21 | 202451 | macros/latex-dev/base/nfssfont.pdf
+2020/07/21 | 201979 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/21 | 201875 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/21 | 200892 | macros/latex-dev/required/graphics/color.pdf
+2020/07/21 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/21 | 199218 | macros/latex-dev/required/tools/dcolumn.pdf
+2020/07/21 | 199047 | macros/latex-dev/required/tools/enumerate.pdf
+2020/07/21 | 198008 | systems/texlive/tlnet/archive/derivative.doc.r55890.tar.xz
+2020/07/21 | 196477 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/21 | 196326 | macros/latex-dev/base/ltnews25.pdf
+2020/07/21 | 195877 | macros/latex-dev/base/exscale.pdf
+2020/07/21 | 194054 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/21 | 1938 | macros/latex-dev/base/minimal.cls
+2020/07/21 | 19379565 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/21 | 193350 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/21 | 192297 | macros/latex-dev/base/latexsym.pdf
+2020/07/21 | 191692 | macros/latex-dev/required/graphics/trig.pdf
+2020/07/21 | 191527 | macros/latex-dev/base/ltx3info.pdf
+2020/07/21 | 19040 | macros/latex-dev/base/lppl.txt
+2020/07/21 | 189846 | macros/latex-dev/required/tools/afterpage.pdf
+2020/07/21 | 18941 | macros/latex-dev/base/ltnews29.tex
+2020/07/21 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/21 | 187766 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/21 | 18722 | macros/latex-dev/base/ltxdoc.dtx
+2020/07/21 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/21 | 184500 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/21 | 18407 | macros/latex-dev/base/nfssfont.dtx
+2020/07/21 | 183426 | macros/latex-dev/required/tools/delarray.pdf
+2020/07/21 | 18318 | macros/latex/contrib/achemso/CHANGELOG.md
+2020/07/21 | 18305 | macros/latex-dev/base/ifthen.dtx
+2020/07/21 | 18300 | macros/latex-dev/base/ltx3info.tex
+2020/07/21 | 182355 | macros/latex-dev/required/tools/multicol.dtx
+2020/07/21 | 1820 | systems/texlive/tlnet/archive/collection-fontsextra.r55888.tar.xz
+2020/07/21 | 181670 | macros/latex-dev/base/syntonly.pdf
+2020/07/21 | 179906 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/21 | 179839 | macros/latex-dev/required/tools/fileerr.pdf
+2020/07/21 | 17862 | macros/latex-dev/required/tools/xspace.dtx
+2020/07/21 | 17728 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/21 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/21 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/21 | 175673 | macros/latex-dev/required/tools/hhline.pdf
+2020/07/21 | 175355 | macros/latex-dev/base/ltoutput.dtx
+2020/07/21 | 1751873 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/21 | 17496 | macros/latex-dev/base/cyrguide.tex
+2020/07/21 | 173079 | macros/latex-dev/base/alltt.pdf
+2020/07/21 | 172216 | macros/latex-dev/base/tlc2.err
+2020/07/21 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/21 | 170233 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/21 | 170214 | macros/latex-dev/base/docstrip.dtx
+2020/07/21 | 169765 | macros/latex-dev/required/tools/shellesc.pdf
+2020/07/21 | 169761 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/21 | 1694 | macros/latex-dev/base/small2e.tex
+2020/07/21 | 167624 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55884.tar.xz
+2020/07/21 | 1666 | macros/latex-dev/required/tools/README.md
+2020/07/21 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/21 | 164947 | macros/latex-dev/base/tlc2.pdf
+2020/07/21 | 163614 | macros/latex-dev/required/tools/xr.pdf
+2020/07/21 | 16343394 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/21 | 16234 | macros/latex-dev/base/modguide.tex
+2020/07/21 | 162268 | macros/latex-dev/required/graphics/rotex.pdf
+2020/07/21 | 161065 | macros/latex-dev/base/ltnews13.pdf
+2020/07/21 | 160667 | macros/latex-dev/base/makeindx.pdf
+2020/07/21 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/21 | 159288 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/21 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/21 | 15737 | macros/latex-dev/required/graphics/cat.eps
+2020/07/21 | 157181 | macros/latex-dev/base/ltnews05.pdf
+2020/07/21 | 15701 | macros/latex-dev/base/slifonts.fdd
+2020/07/21 | 156546 | macros/latex-dev/base/tulm.pdf
+2020/07/21 | 156506 | macros/latex-dev/required/tools/somedefs.pdf
+2020/07/21 | 156277 | macros/latex-dev/base/graphpap.pdf
+2020/07/21 | 155735 | macros/latex-dev/base/classes.dtx
+2020/07/21 | 15474 | macros/latex-dev/base/ltxref.dtx
+2020/07/21 | 154479 | macros/latex-dev/required/graphics/epsfig.pdf
+2020/07/21 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/21 | 15430 | macros/latex-dev/required/graphics/graphics-2017-06-25.sty
+2020/07/21 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/21 | 1532144 | macros/latex-dev/base/encguide.pdf
+2020/07/21 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/21 | 151907 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/21 | 151347 | macros/latex-dev/base/manual.pdf
+2020/07/21 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/21 | 150907 | macros/latex-dev/base/ltnews14.pdf
+2020/07/21 | 150615 | macros/latex-dev/required/graphics/lscape.pdf
+2020/07/21 | 150585 | macros/latex/contrib/achemso/achemso.dtx
+2020/07/21 | 150020 | macros/latex-dev/base/ltnews01.pdf
+2020/07/21 | 149838 | macros/latex-dev/base/ltnews17.pdf
+2020/07/21 | 14892 | macros/latex-dev/base/ltnews28.tex
+2020/07/21 | 147946 | macros/latex-dev/base/ltnews10.pdf
+2020/07/21 | 14673 | macros/latex-dev/base/source2e.tex
+2020/07/21 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/21 | 14575 | macros/latex-dev/required/graphics/rotex.tex
+2020/07/21 | 145318 | macros/latex-dev/base/ltoutenc.dtx
+2020/07/21 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/21 | 144779 | macros/latex-dev/required/tools/indentfirst.pdf
+2020/07/21 | 144482 | macros/latex-dev/base/ltnews08.pdf
+2020/07/21 | 14440 | macros/latex-dev/base/ltbibl.dtx
+2020/07/21 | 14421 | macros/latex-dev/base/lppl-1-2.txt
+2020/07/21 | 14341 | macros/latex-dev/base/lppl-1-1.txt
+2020/07/21 | 141818 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/21 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/21 | 1409380 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/21 | 14078 | macros/latex-dev/required/tools/afterpage.dtx
+2020/07/21 | 138219 | macros/latex-dev/base/lb2.pdf
+2020/07/21 | 1381 | macros/latex-dev/base/legal.txt
+2020/07/21 | 138027 | macros/latex-dev/required/tools/fontsmpl.pdf
+2020/07/21 | 13799 | macros/latex-dev/required/graphics/keyval.dtx
+2020/07/21 | 137919 | macros/latex-dev/base/ltnews12.pdf
+2020/07/21 | 137531 | macros/latex-dev/base/lthooks.dtx
+2020/07/21 | 136159 | macros/latex-dev/base/webcomp.pdf
+2020/07/21 | 135688 | macros/latex-dev/required/tools/rawfonts.pdf
+2020/07/21 | 134751 | macros/latex-dev/base/ltnews02.pdf
+2020/07/21 | 134742 | macros/latex-dev/base/ltnews03.pdf
+2020/07/21 | 1342 | macros/latex-dev/base/ltnews18.tex
+2020/07/21 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/21 | 133138 | macros/latex-dev/base/ltnews06.pdf
+2020/07/21 | 13305 | macros/latex-dev/base/proc.dtx
+2020/07/21 | 1327712 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/21 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/21 | 130687 | macros/latex-dev/base/ltnews16.pdf
+2020/07/21 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/21 | 12946 | macros/latex-dev/base/manual.err
+2020/07/21 | 128772 | macros/latex-dev/base/ltnews04.pdf
+2020/07/21 | 12715 | macros/latex-dev/required/tools/dcolumn.dtx
+2020/07/21 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/21 | 125830 | macros/latex-dev/base/lppl.pdf
+2020/07/21 | 125675 | macros/latex-dev/required/tools/array.dtx
+2020/07/21 | 12560 | macros/latex-dev/required/tools/array-2020-02-10.sty
+2020/07/21 | 12521 | macros/latex-dev/base/testpage.tex
+2020/07/21 | 124029 | macros/latex-dev/base/ltnews07.pdf
+2020/07/21 | 12225 | macros/latex-dev/base/ltnews24.tex
+2020/07/21 | 122092 | macros/latex-dev/base/ltnews15.pdf
+2020/07/21 | 12120 | macros/latex-dev/base/tulm.fdd
+2020/07/21 | 1208500 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/21 | 1208228 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/21 | 120222 | macros/latex-dev/base/ltnews09.pdf
+2020/07/21 | 1197 | macros/latex/contrib/semantex/README.md
+2020/07/21 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/21 | 11750 | macros/latex-dev/required/tools/array-2016-10-06.sty
+2020/07/21 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/21 | 115820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/21 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/21 | 114940 | systems/texlive/tlnet/archive/authoraftertitle.doc.r55889.tar.xz
+2020/07/21 | 11443 | macros/latex-dev/base/ltpage.dtx
+2020/07/21 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/21 | 1128 | macros/latex-dev/required/graphics/graphics.ins
+2020/07/21 | 1127537 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/21 | 1127442 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/21 | 11154 | macros/latex-dev/required/tools/hhline.dtx
+2020/07/21 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/21 | 109018 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/21 | 10777 | macros/latex-dev/required/tools/fontsmpl.dtx
+2020/07/21 | 107404 | macros/latex-dev/required/tools/varioref.dtx
+2020/07/21 | 10698 | macros/latex-dev/base/ltnews26.tex
+2020/07/21 | 106914 | macros/latex-dev/base/inputenc.dtx
+2020/07/21 | 10688 | macros/latex-dev/base/ltnews23.tex
+2020/07/21 | 10669 | macros/latex-dev/base/ltnews22.tex
+2020/07/21 | 10651 | macros/latex-dev/required/graphics/trig.dtx
+2020/07/21 | 10650 | macros/latex-dev/required/tools/enumerate.dtx
+2020/07/21 | 106100 | macros/latex-dev/base/ltclass.dtx
+2020/07/21 | 10606 | macros/latex-dev/base/makeindx.dtx
+2020/07/21 | 1060543 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/21 | 104936 | macros/latex-dev/base/ltnews11.pdf
+2020/07/21 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/21 | 10414 | macros/latex-dev/base/manifest.txt
+2020/07/21 | 10376 | macros/latex-dev/base/ltfsscmp.dtx
+2020/07/21 | 10365 | macros/latex-dev/base/ltvers.dtx
+2020/07/21 | 103144 | systems/texlive/tlnet/archive/luaxml.doc.r55891.tar.xz
+2020/07/21 | 102564 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/21 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/21 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/21 | 101343 | macros/latex-dev/base/lgc2.pdf
+2020/07/21 | 100973 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/21 | 10053 | macros/latex-dev/base/webcomp.err
+2020/07/21 | 1002380 | install/macros/latex/contrib/achemso.tds.zip
2020/07/20 | 99665 | macros/luatex/generic/luaxml/luaxml.pdf
2020/07/20 | 99308 | macros/latex/contrib/derivative/derivative.tex
-2020/07/20 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/20 | 99293960 | systems/win32/w32tex/web2c-lib.tar.xz
2020/07/20 | 977368 | systems/texlive/tlnet/archive/wintools.win32.doc.r55872.tar.xz
-2020/07/20 | 96909 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/20 | 96515 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/20 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/20 | 95314 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/07/20 | 94529 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/20 | 94265 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/20 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/20 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/07/20 | 922565 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
2020/07/20 | 89996 | macros/latex/contrib/caption/ltcaption.pdf
-2020/07/20 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
2020/07/20 | 8816 | macros/luatex/generic/luaxml/luaxml-cssquery.lua
-2020/07/20 | 88016 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/20 | 87406 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2020/07/20 | 865468 | systems/texlive/tlnet/archive/tex4ht.r55873.tar.xz
2020/07/20 | 859 | macros/xetex/latex/xepersian-hm/README.txt
-2020/07/20 | 8581 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/07/20 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/20 | 845 | systems/win32/miktex/tm/packages/pr.ini
-2020/07/20 | 84388 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/07/20 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/20 | 82761 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/20 | 8502552 | systems/win32/w32tex/uptex-w32.tar.xz
2020/07/20 | 824 | fonts/charissil/vf/CharisSIL-BoldItalic-tlf-sc-ot1.vf
2020/07/20 | 823 | macros/latex/contrib/authoraftertitle/authoraftertitle.sty
2020/07/20 | 820 | fonts/charissil/vf/CharisSIL-Italic-tlf-sc-ot1.vf
2020/07/20 | 820 | fonts/charissil/vf/CharisSIL-Bold-tlf-sc-ot1.vf
2020/07/20 | 82006 | macros/latex/contrib/caption/totalcount.pdf
2020/07/20 | 816 | fonts/charissil/vf/CharisSIL-tlf-sc-ot1.vf
-2020/07/20 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/20 | 81485772 | systems/win32/w32tex/pgfcontrib.tar.xz
2020/07/20 | 79448 | systems/texlive/tlnet/archive/nimsticks.doc.r55877.tar.xz
-2020/07/20 | 79201 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/20 | 78145 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
2020/07/20 | 7780 | systems/texlive/tlnet/archive/pwebmac.r55882.tar.xz
-2020/07/20 | 77602 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/20 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/20 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
2020/07/20 | 772909 | fonts/charissil/type1/CharisSIL-BI.pfb
-2020/07/20 | 76758 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/20 | 76739 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/07/20 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
2020/07/20 | 747416 | fonts/charissil/type1/CharisSIL-I.pfb
2020/07/20 | 742076 | fonts/charissil/doc/CharisSIL-features.pdf
-2020/07/20 | 73670 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/20 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/20 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/20 | 72601 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/20 | 72070 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
2020/07/20 | 718117 | macros/latex/contrib/caption/caption-rus.pdf
-2020/07/20 | 71535 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/07/20 | 70303 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/07/20 | 69874 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/20 | 69135 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
2020/07/20 | 688406 | fonts/charissil/type1/CharisSIL-B.pfb
-2020/07/20 | 68821 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/20 | 687664 | systems/win32/w32tex/ChangeLog
2020/07/20 | 684711 | fonts/charissil/type1/CharisSIL-R.pfb
-2020/07/20 | 676984 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/20 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/20 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
2020/07/20 | 6691 | fonts/charissil/map/CharisSIL.map
-2020/07/20 | 66119 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/20 | 65603 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/20 | 65576 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
2020/07/20 | 65545 | macros/xetex/latex/xepersian-hm/doc-samples-xep.pdf
2020/07/20 | 653 | fonts/charissil/doc/CharisSIL-samples.tex
+2020/07/20 | 6477592 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/07/20 | 6430 | macros/latex/contrib/caption/CHANGELOG
-2020/07/20 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/20 | 638878 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/20 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/20 | 63501 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/20 | 63494 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
2020/07/20 | 63436 | macros/xetex/latex/xepersian-hm/doc-samples-glyph.pdf
-2020/07/20 | 63349 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/20 | 6331980 | systems/win32/w32tex/win64/pdftex-w64.tar.xz
2020/07/20 | 631916 | systems/texlive/tlnet/archive/namedef.doc.r55881.tar.xz
2020/07/20 | 62967 | macros/xetex/latex/xepersian-hm/doc-samples-hrule.pdf
-2020/07/20 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/20 | 623384 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/20 | 61817 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
2020/07/20 | 6088193 | install/fonts/charissil.tds.zip
2020/07/20 | 6076025 | fonts/charissil.zip
-2020/07/20 | 597673 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
2020/07/20 | 59544 | macros/xetex/latex/xepersian-hm/xepersian-hm.pdf
-2020/07/20 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/20 | 58971 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/20 | 586878 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/20 | 58610 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/20 | 57247 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/20 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/20 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/20 | 562946 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/20 | 55577 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/20 | 550403 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/20 | 5500745 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/20 | 544669 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/20 | 541654 | systems/win32/miktex/tm/packages/files.csv.lzma
-2020/07/20 | 541029 | systems/win32/miktex/tm/packages/next/files.csv.lzma
2020/07/20 | 536 | fonts/charissil/vf/CharisSIL-BoldItalic-tlf-ts1.vf
2020/07/20 | 532 | fonts/charissil/vf/CharisSIL-Italic-tlf-ts1.vf
2020/07/20 | 528 | fonts/charissil/vf/CharisSIL-Bold-tlf-ts1.vf
2020/07/20 | 5280 | systems/texlive/tlnet/archive/pwebmac.doc.r55882.tar.xz
2020/07/20 | 524 | fonts/charissil/vf/CharisSIL-tlf-ts1.vf
-2020/07/20 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/20 | 51923 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/07/20 | 51416 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/20 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/20 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/20 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/07/20 | 500485 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
2020/07/20 | 4987412 | systems/texlive/tlnet/archive/wintools.win32.r55872.tar.xz
-2020/07/20 | 49697 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
2020/07/20 | 49377 | macros/latex/contrib/caption/caption2.dtx
-2020/07/20 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/07/20 | 48975 | macros/latex/contrib/caption/bicaption.dtx
-2020/07/20 | 48050 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/20 | 48810648 | systems/win32/w32tex/xetex-w32.tar.xz
2020/07/20 | 471 | macros/latex/contrib/authoraftertitle/README.md
2020/07/20 | 46721 | fonts/charissil/doc/CharisSIL-samples.pdf
2020/07/20 | 46619 | macros/latex/contrib/caption/subcaption.dtx
-2020/07/20 | 46286 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/20 | 462361 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/20 | 460365 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/20 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/20 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/20 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/20 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2020/07/20 | 45499 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/20 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
2020/07/20 | 4439 | fonts/charissil/doc/OFL.txt
-2020/07/20 | 43304 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/20 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/20 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
2020/07/20 | 42252 | macros/latex/contrib/derivative/derivative.sty
-2020/07/20 | 42063 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/20 | 41921232 | systems/win32/w32tex/latex-dev.tar.xz
2020/07/20 | 4185 | macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.tex
2020/07/20 | 4126 | macros/xetex/latex/xepersian-hm/kashida-glyph-example.tex
2020/07/20 | 41070 | macros/luatex/generic/luaxml/luaxml-namedentities.lua
2020/07/20 | 4098 | macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.tex
-2020/07/20 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
2020/07/20 | 398252 | systems/texlive/tlnet/archive/lwarp.source.r55880.tar.xz
-2020/07/20 | 39509 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/20 | 39508 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/20 | 392544 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/07/20 | 38946 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
2020/07/20 | 3706 | fonts/charissil/latex/T2CCharisSIL-TLF.fd
2020/07/20 | 3706 | fonts/charissil/latex/T2BCharisSIL-TLF.fd
2020/07/20 | 3706 | fonts/charissil/latex/T2ACharisSIL-TLF.fd
2020/07/20 | 3706 | fonts/charissil/latex/OT1CharisSIL-TLF.fd
2020/07/20 | 3706 | fonts/charissil/latex/LY1CharisSIL-TLF.fd
-2020/07/20 | 36966 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/20 | 36862 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
2020/07/20 | 3665 | fonts/charissil/latex/T1CharisSIL-TLF.fd
-2020/07/20 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/07/20 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
2020/07/20 | 3564 | systems/texlive/tlnet/archive/namedef.r55881.tar.xz
-2020/07/20 | 35336 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/20 | 35315 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/20 | 35050 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
2020/07/20 | 347608 | systems/texlive/tlnet/archive/crossreftools.doc.r55879.tar.xz
-2020/07/20 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/07/20 | 33138 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/20 | 33737372 | systems/win32/w32tex/ltxpkgs.tar.xz
2020/07/20 | 3304 | systems/texlive/tlnet/archive/crossreftools.r55879.tar.xz
-2020/07/20 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/20 | 327001 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
2020/07/20 | 3248 | fonts/charissil/enc/cha_7bykzl.enc
2020/07/20 | 3247 | fonts/charissil/enc/cha_nvhmow.enc
-2020/07/20 | 32402 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
2020/07/20 | 3239 | macros/luatex/generic/luaxml/luaxml-testxml.lua
2020/07/20 | 3228 | fonts/charissil/enc/cha_jncfzr.enc
2020/07/20 | 3224 | fonts/charissil/enc/cha_trlgdg.enc
2020/07/20 | 3221 | fonts/charissil/enc/cha_5222od.enc
-2020/07/20 | 32135 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
2020/07/20 | 318839 | macros/latex/contrib/caption/caption-deu.pdf
2020/07/20 | 3179 | fonts/charissil/enc/cha_6kgbit.enc
-2020/07/20 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/20 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/20 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/07/20 | 310933 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/20 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/20 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
2020/07/20 | 307635 | macros/latex/contrib/caption/caption-eng.pdf
2020/07/20 | 3056 | systems/texlive/tlnet/archive/nimsticks.source.r55877.tar.xz
-2020/07/20 | 305169 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
2020/07/20 | 2982 | fonts/charissil/enc/cha_liimvs.enc
2020/07/20 | 2980 | fonts/charissil/enc/cha_djsqg6.enc
-2020/07/20 | 29632 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
2020/07/20 | 29366 | macros/xetex/latex/xepersian-hm/xepersian-hm.dtx
2020/07/20 | 2932 | fonts/charissil/enc/cha_yszurh.enc
-2020/07/20 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
2020/07/20 | 2930 | fonts/charissil/enc/cha_l6xsmm.enc
2020/07/20 | 2930 | fonts/charissil/enc/cha_fr2ebm.enc
2020/07/20 | 2930 | fonts/charissil/enc/cha_byetuc.enc
2020/07/20 | 2926 | macros/latex/contrib/caption/README
-2020/07/20 | 29183 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
2020/07/20 | 29152 | systems/texlive/tlnet/archive/caption.r55878.tar.xz
2020/07/20 | 29088 | macros/latex/contrib/caption/ltcaption.dtx
-2020/07/20 | 28976 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/07/20 | 28618 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
2020/07/20 | 2838 | fonts/charissil/enc/cha_7qkcho.enc
-2020/07/20 | 281692 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/20 | 27944 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/20 | 279310 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/20 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
2020/07/20 | 2722856 | systems/texlive/tlnet/archive/lwarp.doc.r55880.tar.xz
-2020/07/20 | 27036 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/20 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/20 | 269063 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/20 | 26879 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
2020/07/20 | 267978 | macros/xetex/latex/xepersian-hm/xepersian-hm-doc.pdf
-2020/07/20 | 26630 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/20 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
2020/07/20 | 264773 | macros/latex/contrib/caption/caption-rus.tex
-2020/07/20 | 25474 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/20 | 2534429 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/20 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/20 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/07/20 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/20 | 24269253 | systems/texlive/tlnet/install-tl.zip
-2020/07/20 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/20 | 22970 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/20 | 2556540 | systems/win32/w32tex/tex4htk-w32.tar.xz
2020/07/20 | 2265 | macros/luatex/generic/luaxml/luaxml-pretty.lua
-2020/07/20 | 223962 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
2020/07/20 | 2218 | fonts/charissil/latex/TS1CharisSIL-TLF.fd
-2020/07/20 | 2207224 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2020/07/20 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55871.tar.xz
2020/07/20 | 2164 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-t2a.tfm
2020/07/20 | 21581 | macros/luatex/generic/luaxml/luaxml.tex
@@ -236,12 +699,10 @@
2020/07/20 | 2124 | fonts/charissil/tfm/CharisSIL-Italic-tlf-sc-t2c.tfm
2020/07/20 | 21191 | macros/latex/contrib/caption/elephant.eps
2020/07/20 | 2116 | fonts/charissil/tfm/CharisSIL-Italic-tlf-sc-t2b.tfm
-2020/07/20 | 210651 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
2020/07/20 | 2104 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-t2a.tfm
2020/07/20 | 2100 | fonts/charissil/tfm/CharisSIL-Italic-tlf-t2c.tfm
2020/07/20 | 2092 | fonts/charissil/tfm/CharisSIL-Italic-tlf-t2b.tfm
-2020/07/20 | 20769 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/20 | 207509 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/20 | 20776948 | systems/win32/w32tex/pdftex-w32.tar.xz
2020/07/20 | 2072 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-t2c.tfm
2020/07/20 | 20712 | macros/luatex/generic/luaxml/luaxml-mod-xml.lua
2020/07/20 | 205986 | macros/latex/contrib/derivative.zip
@@ -249,30 +710,21 @@
2020/07/20 | 2056 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-t2b.tfm
2020/07/20 | 2044 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-ly1.tfm
2020/07/20 | 2040 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-ly1.tfm
-2020/07/20 | 203503 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/20 | 2028474 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
2020/07/20 | 2024 | fonts/charissil/tfm/CharisSIL-Italic-tlf-sc-ly1.tfm
2020/07/20 | 2024 | fonts/charissil/tfm/CharisSIL-Italic-tlf-ly1.tfm
-2020/07/20 | 201984 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/20 | 201869 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
2020/07/20 | 2018350 | macros/latex/contrib/caption.zip
2020/07/20 | 2008 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-t1.tfm
2020/07/20 | 2004 | fonts/charissil/tfm/CharisSIL-Italic-tlf-t1.tfm
-2020/07/20 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
2020/07/20 | 1988 | fonts/charissil/tfm/CharisSIL-Italic-tlf-sc-t1.tfm
2020/07/20 | 1984 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-t1.tfm
2020/07/20 | 1972 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-ly1--base.tfm
-2020/07/20 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
2020/07/20 | 19604 | systems/texlive/tlnet/archive/xassoccnt.r55876.tar.xz
2020/07/20 | 1956 | fonts/charissil/tfm/CharisSIL-Italic-tlf-sc-ly1--base.tfm
2020/07/20 | 1952 | fonts/charissil/tfm/CharisSIL-tlf-sc-t2a.tfm
2020/07/20 | 1940 | fonts/charissil/tfm/CharisSIL-tlf-t2a.tfm
2020/07/20 | 1940 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-t1--base.tfm
-2020/07/20 | 194056 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
2020/07/20 | 1937 | macros/xetex/latex/xepersian-hm/xepersian-hm.ins
-2020/07/20 | 19379545 | systems/texlive/tlnet/install-tl-windows.exe
2020/07/20 | 1936 | fonts/charissil/tfm/CharisSIL-Italic-tlf-t1--base.tfm
-2020/07/20 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
2020/07/20 | 193172 | systems/texlive/tlnet/archive/caption.source.r55878.tar.xz
2020/07/20 | 1924 | fonts/charissil/tfm/CharisSIL-tlf-sc-t2c.tfm
2020/07/20 | 1916 | fonts/charissil/tfm/CharisSIL-tlf-sc-t2b.tfm
@@ -282,20 +734,17 @@
2020/07/20 | 1908 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-t1--base.tfm
2020/07/20 | 1900 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-t2a.tfm
2020/07/20 | 1892 | fonts/charissil/tfm/CharisSIL-Bold-tlf-t2a.tfm
-2020/07/20 | 189216 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
2020/07/20 | 1882 | macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.tex
-2020/07/20 | 187768 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/20 | 187110 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/20 | 1880540 | systems/win32/w32tex/win64/ptex-w64.tar.xz
2020/07/20 | 1868 | fonts/charissil/tfm/CharisSIL-Bold-tlf-t2c.tfm
2020/07/20 | 1868 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-t2c.tfm
2020/07/20 | 1864 | fonts/charissil/tfm/CharisSIL-Bold-tlf-t2b.tfm
2020/07/20 | 1856 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-t2b.tfm
2020/07/20 | 185397 | macros/latex/contrib/derivative/derivative.pdf
-2020/07/20 | 184501 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
2020/07/20 | 1812 | fonts/charissil/tfm/CharisSIL-tlf-sc-ly1.tfm
2020/07/20 | 1812 | fonts/charissil/tfm/CharisSIL-tlf-ly1.tfm
2020/07/20 | 1812 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-ly1.tfm
-2020/07/20 | 179907 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/20 | 1808868 | systems/win32/w32tex/win64/uptex-w64.tar.xz
2020/07/20 | 1796 | fonts/charissil/tfm/CharisSIL-Bold-tlf-ly1.tfm
2020/07/20 | 1788 | fonts/charissil/tfm/CharisSIL-tlf-t1.tfm
2020/07/20 | 1784 | fonts/charissil/tfm/CharisSIL-tlf-sc-t1.tfm
@@ -303,10 +752,6 @@
2020/07/20 | 1776 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-t1.tfm
2020/07/20 | 177308 | systems/texlive/tlnet/archive/lwarp.r55880.tar.xz
2020/07/20 | 1772 | fonts/charissil/tfm/CharisSIL-Bold-tlf-t1.tfm
-2020/07/20 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/20 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/20 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/20 | 1751875 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
2020/07/20 | 1744 | fonts/charissil/tfm/CharisSIL-tlf-sc-ly1--base.tfm
2020/07/20 | 1744 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-ly1--base.tfm
2020/07/20 | 1724 | fonts/charissil/vf/CharisSIL-BoldItalic-tlf-sc-t1.vf
@@ -317,24 +762,17 @@
2020/07/20 | 1716 | fonts/charissil/vf/CharisSIL-Bold-tlf-t1.vf
2020/07/20 | 1716 | fonts/charissil/vf/CharisSIL-Bold-tlf-sc-t1.vf
2020/07/20 | 1712 | fonts/charissil/vf/CharisSIL-tlf-sc-t1.vf
-2020/07/20 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
2020/07/20 | 1708 | fonts/charissil/vf/CharisSIL-tlf-t1.vf
2020/07/20 | 1708 | fonts/charissil/tfm/CharisSIL-tlf-sc-t1--base.tfm
+2020/07/20 | 1706948 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
2020/07/20 | 1704 | fonts/charissil/tfm/CharisSIL-Bold-tlf-t1--base.tfm
-2020/07/20 | 170232 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
2020/07/20 | 1700 | fonts/charissil/vf/CharisSIL-BoldItalic-tlf-sc-ly1.vf
2020/07/20 | 1700 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-t1--base.tfm
-2020/07/20 | 169763 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
2020/07/20 | 169730 | macros/latex/contrib/caption/caption.dtx
2020/07/20 | 1696 | fonts/charissil/vf/CharisSIL-Italic-tlf-sc-ly1.vf
2020/07/20 | 1696 | fonts/charissil/vf/CharisSIL-Bold-tlf-sc-ly1.vf
2020/07/20 | 1692 | fonts/charissil/vf/CharisSIL-tlf-sc-ly1.vf
2020/07/20 | 166680 | macros/latex/contrib/caption/caption-deu.tex
-2020/07/20 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/07/20 | 16334930 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/20 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/20 | 159286 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/20 | 15924 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
2020/07/20 | 15874 | macros/luatex/generic/luaxml/luaxml-domobject.lua
2020/07/20 | 1585212 | systems/texlive/tlnet/archive/caption.doc.r55878.tar.xz
2020/07/20 | 15737 | macros/latex/contrib/caption/cat.eps
@@ -342,16 +780,11 @@
2020/07/20 | 155388 | macros/latex/contrib/caption/caption3.dtx
2020/07/20 | 1548 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-sc-ot1.tfm
2020/07/20 | 154507 | macros/latex/contrib/caption/subcaption.pdf
-2020/07/20 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
2020/07/20 | 1540 | fonts/charissil/tfm/CharisSIL-Italic-tlf-ot1.tfm
-2020/07/20 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2020/07/20 | 15372 | systems/texlive/tlnet/archive/namedef.source.r55881.tar.xz
-2020/07/20 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
2020/07/20 | 1524 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-ot1.tfm
2020/07/20 | 1524 | fonts/charissil/README
-2020/07/20 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
2020/07/20 | 151528 | macros/latex/contrib/caption/caption-eng.tex
-2020/07/20 | 151032 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
2020/07/20 | 1510100 | fonts/charissil/truetype/CharisSIL-I.ttf
2020/07/20 | 1508296 | fonts/charissil/truetype/CharisSIL-R.ttf
2020/07/20 | 1504932 | fonts/charissil/truetype/CharisSIL-BI.ttf
@@ -361,18 +794,14 @@
2020/07/20 | 1484 | macros/luatex/generic/luaxml/luaxml-parse-query.lua
2020/07/20 | 14812 | fonts/charissil/doc/FONTLOG.txt
2020/07/20 | 147896 | macros/xetex/latex/xepersian-hm/kashida-leaders-hrule-example.pdf
-2020/07/20 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
2020/07/20 | 145149 | macros/xetex/latex/xepersian-hm/kashida-leaders-glyph-example.pdf
-2020/07/20 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2020/07/20 | 1443920 | fonts/charissil/truetype/CharisSIL-B.ttf
2020/07/20 | 1428 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-ts1.tfm
2020/07/20 | 1425 | fonts/charissil/latex/CharisSIL.sty
2020/07/20 | 1424 | fonts/charissil/tfm/CharisSIL-Italic-tlf-ts1.tfm
2020/07/20 | 1424 | fonts/charissil/tfm/CharisSIL-BoldItalic-tlf-ts1--base.tfm
-2020/07/20 | 141816 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
2020/07/20 | 1412 | fonts/charissil/tfm/CharisSIL-Italic-tlf-ts1--base.tfm
-2020/07/20 | 14114 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2020/07/20 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/20 | 140450036 | systems/win32/w32tex/context.tar.xz
2020/07/20 | 13827 | macros/xetex/latex/xepersian-hm/xepersian-hm-doc.ltx
2020/07/20 | 1380 | fonts/charissil/tfm/CharisSIL-tlf-sc-ot1.tfm
2020/07/20 | 1380 | fonts/charissil/tfm/CharisSIL-tlf-ot1.tfm
@@ -385,45 +814,25 @@
2020/07/20 | 135724 | systems/texlive/tlnet/archive/tex4ht.doc.r55873.tar.xz
2020/07/20 | 1352 | macros/luatex/generic/luaxml/luaxml-entities.lua
2020/07/20 | 1352 | fonts/charissil/tfm/CharisSIL-tlf-ts1--base.tfm
-2020/07/20 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/07/20 | 1327713 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
2020/07/20 | 1324 | fonts/charissil/tfm/CharisSIL-tlf-sc-ot1--base.tfm
2020/07/20 | 1320 | fonts/charissil/tfm/CharisSIL-Bold-tlf-sc-ot1--base.tfm
2020/07/20 | 131968 | systems/texlive/tlnet/archive/texlive-scripts.r55871.tar.xz
-2020/07/20 | 13135 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
2020/07/20 | 13119 | macros/xetex/latex/xepersian-hm/doc-ligature-xephm.pdf
-2020/07/20 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/07/20 | 1266025 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
2020/07/20 | 12628 | macros/latex/contrib/caption/totalcount.dtx
2020/07/20 | 1230 | macros/luatex/generic/luaxml/luaxml-stack.lua
-2020/07/20 | 1209106 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/20 | 1208462 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
2020/07/20 | 1196 | macros/latex/contrib/derivative/README.md
-2020/07/20 | 1193675 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/20 | 117132 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/20 | 115819 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
2020/07/20 | 115778 | macros/latex/contrib/caption/bicaption.pdf
2020/07/20 | 1155 | macros/luatex/generic/luaxml/README
-2020/07/20 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
2020/07/20 | 114630 | macros/latex/contrib/authoraftertitle.zip
2020/07/20 | 1143 | macros/xetex/latex/xepersian-hm/INSTALL.txt
2020/07/20 | 113957 | macros/latex/contrib/authoraftertitle/authoraftertitle.pdf
2020/07/20 | 1139344 | systems/texlive/tlnet/archive/xassoccnt.doc.r55876.tar.xz
-2020/07/20 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
2020/07/20 | 11332 | macros/luatex/generic/luaxml/luaxml-mod-handler.lua
2020/07/20 | 112 | macros/latex/contrib/caption/SUMMARY
-2020/07/20 | 1128295 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/07/20 | 1127569 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2020/07/20 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/20 | 109018 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/07/20 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/20 | 11008088 | systems/win32/w32tex/win64/xetex-w64.tar.xz
+2020/07/20 | 10483700 | systems/win32/w32tex/ptex-w32.tar.xz
2020/07/20 | 1046070 | macros/xetex/latex/xepersian-hm.zip
-2020/07/20 | 104588 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/20 | 102565 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/20 | 1021924 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/20 | 101911 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
2020/07/20 | 10115 | macros/xetex/latex/xepersian-hm/doc-ligature-xep.pdf
-2020/07/20 | 100971 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
2020/07/20 | 1007 | macros/latex/contrib/authoraftertitle/authoraftertitle.tex
2020/07/20 | 100197 | macros/xetex/latex/xepersian-hm/kashida-xep-XB-example.pdf
2020/07/19 | 94248 | macros/latex/contrib/xassoccnt/xassoccnt_coupledcounters_example.pdf
@@ -441,12 +850,10 @@
2020/07/19 | 719 | macros/latex/contrib/lwarp/lwarp_baseline_marker.eps
2020/07/19 | 712034 | systems/win32/miktex/tm/packages/overlock.tar.lzma
2020/07/19 | 686995 | systems/win32/miktex/tm/packages/aeb-mlink.tar.lzma
-2020/07/19 | 686760 | systems/win32/w32tex/ChangeLog
2020/07/19 | 68361 | macros/latex/contrib/xassoccnt/xassoccnt_example.pdf
2020/07/19 | 68338 | systems/win32/miktex/tm/packages/tikzpackets.tar.lzma
2020/07/19 | 6565 | graphics/pgf/contrib/nimsticks/nimsticks.dtx
2020/07/19 | 65140 | macros/latex/contrib/xassoccnt/xassoccnt_totalcounters_example.pdf
-2020/07/19 | 6477172 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/07/19 | 64628 | macros/latex/contrib/xassoccnt/xassoccnt_resetlist_example.pdf
2020/07/19 | 6337 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/07/19 | 626485 | systems/win32/miktex/tm/packages/artthreads.tar.lzma
@@ -454,7 +861,6 @@
2020/07/19 | 542720 | macros/latex/contrib/xassoccnt/xassoccnt_doc.pdf
2020/07/19 | 515166 | systems/win32/miktex/tm/packages/yquant.tar.lzma
2020/07/19 | 494013 | systems/win32/miktex/tm/packages/xindex.tar.lzma
-2020/07/19 | 48814344 | systems/win32/w32tex/xetex-w32.tar.xz
2020/07/19 | 4785 | macros/latex/contrib/crossreftools/crossreftools_driver.tex
2020/07/19 | 477070 | systems/win32/miktex/tm/packages/polytable.tar.lzma
2020/07/19 | 47472 | systems/texlive/tlnet/archive/cabin.doc.r55867.tar.xz
@@ -466,7 +872,6 @@
2020/07/19 | 42917 | macros/latex/contrib/xassoccnt/xassoccnt_label_example.pdf
2020/07/19 | 4264 | macros/latex/contrib/xassoccnt/xassoccnt_driver_example.tex
2020/07/19 | 39519 | macros/latex/contrib/crossreftools/crossreftools_doc.tex
-2020/07/19 | 392 | systems/texlive/tlnet/archive/texlive-docindex.r55864.tar.xz
2020/07/19 | 377987 | systems/win32/miktex/tm/packages/biblatex-publist.tar.lzma
2020/07/19 | 3766 | macros/latex/contrib/xassoccnt/xassoccnt_coupledcounters_example.tex
2020/07/19 | 3764147 | systems/win32/miktex/tm/packages/l3experimental.tar.lzma
@@ -498,13 +903,10 @@
2020/07/19 | 1890 | graphics/pgf/contrib/nimsticks/README.md
2020/07/19 | 1790 | macros/latex/contrib/xassoccnt/xassoccnt_resetloop_example.tex
2020/07/19 | 1789 | macros/latex/contrib/xassoccnt/xassoccnt_suspendedcounters_example.tex
-2020/07/19 | 1706900 | systems/win32/w32tex/win64/ptex-ng-w64.tar.xz
-2020/07/19 | 167528 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55864.tar.xz
2020/07/19 | 1627116 | systems/win32/miktex/tm/packages/babel.tar.lzma
2020/07/19 | 1623 | macros/latex/contrib/lwarp/README.txt
2020/07/19 | 150149 | systems/win32/miktex/tm/packages/zztex.tar.lzma
2020/07/19 | 1413730 | systems/win32/miktex/tm/packages/nicematrix.tar.lzma
-2020/07/19 | 140448940 | systems/win32/w32tex/context.tar.xz
2020/07/19 | 14028 | macros/latex/contrib/crossreftools/crossreftools.sty
2020/07/19 | 14012 | macros/latex/contrib/xassoccnt/xassoccnt_counterhierarchy_example.pdf
2020/07/19 | 13892 | systems/texlive/tlnet/archive/apa7.r55868.tar.xz
@@ -523,14 +925,12 @@
2020/07/19 | 1186386 | macros/latex/contrib/xassoccnt.zip
2020/07/19 | 117595 | macros/latex/contrib/xassoccnt/xassoccnt_doc.tex
2020/07/19 | 1105502 | systems/win32/miktex/tm/packages/cryptocode.tar.lzma
-2020/07/19 | 11007908 | systems/win32/w32tex/win64/xetex-w64.tar.xz
2020/07/19 | 107502 | systems/win32/miktex/tm/packages/lua-ul.tar.lzma
2020/07/19 | 10651111 | systems/win32/miktex/tm/packages/l3kernel.tar.lzma
2020/07/19 | 1036 | macros/latex/contrib/crossreftools/README
2020/07/19 | 1023 | macros/latex/contrib/xassoccnt/xassoccnt_counterhierarchy_example.tex
2020/07/19 | 101526 | macros/latex/contrib/crossreftools/crossreftools_driver.pdf
2020/07/18 | 920 | systems/texlive/tlnet/archive/collection-plaingeneric.r55862.tar.xz
-2020/07/18 | 8489160 | systems/win32/w32tex/uptex-w32.tar.xz
2020/07/18 | 84668 | systems/texlive/tlnet/archive/l3experimental.source.r55860.tar.xz
2020/07/18 | 825938 | macros/latex/contrib/apa7.zip
2020/07/18 | 64106 | macros/latex/contrib/apa7/samples/shortsample.pdf
@@ -539,18 +939,14 @@
2020/07/18 | 527705 | macros/latex/contrib/apa7/apa7.pdf
2020/07/18 | 4918556 | systems/win32/w32tex/aleph-w32.tar.xz
2020/07/18 | 47816 | systems/texlive/tlnet/archive/zztex.doc.r55862.tar.xz
-2020/07/18 | 41918280 | systems/win32/w32tex/latex-dev.tar.xz
2020/07/18 | 4079 | fonts/cabin/latex/cabin.sty
2020/07/18 | 4076878 | install/fonts/cabin.tds.zip
2020/07/18 | 4039702 | fonts/cabin.zip
2020/07/18 | 3652252 | systems/texlive/tlnet/archive/l3experimental.doc.r55860.tar.xz
-2020/07/18 | 33723648 | systems/win32/w32tex/ltxpkgs.tar.xz
-2020/07/18 | 2549304 | systems/win32/w32tex/tex4htk-w32.tar.xz
2020/07/18 | 25220 | systems/texlive/tlnet/archive/l3experimental.r55860.tar.xz
2020/07/18 | 242784 | systems/texlive/tlnet/archive/thmtools.doc.r55861.tar.xz
2020/07/18 | 2314 | fonts/cabin/README
2020/07/18 | 2176 | systems/texlive/tlnet/archive/pas-cours.r55859.tar.xz
-2020/07/18 | 20732196 | systems/win32/w32tex/pdftex-w32.tar.xz
2020/07/18 | 198984 | systems/texlive/tlnet/archive/pas-cours.doc.r55859.tar.xz
2020/07/18 | 196737 | macros/latex/contrib/apa7/samples/longsample.pdf
2020/07/18 | 19628 | systems/texlive/tlnet/archive/thmtools.source.r55861.tar.xz
@@ -561,7 +957,6 @@
2020/07/18 | 142920 | macros/latex/contrib/apa7/apa7.dtx
2020/07/18 | 1278 | macros/latex/contrib/apa7/README.txt
2020/07/18 | 12516 | systems/texlive/tlnet/archive/thmtools.r55861.tar.xz
-2020/07/18 | 10497988 | systems/win32/w32tex/ptex-w32.tar.xz
2020/07/18 | 101724 | systems/texlive/tlnet/archive/zztex.r55862.tar.xz
2020/07/18 | 10078428 | systems/texlive/tlnet/archive/l3kernel.doc.r55860.tar.xz
2020/07/17 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
@@ -814,7 +1209,6 @@
2020/07/15 | 834142 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
2020/07/15 | 825 | fonts/cabin/doc/cabin-samples.tex
2020/07/15 | 8240 | macros/plain/contrib/zztex/tex/zzfront.tex
-2020/07/15 | 81485156 | systems/win32/w32tex/pgfcontrib.tar.xz
2020/07/15 | 8085 | macros/plain/contrib/zztex/tex/zzbibtex.tex
2020/07/15 | 8072 | macros/plain/contrib/zztex/tex/zztabbing.tex
2020/07/15 | 8033 | macros/plain/contrib/zztex/tex/zztag.tex
@@ -928,7 +1322,6 @@
2020/07/15 | 41253 | macros/plain/contrib/zztex/tex/zzfloat.tex
2020/07/15 | 404 | macros/plain/contrib/zztex/tex/zzcmmath.tex
2020/07/15 | 403539 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
-2020/07/15 | 401021176 | systems/win32/w32tex/ltxpkgdocs.tar.xz
2020/07/15 | 393856 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
2020/07/15 | 388513 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
2020/07/15 | 38750 | graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
@@ -1322,65 +1715,3 @@
2020/07/15 | 102168 | fonts/cabin/opentype/Cabin-MediumItalic.otf
2020/07/15 | 1017865 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
2020/07/15 | 101349 | graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
-2020/07/14 | 99293756 | systems/win32/w32tex/web2c-lib.tar.xz
-2020/07/14 | 9814 | indexing/xindex/lualatex/xindex-lapp.lua
-2020/07/14 | 9355 | indexing/xindex/lualatex/xindex-base.lua
-2020/07/14 | 92640 | systems/texlive/tlnet/archive/lua-ul.doc.r55831.tar.xz
-2020/07/14 | 913918 | macros/latex/contrib/schooldocs.zip
-2020/07/14 | 8844 | systems/texlive/tlnet/archive/lua-ul.source.r55831.tar.xz
-2020/07/14 | 84968 | macros/latex/contrib/polytable/polytable.dtx
-2020/07/14 | 83880 | macros/latex/contrib/aeb_mlink/examples/mlink_tst.pdf
-2020/07/14 | 8358 | indexing/xindex/lualatex/xindex-pretty.lua
-2020/07/14 | 8262 | macros/latex/contrib/edichokey/edichokey-doc-en.tex
-2020/07/14 | 80323 | indexing/xindex/lualatex/xindex-unicode.lua
-2020/07/14 | 782884 | systems/texlive/tlnet/archive/babel.doc.r55830.tar.xz
-2020/07/14 | 6780 | indexing/xindex/scripts/xindex.lua
-2020/07/14 | 665904 | systems/texlive/tlnet/archive/babel.source.r55830.tar.xz
-2020/07/14 | 65772 | systems/texlive/tlnet/archive/tikzpackets.doc.r55827.tar.xz
-2020/07/14 | 63825 | macros/latex/contrib/edichokey/edichokey-doc-en.pdf
-2020/07/14 | 63484 | macros/latex/contrib/aeb_mlink/aeb_mlink.dtx
-2020/07/14 | 6262 | indexing/xindex/lualatex/xindex-norsk.lua
-2020/07/14 | 6064 | systems/texlive/tlnet/archive/lua-ul.r55831.tar.xz
-2020/07/14 | 550273 | indexing/xindex.zip
-2020/07/14 | 54358 | macros/latex/contrib/edichokey/edichokey-ex.pdf
-2020/07/14 | 52814 | macros/latex/contrib/elpres/elpres-example.pdf
-2020/07/14 | 48764 | indexing/xindex/doc/xindex-doc.tex
-2020/07/14 | 468283 | macros/latex/contrib/polytable.zip
-2020/07/14 | 4634 | indexing/xindex/lualatex/xindex-dtk.lua
-2020/07/14 | 4516 | systems/texlive/tlnet/archive/expkv-def.r55829.tar.xz
-2020/07/14 | 447964 | macros/latex/contrib/polytable/polytable.pdf
-2020/07/14 | 4434399 | macros/latex/contrib/aeb_mlink.zip
-2020/07/14 | 44222 | macros/latex/contrib/aeb_mlink/docs/aebmlink_man.tex
-2020/07/14 | 4241282 | macros/latex/contrib/aeb_mlink/docs/aeb_mlink.pdf
-2020/07/14 | 389262 | indexing/xindex/doc/xindex-doc.pdf
-2020/07/14 | 3836652 | systems/win32/w32tex/luajittex-dev-w32.tar.xz
-2020/07/14 | 3835448 | systems/win32/w32tex/luajittex-w32.tar.xz
-2020/07/14 | 3800308 | systems/win32/w32tex/luajittex-exp-w32.tar.xz
-2020/07/14 | 36137 | macros/latex/contrib/aeb_mlink/examples/mlink_tst_url.pdf
-2020/07/14 | 350 | macros/latex/contrib/polytable/README
-2020/07/14 | 34728 | indexing/xindex/lualatex/xindex-lib.lua
-2020/07/14 | 342216 | systems/texlive/tlnet/archive/expkv-def.doc.r55829.tar.xz
-2020/07/14 | 336663 | macros/latex/contrib/aeb_mlink/docs/aebmlink_man.pdf
-2020/07/14 | 316230 | macros/latex/contrib/elpres.zip
-2020/07/14 | 306724 | systems/texlive/tlnet/archive/updmap-map.r55824.tar.xz
-2020/07/14 | 2915 | indexing/xindex/lualatex/xindex-DIN2.lua
-2020/07/14 | 2878 | indexing/xindex/lualatex/xindex-cfg-common.lua
-2020/07/14 | 2768 | macros/latex/contrib/edichokey/edichokey.sty
-2020/07/14 | 2725 | macros/latex/contrib/aeb_mlink/README.md
-2020/07/14 | 25879 | macros/latex/contrib/edichokey/edichokey-ex.tex
-2020/07/14 | 25744 | systems/texlive/tlnet/archive/chemfig.r55828.tar.xz
-2020/07/14 | 2567 | macros/latex/contrib/elpres/elpres-example.tex
-2020/07/14 | 2555 | indexing/xindex/lualatex/xindex-cfg.lua
-2020/07/14 | 2323 | indexing/xindex/lualatex/xindex-cfg-uca.lua
-2020/07/14 | 2260 | systems/texlive/tlnet/archive/tikzpackets.r55827.tar.xz
-2020/07/14 | 2054616 | systems/texlive/tlnet/archive/chemfig.doc.r55828.tar.xz
-2020/07/14 | 1830716 | systems/win32/w32tex/jtex-w32.tar.xz
-2020/07/14 | 169020 | systems/texlive/tlnet/archive/babel.r55830.tar.xz
-2020/07/14 | 1609 | indexing/xindex/CHANGELOG
-2020/07/14 | 14680 | systems/texlive/tlnet/archive/expkv-def.source.r55829.tar.xz
-2020/07/14 | 1376 | systems/texlive/tlnet/archive/collection-pictures.r55827.tar.xz
-2020/07/14 | 132 | macros/latex/contrib/polytable/polytable.ins
-2020/07/14 | 1313 | macros/latex/contrib/edichokey/README.md
-2020/07/14 | 1298 | macros/latex/contrib/elpres/README.md
-2020/07/14 | 126947 | macros/latex/contrib/edichokey.zip
-2020/07/14 | 10941 | indexing/xindex/lualatex/xindex-HAdW-eKO.lua
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md
index f2eb61eca3..6fcc4e9a1f 100644
--- a/macros/latex-dev/base/README.md
+++ b/macros/latex-dev/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2020-10-01 pre-release 6
+Release 2020-10-01 pre-release 7
Overview
--------
diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf
index 033cb5ff35..9931c1aa9a 100644
--- a/macros/latex-dev/base/alltt.pdf
+++ b/macros/latex-dev/base/alltt.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf
index 4c6572d7a3..0825e5ce68 100644
--- a/macros/latex-dev/base/cfgguide.pdf
+++ b/macros/latex-dev/base/cfgguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt
index 6c37210ae9..1ef6f2cd44 100644
--- a/macros/latex-dev/base/changes.txt
+++ b/macros/latex-dev/base/changes.txt
@@ -6,12 +6,82 @@ completeness or accuracy and it contains some references to files that
are not part of the distribution.
================================================================================
+2020-07-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmiscen.dtx: \begin should not be long for better
+ error recovery (gh/354)
+
+2020-07-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * lthooks.dtx, ltshipout.dtx, ltfilehook.dtx:
+ Integrate hook management into the kernel
+
+2020-07-08 Joseph Wright <joseph.wright@latex-project.org>
+
+ * ltexpl.dtx:
+ Add hook \@expl@finalise@setup@@
+
+ * ltfinal.dtx:
+ Execute hook \@expl@finalise@setup@@
+
+2020-07-07 Johannes Braams <Johannes.Braams@latex-project.org>
+
+ * docstrip.dtx: Merge the @@-module functionality of
+ l3docstrip.dtx into docstrip.dtx (gh/337)
+
+2020-07-04 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * ltoutenc.dtx:
+ Suppress tlig ligatures in LuaTeX without font reloading (gh/165)
+
+2020-06-15 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * doc.dtx (subsection{Macros surrounding the `definition parts'}):
+ Void \@labels for vertical typesetting (gh/344)
+
+2020-06-05 Phelype Oleinik <phelype.oleinik@latex-project.org>
+
+ * ltdefns.dtx (subsection{Loading further extensions}):
+ Moved loading of ltexpl.ltx earlier (from ltfinal.dtx) to ltdefns to
+ allow usage of expl3 extensions while loading the kernel. Further
+ changes to support this one listed below:
+
+ * ltfinal.dtx:
+ Removed loading of ltexpl.ltx
+
+ * ltclass.dtx:
+ Added \@expl@push@filename@@ and \@expl@push@filename@aux@@ to
+ \@pushfilename and \@expl@pop@filename@@ to \@popfilename.
+
+ * ltfiles.dtx (section{File Handling}):
+ Added \@expl@sys@load@backend@@ in \document.
+
+ * ltexpl.dtx:
+ - Added blank definitions for \@expl@sys@load@backend@@,
+ \@expl@push@filename@@, \@expl@push@filename@aux@@, and
+ \@expl@pop@filename@@.
+ - Added temporary definitions for some kernel commands.
+
+2020-06-04 Marcel Krüger <Marcel.Krueger@latex-project.org>
+
+ * format.ins: Load ltluatex.dtx before ltdefns.dtx
+
+2020-05-31 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmiscen.dtx (subsection{Center, Flushright, Flushleft}):
+ % Added \finalhyphendemerits=0 to avoid extra line in
+ \centering, \raggedleft or \raggedright (gh/247)
+
2020-05-19 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
* ltfssini.dtx (section{Custom series settings for main document families}):
Added \IfFontSeriesContextTF so that it is possible to reliably
detect the current font series context (gh/335)
+2020-05-17 Johannes Braams <Johannes.Braams@latex-project.org>
+
+ * ltxdoc.dtx: Support spaces within filenames (gh/218)
+
2020-05-15 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
* ltdefns.dtx (subsection{Initex initialisations}):
@@ -20,8 +90,8 @@ are not part of the distribution.
2020-05-11 Marcel Krüger <Marcel.Krueger@latex-project.org>
- * ltdefns.dtx:
- Use primitive \- with LuaTeX
+ * ltdefns.dtx:
+ Use primitive \- with LuaTeX
2020-05-07 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
@@ -30,15 +100,15 @@ are not part of the distribution.
2020-05-06 Marcel Krüger <Marcel.Krueger@latex-project.org>
- * ltspace.dtx:
- Make Unicode softhyphen U+00AD active and defined as \-.
+ * ltspace.dtx:
+ Make Unicode softhyphen U+00AD active and defined as \-.
-2020-05-02 Johannes Braams <texniek at braams.xs4all.nl>
+2020-05-02 Johannes Braams <Johannes.Braams@latex-project.org>
* ltexpl.dtx: Created aliases for two expl3 macros in order to use
them to remove leading and trailing spaces from filenames (gh/217)
-2020-05-02 Johannes Braams <texniek at braams.xs4all.nl>
+2020-05-02 Johannes Braams <Johannes.Braams@latex-project.org>
* ltfiles.dtx: Modified \include and \includeony to support
filenames with spaces in them (gh/217)
@@ -132,7 +202,7 @@ are not part of the distribution.
* ltmath.dtx (subsubsection{The UNSORTED Rest}):
Add \texttt{amsmath} math/text spacing commands to the kernel (gh/303)
-2020-03-08 Johannes Braams <texniek at braams.xs4all.nl>
+2020-03-08 Johannes Braams <Johannes.Braams@latex-project.org>
* letter.dtx: merged changes to classes.dtx into letter.dtx
diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf
index 1c33a811b0..d8f283622a 100644
--- a/macros/latex-dev/base/classes.pdf
+++ b/macros/latex-dev/base/classes.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf
index ef43b41db0..3bcc695f6b 100644
--- a/macros/latex-dev/base/clsguide.pdf
+++ b/macros/latex-dev/base/clsguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf
index cd291a5f9a..ac154a6eea 100644
--- a/macros/latex-dev/base/cmfonts.pdf
+++ b/macros/latex-dev/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf
index 2bbc7d8f18..4ecc0eec71 100644
--- a/macros/latex-dev/base/cyrguide.pdf
+++ b/macros/latex-dev/base/cyrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/doc.dtx b/macros/latex-dev/base/doc.dtx
index 3011994d9d..7e7817153c 100644
--- a/macros/latex-dev/base/doc.dtx
+++ b/macros/latex-dev/base/doc.dtx
@@ -35,7 +35,7 @@
%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01]
%<+package> \ProvidesPackage{doc}
%<+shortvrb>\ProvidesPackage{shortvrb}
-%<+package|shortvrb> [2019/12/16 v2.1l
+%<+package|shortvrb> [2020/06/15 v2.1m
%<+package|shortvrb> Standard LaTeX documentation package (FMi)]
%\catcode`\<=12
%
@@ -139,7 +139,7 @@
% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}}
% \GetFileInfo{doc.sty}
%
-% \CheckSum{2208} ^^A % keep the checksum in this file
+% \CheckSum{2213} ^^A % keep the checksum in this file
%
% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks
% {This file has version number \fileversion{} dated \filedate{}.}}
@@ -1324,6 +1324,16 @@
\if@inlabel\leavevmode\fi
\trivlist \parskip \z@ \item[]%
% \end{macrocode}
+% The \cs{item} command sets the \cs{@labels} box but that box is
+% never typeset (as \cs{everypar} that normally does this gets
+% redefined later). That is normally not an issue, but produces a
+% problem when typesetting in mixed directions, (e.g., in
+% Japanese), so we explicitly clear it for that use case.
+% \changes{v2.1m}{2020/06/15}{Void \cs{@labels} for vertical
+% typesetting (gh/344)}
+% \begin{macrocode}
+ \global\setbox\@labels\box\voidb@x
+% \end{macrocode}
% Additionally, everything should be set in \texttt{typewriter} font.
% Some people might prefer it somewhat differently; because of this
% the font choice is
@@ -1448,7 +1458,8 @@
% 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 \cs{updefault} for extended NFSS}
+% \changes{v2.1l}{2019/12/16}{Use \cs{shapedefault} not
+% \cs{updefault} for extended NFSS}
% \begin{macrocode}
\def\MacroFont{\small
\usefont\encodingdefault
diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf
index f4f1b1fa76..76dc52e218 100644
--- a/macros/latex-dev/base/doc.pdf
+++ b/macros/latex-dev/base/doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/docstrip.dtx b/macros/latex-dev/base/docstrip.dtx
index 3ce6ed5696..a0a06311ed 100644
--- a/macros/latex-dev/base/docstrip.dtx
+++ b/macros/latex-dev/base/docstrip.dtx
@@ -29,9 +29,9 @@
\catcode`\{=1
\catcode`\}=2
\def\filename{docstrip.dtx}
-\def\fileversion{v2.5h}
-\def\filedate{2020/04/18}
-\def\docdate {2018/05/03}
+\def\fileversion{v2.6a}
+\def\filedate{2020-07-07}
+\def\docdate {2020-07-11}
%%
%
%\iffalse
@@ -42,7 +42,7 @@
%% Frank Mittelbach
%% Copyright (C) 1995 Marcin Woli\'nski
%% Copyright (C) 1996-1997 Mark Wooding, Marcin Woli\'nski
-%% Copyright (C) 1998-2003 LaTeX3 project and the above authors
+%% Copyright (C) 1998-2020 LaTeX3 project and the above authors
%% All rights are reserved.
%%
%
@@ -82,6 +82,8 @@
% \changes{2.3e}{1996/10/02}{Introduced ``open lists''}
% \changes{2.4a}{1996/06/06}{Add stream limits (MDW)}
% \changes{2.4c}{1996/06/11}{Add initex support (DPC)}
+% \changes{v2.6a}{2020-07-07}{Added the handling of @@-modules from
+% \texttt{l3docstrip.dtx} (gh/337)}
%
% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ }
% \DoNotIndex{\@ne}
@@ -785,6 +787,57 @@
% When a block of code is {\em not\/} included, any guards that occur
% within that block are {\em not\/} evaluated.
%
+% \section{Internal functions and variables}
+%
+% An important consideration for \LaTeX3 development is separating
+% out public and internal functions. Functions and variables which
+% are private to one module should not be used or modified by any
+% other module. As \TeX{} does not have any formal namespacing
+% system, this requires a convention for indicating which functions
+% in a code-level module are public and which are private.
+%
+% Using \ds\ allows internal functions to be indicated
+% using a `two part' system. Within the \texttt{.dtx} file,
+% internal functions may be indicated using |@@| in place of the
+% module name, for example
+% \begin{verbatim}
+% \cs_new_protected:Npn \@@_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l_@@_internal_tl
+% \end{verbatim}
+%
+% To extract the code using \ds, the original `guard'
+% mecahnism is extended by the introduction of the syntax
+% \texttt{\%<@@=\meta{module}>}. The \meta{module} name then
+% replaces the |@@| when the code is extracted, so that
+% \begin{verbatim}
+% %<*package>
+% %<@@=foo>
+% \cs_new_protected:Npn \@@_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l_@@_internal_tl
+% %</package>
+% \end{verbatim}
+% is extracted as
+% \begin{verbatim}
+% \cs_new_protected:Npn \__foo_some_function:nn #1#2
+% {
+% % Some code here
+% }
+% \tl_new:N \l__foo_internal_tl
+% \end{verbatim}
+% where the |__| indicates that the functions and variables are
+% internal to the \texttt{foo} module.
+%
+% Use |@@@@| to obtain |@@| in the output (|@@@@@| to get |@@@|).
+% For longer pieces of code the replacement can be completely
+% suppressed by giving an empty module name, namely using the
+% syntax \texttt{\%<@@=>}.
+%
% \section{Those other languages}
% Since \TeX\ is an open system some of \TeX\ packages include
% non-\TeX\ files. Some authors use \ds\ to generate PostScript
@@ -853,7 +906,7 @@
%
% \subsection{Verbatim mode}
% If your programming language uses some construct that can
-% interferes badly with \ds\ (e.g., percent in column one) you may
+% interfere badly with \ds\ (e.g., percent in column one) you may
% need a way for preventing it from being stripped off. For that
% purpose \ds\ features `verbatim mode'.
%
@@ -2245,9 +2298,14 @@ Z
% \subsection{Processing the input lines}
%
% \begin{macro}{\normalLine}
+% \changes{v2.6a}{2020-07-07}{The search-and-replace macro
+% \cs{replaceModuleInLine} added from \textsf{l3docstrip.dtx}
+% (gh/337)}
% The macro |\normalLine| writes its argument (which has to be
% delimited with |\endLine|) on all active output files i.e.
-% those with off-counters equal to zero.
+% those with off-counters equal to zero. It uses the
+% search-and-replace macro \cs{replaceModuleInLine} to replace any
+% occurences of \texttt{@@} with the current module name.
% If statistics are included, the counter
% |\codeLinesPassed| is incremented by $1$.
% \begin{macrocode}
@@ -2257,6 +2315,7 @@ Z
%</stats>
\maybeMsg{.}%
\def\inLine{#1}%
+ \replaceModuleInLine
\let\do\putline@do
\activefiles
}
@@ -2417,14 +2476,17 @@ Z
% \changes{2.3a}{1995/08/18}{Adapted to concurrent version}
% \changes{2.3a}{1995/08/20}{Trying to avoid assignments}
% \changes{2.3e}{1996/09/16}{Verbatim mode}
+% \changes{v2.6a}{2020-07-07}{Add the @-sign option from
+% \textsf{l3docstrip.dtx} (gh/337)}
+%
% When the macros that process a line have found that the line
% starts with `\texttt{\%<}', a guard line has been encountered.
% The first character of a guard can be an asterisk (\texttt{*}), a
% slash (\texttt{/}) a plus (\texttt{+}), a minus (\texttt{-}), a
-% less-than sign (\texttt{<}) starting verbatim mode or
-% any other character that can be found in an option name. This
-% means that we have to peek at the next token and
-% decide what kind of guard we have.
+% less-than sign (\texttt{<}) starting verbatim mode, a commercial
+% at (\texttt{@}) or any other character that can be found in an
+% option name. This means that we have to peek at the next token
+% and decide what kind of guard we have.
%
% We reinsert |#1| as it may be needed by |\doOption|.
% \begin{macrocode}
@@ -2432,12 +2494,13 @@ Z
\ifcase
\ifx*#10\else \ifx/#11\else
\ifx+#12\else \ifx-#13\else
- \ifx<#14\else 5\fi\fi\fi\fi\fi\relax
+ \ifx<#14\else \ifx @#15\else 6\fi\fi\fi\fi\fi\fi\relax
\expandafter\starOption\or
\expandafter\slashOption\or
\expandafter\plusOption\or
\expandafter\minusOption\or
\expandafter\verbOption\or
+ \expandafter\moduleOption\or
\expandafter\doOption\fi
#1}
% \end{macrocode}
@@ -2452,12 +2515,17 @@ Z
% result of the test |\if1\Expr{|\meta{options}|}|, the current
% line is either copied to the output stream or removed. Then
% the test is computed for all active output files.
+% \changes{v2.6a}{2020-07-07}{Now use \cs{InLine} and call
+% \cs{replaceModuleInline} (gh/337)}
% \begin{macrocode}
\def\doOption#1>#2\endLine{%
\maybeMsg{<#1 . >}%
\Evaluate{#1}%
\def\do##1##2##3{%
- \if1\Expr{##2}\StreamPut##1{#2}\fi
+ \if1\Expr{##2}%
+ \def\inLine{#2}%
+ \replaceModuleInLine
+ \StreamPut##1{\inLine}\fi
}%
\activefiles
}
@@ -2681,6 +2749,94 @@ Z
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\moduleOption}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+%
+% In the case where the line starts |%<@|: the defined syntax requires that
+% this continues to |%<@@=|. At the moment, we assume that the syntax is
+% correct and |#1| here is the module name for substitution into any
+% internal functions in the extracted material.
+% \begin{macrocode}
+\def\moduleOption @@=#1>#2\endLine{%
+ \maybeMsg{<@@=#1>}%
+ \prepareActiveModule{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prepareActiveModule}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceModuleInLine}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% Here, we set up to do the search-and-replace when doing the
+% extraction. The argument (|#1|) is the replacement text to use,
+% or if empty an indicator that no replacement should be done. The
+% search material is one of |__@@|, |_@@| or |@@|, done in order
+% such that all three end up the same in the output. The string
+% |@@@@| is hidden from these replacements by temporarily turning
+% it into a pair of letters with different category codes, not
+% produced by \ds; this allows to get |@@| in the
+% output. The replacement function is initialised as a do-nothing
+% for the case where |%<@@=| is never seen.
+% \begin{macrocode}
+\begingroup
+ \catcode`\_ = 12 %
+ \long\gdef\prepareActiveModule#1{%
+ \ifx\relax#1\relax
+ \let\replaceModuleInLine\empty
+ \else
+ \edef\replaceModuleInLine{%
+ \noexpand\replaceAllIn\noexpand\inLine{@@@@}{\string aa}%
+ \noexpand\replaceAllIn\noexpand\inLine{__@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{_@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{@@}{__#1}%
+ \noexpand\replaceAllIn\noexpand\inLine{\string aa}{@@}%
+ }%
+ \fi
+ }
+\endgroup
+\let\replaceModuleInLine\empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\replaceAllIn}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxI}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxII}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% \begin{macro}{\replaceAllInAuxIII}
+% \changes{v2.6a}{2020-07-07}{Macro added from
+% \textsf{l3docstrip.dtx} (gh/337)}
+% The code here is a simple search-and-replace routine for a macro
+% |#1|, replacing |#2| by |#3|. As set up here, there is an
+% assumption that nothing is going to be expandable, which is
+% reasonable as \ds\ deals with `string' material.
+% \begin{macrocode}
+\long\def\replaceAllIn#1#2#3{%
+ \long\def\tempa##1##2#2{%
+ ##2\qMark\replaceAllInAuxIII#3##1%
+ }%
+ \edef#1{\expandafter\replaceAllInAuxI#1\qMark#2\qStop}%
+}
+\def\replaceAllInAuxI{%
+ \expandafter\replaceAllInAuxII\tempa\replaceAllInAuxI\empty
+}
+\long\def\replaceAllInAuxII#1\qMark#2{#1}
+\long\def\replaceAllInAuxIII#1\qStop{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Batchfile commands}
% \changes{2.3e}{1996/10/02}{Added doc}
% \ds{} keeps information needed to control inclusion of sources in
diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf
index 3f74e31d4e..67d5187d44 100644
--- a/macros/latex-dev/base/docstrip.pdf
+++ b/macros/latex-dev/base/docstrip.pdf
Binary files differ
diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf
index d651b88475..d54e91c196 100644
--- a/macros/latex-dev/base/encguide.pdf
+++ b/macros/latex-dev/base/encguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf
index 65bc658e9e..39cb0b1d14 100644
--- a/macros/latex-dev/base/exscale.pdf
+++ b/macros/latex-dev/base/exscale.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf
index 2cd2d911b8..64c783ef04 100644
--- a/macros/latex-dev/base/fix-cm.pdf
+++ b/macros/latex-dev/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf
index 2b2017d501..2af45dc5f7 100644
--- a/macros/latex-dev/base/fntguide.pdf
+++ b/macros/latex-dev/base/fntguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.tex b/macros/latex-dev/base/fntguide.tex
index 8610bc99f7..b6576a0237 100644
--- a/macros/latex-dev/base/fntguide.tex
+++ b/macros/latex-dev/base/fntguide.tex
@@ -33,12 +33,16 @@
\documentclass{ltxguide}[1995/11/28]
+\usepackage{varioref}
+
\title{\LaTeXe{} font selection}
-\author{\copyright~Copyright 1995--2019, \LaTeX3 Project Team.\\
+\author{\copyright~Copyright 1995--2020, \LaTeX3 Project
+ Team.\thanks{Thanks to Arash Esbati for documenting the
+ newer NFSS features of 2020}\\
All rights reserved.}
-\date{October 2019}
+\date{July 2020}
\begin{document}
@@ -284,14 +288,26 @@ 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.
+\NEWdescription{2020/02/02}
The most common values for the font shape are:
\begin{center}
\begin{minipage}{.7\linewidth}
\begin{tabular}{rl}
- |n| & Normal (that is `upright' or `roman') \\
- |it| & Italic \\
- |sl| & Slanted (or `oblique') \\
- |sc| & Caps and small caps
+ |n| & Normal (that is `upright' or `roman') \\
+ |it| & Italic \\
+ |sl| & Slanted (or `oblique') \\
+ |sc| & Caps and small caps \\
+ |scit| & Caps and small caps italic \\
+ |scsl| & Caps and small caps slanted \\
+ |sw| & Swash
+ \end{tabular}
+ \end{minipage}
+\end{center}
+A less common value for font shape is:
+\begin{center}
+ \begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |ssc| & Spaced caps and small caps
\end{tabular}
\end{minipage}
\end{center}
@@ -337,6 +353,9 @@ The author commands for fonts set the five attributes:
|\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| \\
|\tiny| & size & |5pt| \\
|\scriptsize| & size & |7pt| \\
|\footnotesize| & size & |8pt| \\
@@ -489,14 +508,27 @@ 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| \\
+ |\itdefault| \\
+ |\sldefault| \\
+ |\scdefault| \\
+ |\sscdefault| \\
+ |\swdefault| \\
+ |\ulcdefault| \\
|\updefault|
\end{decl}
+\NEWfeature{2020/02/02}
The shapes selected by |\textit|, |\itshape|, |\textsl|, |\slshape|,
-|\textsc|, |\scshape|, |\textup| and |\upshape|. By default these are
-|it|, |sl|, |sc| and |n|.
+|\textsc|, |\scshape|, |\textssc|, |\sscshape|, |\textsw|, |\swshape|,
+|\textulc|, |\ulcshape|, |\textup| and |\upshape|. By default these are
+|it|, |sl|, |sc|, |ssc|, |sw|, |ulc| and |n|. |ulc| is special here
+since it is a virtual one; it doesn't exist as a real shape. The
+respective macros |\textulc| or |\ulcshape| change small capitals back
+to upper/lower case but will not change the font with respect to
+italics, slanted or swash. |\upshape| or |\textup| in contrast will
+switch italics or slanted back to upright but not alter the state of
+upper/lower case, e.g., keep small capitals if present. Finally, the
+command |\normalshape| is provided to reset the shape back to normal
+which is a shorthand for |\upshape\ulcshape|.
Note that there are no parameters for the size commands. These should
be defined directly in class files, for example:
@@ -1874,6 +1906,264 @@ dependencies that you have to obey:
declarations.
\end{itemize}
+\subsection{Font series defaults per document family}
+
+\NEWfeature{2020/02/02}
+With additional weights and widths being available in many font families
+nowadays, it is more likely that somebody will want to match, say, a
+medium weight serif family with a semi-light sans serif family, or that
+with one family one wants to use the bold-extended face when |\textbf|
+is used, while with another it should be bold (not extended) or
+semi-bold, etc. The default values can be altered using the
+|\DeclareFontSeriesDefault| declaration in packages or document
+preambles:
+\begin{decl}
+ |\DeclareFontSeriesDefault| \oarg{meta family}
+ \arg{meta series} \arg{series value}
+\end{decl}
+This declaration takes three arguments:
+\begin{description}
+\item[Meta family interface:] Can be either |rm|, |sf| or |tt|. This is
+ optional and if not present the next two arguments apply to the
+ overall default.
+\item[Meta series interface:] Can be |md| or |bf|.
+\item[Series value:] This is the value that is going to be used when the
+ combination of \m{meta family} and \m{meta series} is requested.
+\end{description}
+For example,
+\begin{verbatim}
+ \DeclareFontSeriesDefault[rm]{bf}{sb}
+\end{verbatim}
+would use |sb| (semi-bold) when |\rmfamily\bfseries| is requested in
+document.
+
+\subsection{Handling of nested emphasis}
+
+\begin{decl}
+ |\DeclareEmphSequence| \arg{list of font declarations}
+\end{decl}
+
+\NEWfeature{2020/02/02}
+This declaration takes a comma separated list of font declarations each
+specifying how increasing levels of emphasis should be handled. For
+example:
+\begin{verbatim}
+ \DeclareEmphSequence{\itshape,%
+ \upshape\scshape,%
+ \itshape}
+\end{verbatim}
+uses italics for the first, small capitals for the second, and italic
+small capitals for the third level. If there are more nesting levels
+than provided, declarations stored in |\emreset| (by default
+|\ulcshape\upshape|) are used for the next level and then the list
+restarts.
+
+\subsection{Providing font family substitutions}
+
+\begin{decl}
+ |\DeclareFontFamilySubstitution| \arg{encoding}
+ \arg{family}
+ \arg{new-family}
+\end{decl}
+
+\NEWfeature{2020/02/02}
+This declaration selects the font family \m{new-family} as replacement
+for \m{family} in the font encoding \m{encoding}. For example,
+\begin{verbatim}
+ \DeclareFontFamilySubstitution{LGR}
+ {Montserrat-LF}{IBMPlexSans-TLF}
+\end{verbatim}
+tells \LaTeX{} to substitute the sans serif font |Montserrat-LF| in the
+Greek encoding |LGR| with |IBMPlexSans-TLF| once requested in a
+document.
+
+\section{Additional text symbols -- \textsf{textcomp}}
+
+\NEWfeature{2020/02/02}
+For a long time the interface to additional text symbols and the text
+companion encoding |TS1| in general was the \textsf{textcomp} package.
+All the symbols provided by the \textsf{textcomp} package are now
+available in \LaTeX{} kernel. Furthermore, an intelligent substitution
+mechanism has been implemented so that glyphs missing in some fonts are
+automatically substituted with default glyphs that are sans serif if you
+typeset in |\textsf| and monospaced if you typeset using |\texttt|. In
+the past they were always taken from Computer Modern Roman if
+substitution was necessary.
+
+{\sffamily This is most noticeable with |\oldstylenums| which are now
+ taken from |TS1| so that you no longer get \legacyoldstylenums{1234}
+ but \oldstylenums{1234} when typesetting in sans serif fonts \ttfamily
+ and \oldstylenums{1234} when using typewriter fonts.}
+
+\begin{decl}
+ |\legacyoldstylenums| \arg{nums}\\
+ |\UseLegacyTextSymbols|
+\end{decl}
+If there ever is a need to use the original (inferior) definition, then
+that remains available as |\legacyoldstylenums|; and to fully revert to
+the old behavior there is also |\UseLegacyTextSymbols|. The latter
+declaration reverts |\oldstylenums| and also changes the footnote
+symbols, such as |\textdagger|, |\textparagraph|, etc., to pick up their
+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).
+
+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 \\
+ \verb*|\textcircled a| & \textcircled a
+ \end{tabular}
+\end{center}
+
+These accents are available via font encoding. The numbers in third row
+show the slot number:
+\begin{center}
+ \begin{tabular}[t]{@{}p{0.32\linewidth}p{1em}p{2em}@{}}
+ \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
+ \end{tabular}
+ \quad
+ \begin{tabular}[t]{@{}p{0.32\linewidth}p{1em}p{2em}@{}}
+ \verb|\capitalbreve| & \capitalbreve{} & 8 \\
+ \verb|\capitalmacron| & \capitalmacron{} & 9 \\
+ \verb|\capitaldotaccent| & \capitaldotaccent{} & 10 \\
+ \verb|\t| & \t{} & 26 \\
+ \verb|\capitaltie| & \capitaltie{} & 27 \\
+ \verb|\newtie| & \newtie{} & 28 \\
+ \verb|\capitalnewtie| & \capitalnewtie{} & 29
+ \end{tabular}
+\end{center}
+
+Table~\vref{tab:textcomp} contains macros to access text symbols. Again,
+the numbers are the slots in the encoding.
+
+\begin{table}
+\centering\footnotesize
+ \begin{tabular}[t]{@{}lp{1.5em}l@{}}
+ \verb|\textcapitalcompwordmark| & \textcapitalcompwordmark & 23 \\
+ \verb|\textascendercompwordmark| & \textascendercompwordmark & 31 \\
+ \verb|\textquotestraightbase| & \textquotestraightbase & 13 \\
+ \verb|\textquotestraightdblbase| & \textquotestraightdblbase & 18 \\
+ \verb|\texttwelveudash| & \texttwelveudash & 21 \\
+ \verb|\textthreequartersemdash| & \textthreequartersemdash & 22 \\
+ \verb|\textleftarrow| & \textleftarrow & 24 \\
+ \verb|\textrightarrow| & \textrightarrow & 25 \\
+ \verb|\textblank| & \textblank & 32 \\
+ \verb|\textdollar| & \textdollar & 36 \\
+ \verb|\textquotesingle| & \textquotesingle & 39 \\
+ \verb|\textasteriskcentered| & \textasteriskcentered & 42 \\
+ \verb|\textdblhyphen| & \textdblhyphen & 45 \\
+ \verb|\textfractionsolidus| & \textfractionsolidus & 47 \\
+ \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|\textlangle| & \textlangle & 60 \\
+ \verb|\textminus| & \textminus & 61 \\
+ \verb|\textrangle| & \textrangle & 62 \\
+ \verb|\textmho| & \textmho & 77 \\
+ \verb|\textbigcircle| & \textbigcircle & 79 \\
+ \verb|\textohm| & \textohm & 87 \\
+ \verb|\textlbrackdbl| & \textlbrackdbl & 91 \\
+ \verb|\textrbrackdbl| & \textrbrackdbl & 93 \\
+ \verb|\textuparrow| & \textuparrow & 94 \\
+ \verb|\textdownarrow| & \textdownarrow & 95 \\
+ \verb|\textasciigrave| & \textasciigrave & 96 \\
+ \verb|\textborn| & \textborn & 98 \\
+ \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|\textdagger| & \textdagger & 132 \\
+ \verb|\textdaggerdbl| & \textdaggerdbl & 133 \\
+ \verb|\textbardbl| & \textbardbl & 134 \\
+ \verb|\textperthousand| & \textperthousand & 135 \\
+ \verb|\textbullet| & \textbullet & 136 \\
+ \verb|\textcelsius| & \textcelsius & 137 \\
+ \verb|\textdollaroldstyle| & \textdollaroldstyle & 138 \\
+ \verb|\textcentoldstyle| & \textcentoldstyle & 139
+ \end{tabular}\qquad
+ \begin{tabular}[t]{lp{1.5em}l}
+ \verb|\textflorin| & \textflorin & 140 \\
+ \verb|\textcolonmonetary| & \textcolonmonetary & 141 \\
+ \verb|\textwon| & \textwon & 142 \\
+ \verb|\textnaira| & \textnaira & 143 \\
+ \verb|\textguarani| & \textguarani & 144 \\
+ \verb|\textpeso| & \textpeso & 145 \\
+ \verb|\textlira| & \textlira & 146 \\
+ \verb|\textrecipe| & \textrecipe & 147 \\
+ \verb|\textinterrobang| & \textinterrobang & 148 \\
+ \verb|\textinterrobangdown| & \textinterrobangdown & 149 \\
+ \verb|\textdong| & \textdong & 150 \\
+ \verb|\texttrademark| & \texttrademark & 151 \\
+ \verb|\textpertenthousand| & \textpertenthousand & 152 \\
+ \verb|\textpilcrow| & \textpilcrow & 153 \\
+ \verb|\textbaht| & \textbaht & 154 \\
+ \verb|\textnumero| & \textnumero & 155 \\
+ \verb|\textdiscount| & \textdiscount & 156 \\
+ \verb|\textestimated| & \textestimated & 157 \\
+ \verb|\textopenbullet| & \textopenbullet & 158 \\
+ \verb|\textservicemark| & \textservicemark & 159 \\
+ \verb|\textlquill| & \textlquill & 160 \\
+ \verb|\textrquill| & \textrquill & 161 \\
+ \verb|\textcent| & \textcent & 162 \\
+ \verb|\textsterling| & \textsterling & 163 \\
+ \verb|\textcurrency| & \textcurrency & 164 \\
+ \verb|\textyen| & \textyen & 165 \\
+ \verb|\textbrokenbar| & \textbrokenbar & 166 \\
+ \verb|\textsection| & \textsection & 167 \\
+ \verb|\textasciidieresis| & \textasciidieresis & 168 \\
+ \verb|\textcopyright| & \textcopyright & 169 \\
+ \verb|\textordfeminine| & \textordfeminine & 170 \\
+ \verb|\textcopyleft| & \textcopyleft & 171 \\
+ \verb|\textlnot| & \textlnot & 172 \\
+ \verb|\textcircledP| & \textcircledP & 173 \\
+ \verb|\textregistered| & \textregistered & 174 \\
+ \verb|\textasciimacron| & \textasciimacron & 175 \\
+ \verb|\textdegree| & \textdegree & 176 \\
+ \verb|\textpm| & \textpm & 177 \\
+ \verb|\texttwosuperior| & \texttwosuperior & 178 \\
+ \verb|\textthreesuperior| & \textthreesuperior & 179 \\
+ \verb|\textasciiacute| & \textasciiacute & 180 \\
+ \verb|\textmu| & \textmu & 181 \\
+ \verb|\textparagraph| & \textparagraph & 182 \\
+ \verb|\textperiodcentered| & \textperiodcentered & 183 \\
+ \verb|\textreferencemark| & \textreferencemark & 184 \\
+ \verb|\textonesuperior| & \textonesuperior & 185 \\
+ \verb|\textordmasculine| & \textordmasculine & 186 \\
+ \verb|\textsurd| & \textsurd & 187 \\
+ \verb|\textonequarter| & \textonequarter & 188 \\
+ \verb|\textonehalf| & \textonehalf & 189 \\
+ \verb|\textthreequarters| & \textthreequarters & 190 \\
+ \verb|\texteuro| & \texteuro & 191 \\
+ \verb|\texttimes| & \texttimes & 214 \\
+ \verb|\textdiv| & \textdiv & 246
+ \end{tabular}
+\caption{Text symbols formerly from the \textsf{textcomp} package}
+\label{tab:textcomp}
+\end{table}
\section{If you need to know more \ldots}
diff --git a/macros/latex-dev/base/format.ins b/macros/latex-dev/base/format.ins
index 940161edd5..5d96b5e1f3 100644
--- a/macros/latex-dev/base/format.ins
+++ b/macros/latex-dev/base/format.ins
@@ -161,6 +161,7 @@ the system are in the document `cfgguide.tex'.
\from{ltdirchk.dtx}{initex,2ekernel,dircheck}
\from{ltplain.dtx}{2ekernel}
\from{ltvers.dtx}{2ekernel}
+ \from{ltluatex.dtx}{2ekernel}
\from{ltdefns.dtx}{2ekernel}
\from{ltalloc.dtx}{2ekernel}
\from{ltcntrl.dtx}{2ekernel}
@@ -196,7 +197,6 @@ the system are in the document `cfgguide.tex'.
\from{ltpage.dtx}{2ekernel}
\from{ltoutput.dtx}{2ekernel}
\from{ltclass.dtx}{2ekernel,tracerollback}
- \from{ltluatex.dtx}{2ekernel}
\from{ltfinal.dtx}{2ekernel}}
\file{tracefnt.sty}{%
\from{ltfsstrc.dtx}{package,trace}}
diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf
index 6445993704..8228eeef94 100644
--- a/macros/latex-dev/base/graphpap.pdf
+++ b/macros/latex-dev/base/graphpap.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf
index d9c284461f..c4a2758d2d 100644
--- a/macros/latex-dev/base/ifthen.pdf
+++ b/macros/latex-dev/base/ifthen.pdf
Binary files differ
diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf
index ee5a4e8bbe..a9e5de1101 100644
--- a/macros/latex-dev/base/inputenc.pdf
+++ b/macros/latex-dev/base/inputenc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexchanges.pdf b/macros/latex-dev/base/latexchanges.pdf
index d4b0bd2de2..41cbf57ca1 100644
--- a/macros/latex-dev/base/latexchanges.pdf
+++ b/macros/latex-dev/base/latexchanges.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf
index e914f5ee30..d2e28e7b3e 100644
--- a/macros/latex-dev/base/latexrelease.pdf
+++ b/macros/latex-dev/base/latexrelease.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf
index 5a41af7123..e50c21e049 100644
--- a/macros/latex-dev/base/latexsym.pdf
+++ b/macros/latex-dev/base/latexsym.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf
index abb4820d33..675ad85fe3 100644
--- a/macros/latex-dev/base/lb2.pdf
+++ b/macros/latex-dev/base/lb2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf
index 4df0771074..afc2790ef9 100644
--- a/macros/latex-dev/base/letter.pdf
+++ b/macros/latex-dev/base/letter.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf
index f3c7b5ff3e..9dd6a2d932 100644
--- a/macros/latex-dev/base/lgc2.pdf
+++ b/macros/latex-dev/base/lgc2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf
index 14c251a554..fbb4dfd8a5 100644
--- a/macros/latex-dev/base/lppl.pdf
+++ b/macros/latex-dev/base/lppl.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltclass.dtx b/macros/latex-dev/base/ltclass.dtx
index dd35be9ae4..152adf82ff 100644
--- a/macros/latex-dev/base/ltclass.dtx
+++ b/macros/latex-dev/base/ltclass.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2020/04/24 v1.3k LaTeX Kernel (Class & Package Interface)]
+ [2020/06/05 v1.3l LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -552,22 +552,58 @@
% |#2| current extension. \\
% |#3| current catcode of |@|. \\
% |#4| Rest of the stack.
+% \changes{v1.3l}{2020/06/05}{Added \cs{@expl@push@filename@@}
+% and \cs{@expl@push@filename@aux@@}}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
\def\@pushfilename{%
+ \@expl@push@filename@@
\xdef\@currnamestack{%
{\@currname}%
{\@currext}%
{\the\catcode`\@}%
- \@currnamestack}}
+ \@currnamestack}%
+ \@expl@push@filename@aux@@}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
+%<latexrelease>\def\@pushfilename{%
+%<latexrelease> \xdef\@currnamestack{%
+%<latexrelease> {\@currname}%
+%<latexrelease> {\@currext}%
+%<latexrelease> {\the\catcode`\@}%
+%<latexrelease> \@currnamestack}}
+%<latexrelease>\EndIncludeInRelease
\@onlypreamble\@pushfilename
% \end{macrocode}
%
+% \changes{v1.3l}{2020/06/05}{Added \cs{@expl@pop@filename@@}}
% \begin{macrocode}
-\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil}
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}{\@popfilename}%
+%<latexrelease> {Add \@expl@pop@filename@@}%
+\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil
+ \@expl@pop@filename@@}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}{\@pushfilename}%
+%<latexrelease> {Add \@expl@push@filename@@ and \@expl@push@filename@aux@@}%
+%<latexrelease>\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil}
+%<latexrelease>\EndIncludeInRelease
\@onlypreamble\@popfilename
% \end{macrocode}
%
% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
\def\@p@pfilename#1#2#3#4\@nil{%
\gdef\@currname{#1}%
\gdef\@currext{#2}%
diff --git a/macros/latex-dev/base/ltdefns.dtx b/macros/latex-dev/base/ltdefns.dtx
index 8b7a307ad2..3abd251e4c 100644
--- a/macros/latex-dev/base/ltdefns.dtx
+++ b/macros/latex-dev/base/ltdefns.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2020/05/15 v1.5h LaTeX Kernel (definition commands)]
+ [2020/06/04 v1.5i LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -101,6 +101,16 @@
%<*2ekernel>
% \end{macrocode}
%
+% \subsection{Loading further extensions}
+%
+% \changes{v1.5i}{2020-06-04}{Load \textsf{ltexpl} in \texttt{ltdefns}}
+% Simply load further code: it's deliberately separate.
+% This is done as soon as possible here in \texttt{ltdefns.dtx} so that
+% we have the extensions as soon as possible.
+% \begin{macrocode}
+\input ltexpl.ltx
+% \end{macrocode}
+%
% \subsection{Initex initialisations}
%
% \task{???}{This section needs extension}
diff --git a/macros/latex-dev/base/ltexpl.dtx b/macros/latex-dev/base/ltexpl.dtx
index 5e726298b2..7a567e378f 100644
--- a/macros/latex-dev/base/ltexpl.dtx
+++ b/macros/latex-dev/base/ltexpl.dtx
@@ -33,10 +33,10 @@
%<*driver>
% \fi
\ProvidesFile{ltexpl.dtx}
- [2020-05-03 v1.2b LaTeX Kernel (expl3-dependent code)]
+ [2020-07-08 v1.2d LaTeX Kernel (expl3-dependent code)]
% \iffalse
\documentclass{ltxdoc}
-\GetFileInfo{ltfinal.dtx}
+\GetFileInfo{ltexpl.dtx}
\title{\filename}
\date{\filedate}
\author{%
@@ -44,7 +44,7 @@
\begin{document}
\MaintainedByLaTeXTeam{latex}
\maketitle
- \DocInput{ltfinal.dtx}
+ \DocInput{ltexpl.dtx}
\end{document}
%</driver>
% \fi
@@ -55,69 +55,170 @@
%
% \changes{v0.0}{2019-10-02}{Initial version}
%
+% \subsection{Loader}
+%
+% \changes{v1.0a}{2020/03/02}
+% {Don't load expl3 if already in the format (gh/295)}
+% \changes{v1.1}{2020/03/05}
+% {Load xparse.ltx if \cs{NewDocumentCommand} is not defined
+% by expl3.ltx}
+% \changes{v1.2c}{2020/06/04}
+% {Define a local version of some \LaTeXe{} basic macros to support
+% package loading}
+%
+% First define some blank commands, so that in case something goes wrong while
+% loading \textsf{expl3}, we won't get strange \texttt{Undefined control
+% sequence} errors.
% \begin{macrocode}
%<*2ekernel>
+\def\@expl@sys@load@backend@@{}
+\def\@expl@push@filename@@{}
+\def\@expl@push@filename@aux@@{}
+\def\@expl@pop@filename@@{}
+%</2ekernel>
% \end{macrocode}
%
-% \subsection{Loader}
+% \changes{v1.2d}{2020/07/08}
+% {Add a last-minute hook for \textsf{expl3}}
+% Create a hook for last-minute \pkg{expl3} material.
+% \begin{macrocode}
+%<*2ekernel>
+\def\@expl@finalise@setup@@{}
+%</2ekernel>
+% \end{macrocode}
%
-% Check for the required primitive/engine support and the existence of
-% a loader.
+% Now define some basics to support loading \textsf{expl3}. These macros can
+% be defined here safely, because they are redefined later on by the kernel,
+% so we define simpler versions just to suit our needs.
% \begin{macrocode}
+%<*2ekernel>
+\long\def\@gobble#1{}
+\long\def\@firstofone#1{#1}
+\long\def\@firstoftwo#1#2{#1}
+\long\def\@secondoftwo#1#2{#2}
+\long\def\IfFileExists#1{%
+ \openin\@inputcheck"#1" %
+ \ifeof\@inputcheck
+ \expandafter\@secondoftwo
+ \else
+ \closein\@inputcheck
+ \expandafter\@firstoftwo
+ \fi}
+\long\def\@ifnextchar#1#2#3{%
+ \let\reserved@d=#1%
+ \def\reserved@a{#2}%
+ \def\reserved@b{#3}%
+ \futurelet\@let@token\@ifnch}
+\def\@ifnch{%
+ \ifx\@let@token\reserved@d
+ \expandafter\reserved@a
+ \else
+ \expandafter\reserved@b
+ \fi}
%</2ekernel>
-%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2020/02/02}%
-%<latexrelease> {expl3}{Pre-load expl3}%
% \end{macrocode}
+%
% If we are doing a rollback with a format containing expl3 we
% aren't reloading it as that creates havoc. This may need a
% refined version!
-% \changes{v1.0a}{2020/03/02}
-% {Don't load expl3 if already in the format (gh/295)}
-% \changes{v1.1}{2020/03/05}
-% {Load xparse.ltx if \cs{NewDocumentCommand} is not defined
-% by expl3.ltx}
% \begin{macrocode}
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {expl3}{Pre-load expl3}%
\expandafter\ifx\csname tex\string _let:D\endcsname\relax
- \IfFileExists{expl3.ltx}
- {%
- \ifnum0%
- \ifdefined\pdffilesize 1\fi
- \ifdefined\filesize 1\fi
- \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
- >0 %
- \expandafter\@firstofone
- \else
- \message{Skipping expl3-dependent extensions}
-%<2ekernel> \expandafter\endinput
-%<latexrelease> \expandafter\@gobble
- \fi
- }
- {%
- \message{Skipping expl3-dependent extensions}%
-%<2ekernel> \endinput
-%<latexrelease> \@gobble
- }%
- {%
- \input{expl3.ltx}
- \ifdefined\NewDocumentCommand
- \else
- \IfFileExists{xparse.ltx}
- {\input{xparse.ltx}}
- {}%
- \fi
- }%
+ \expandafter\@firstofone
\else
- \GenericInfo{}{Skipping: expl3 code already part of the format}
+ \GenericInfo{}{Skipping: expl3 code already part of the format}%
+%<2ekernel> \expandafter\endinput
+%<latexrelease> \expandafter\@gobble
\fi
-%</2ekernel|latexrelease>
+% \end{macrocode}
+%
+% Check for the required primitive/engine support and the existence of
+% a loader.
+% \begin{macrocode}
+ {%
+ \IfFileExists{expl3.ltx}
+ {%
+ \ifnum0%
+ \ifdefined\pdffilesize 1\fi
+ \ifdefined\filesize 1\fi
+ \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
+ \ifdefined\kanjiskip 1\fi
+ >0 %
+ \expandafter\@firstofone
+ \else
+% \end{macrocode}
+%
+% In \texttt{2ekernel} mode, an error is fatal and building the format
+% is aborted. Use \verb=\batchmode \read -1 to \tokenlist=, which errors
+% with
+% \verb=! Emergency stop. (cannot \read from terminal in nonstop modes)=
+% and aborts the \TeX{} run. In \texttt{latexrelease} mode, raise an
+% error and do nothing. Both ways, the error message shows the minimum
+% \textsf{expl3} engine requirements.
+% \begin{macrocode}
+%<2ekernel> \def~{ }\def\MessageBreak{^^J~~~~~~~~~~~~~~~}%
+%<2ekernel> \errmessage{LaTeX Error:
+%<latexrelease> \@latex@error{%
+ LaTeX requires the e-TeX primitives and additional\MessageBreak
+ functionality available in the engines:\MessageBreak
+ - pdfTeX v1.40\MessageBreak
+ - XeTeX v0.99992\MessageBreak
+ - LuaTeX v0.95\MessageBreak
+ - e-(u)pTeX mid-2012\MessageBreak
+ or later%
+%<latexrelease> }\@ehd \expandafter\@gobble
+%<2ekernel> }\batchmode \read -1 to \reserved@a
+ \fi
+ }
+ {%
+%<*2ekernel>
+ \errmessage{LaTeX requires expl3}%
+ \batchmode \read -1 to \reserved@a
+%</2ekernel>
+%<*latexrelease>
+ \@latex@error{LaTeX requires expl3}\@ehd
+ \@gobble
+%</latexrelease>
+ }%
+ {%
+ \input expl3.ltx
+ \ifdefined\NewDocumentCommand
+ \else
+ \IfFileExists{xparse.ltx}
+ {\input xparse.ltx }
+ {}%
+ \fi
+ }%
+ }
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2020/02/02}%
+%<latexrelease> {expl3}{Pre-load expl3}%
+%<latexrelease>\IfFileExists{expl3.ltx}
+%<latexrelease> {%
+%<latexrelease> \ifnum0%
+%<latexrelease> \ifdefined\pdffilesize 1\fi
+%<latexrelease> \ifdefined\filesize 1\fi
+%<latexrelease> \ifdefined\luatexversion\ifnum\luatexversion>94 1\fi\fi
+%<latexrelease> >0 %
+%<latexrelease> \else
+%<latexrelease> \message{Skipping expl3-dependent extensions}
+%<latexrelease> \expandafter\@gobbletwo
+%<latexrelease> \fi
+%<latexrelease> }
+%<latexrelease> {%
+%<latexrelease> \message{Skipping expl3-dependent extensions}%
+%<latexrelease> \@gobbletwo
+%<latexrelease> }%
+%<latexrelease>\input{expl3.ltx}
%<latexrelease>\EndIncludeInRelease
% \end{macrocode}
%
% \subsection{Using expl3 code}
%
% \begin{macrocode}
-%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2020/10/01}%
%<latexrelease> {\@expl@tl@trim@spaces@apply@@nN}
%<latexrelease> {l3 macro for use in include}%
@@ -141,7 +242,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\@expl@tl@trim@spaces@apply@@nN}
@@ -150,11 +250,7 @@
%<latexrelease>\let\@expl@tl@trim@spaces@apply@@nN\@undefined
%<latexrelease>
%<latexrelease>\EndIncludeInRelease
-%<*2ekernel>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</2ekernel>
+%</2ekernel|latexrelease>
% \end{macrocode}
%
% \Finale
diff --git a/macros/latex-dev/base/ltfilehook-code.pdf b/macros/latex-dev/base/ltfilehook-code.pdf
new file mode 100644
index 0000000000..bd183ac9bc
--- /dev/null
+++ b/macros/latex-dev/base/ltfilehook-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltfilehook-code.tex b/macros/latex-dev/base/ltfilehook-code.tex
new file mode 100644
index 0000000000..2a9c1d1815
--- /dev/null
+++ b/macros/latex-dev/base/ltfilehook-code.tex
@@ -0,0 +1,10 @@
+% This will typeset documentation + code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex ltfilehook.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltfilehook.dtx}
diff --git a/macros/latex-dev/base/ltfilehook-doc.pdf b/macros/latex-dev/base/ltfilehook-doc.pdf
new file mode 100644
index 0000000000..d58188e4fb
--- /dev/null
+++ b/macros/latex-dev/base/ltfilehook-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltfilehook-doc.tex b/macros/latex-dev/base/ltfilehook-doc.tex
new file mode 100644
index 0000000000..d3a20f74ef
--- /dev/null
+++ b/macros/latex-dev/base/ltfilehook-doc.tex
@@ -0,0 +1,12 @@
+% This will typeset only documentation but not the code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex ltfilehook.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ }
+\input{ltfilehook.dtx}
diff --git a/macros/latex-dev/base/ltfilehook.dtx b/macros/latex-dev/base/ltfilehook.dtx
new file mode 100644
index 0000000000..6c16a9832e
--- /dev/null
+++ b/macros/latex-dev/base/ltfilehook.dtx
@@ -0,0 +1,1161 @@
+% \iffalse meta-comment
+%
+%% File: ltfilehook.dtx (C) Copyright 2020 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
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/FrankMittelbach/...
+%
+% for those people who are interested or want to report an issue.
+%
+% \begin{macrocode}
+\providecommand\ltfilehookversion{v0.9a}
+\providecommand\ltfilehookdate{2020/07/19}
+% \end{macrocode}
+%
+%<*driver>
+
+\RequirePackage{lthooks} % needed for structedlog if running old format
+
+\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
+
+\usepackage{structuredlog} % for demonstration
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltfilehook.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}}
+%
+% \let\hook\texttt
+%
+% \title{The \texttt{ltfilehook} package\thanks{This package has version
+% \ltfilehookversion\ dated \ltfilehookdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+%
+%
+% \subsection{Provided hooks}
+%
+% The code offers a number of hooks into which packages (or the
+% user) can add code to support different use cases.
+% Many hooks are offered as pairs (i.e., the second hook is
+% reversed. Also important to know is that these pairs are
+% properly nested with respect to other pairs of hooks.
+%
+% There are hooks that are executed for all files of a certain type
+% (if they contain code), e.g., for all \enquote{include files} or
+% all \enquote{packages},
+% and there are also hooks that are specific to a single file,
+% e.g., do something after the package \texttt{foo.sty} has been
+% loaded.
+%
+%
+% \subsection{General hooks for file reading}
+% \label{sec:general-file-hooks}
+%
+% There are four hooks that are called for each file that is read
+% using document-level commands such as \cs{input}, \cs{include},
+% \cs{usepackage}, etc. They are not called for files read using
+% internal low-level methods, such as \cs{@input} or \cs{openin}.
+%
+% \begin{variable}{file/before,file/before/...,
+% file/after/...,file/after,
+% }
+% These are:
+% \begin{description}
+% \item[\texttt{file/before}, \texttt{file/before/\meta{file-name}}]
+%
+% These hooks are executed in that order just before the file is
+% loaded for reading. The code of the first hook is used is used
+% with every file, while the second is executed only for the
+% file with matching \meta{file-name} allowing you to specify
+% code that only applies to one file.
+%
+% \item[\texttt{file/after/\meta{file-name}}, \texttt{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}
+% 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 add code to both
+% \texttt{/before} and \texttt{/after} hooks.
+%
+% \end{description}
+% \end{variable}
+%
+%
+% So the overall sequence of hook processing for any file read
+% through the user interface commands of \LaTeX{} is:
+%
+% \begin{tabbing}
+% mm\=mm\=mm\=mm\=\kill
+% \>\cs{UseHook}\marg{\hook{file/before}} \\
+% \>\cs{UseHook}\marg{\hook{file/before/\meta{file name}}} \\
+% \>\> \meta{file contents} \\
+% \>\cs{UseHook}\marg{\hook{file/after/\meta{file name}}} \\
+% \>\cs{UseHook}\marg{\hook{file/after}}
+% \end{tabbing}
+%
+% \fmi{With a higher-level interface that doesn't matter, but it
+% is a bit weird, if you use \cs{AddToHook} or \cs{hook_gput:nnn}
+% directly, so I guess that has to be done differently!}
+%
+% The file hooks only refer to the file by its name and extension,
+% so the \meta{file name} should be the file name as it is on the
+% filesystem with extension (if any) and without paths. Different
+% from \cs{input} and similar commands, for hooks the \texttt{.tex}
+% extension is not assumed, so \texttt{.tex} files must also be given
+% with their extension.
+% Files within subfolders should also be addressed by their name and
+% extension only.
+%
+% Extensionless files also work, and should then be given without
+% extension. Note however that \TeX{} prioritizes \texttt{.tex}
+% files, so if two files \texttt{foo} and \texttt{foo.tex} exist in
+% the search path, only the latter will be seen.
+%
+% When a file is input, the \meta{file name} is available in
+% \cs{CurrentFile}, which is then used when accessing the
+% \hook{file/before/\meta{file name}} and
+% \hook{file/after/\meta{file name}}.
+%
+% \begin{variable}{\CurrentFile}
+% The name of the file about to be read (or just finished) is
+% available to the hooks through \cs{CurrentFile} (there is no
+% \texttt{expl3} name for it for now). The file is always provided
+% with its extension, i.e., how it appears on your hard drive, but
+% without any specified path to it. For example,
+% \verb=\input{sample}= and \verb=\input{app/sample.tex}= would
+% both have \cs{CurrentFile} being \texttt{sample.tex}.
+% \end{variable}
+%
+% \begin{variable}{\CurrentFilePath}
+% The path to the current file (complement to \cs{CurrentFile}) is
+% available in \cs{CurrentFilePath} if needed.
+% The paths returned in \cs{CurrentFilePath} are only user paths,
+% given through \cs{input@path} (or \pkg{expl3}'s equivalent
+% \cs{l_file_search_path_seq}) or by directly typing in the path
+% in the \cs{input} command or equivalent. Files located by
+% \texttt{kpsewhich} get the path added internally by the \TeX{}
+% implementation, so at the macro level it looks as if the file were
+% in the current folder, so the path in \cs{CurrentFilePath} is empty
+% in these cases (package and class files, mostly).
+% \end{variable}
+%
+% \subsection{Hooks for package and class files}
+%
+% Commands to load package and class files (e.g., \cs{usepackage},
+% \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/after/array.sty} 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.
+%
+%
+% \begin{variable}{
+% package/before,package/after,
+% package/before/...,package/after/...,
+% class/before,class/after,
+% class/before/...,class/after/...,
+% }
+% These are:
+% \begin{description}
+% \item[\texttt{package/before}, \texttt{package/after}]
+%
+% These hooks are called for each package being loaded.
+%
+% \item[\texttt{package/before/\meta{name}},
+% \texttt{package/after/\meta{name}}]
+%
+% These hooks are additionally called if the package name is
+% \meta{name} (without extension).
+%
+% \item[\texttt{class/before}, \texttt{class/after}]
+%
+% These hooks are called for each class being loaded.
+%
+% \item[\texttt{class/before/\meta{name}}, \texttt{class/after/\meta{name}}]
+%
+% These hooks are additionally called if the class name is
+% \meta{name} (without extension).
+%
+% \end{description}
+% \end{variable}
+% All \hook{/after} hooks are implemented as reversed hooks.
+%
+% \noindent The overall sequence of execution for \cs{usepackage}
+% and friends is therefore:
+% \begin{tabbing}
+% mm\=mm\=mm\=mm\=\kill
+% \>\cs{UseHook}\marg{\hook{package/before}} \\
+% \>\cs{UseHook}\marg{\hook{package/before/\meta{package name}}} \\[5pt]
+% \>\>\cs{UseHook}\marg{\hook{file/before}} \\
+% \>\>\cs{UseHook}\marg{\hook{file/before/\meta{package name}.sty}} \\
+% \>\>\> \meta{package contents} \\
+% \>\>\cs{UseHook}\marg{\hook{file/after/\meta{package name}.sty}} \\
+% \>\>\cs{UseHook}\marg{\hook{file/after}} \\[5pt]
+% \>\>\emph{code from \cs{AtEndOfPackage} if
+% used inside the package} \\[5pt]
+% \>\cs{UseHook}\marg{\hook{package/after/\meta{package name}}} \\
+% \>\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
+% \cs{AtEndOfClass}.
+%
+% If a package or class is not loaded (or it was loaded before the
+% hooks were set) none of the hooks are executed!
+%
+% \subsection{Hooks for \cs{include} files}
+%
+% To manage \cs{include} files, \LaTeX{} issues a \cs{clearpage}
+% before and after loading such a file. Depending on the use case
+% one may want to execute code before or after these
+% \cs{clearpage}s especially for the one that is issued at the end.
+%
+% Executing code before the final \cs{clearpage}, means that the
+% code is processed while the last page of the included material is
+% still under construction. Executing code after it means that all
+% floats from inside the include file are placed (which
+% might have added further pages) and the final page has finished.
+%
+% Because of these different scenarios we offer hooks in three
+% places.\footnote{If you want to execute code before the first
+% \cs{clearpage} there is no need to use a hook---you can write it
+% directly in front of the \cs{include}.}
+% None of the hooks are executed when an \cs{include} file is
+% bypassed because of an \cs{includeonly} declaration. They are,
+% however, all executed if \LaTeX{} makes an attempt to load the
+% \cs{include} file (even if it doesn't exist and all that happens
+% is \enquote{\texttt{No file \meta{filename}.tex}}).
+%
+%
+% \begin{variable}{include/before,include/before/...,
+% include/end,include/end/...,
+% include/after,include/after/...,
+% }
+% These are:
+% \begin{description}
+%
+% \item[\texttt{include/before}, \texttt{include/before/\meta{name}}]
+%
+% These hooks are executed one after another after the initial
+% \cs{clearpage} and after \texttt{.aux} file is changed to use
+% \texttt{\meta{name}.aux}, but before the
+% \texttt{\meta{name}.tex} file is loaded. In other words they are executed
+% at the very beginning of the first page of the \cs{include}
+% file.
+%
+%
+% \item[\texttt{include/end/\meta{name}}, \texttt{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/after/\meta{name}}, \texttt{include/after}]
+%
+% These hooks are executed (in that order) after \LaTeX{} has
+% issued the \cs{clearpage} but before is has switched back
+% writing to the main \texttt{.aux} file. Thus technically we are
+% still inside the \cs{include} and if the hooks generate any
+% further typeset material including anything that writes to the
+% \texttt{.aux} file, then it would be considered part of the
+% included material and bypassed if it is not loaded because of
+% some \cs{includeonly} statement.\footnotemark
+%
+% \end{description}
+% \end{variable}\footnotetext{For that reason
+% another \cs{clearpage} is executed after these hooks which
+% normally does nothing, but starts a new page if further material
+% got added this way.}
+%
+% \subsection{High-level interfaces for \LaTeX{}}
+%
+% We do not provide any high-level \LaTeX{} commands (like
+% \pkg{filehook} or \pkg{scrlfile} do) but think that for package
+% writers the commands from for hook management are sufficient.
+%
+% \subsection{A sample package for structuring the log output}
+%
+% As an application we provide the package \pkg{structuredlog} that
+% adds lines to the \texttt{.log} when a file is opened and closed
+% for reading keeping track of nesting level es well.
+% For example, for the current document it adds the lines
+%\begin{verbatim}
+% = (LEVEL 1 START) t1lmr.fd
+% = (LEVEL 1 STOP) t1lmr.fd
+% = (LEVEL 1 START) supp-pdf.mkii
+% = (LEVEL 1 STOP) supp-pdf.mkii
+% = (LEVEL 1 START) nameref.sty
+% == (LEVEL 2 START) refcount.sty
+% == (LEVEL 2 STOP) refcount.sty
+% == (LEVEL 2 START) gettitlestring.sty
+% == (LEVEL 2 STOP) gettitlestring.sty
+% = (LEVEL 1 STOP) nameref.sty
+% = (LEVEL 1 START) ltfilehook-doc.out
+% = (LEVEL 1 STOP) ltfilehook-doc.out
+% = (LEVEL 1 START) ltfilehook-doc.out
+% = (LEVEL 1 STOP) ltfilehook-doc.out
+% = (LEVEL 1 START) ltfilehook-doc.hd
+% = (LEVEL 1 STOP) ltfilehook-doc.hd
+% = (LEVEL 1 START) ltfilehook.dtx
+% == (LEVEL 2 START) ot1lmr.fd
+% == (LEVEL 2 STOP) ot1lmr.fd
+% == (LEVEL 2 START) omllmm.fd
+% == (LEVEL 2 STOP) omllmm.fd
+% == (LEVEL 2 START) omslmsy.fd
+% == (LEVEL 2 STOP) omslmsy.fd
+% == (LEVEL 2 START) omxlmex.fd
+% == (LEVEL 2 STOP) omxlmex.fd
+% == (LEVEL 2 START) umsa.fd
+% == (LEVEL 2 STOP) umsa.fd
+% == (LEVEL 2 START) umsb.fd
+% == (LEVEL 2 STOP) umsb.fd
+% == (LEVEL 2 START) ts1lmr.fd
+% == (LEVEL 2 STOP) ts1lmr.fd
+% == (LEVEL 2 START) t1lmss.fd
+% == (LEVEL 2 STOP) t1lmss.fd
+% = (LEVEL 1 STOP) ltfilehook.dtx
+%\end{verbatim}
+% Thus if you inspect an issue in the \texttt{.log} it is easy to
+% figure out in which file it occurred, simply by searching back for
+% \texttt{LEVEL} and if it is a \texttt{STOP} then remove 1 from
+% 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 }
+%
+%
+% \section{The Implementation}
+% \begin{macrocode}
+%<*2ekernel>
+% \end{macrocode}
+%
+% \subsection{\pkg{expl3} helpers}
+%
+% \begin{macrocode}
+%<@@=filehook>
+% \end{macrocode}
+%
+% \begin{macro}{\CurrentFile,\CurrentFilePath}
+% User-level macros that hold the current file name and file path.
+% These are used internally as well because the code takes care to
+% protect against a possible redefinition of these macros in the loaded
+% file (it's necessary anyway to make hooks work with nested
+% \cs{input}).
+% \begin{macrocode}
+\def\CurrentFile{}
+\def\CurrentFilePath{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_internal_tl}
+% \begin{macro}{\@filehook@set@curr@file,\@@_normalise_file_name:n}
+% When inputting a file, \cs{@filehook@set@curr@file} does a file
+% lookup (in \cs{input@path} and \cs{l_file_search_path_seq}) and
+% returns the actual file name (\meta{base} plus \meta{ext}) in
+% \cs{CurrentFile}. Only the base and extension are returned,
+% regardless of the input (both \texttt{path/to/file.tex} and
+% \texttt{file.tex} end up as \texttt{file.tex} in \cs{CurrentFile}).
+% The path is returned in \cs{CurrentFilePath}, in case it's needed.
+% \cs{CurrentFile} is then used to run the file hooks with
+% \texttt{file/before/\cs{CurrentFile}} and
+% \texttt{file/after/\cs{CurrentFile}}.
+% \begin{macrocode}
+\ExplSyntaxOn
+\tl_new:N \l_@@_internal_tl
+\cs_new_protected:Npn \@filehook@set@curr@file #1
+ { \exp_args:NV \@@_normalise_file_name:n #1 }
+\cs_new_protected:Npn \@@_normalise_file_name:n #1
+ {
+ \file_if_exist:nTF {#1}
+ {
+ \exp_args:Nx \file_parse_full_name:nNNN
+ { \file_full_name:n {#1} }
+ }
+ { \file_parse_full_name:nNNN {#1} }
+ \CurrentFilePath \CurrentFile \l_@@_internal_tl
+ \tl_set:Nx \CurrentFile { \CurrentFile \l_@@_internal_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_input_file_seq}
+% \begin{macro}{\@filehook@file@push,\@filehook@file@pop}
+% \begin{macro}{\@@_file_pop_assign:nn}
+% Yet another stack, to keep track of \cs{CurrentFile} and
+% \cs{CurrentFilePath} with nested \cs{input}s. At the beginning of
+% \cs{InputIfFileExists}, the current value of \cs{CurrentFilePath}
+% and \cs{CurrentFile} is pushed to \cs{g_@@_input_file_seq}, and
+% at the end, it is popped and the value reassigned.
+% \cs{IfFileExists} does \cs{set@curr@file} internally, which changes
+% \cs{CurrentFile}, so \cs{@filehook@file@push} has to be executed
+% before \cs{IfFileExists}.
+% \begin{macrocode}
+\seq_new:N \g_@@_input_file_seq
+\cs_new_protected:Npn \@filehook@file@push
+ {
+ \seq_gpush:Nx \g_@@_input_file_seq
+ { { \CurrentFilePath } { \CurrentFile } }
+ }
+\cs_new_protected:Npn \@filehook@file@pop
+ {
+ \seq_gpop:NNTF \g_@@_input_file_seq \l_@@_internal_tl
+ { \exp_after:wN \@@_file_pop_assign:nn \l_@@_internal_tl }
+ { \ERROR_should_not_happen }
+ }
+\cs_new_protected:Npn \@@_file_pop_assign:nn #1 #2
+ {
+ \tl_set:Nn \CurrentFilePath {#1}
+ \tl_set:Nn \CurrentFile {#2}
+ }
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Declaring the file-related hooks}
+%
+% All hooks starting with \texttt{file/} \texttt{include/},
+% \texttt{class/} or \texttt{package/} are generic and will be
+% allocated if code is added to them. Thus there is no need to
+% explicitly declare any hook in the code below.
+%
+% Furthermore, those named \texttt{.../after} or \texttt{.../end} are
+% automatically declared as reversed hooks if filled with code, so this
+% is also automatically taken care of.
+%
+% \subsection{Patching \LaTeX{} commands (need proper integration later)}
+%
+% Most of what we have to do is adding \cs{UseHook} into several
+% \LaTeXe{} core commands, which is done for now by patching them.
+% \begin{macrocode}
+%<@@=>
+% \end{macrocode}
+%
+% \begin{macro}{\InputIfFileExists}
+% \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
+% exist no hooks should be executed.
+% \begin{macrocode}
+\let\InputIfFileExists\@undefined
+\DeclareRobustCommand \InputIfFileExists[3]{%
+ \@filehook@file@push
+ \IfFileExists{#1}%
+ {%
+% \end{macrocode}
+% If the file exists then \cs{@curr@file} holds its name. But we
+% 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 restored it for the
+% \texttt{file/after/...} hook.
+%
+% The hook always refers to the \emph{actual} file that will be
+% operated on, regardless of how the user had it written in the
+% document. \pkg{expl3}'s \cs{file_full_name:n} normalizes the file
+% name (to factor out differences in the |.tex| extension), and
+% then does a file lookup to take into account a possible path from
+% \cs{l_file_search_path_seq} and \cs{input@path}. However only
+% the file name and extension are returned so that file hooks can
+% refer to the file by their name only. The path to the file is
+% returned in \cs{CurrentFilePath}.
+% \begin{macrocode}
+ \edef\reserved@a{\@filef@und
+ \def\noexpand\CurrentFile{\CurrentFile}%
+ \def\noexpand\CurrentFilePath{\CurrentFilePath}%
+ }%
+ \expandafter\@swaptwoargs\expandafter
+ {\reserved@a}%
+ {%
+ #2%
+ \@addtofilelist{#1}%
+ \UseHook{file/before}%
+% \end{macrocode}
+% The current file name is available in \cs{@curr@file} so we use
+% that in the specific hook.
+% \begin{macrocode}
+ \UseHook{file/before/\CurrentFile}%
+ \@@input
+ }%
+% \end{macrocode}
+% And it is restored here so we can use it once more.
+% \begin{macrocode}
+ \UseHook{file/after/\CurrentFile}%
+ \UseHook{file/after}%
+ \@filehook@file@pop
+ }%
+ {\@filehook@file@pop #3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@curr@file}
+% Now we just hook into \cs{set@curr@file} to add
+% \cs{@filehook@set@curr@file} at the end, after \cs{@curr@file} is
+% set.
+% \begin{macrocode}
+\def\set@curr@file#1{%
+ \begingroup
+ \escapechar\m@ne
+ \xdef\@curr@file{%
+ \expandafter\expandafter\expandafter\unquote@name
+ \expandafter\expandafter\expandafter{%
+ \expandafter\string
+ \csname\@firstofone#1\@empty\endcsname}}%
+ \endgroup
+ \@filehook@set@curr@file{\@curr@file}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\load@onefilewithoptions}
+% This macro is used when loading packages or classes.
+% \begin{macrocode}
+\def\load@onefilewithoptions#1[#2][#3]#4{%
+ \@pushfilename
+ \xdef\@currname{#1}%
+ \global\let\@currext#4%
+ \let\CurrentOption\@empty
+ \@reset@ptions
+ \makeatletter
+ \def\reserved@a{%
+ \@ifl@aded\@currext{#1}%
+ {\@if@ptions\@currext{#1}{#2}{}%
+ {\@latex@error
+ {Option clash for \@cls@pkg\space #1}%
+ {The package #1 has already been loaded
+ with options:\MessageBreak
+ \space\space[\@ptionlist{#1.\@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{#1.\@currext},#2\MessageBreak
+ to your \noexpand\documentclass declaration may fix this.%
+ \MessageBreak
+ Try typing \space <return> \space to proceed.}}}%
+ {\@pass@ptions\@currext{#2}{#1}%
+ \global\expandafter
+ \let\csname ver@\@currname.\@currext\endcsname\@empty
+ \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
+ \InputIfFileExists
+ {\@currname.\@currext}%
+ {%
+%-----------------------------------------
+% \end{macrocode}
+% When the current extension is \cs{@pkgextension} we are loading a
+% package otherwise, if it is \cs{@clsextension}, a class, so
+% depending on that we execute different hooks. If the extension is
+% neither, then it is another type of file without special hooks.
+% \begin{macrocode}
+ \ifx\@currext\@pkgextension
+ \UseHook{package/before}%
+ \UseHook{package/before/\@currname}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/before}%
+ \UseHook{class/before/\@currname}%
+ \fi
+ \fi
+% \end{macrocode}
+% The value of \cs{CurrentFile} holds during \cs{InputIfFileExists},
+% so the hooks above have that available for using. However at this
+% point \cs{CurrentFile} is reset to its previous value by
+% \cs{@filehook@file@pop} because it doesn't know that we'll have
+% more hooks ahead. So here (still in the \meta{true} branch of
+% \cs{InputIfFileExists}, right after actually reading the file in)
+% we'll cheat: use \cs{@filehook@file@push} once more, so there are
+% two entries for the current file in the name stack, so that when
+% \cs{InputIfFileExists} pops it, there's still one (identical) left.
+% \begin{macrocode}
+ \@filehook@file@push
+%-----------------------------------------
+ }%
+ {\@missingfileerror\@currname\@currext}%
+ \let\@unprocessedoptions\@@unprocessedoptions
+ \csname\@currname.\@currext-h@@k\endcsname
+ \expandafter\let\csname\@currname.\@currext-h@@k\endcsname
+ \@undefined
+%-----------------------------------------
+% \end{macrocode}
+% And same procedure, James, when we are finished loading, except
+% that the hook order is now reversed.
+% \begin{macrocode}
+ \ifx\@currext\@pkgextension
+ \UseHook{package/after/\@currname}%
+ \UseHook{package/after}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/after/\@currname}%
+ \UseHook{class/after}%
+ \fi
+ \fi
+% \end{macrocode}
+% Now here we do \cs{@filehook@file@pop} to restore the
+% \cs{CurrentFile} before this file being loaded and fix what we've
+% done in the stack right above.
+% \begin{macrocode}
+ \@filehook@file@pop
+%-----------------------------------------
+ \@unprocessedoptions}%
+ \@ifl@ter\@currext{#1}{#3}{}%
+ {\@latex@warning@no@line
+ {You have requested,\on@line,
+ version\MessageBreak
+ `#3' of \@cls@pkg\space #1,\MessageBreak
+ but only version\MessageBreak
+ `\csname ver@#1.\@currext\endcsname'\MessageBreak
+ is available}}%
+ \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
+ \@popfilename
+ \@reset@ptions}%
+ \reserved@a}
+% \end{macrocode}
+%
+% The code for this macro has changed between 2020/02/02 and
+% 2020/10/01 so the never version is this:
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020/10/01}
+{%
+\def\load@onefilewithoptions#1[#2][#3]#4{%
+ \@pushfilename
+ \xdef\@currname{#1}%
+ \global\let\@currext#4%
+ \let\CurrentOption\@empty
+ \@reset@ptions
+ \makeatletter
+ \def\reserved@a{%
+ \@ifl@aded\@currext{#1}%
+ {\@if@ptions\@currext{#1}{#2}{}%
+ {\@latex@error
+ {Option clash for \@cls@pkg\space #1}%
+ {The package #1 has already been loaded
+ with options:\MessageBreak
+ \space\space[\@ptionlist{#1.\@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{#1.\@currext},#2\MessageBreak
+ to your \noexpand\documentclass declaration may fix this.%
+ \MessageBreak
+ Try typing \space <return> \space to proceed.}}}%
+ {\@pass@ptions\@currext{#2}{#1}%
+ \global\expandafter
+ \let\csname ver@\@currname.\@currext\endcsname\@empty
+ \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty
+ \InputIfFileExists
+ {\@currname.\@currext}%
+ {%
+%-----------------------------------------
+ \ifx\@currext\@pkgextension
+ \UseHook{package/before}%
+ \UseHook{package/before/\@currname}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/before}%
+ \UseHook{class/before/\@currname}%
+ \fi
+ \fi
+ \@filehook@file@push
+%-----------------------------------------
+ }%
+ {\@missingfileerror\@currname\@currext}%
+ \expandafter\let\csname unprocessedoptions-\@currname.\@currext\endcsname
+ \@@unprocessedoptions
+ \csname\@currname.\@currext-h@@k\endcsname
+ \expandafter\let\csname\@currname.\@currext-h@@k\endcsname
+ \@undefined
+ \ifx\@unprocessedoptions\relax
+ \let\@unprocessedoptions\@undefined
+ \else
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \fi
+ \expandafter\let
+ \csname unprocessedoptions-\@currname.\@currext\endcsname
+ \@undefined
+%-----------------------------------------
+ \ifx\@currext\@pkgextension
+ \UseHook{package/after/\@currname}%
+ \UseHook{package/after}%
+ \else
+ \ifx\@currext\@clsextension
+ \UseHook{class/after/\@currname}%
+ \UseHook{class/after}%
+ \fi
+ \fi
+ \@filehook@file@pop
+%-----------------------------------------
+ }%
+ \@ifl@ter\@currext{#1}{#3}{}%
+ {\@latex@warning@no@line
+ {You have requested,\on@line,
+ version\MessageBreak
+ `#3' of \@cls@pkg\space #1,\MessageBreak
+ but only version\MessageBreak
+ `\csname ver@#1.\@currext\endcsname'\MessageBreak
+ is available}}%
+ \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi
+ \@popfilename
+ \@reset@ptions}%
+ \reserved@a}
+}{}%
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\@include}
+% \begin{macrocode}
+\def\@include#1 {%
+ \clearpage
+ \if@filesw
+ \immediate\write\@mainaux{\string\@input{#1.aux}}%
+ \fi
+ \@tempswatrue
+ \if@partsw
+ \@tempswafalse
+ \edef\reserved@b{#1}%
+ \@for\reserved@a:=\@partlist\do
+ {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+ \fi
+ \if@tempswa
+ \let\@auxout\@partaux
+ \if@filesw
+ \immediate\openout\@partaux #1.aux
+ \immediate\write\@partaux{\relax}%
+ \fi
+%-----------------------------------------
+% \end{macrocode}
+% First we need to fix \cs{CurrentFile}, because due the pesky
+% space-delimited \cs{@include}, \cs{CurrentFile} contains the
+% \cs{include}'d file with a space. To fix that, we re-do
+% \cs{set@curr@file}. The 2020/10/01 release doesn't need this as
+% \cs{include} was changed to do \cs{set@curr@file} on the correct
+% file name, rather than one with a trailing space.
+% \begin{macrocode}
+ \set@curr@file{#1}%
+% \end{macrocode}
+% Execute the \texttt{before} hooks just after we switched the
+% \texttt{.aux} file \ldots
+% \begin{macrocode}
+ \UseHook{include/before}%
+ \UseHook{include/before/#1}%
+%-----------------------------------------
+ \@input@{#1.tex}%
+% \end{macrocode}
+% \ldots{} then \texttt{end} hooks \ldots
+% \begin{macrocode}
+%-----------------------------------------
+ \UseHook{include/end/#1}%
+ \UseHook{include/end}%
+%-----------------------------------------
+ \clearpage
+% \end{macrocode}
+% \ldots{} and after the \cs{clearpage} the \texttt{after} hooks
+% followed by another \cs{clearpage} just in case new material got
+% added (after all we need to be in well defined state after the
+% \cs{include}).
+% \begin{macrocode}
+%-----------------------------------------
+ \UseHook{include/after/#1}%
+ \UseHook{include/after}%
+% \end{macrocode}
+% The additional \cs{clearpage} is needed to ensure that switching
+% the \texttt{.aux} files happen at a defined point even if the
+% above hooks add further material.
+% \begin{macrocode}
+ \clearpage
+%-----------------------------------------
+ \@writeckpt{#1}%
+ \if@filesw
+ \immediate\closeout\@partaux
+ \fi
+ \else
+ \deadcycles\z@
+ \@nameuse{cp@#1}%
+ \fi
+ \let\@auxout\@mainaux
+}
+% \end{macrocode}
+%
+% The code for this macro has changed between 2020/02/02 and
+% 2020/10/01 so the never version is this:
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020/10/01}
+{%
+\def\@include#1 {%
+ \clearpage
+ \if@filesw
+ \immediate\write\@mainaux{\string\@input{"#1.aux"}}%
+ \fi
+ \@tempswatrue
+ \if@partsw
+ \@tempswafalse
+ \edef\reserved@b{#1}%
+ \@for\reserved@a:=\@partlist\do
+ {\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
+ \fi
+ \if@tempswa
+ \let\@auxout\@partaux
+ \if@filesw
+ \immediate\openout\@partaux "#1.aux"
+ \immediate\write\@partaux{\relax}%
+ \fi
+%-----------------------------------------
+ \UseHook{include/before}%
+ \UseHook{include/before/#1}%
+%-----------------------------------------
+ \@input@{#1.tex}%
+%-----------------------------------------
+ \UseHook{include/end/#1}%
+ \UseHook{include/end}%
+%-----------------------------------------
+ \clearpage
+%-----------------------------------------
+ \UseHook{include/after/#1}%
+ \UseHook{include/after}%
+ \clearpage
+%-----------------------------------------
+ \@writeckpt{#1}%
+ \if@filesw
+ \immediate\closeout\@partaux
+ \fi
+ \else
+ \deadcycles\z@
+ \@nameuse{cp@#1}%
+ \fi
+ \let\@auxout\@mainaux}
+}{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{High-level interfaces for \LaTeX{}}
+%
+% None so far and the general feeling for now is that the hooks are
+% enough. Packages like \pkg{filehook}, etc., may use them to set
+% up their interfaces (samples are given below) but for the now the
+% kernel will not provide any.
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+%
+%
+%
+% \section{Package emulation for compatibility}
+%
+%
+% \subsection{Package \pkg{filehook} emulation}
+%
+% This is a partial implementation of the \pkg{filehook}
+% interfaces. It is only meant for guidance in case that package
+% gets updated to use the hook management.
+%
+% Not implemented are:
+%\begin{verbatim}
+% \AtBeginOfFiles
+% \AtEndOfFiles
+% \AtBeginOfInputs
+% \AtEndOfInputs
+% \AtBeginOfInputFile
+% \AtEndOfInputFile
+%\end{verbatim}
+%
+% \begin{macrocode}
+%<*filehook-draft>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfEveryFile [1]
+ {\AddToHook{file/before}{#1}}
+\newcommand\AtEndOfEveryFile [1]
+ {\AddToHook{file/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfIncludes [1]
+ {\AddToHook{include/before}{#1}}
+\newcommand\AtEndOfIncludes [1]
+ {\AddToHook{include/end}{#1}}
+\newcommand\AfterIncludes [1]
+ {\AddToHook{include/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfPackages [1]
+ {\AddToHook{package/before}{#1}}
+\newcommand\AtEndOfPackages [1]
+ {\AddToHook{package/after}{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfClasses [1]
+ {\AddToHook{class/before}{#1}}
+\newcommand\AtEndOfClasses [1]
+ {\AddToHook{class/after}{#1}}
+% \end{macrocode}
+%
+% For normal files we drop the \texttt{.tex} extension for now:
+% \begin{macrocode}
+\newcommand\AtBeginOfFile [2]
+ {\AddToHook{file/before/#1}{#2}}
+\newcommand\AtEndOfFile [2]
+ {\AddToHook{file/after/#1}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareDocumentCommand \AtBeginOfPackageFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifpackageloaded{#2}%
+ {#3}%
+ {\AddToHook{package/before/#2}{#3}}}%
+ {\AddToHook{package/before/#2}{#3}}%
+ }
+\DeclareDocumentCommand \AtEndOfPackageFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifpackageloaded{#2}%
+ {#3}%
+ {\AddToHook{package/after/#2}{#3}}}%
+ {\AddToHook{package/after/#2}{#3}}%
+ }
+% \end{macrocode}
+%
+% Are the * forms here of any use? I know they are use 3--4 times
+% on CTAN but I wonder if those are real or mistaken usages.
+% \begin{macrocode}
+\DeclareDocumentCommand \AtBeginOfClassFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifclassloaded{#2}%
+ {#3}%
+ {\AddToHook{class/before/#2}{#3}}}%
+ {\AddToHook{class/before/#2}{#3}}%
+ }
+\DeclareDocumentCommand \AtEndOfClassFile {smm}
+ {\IfBooleanTF{#1}%
+ {\@ifclassloaded{#2}%
+ {#3}%
+ {\AddToHook{class/after/#2}{#3}}}%
+ {\AddToHook{class/after/#2}{#3}}%
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtBeginOfIncludeFile [2]
+ {\AddToHook{include/before/#1}{#2}}
+\newcommand\AtEndOfIncludeFile [2]
+ {\AddToHook{include/end/#1}{#2}}
+\newcommand\AfterIncludeFile [2]
+ {\AddToHook{include/after/#1}{#2}}
+% \end{macrocode}
+%
+%
+% This is missing some interfaces so disabling the package isn't
+% really correct, but then this code above is not supposed to stay
+% like this anyway.
+% \begin{macrocode}
+\expandafter\let\csname ver@filehook.sty\endcsname\fmtversion
+\@namedef {ver@filehook.sty}{2020/10/01}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</filehook-draft>
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{Package \pkg{scrlfile} emulation}
+%
+% This is a partial implementation of the \pkg{scrlfile}
+% interfaces. It is only meant for guidance in case that package
+% gets updated to use the hook management.
+%
+% \begin{macrocode}
+%<*scrlfile-draft>
+% \end{macrocode}
+%
+% I think this is roughly correct (using the \texttt{file/...}
+% hooks rather than the class or package hooks at least for the
+% \cs{After...} commands but it needs some further verification.
+%
+% The star and plus variants haven't been implemented so far, this
+% is only a rough draft.
+% \begin{macrocode}
+\newcommand\BeforeClass[2]
+ {\AddToHook{file/before/#1.cls}{#2}}
+\newcommand\AfterClass [2]
+ {\AddToHook{file/after/#1.cls}{#2}}
+\newcommand\AfterAtEndOfClass [2]
+ {\AddToHook{class/after/#1}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\BeforePackage [2]
+ {\AddToHook{package/before/#1.sty}{#2}}
+\newcommand\AfterPackage [2]
+ {\AddToHook{file/after/#1.sty}{#2}}
+\newcommand\AfterEndOfPackage [2]
+ {\AddToHook{package/after/#1}{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\BeforeFile [2]
+ {%
+ \typeout{BeforeFile: #1!!!}%
+ \AddToHook{file/before/#1}{#2}}
+\newcommand\AfterFile [2]
+ {%
+ \typeout{AfterFile: #1!!!}%
+ \AddToHook{file/after/#1}{#2}}
+% \end{macrocode}
+%
+% This is missing some interfaces so disabling the package isn't
+% really correct, but then this code above is not supposed to stay
+% like this anyway.
+% \begin{macrocode}
+\expandafter\let\csname ver@scrlfile.sty\endcsname\fmtversion
+\@namedef {ver@scrlfile.sty}{2020/10/01}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</scrlfile-draft>
+% \end{macrocode}
+%
+%
+%
+% \section{A sample package for structuring the log output}
+%
+% \begin{macrocode}
+%<*structuredlog>
+%<@@=filehook>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesExplPackage
+ {structuredlog}{\ltfilehookdate}{\ltfilehookversion}
+ {Structuring the TeX transcript file}
+% \end{macrocode}
+
+
+
+% \begin{macrocode}
+\int_new:N \g_@@_nesting_level_int
+% \end{macrocode}
+
+% \begin{macrocode}
+\tl_new:N \g_@@_nesting_prefix_tl
+\tl_gset:Nn \g_@@_nesting_prefix_tl { }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{file/before}{
+ \int_gincr:N \g_@@_nesting_level_int
+ \tl_gput_right:Nn\g_@@_nesting_prefix_tl {=}
+ \iow_term:x {
+ \g_@@_nesting_prefix_tl \space
+ ( LEVEL~ \int_use:N \g_@@_nesting_level_int \space START )~
+ \CurrentFile ^^J
+ }
+}
+% \end{macrocode}
+% We don't want to install the \hook{file/after} hook immediately,
+% because that would mean it is the first time executed when the
+% package finishes. We therefore put the declaration inside
+% \cs{AddToHookNext} so that it gets only installed when we have
+% left the package.
+% \begin{macrocode}
+\AddToHookNext{file/after}{
+ \AddToHook{file/after}{
+ \iow_term:x {
+ \g_@@_nesting_prefix_tl \space
+ ( LEVEL~ \int_use:N \g_@@_nesting_level_int \space STOP )~
+ \CurrentFile ^^J
+ }
+ \int_gdecr:N \g_@@_nesting_level_int
+ \tl_gset:Nx \g_@@_nesting_prefix_tl
+ {\exp_after:wN \use_none:n \g_@@_nesting_prefix_tl}
+ }
+}
+% \end{macrocode}
+%
+% We have to manually increment the level because now that we have
+% installed the code in \texttt{file/after} it gets decremented
+% when we leave the package without ever being incremented upon
+% entry.
+% \begin{macrocode}
+%\int_incr:N\g_@@_nesting_level_int
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</structuredlog>
+% \end{macrocode}
+
+% \Finale
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx
index 8e9611d918..60b6a23e5c 100644
--- a/macros/latex-dev/base/ltfiles.dtx
+++ b/macros/latex-dev/base/ltfiles.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2020-05-05 v1.2g LaTeX Kernel (File Handling)]
+ [2020-06-05 v1.2h LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -234,14 +234,18 @@
% \changes{v0.9e}{1993/12/09}{Hook added}
% \begin{macrocode}
%</2ekernel>
-%<latexrelease>\IncludeInRelease{2017/04/15}%
-%<latexrelease> {\document}{Save language for hyphenation}%
+%<latexrelease>\IncludeInRelease{2020/06/05}%
+%<latexrelease> {\document}{Added hook to load l3backend code}%
%<*2ekernel|latexrelease>
% \end{macrocode}
% Cancel the |\begingroup| from |\begin|.
% \begin{macrocode}
\def\document{\endgroup
% \end{macrocode}
+% \changes{v1.2h}{2020/06/05}{Added hook to load \textsf{l3backend} code}
+% \begin{macrocode}
+ \@expl@sys@load@backend@@
+% \end{macrocode}
% If some options on |\documentclass| haven't been used by any
% package we will now give a warning since this is most certainly a
% misspelling.
@@ -406,6 +410,64 @@
\ignorespaces}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
+%<latexrelease>\IncludeInRelease{2017/04/15}%
+%<latexrelease> {\document}{Save language for hyphenation}%
+%<latexrelease>\def\document{\endgroup
+%<latexrelease> \ifx\@unusedoptionlist\@empty\else
+%<latexrelease> \@latex@warning@no@line{Unused global option(s):^^J%
+%<latexrelease> \@spaces[\@unusedoptionlist]}%
+%<latexrelease> \fi
+%<latexrelease> \@colht\textheight
+%<latexrelease> \@colroom\textheight \vsize\textheight
+%<latexrelease> \columnwidth\textwidth
+%<latexrelease> \@clubpenalty\clubpenalty
+%<latexrelease> \if@twocolumn
+%<latexrelease> \advance\columnwidth -\columnsep
+%<latexrelease> \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
+%<latexrelease> \fi
+%<latexrelease> \hsize\columnwidth \linewidth\hsize
+%<latexrelease> \begingroup\@floatplacement\@dblfloatplacement
+%<latexrelease> \makeatletter\let\@writefile\@gobbletwo
+%<latexrelease> \global \let \@multiplelabels \relax
+%<latexrelease> \@input{\jobname.aux}%
+%<latexrelease> \endgroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\openout\@mainaux\jobname.aux
+%<latexrelease> \immediate\write\@mainaux{\relax}%
+%<latexrelease> \fi
+%<latexrelease> \process@table
+%<latexrelease> \let\glb@currsize\@empty % Force math initialization.
+%<latexrelease> \normalsize
+%<latexrelease> \everypar{}%
+%<latexrelease> \ifx\normalsfcodes\@empty
+%<latexrelease> \ifnum\sfcode`\.=\@m
+%<latexrelease> \let\normalsfcodes\frenchspacing
+%<latexrelease> \else
+%<latexrelease> \let\normalsfcodes\nonfrenchspacing
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \ifx\document@default@language\m@ne
+%<latexrelease> \chardef\document@default@language\language
+%<latexrelease> \fi
+%<latexrelease> \@noskipsecfalse
+%<latexrelease> \let \@refundefined \relax
+%<latexrelease> \let\AtBeginDocument\@firstofone
+%<latexrelease> \@begindocumenthook
+%<latexrelease> \ifdim\topskip<1sp\global\topskip 1sp\relax\fi
+%<latexrelease> \global\@maxdepth\maxdepth
+%<latexrelease> \global\let\@begindocumenthook\@undefined
+%<latexrelease> \ifx\@listfiles\@undefined
+%<latexrelease> \global\let\@filelist\relax
+%<latexrelease> \global\let\@addtofilelist\@gobble
+%<latexrelease> \fi
+%<latexrelease> \gdef\do##1{\global\let ##1\@notprerr}%
+%<latexrelease> \@preamblecmds
+%<latexrelease> \global\let \@nodocument \relax
+%<latexrelease> \global\let\do\noexpand
+%<latexrelease> \ignorespaces}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\document}{Save language for hyphenation}
%<latexrelease>\def\document{\endgroup
diff --git a/macros/latex-dev/base/ltfinal.dtx b/macros/latex-dev/base/ltfinal.dtx
index 5654950762..9089c8a705 100644
--- a/macros/latex-dev/base/ltfinal.dtx
+++ b/macros/latex-dev/base/ltfinal.dtx
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2019-10-02 v2.2 LaTeX Kernel (Final Settings)]
+ [2020-07-16 v2.2f LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -460,6 +460,14 @@
\fi
% \end{macrocode}
%
+% \changes{v2.2b}{2020/07/08}
+% {Add a last-minute hook for \textsf{expl3}}
+% At this stage, we can install any last-minute \textsf{expl3} set-up.
+% \begin{macrocode}
+\@expl@finalise@setup@@
+\def\@expl@finalise@setup@@{}
+% \end{macrocode}
+%
% This is as good a place as any to active a few Xe\TeX{}-specific
% settings
% \begin{macrocode}
@@ -1044,13 +1052,8 @@
% }{}
% \end{macrocode}
%
-% \subsection{Loading further extensions}
-%
% \changes{v2.2}{2019-10-02}{Load \textsf{ltexpl}}
-% Simply load further code: it's deliberately separate
-% \begin{macrocode}
-\input{ltexpl.ltx}
-% \end{macrocode}
+% \changes{v2.2a}{2020-06-04}{Load \textsf{ltexpl} in \texttt{ltdefns}}
%
% \subsection{Freeing Memory}
%
@@ -1124,14 +1127,6 @@
% \end{macro}
% \end{macro}
%
-% \subsection{Some last minute initializations \ldots}
-%
-% This initializes the 2020/02/02 extensions to NFSS after any changes
-% in the preamble.
-% \begin{macrocode}
-\AtBeginDocument{\reinstall@nfss@defs\init@series@setup}
-% \end{macrocode}
-%
%
%
% \subsection{Do some temporary work for pre-release}
@@ -1139,9 +1134,233 @@
% This is a good place to load code that hasn't yet been
% integrated into the other files \ldots
% \begin{macrocode}
-%\input ...
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\ShowHook}{The hook management}%
+\input lthooks.ltx
+\input ltshipout.ltx
+\input ltfilehook.ltx
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\ShowHook}{The hook management}%
+
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand*\begin[1]{%
+%<latexrelease> \@ifundefined{#1}%
+%<latexrelease> {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
+%<latexrelease> {\def\reserved@a{\def\@currenvir{#1}%
+%<latexrelease> \edef\@currenvline{\on@line}%
+%<latexrelease> \csname #1\endcsname}}%
+%<latexrelease> \@ignorefalse
+%<latexrelease> \begingroup\@endpefalse\reserved@a}
+%<latexrelease>
+%<latexrelease>\@namedef{end }#1{%
+%<latexrelease> \csname end#1\endcsname\@checkend{#1}%
+%<latexrelease> \expandafter\endgroup\if@endpe\@doendpe\fi
+%<latexrelease> \if@ignore\@ignorefalse\ignorespaces\fi}
+%<latexrelease>
+%<latexrelease>\DeclareDocumentCommand \NewHook {m}{}
+%<latexrelease>\DeclareDocumentCommand \NewReversedHook {m}{}
+%<latexrelease>\DeclareDocumentCommand \NewMirroredHookPair {mm}{}
+%<latexrelease>
+%<latexrelease>\DeclareDocumentCommand \AddToHookNext {m+m}{}
+%<latexrelease>\DeclareDocumentCommand \RemoveFromHook {mo}{}
+%<latexrelease>\def \UseHook #1{}
+%<latexrelease>\def \UseOneTimeHook #1{}
+%<latexrelease>\def \ShowHook #1{}
+%<latexrelease>\let \DebugHookOn \@empty
+%<latexrelease>\let \DebugHookOff\@empty
+%<latexrelease>
+%<latexrelease>\DeclareDocumentCommand \DeclareHookRule {mmmm}{}
+%<latexrelease>\DeclareDocumentCommand \DeclareDefaultHookRule {mmm}{}
+%<latexrelease>\DeclareDocumentCommand \ClearHookRule {mmm}{}
+% \end{macrocode}
+% If the hook management is not provided we make the test for existence
+% false and the test for empty true in the hope that this is most
+% of the time reasonable. If not a package would need to guard
+% against running in an old kernel.
+% \begin{macrocode}
+%<latexrelease>\DeclareExpandableDocumentCommand \IfHookExistTF {mmm}{#3}
+%<latexrelease>\DeclareExpandableDocumentCommand \IfHookEmptyTF {mmm}{#2}
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\AtBeginDocument{\g@addto@macro\@begindocumenthook}
+%<latexrelease>\DeclareRobustCommand\AtEndDocument{\g@addto@macro\@enddocumenthook}
+%<latexrelease>
+%<latexrelease>\let\AtBeginEnvironment \@undefined
+%<latexrelease>\let\AtEndEnvironment \@undefined
+%<latexrelease>\let\BeforeBeginEnvironment \@undefined
+%<latexrelease>\let\AfterEndEnvironment \@undefined
+%<latexrelease>
+%<latexrelease>\def\@pushfilename{%
+%<latexrelease> \@expl@push@filename@@
+%<latexrelease> \xdef\@currnamestack{%
+%<latexrelease> {\@currname}%
+%<latexrelease> {\@currext}%
+%<latexrelease> {\the\catcode`\@}%
+%<latexrelease> \@currnamestack}%
+%<latexrelease> \@expl@push@filename@aux@@}
+%<latexrelease>\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil
+%<latexrelease> \@expl@pop@filename@@}
+%<latexrelease>
+%<latexrelease>
+%<latexrelease>% next goes away again when etoolbox is updated ...
+%<latexrelease>\expandafter\let\csname ver@etoolbox.sty\endcsname\@undefined
+%<latexrelease>
+%<latexrelease>\def\document{\endgroup
+%<latexrelease> \@expl@sys@load@backend@@
+%<latexrelease> \ifx\@unusedoptionlist\@empty\else
+%<latexrelease> \@latex@warning@no@line{Unused global option(s):^^J%
+%<latexrelease> \@spaces[\@unusedoptionlist]}%
+%<latexrelease> \fi
+%<latexrelease> \@colht\textheight
+%<latexrelease> \@colroom\textheight \vsize\textheight
+%<latexrelease> \columnwidth\textwidth
+%<latexrelease> \@clubpenalty\clubpenalty
+%<latexrelease> \if@twocolumn
+%<latexrelease> \advance\columnwidth -\columnsep
+%<latexrelease> \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
+%<latexrelease> \fi
+%<latexrelease> \hsize\columnwidth \linewidth\hsize
+%<latexrelease> \begingroup\@floatplacement\@dblfloatplacement
+%<latexrelease> \makeatletter\let\@writefile\@gobbletwo
+%<latexrelease> \global \let \@multiplelabels \relax
+%<latexrelease> \@input{\jobname.aux}%
+%<latexrelease> \endgroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\openout\@mainaux\jobname.aux
+%<latexrelease> \immediate\write\@mainaux{\relax}%
+%<latexrelease> \fi
+%<latexrelease> \process@table
+%<latexrelease> \let\glb@currsize\@empty % Force math initialization.
+%<latexrelease> \normalsize
+%<latexrelease> \everypar{}%
+%<latexrelease> \ifx\normalsfcodes\@empty
+%<latexrelease> \ifnum\sfcode`\.=\@m
+%<latexrelease> \let\normalsfcodes\frenchspacing
+%<latexrelease> \else
+%<latexrelease> \let\normalsfcodes\nonfrenchspacing
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \ifx\document@default@language\m@ne
+%<latexrelease> \chardef\document@default@language\language
+%<latexrelease> \fi
+%<latexrelease> \@noskipsecfalse
+%<latexrelease> \let \@refundefined \relax
+%<latexrelease> \let\AtBeginDocument\@firstofone
+%<latexrelease> \@begindocumenthook
+%<latexrelease> \ifdim\topskip<1sp\global\topskip 1sp\relax\fi
+%<latexrelease> \global\@maxdepth\maxdepth
+%<latexrelease> \global\let\@begindocumenthook\@undefined
+%<latexrelease> \ifx\@listfiles\@undefined
+%<latexrelease> \global\let\@filelist\relax
+%<latexrelease> \global\let\@addtofilelist\@gobble
+%<latexrelease> \fi
+%<latexrelease> \gdef\do##1{\global\let ##1\@notprerr}%
+%<latexrelease> \@preamblecmds
+%<latexrelease> \global\let \@nodocument \relax
+%<latexrelease> \global\let\do\noexpand
+%<latexrelease> \ignorespaces}
+%<latexrelease>
+%<latexrelease>\def\enddocument{%
+%<latexrelease> \let\AtEndDocument\@firstofone
+%<latexrelease> \@enddocumenthook
+%<latexrelease> \@checkend{document}%
+%<latexrelease> \clearpage
+%<latexrelease> \begingroup
+%<latexrelease> \if@filesw
+%<latexrelease> \immediate\closeout\@mainaux
+%<latexrelease> \let\@setckpt\@gobbletwo
+%<latexrelease> \let\@newl@bel\@testdef
+%<latexrelease> \@tempswafalse
+%<latexrelease> \makeatletter \@@input\jobname.aux
+%<latexrelease> \fi
+%<latexrelease> \@dofilelist
+%<latexrelease> \ifdim \font@submax >\fontsubfuzz\relax
+%<latexrelease> \@font@warning{Size substitutions with differences\MessageBreak
+%<latexrelease> up to \font@submax\space have occurred.\@gobbletwo}%
+%<latexrelease> \fi
+%<latexrelease> \@defaultsubs
+%<latexrelease> \@refundefined
+%<latexrelease> \if@filesw
+%<latexrelease> \ifx \@multiplelabels \relax
+%<latexrelease> \if@tempswa
+%<latexrelease> \@latex@warning@no@line{Label(s) may have changed.
+%<latexrelease> Rerun to get cross-references right}%
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@multiplelabels
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \endgroup
+%<latexrelease> \deadcycles\z@\@@end}
+%<latexrelease>
+%<latexrelease>\expandafter\let\csname ver@atveryend.sty\endcsname\@undefined
+%<latexrelease>\let\AfterLastShipout \@undefined
+%<latexrelease>\let\AtVeryEndDocument \@undefined
+%<latexrelease>\let\AtEndAfterFileList \@undefined
+%<latexrelease>\let\AtVeryVeryEnd \@undefined
+%<latexrelease>\let\BeforeClearDocument \@undefined
+%<latexrelease>
+%<latexrelease>
+%<latexrelease>\expandafter\let\expandafter\shipout\csname tex_shipout:D\endcsname
+%<latexrelease>
+%<latexrelease>\let \ShipoutBox\@undefined
+%<latexrelease>\let \ReadonlyShipoutCounter \@undefined
+%<latexrelease>\let \c@totalpages \@undefined
+%<latexrelease>\let \thetotalpages \@undefined
+%<latexrelease>
+%<latexrelease>\let \DiscardShipoutBox \@undefined
+%<latexrelease>\let \DebugShipoutOn \@undefined
+%<latexrelease>\let \DebugShipoutOff \@undefined
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand \AtBeginDvi [1]{%
+%<latexrelease> \global \setbox \@begindvibox
+%<latexrelease> \vbox{\unvbox \@begindvibox #1}%
+%<latexrelease>}
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipout \@undefined
+%<latexrelease>\let \AtBeginShipoutNext \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutFirst \@undefined
+%<latexrelease>
+%<latexrelease>\let \ShipoutBoxHeight \@undefined
+%<latexrelease>\let \ShipoutBoxDepth \@undefined
+%<latexrelease>\let \ShipoutBoxWidth \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutDiscard \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtBeginShipoutAddToBox \@undefined
+%<latexrelease>\let \AtBeginShipoutAddToBoxForeground \@undefined
+%<latexrelease>\let \AtBeginShipoutUpperLeft \@undefined
+%<latexrelease>\let \AtBeginShipoutUpperLeftForeground \@undefined
+%<latexrelease>
+%<latexrelease>\expandafter\let\csname ver@atbegshi.sty\endcsname \@undefined
+%<latexrelease>
+%<latexrelease>\let \EveryShipout \@undefined
+%<latexrelease>\let \AtNextShipout \@undefined
+%<latexrelease>\expandafter \let \csname ver@everyshi.sty\endcsname \@undefined
+%<latexrelease>
+%<latexrelease>\let \AtEndDvi \@undefined
+%<latexrelease>\expandafter\let \csname ver@atenddvi.sty\endcsname \@undefined
+%<latexrelease>
+%<latexrelease>\AtBeginDocument{\reinstall@nfss@defs\init@series@setup}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \subsection{Some last minute initializations \ldots}
+%
+% This initializes the 2020/02/02 extensions to NFSS after any changes
+% in the preamble.
+% \begin{macrocode}
+\g@addto@macro\@kernel@after@env@document@begin
+ {\reinstall@nfss@defs\init@series@setup}
% \end{macrocode}
%
+%
% \subsection{Dumping the format}
% Finally we make |@| into a letter, ensure the format will
% be in the `normal' error mode, and dump everything into the
diff --git a/macros/latex-dev/base/lthooks-code.pdf b/macros/latex-dev/base/lthooks-code.pdf
new file mode 100644
index 0000000000..336bf58d94
--- /dev/null
+++ b/macros/latex-dev/base/lthooks-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks-code.tex b/macros/latex-dev/base/lthooks-code.tex
new file mode 100644
index 0000000000..32822fcfd8
--- /dev/null
+++ b/macros/latex-dev/base/lthooks-code.tex
@@ -0,0 +1,10 @@
+% This will typeset documentation + code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex lthooks.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\AlsoImplementation}
+\input{lthooks.dtx}
diff --git a/macros/latex-dev/base/lthooks-doc.pdf b/macros/latex-dev/base/lthooks-doc.pdf
new file mode 100644
index 0000000000..b02d0e6798
--- /dev/null
+++ b/macros/latex-dev/base/lthooks-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lthooks-doc.tex b/macros/latex-dev/base/lthooks-doc.tex
new file mode 100644
index 0000000000..47d86a4599
--- /dev/null
+++ b/macros/latex-dev/base/lthooks-doc.tex
@@ -0,0 +1,12 @@
+% This will typeset only documentation but not the code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex lthooks.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ }
+\input{lthooks.dtx}
diff --git a/macros/latex-dev/base/lthooks.dtx b/macros/latex-dev/base/lthooks.dtx
new file mode 100644
index 0000000000..603b472e44
--- /dev/null
+++ b/macros/latex-dev/base/lthooks.dtx
@@ -0,0 +1,3925 @@
+% \iffalse meta-comment
+%
+%% File: lthooks.dtx (C) Copyright 2020 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
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/FrankMittelbach/...
+%
+% for those people who are interested or want to report an issue.
+%
+% \begin{macrocode}
+\providecommand\lthooksversion{v0.9b}
+\providecommand\lthooksdate{2020/07/19}
+% \end{macrocode}
+%
+%<*driver>
+\RequirePackage[debug]{lthooks}
+
+\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
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{lthooks.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape FMi: #1\end{quote}}
+% \long\def\pho#1{\begin{quote}\itshape PhO: #1\end{quote}}
+%
+% \newcommand\hook[1]{\texttt{#1}}
+%
+%
+% \title{The \texttt{lthooks} package\thanks{This package has version
+% \lthooksversion\ dated \lthooksdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach\thanks{Code improvements for speed and other goodies by Phelype Oleinik}}
+%
+% \maketitle
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% Hooks are points in the code of commands or environments where it
+% is possible to add processing code into existing commands. This
+% can be done by different packages that do not know about each
+% other and to allow for hopefully safe processing it is necessary
+% to sort different chunks of code added by different packages into
+% a suitable processing order.
+%
+% This is done by the packages adding chunks of code (via
+% \cs{AddToHook}) and labeling their code with some label by
+% default using the package name as a label.
+%
+% At \verb=\begin{document}= all code for a hook is then sorted
+% according to some rules (given by \cs{DeclareHookRule}) for fast
+% execution without processing overhead. If the hook code is
+% modified afterwards (or the rules are changed),
+% a new version for fast processing is generated.
+%
+% Some hooks are used already in the preamble of the document. If
+% that happens then the hook is prepared for execution (and sorted)
+% already at that point.
+%
+%
+% \section{Package writer interface}
+%
+% The hook management system is offered as a set of CamelCase
+% commands for traditional \LaTeXe{} packages (and for use in the
+% document preamble if needed) as well as \texttt{expl3} commands
+% for modern packages, that use the L3 programming layer of
+% \LaTeX{}. Behind the scenes, a single set of data structures is
+% accessed so that packages from both worlds can coexist and access
+% hooks in other packages.
+%
+%
+%
+% \subsection{\LaTeXe\ interfaces}
+%
+% \subsubsection{Declaring hooks and using them in code}
+%
+% With two exceptions, hooks have to be declared before they can be
+% used. The exceptions are hooks in environments (i.e., executed at
+% \cs{begin} and \cs{end}) and hooks run when loading files,
+% e.g. before and after a package is loaded, etc. Their hook names
+% depend on the environment or the file name and so declaring them
+% beforehand is difficult.
+%
+%
+% \begin{function}{\NewHook}
+% \begin{syntax}
+% \cs{NewHook} \Arg{hook}
+% \end{syntax}
+% Creates a new \meta{hook}.
+% If this is a hook provided as part of a package it is suggested
+% that the \meta{hook} name is always structured as follows:
+% \meta{package-name}\texttt{/}\meta{hook-name}. If necessary you
+% can further subdivide the name by adding more \texttt{/} parts.
+% If a hook name is already taken, an error is raised and the hook
+% is not created.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}{\NewReversedHook}
+% \begin{syntax}
+% \cs{NewReversedHook} \Arg{hook}
+% \end{syntax}
+% Like \cs{NewHook} declares a new \meta{hook}.
+% the difference is that the code chunks for this hook are in
+% reverse order by default (those added last are executed first).
+% Any rules for the hook are applied after the default ordering.
+% See sections~\ref{sec:order} and \ref{sec:reversed-order}
+% for further details.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+% \begin{function}{\NewMirroredHookPair}
+% \begin{syntax}
+% \cs{NewMirroredHookPair} \Arg{hook-1} \Arg{hook-2}
+% \end{syntax}
+% A shorthand for
+% \cs{NewHook}\Arg{hook-1}\cs{NewReversedHook}\Arg{hook-2}.
+%
+% The \meta{hooks} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+
+
+
+% \begin{function}{\UseHook}
+% \begin{syntax}
+% \cs{UseHook} \Arg{hook}
+% \end{syntax}
+% Execute the hook code inside a command or environment.\footnote{For
+% legacy hooks such as \hook{begindocument} it is also
+% possible to call \cs{@...hook}, e.g., \cs{@begindocumenthook},
+% but this syntax is discouraged.}
+%
+% Before \verb=\begin{document}= the fast execution code for a hook
+% is not set up, so in order to use a hook there it is explicitly
+% initialized first. As that involves assignments using a hook at
+% those times is not 100\% the same as using it after
+% \verb=\begin{document}=.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\UseOneTimeHook}
+% \begin{syntax}
+% \cs{UseOneTimeHook} \Arg{hook}
+% \end{syntax}
+% Some hooks are only used (and can be only used) in one place, for
+% example, those in \verb=\begin{document}= or
+% \verb=\end{document}=. Once we have passed that point adding to
+% the hook through a defined \cs{\meta{addto-cmd}} command (e.g.,
+% \cs{AddToHook} or \cs{AtBeginDocument}, etc.\@) would have no
+% effect (as would the use of such a command inside the hook code
+% itself). It is therefore customary to redefine
+% \cs{\meta{addto-cmd}} to simply process its argument, i.e.,
+% essentially make it behave like \cs{@firstofone}.
+%
+% \cs{UseOneTimeHook} does that: it records that the hook has been
+% consumed and any further attempt to add to it will result in
+% executing the code to be added immediately.
+%
+% \fmi{Maybe add an error version as well?}
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+%
+% \subsubsection{Updating code for hooks}
+%
+% \begin{function}{\AddToHook}
+% \begin{syntax}
+% \cs{AddToHook} \Arg{hook}\oarg{label}\Arg{code}
+% \end{syntax}
+% Adds \meta{code} to the \meta{hook} labeled by \meta{label}. If
+% the optional argument \meta{label} is not provided, if \cs{AddToHook}
+% is used in a package/class, then the current
+% package/class name is used, otherwise \hook{top-level} is
+% used~(see section~\ref{sec:default-label}).
+%
+% If there already exists code under the \meta{label} then the new
+% \meta{code} is appended to the existing one (even if this is a reversed hook).
+% If you want to replace existing code under the
+% \meta{label}, first apply \cs{RemoveFromHook}.
+%
+% The hook doesn't have to exist for code to be added to
+% it. However, if it is not declared later then obviously the
+% added \meta{code} will never be executed. This
+% allows for hooks to work regardless of package loading order and
+% enables packages to add to hook of other packages without
+% worrying whether they are actually used in the current document.
+% See section~\ref{sec:querying}.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}{\RemoveFromHook}
+% \begin{syntax}
+% \cs{RemoveFromHook} \Arg{hook}\oarg{label}
+% \end{syntax}
+% Removes any code labeled by \meta{label} from the \meta{hook}.
+% If the optional
+% argument \meta{label} is not provided, if \cs{AddToHook}
+% is used in a package/class, then the current
+% package/class name is used, otherwise \hook{top-level} is used.
+%
+% If the optional argument is \texttt{*}, then all code chunks are
+% removed. This is rather dangerous as it drops code from other
+% packages one may not know about!
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \medskip
+%
+% A useful application for this declaration inside the document body
+% is when one wants to temporarily add code to hooks and later remove
+% it again, e.g.,
+%\begin{verbatim}
+% \AddToHook{env/quote/before}{\small}
+% \begin{quote}
+% A quote set in a smaller typeface
+% \end{quote}
+% ...
+% \RemoveFromHook{env/quote/before}
+% ... now back to normal for further quotes
+%\end{verbatim}
+% Note that you can't cancel the setting with
+%\begin{verbatim}
+% \AddToHook{env/quote/before}{}
+%\end{verbatim}
+% because that only \enquote{adds} a further empty chunk of code to
+% the hook. Adding \cs{normalsize} would work but that means the hook
+% then contained \cs{small}\cs{normalsize} which means to font size
+% changes for no good reason.
+%
+% The above is only needed if one wants to typeset several quotes in a
+% smaller typeface. If the hook is only needed once then
+% \cs{AddToHookNext} is simpler, because it resets itself after one use.
+%
+%
+% \begin{function}{\AddToHookNext}
+% \begin{syntax}
+% \cs{AddToHookNext} \Arg{hook}\Arg{code}
+% \end{syntax}
+% Adds \meta{code} to the next invocation of the \meta{hook}.
+% The code is executed after the normal hook code has finished and
+% it is executed only once, i.e. it is deleted after it was used.
+%
+% Using the declaration is a global operation, i.e., the code is
+% not lost, even if the declaration is used inside a group and the
+% next invocation happens after the group. If the declaration is
+% used several times before the hook is executed then all code is
+% executed in the order in which it was declared.\footnotemark
+%
+% The hook doesn't have to exist for code to be added to it. This
+% allows for hooks to work regardless of package loading order.
+% See section~\ref{sec:querying}.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}\footnotetext{There is
+% no mechanism to reorder such code chunks (or delete them).}
+%
+% \subsubsection{Hook names and default labels}
+% \label{sec:default-label}
+%
+% It is best practice to use \cs{AddToHook} in packages or classes
+% \emph{without specifying a \meta{label}} because then the package
+% or class name is automatically used, which is helpful if rules are
+% needed, and avoids mistyping the \meta{label}.
+%
+% Using an explicit \meta{label} is only necessary in very specific
+% situations, e.g., if you want to add several chunks of code into a
+% single hook and have them placed in different parts of the hook
+% (by providing some rules).
+%
+% The other case is when you develop a larger package with several
+% sub-packages. In that case you may want to use the same
+% \meta{label} throughout the sub-packages in order to avoid
+% that the labels change if you internally reorganize your code.
+%
+% It is not enforced, but highly recommended that the hooks defined by
+% a package, and the \meta{labels} used to add code to other hooks
+% contain the package name to easily identify the source of the code
+% chunk and to prevent clashes. This should be the standard practice,
+% so this hook management code provides a shortcut to refer to the
+% current package in the name of a \meta{hook} and in a \meta{label}.
+% If \meta{hook} name or \meta{label} consist just of a single dot
+% (|.|), or starts with a dot followed by a slash (|./|) then the dot
+% denotes the \meta{default label} (usually the current package or class
+% name---see~\cs{DeclareDefaultHookLabel}).
+% A \enquote{|.|} or \enquote{|./|} anywhere else in a \meta{hook} or in
+% \meta{label} is treated literally and is not replaced.
+
+% For example,
+% inside the package \texttt{mypackage.sty}, the default label is
+% \texttt{mypackage}, so the instructions:
+% \begin{verbatim}
+% \NewHook {./hook}
+% \AddToHook {./hook}[.]{code} % Same as \AddToHook{./hook}{code}
+% \AddToHook {./hook}[./sub]{code}
+% \DeclareHookRule{begindocument}{.}{<}{babel}
+% \AddToHook {file/after/foo.tex}{code}
+% \end{verbatim}
+% are equivalent to:
+% \begin{verbatim}
+% \NewHook {mypackage/hook}[mypackage]{code}
+% \AddToHook {mypackage/hook}[mypackage]{code}
+% \AddToHook {mypackage/hook}[mypackage/sub]{code}
+% \DeclareHookRule{begindocument}{mypackage}{<}{babel}
+% \AddToHook {file/after/foo.tex}{code} % unchanged
+% \end{verbatim}
+%
+% The \meta{default label} is automatically set to the name of the
+% current package or class (using \cs{@currname}). If \cs{@currname}
+% is not set (because the hook command is used outside of a package, or
+% the current file wasn't loaded with \cs{usepackage} or
+% \cs{documentclass}), then the \texttt{top-level} is used as the
+% \meta{default label}.
+%
+% This syntax is available in all \meta{label} arguments and most
+% \meta{hook}, both in the \LaTeXe{} interface, and the \LaTeX3
+% interface described in section~\ref{sec:l3hook-interface}.
+%
+% Note, however, that the replacement of |.| by the \meta{default label}
+% takes place when the hook command is executed, so actions that are
+% somehow executed after the package ends will have the wrong
+% \meta{default label} if the dot-syntax is used. For that reason,
+% this syntax is not available in \cs{UseHook} (and \cs{hook_use:n})
+% because the hook is most of the time used outside of the package file
+% in which it was defined. This syntax is also not available in the hook
+% conditionals \cs{IfHookEmptyTF} (and \cs{hook_if_empty:nTF}) and
+% \cs{IfHookExistTF} (and \cs{hook_if_exist:nTF}) because these
+% conditionals are used in some performance-critical parts of the hook
+% management code, and because they are usually used to refer to other
+% package's hooks, so the dot-syntax doesn't make much sense.
+%
+% In some cases, for example in large packages, one may want to separate
+% it in logical parts, but still use the main package name as
+% \meta{label}, then the \meta{default label} can be set using
+% \cs{DeclareDefaultHookLabel}:
+%
+% \begin{function}{\DeclareDefaultHookLabel}
+% \begin{syntax}
+% \cs{DeclareDefaultHookLabel} \Arg{default label}
+% \end{syntax}
+% Sets the \meta{default label} to be used in \meta{label} arguments.
+% If \cs{DeclareDefaultHookLabel} is not used in the
+% current package, \cs{@currname} is used instead. If \cs{@currname}
+% is not set, the code is assumed to be in the main document, in which
+% case \texttt{top-level} is used.
+%
+% The effect of \cs{DeclareDefaultHookLabel} holds for the current
+% file, and is reset to the previous value when the file is closed.
+% \end{function}
+%
+%
+% \subsubsection{Defining relations between hook code}
+%
+% The default assumption is that code added to hooks by different
+% packages is independent and the order in which it is executed is
+% irrelevant. While this is true in many case it is obviously false
+% in many others.
+%
+% Before the hook management system was introduced
+% packages had to take elaborate precaution to determine of some other
+% package got loaded as well (before or after) and find some ways to
+% alter its behavior accordingly. In addition is was often the user's
+% responsibility to load packages in the right order so that code
+% added to hooks got added in the right order and some cases even
+% altering the loading order wouldn't resolve the conflicts.
+%
+% With the new hook management system it is now possible to define
+% rules (i.e., relationships) between code chunks added by different
+% packages and explicitly describe in which order they should be
+% processed.
+%
+% \begin{function}{\DeclareHookRule}
+% \begin{syntax}
+% \cs{DeclareHookRule} \Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% \end{syntax}
+% Defines a relation between \meta{label1} and \meta{label2} for a
+% given \meta{hook}. If \meta{hook} is \texttt{??} this defines a
+% relation for all hooks that use the two labels, i.e., that have
+% chunks of code labeled with \meta{label1} and \meta{label2}.
+% Rules specific to a given hook take precedence over default
+% rules that use \texttt{??} as the \meta{hook}.
+%
+% Currently, the supported relations are the following:
+% \begin{itemize}
+%
+% \item[\texttt{before} or \texttt{\string<}]
+%
+% Code for \meta{label1} comes before code for \meta{label2}.
+%
+% \item[\texttt{after} or \texttt{\string>}]
+% Code for \meta{label1} comes after code for \meta{label2}.
+%
+% \item[\texttt{incompatible-warning}]
+%
+% Only code for either \meta{label1} or \meta{label2} can appear
+% for that hook (a way to say that two packages---or parts of
+% them---are incompatible). A warning is raised if both labels
+% appear in the same hook.
+%
+% \item[\texttt{incompatible-error}]
+%
+% Like \texttt{incompatible-error} but instead of a warning a
+% \LaTeX{} error is raised, and the code for both labels are
+% dropped from that hook until the conflict is resolved.
+%
+% \item[\texttt{removes}]
+%
+% Code for \meta{label1} overwrites code for \meta{label2}. More
+% precisely, code for \meta{label2} is dropped for that
+% hook. This can be used, for example if one package is a
+% superset in functionality of another one and therefore wants to
+% undo code in some hook and replace it with its own version.
+%
+% \item[\texttt{unrelated}]
+%
+% The order of code for \meta{label1} and \meta{label2} is
+% irrelevant. This rule is there to undo an incorrect rule
+% specified earlier.
+%
+% \end{itemize}
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+% \begin{function}{\ClearHookRule}
+% \begin{syntax}
+% \cs{ClearHookRule}\Arg{hook}\Arg{label1}\Arg{label2}
+% \end{syntax}
+% Syntactic sugar for saying that \meta{label1} and \meta{label2}
+% are unrelated for the given \meta{hook}.
+% \end{function}
+%
+%
+%
+% \begin{function}{\DeclareDefaultHookRule}
+% \begin{syntax}
+% \cs{DeclareDefaultHookRule}\Arg{label1}\Arg{relation}\Arg{label2}
+% \end{syntax}
+% This sets up a relation between \meta{label1} and \meta{label2}
+% for all hooks unless overwritten by a specific rule for a hook.
+% Useful for cases where one package has a specific relation to
+% some other package, e.g., is \texttt{incompatible} or always
+% needs a special ordering \texttt{before} or \texttt{after}.
+% (Technically it is just a shorthand for using \cs{DeclareHookRule}
+% with \texttt{??} as the hook name.)
+%
+% Declaring default rules is only supported in the document
+% preamble.\footnotemark{}
+%
+% The \meta{label} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}\footnotetext{Trying to do so, e.g., via
+% \cs{DeclareHookRule} with \texttt{??} has bad side-effects and
+% is not supported (though not explicitly caught for performance
+% reasons).}
+%
+%
+%
+% \subsubsection{Querying hooks}
+% \label{sec:querying}
+%
+% Simpler data types, like token lists, have three possible states; they
+% can:
+% \begin{itemize}
+% \item exist and be empty;
+% \item exist and be non-empty; and
+% \item not exist (in which case emptiness doesn't apply);
+% \end{itemize}
+% Hooks are a bit more complicated: they have four possible states.
+% A hook may exist or not, and either way it may or may not be empty.
+% This means that even a hook that doesn't exist may be non-empty.
+%
+% This seemingly strange state may happen when, for example, package~$A$
+% defines hook \hook{A/foo}, and package $B$ adds some code to that
+% hook. However, a document may load package $B$ before package $A$, or
+% may not load package $A$ at all. In both cases some code is added to
+% hook \hook{A/foo} without that hook being defined yet, thus that
+% hook is said to be non-empty, whereas it doesn't exist. Therefore,
+% querying the existence of a hook doesn't imply its emptiness, neither
+% does the other way around.
+%
+% A hook is said to be empty when no code was added to it, either to
+% its permanent code pool, or to its ``next'' token list. The hook
+% doesn't need to be declared to have code added to its code pool.
+% A hook is said to exist when it was declared with \cs{NewHook} or
+% some variant thereof.
+%
+% \begin{function}[EXP]{\IfHookEmptyTF}
+% \begin{syntax}
+% \cs{IfHookEmptyTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} is empty (\emph{i.e.}, no code was added to
+% it using either \cs{AddToHook} or \cs{AddToHookNext}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}[EXP]{\IfHookExistTF}
+% \begin{syntax}
+% \cs{IfHookExistTF} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} exists (if it was created with either
+% \cs{NewHook}, \cs{NewReversedHook}, or \cs{NewMirroredHookPair}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The existence of a hook usually doesn't mean much from the viewpoint
+% of code that tries to add/remove code from that hook, since package
+% loading order may vary, thus the creation of hooks is asynchronous
+% to adding and removing code from it, so this test should be used
+% sparingly.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \fmi{Would be helpful if we provide some use cases}
+%
+% \subsubsection{Displaying hook code}
+%
+% If one has to adjust the code execution in a hook using a hook
+% rule it is helpful to get some information about the code
+% associated with a hook, its current order and the existing rules.
+%
+% \begin{function}{\ShowHook}
+% \begin{syntax}
+% \cs{ShowHook} \Arg{hook}
+% \end{syntax}
+% Displays information about the \meta{hook} such as
+% \begin{itemize}
+% \item
+% the code chunks (and their labels) added to it,
+% \item
+% any rules set up to order them,
+% \fmi{currently this is missing the default rules that apply,
+% guess that needs fixing}
+% \item
+% the computed order (if already defined),
+% \item
+% any code executed on the next invocation only.
+% \end{itemize}
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+% \subsubsection{Debugging hook code}
+%
+% \begin{function}{\DebugHookOn,\DebugHookOff}
+% \begin{syntax}
+% \cs{DebugHookOn}
+% \end{syntax}
+% Turn the debugging of hook code on or off. This displays changes
+% made to the hook data structures. The output is rather coarse and
+% not really intended for normal use.
+% \end{function}
+%
+%
+% \subsection{L3 programming layer (\texttt{expl3}) interfaces}
+% \label{sec:l3hook-interface}
+%
+%
+% This is a quick summary of the \LaTeX3 programming interfaces for
+% use with packages written in \texttt{expl3}. In contrast to the
+% \LaTeXe{} interfaces they always use mandatory arguments only, e.g.,
+% you always have to specify the \meta{label} for a code chunk. We
+% therefore suggest to use the declarations discussed in the previous
+% section even in \texttt{expl3} packages, but the choice is yours.
+%
+%
+% \begin{function}
+% {\hook_new:n,\hook_new_reversed:n,\hook_new_pair:nn}
+% \begin{syntax}
+% \cs{hook_new:n}\Arg{hook}
+% \cs{hook_new_pair:nn}\Arg{hook-1}\Arg{hook-2}
+% \end{syntax}
+% Creates a new \meta{hook} with normal or reverse ordering of code
+% chunks. \cs{hook_new_pair:nn} creates a pair of such hooks with
+% \Arg{hook-2} being a reversed hook.
+% If a hook name is already taken, an error is raised and the hook
+% is not created.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+%
+%
+% \begin{function}{\hook_use:n}
+% \begin{syntax}
+% \cs{hook_use:n} \Arg{hook}
+% \end{syntax}
+% Executes the \Arg{hook} code followed (if set up) by the code for next
+% invocation only, then empties that next invocation code.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\hook_use_once:n}
+% \begin{syntax}
+% \cs{hook_use_once:n} \Arg{hook}
+% \end{syntax}
+% Changes the \Arg{hook} status so that from now on any addition to
+% the hook code is executed immediately. Then execute any
+% \Arg{hook} code already set up.
+% \fmi{better L3 name?}
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}{\hook_gput_code:nnn}
+% \begin{syntax}
+% \cs{hook_gput_code:nnn} \Arg{hook} \Arg{label} \Arg{code}
+% \end{syntax}
+% Adds a chunk of \meta{code} to the \meta{hook} labeled
+% \meta{label}. If the label already exists the \meta{code} is
+% appended to the already existing code.
+%
+% If code is added to an external \meta{hook} (of the kernel or
+% another package) then the convention is to use the package name
+% as the \meta{label} not some internal module name or some other
+% arbitrary string.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+%
+% \begin{function}
+% {\hook_gput_next_code:nn}
+% \begin{syntax}
+% \cs{hook_gput_next_code:nn} \Arg{hook} \Arg{code}
+% \end{syntax}
+% Adds a chunk of \meta{code} for use only in the next invocation of the
+% \meta{hook}. Once used it is gone.
+%
+% This is simpler than \cs{hook_gput_code:nnn}, the code is simply
+% appended to the hook in the order of declaration at the very end,
+% i.e., after all standard code for the hook got executed.
+%
+% Thus if one needs to undo what the standard does one has to do
+% that as part of \meta{code}.
+%
+% The \meta{hook} can be specified using the dot-syntax to denote
+% the current package name. See section~\ref{sec:default-label}.
+% \end{function}
+%
+
+
+% \begin{function}{\hook_gremove_code:nn}
+% \begin{syntax}
+% \cs{hook_gremove_code:nn} \Arg{hook} \Arg{label}
+% \end{syntax}
+% Removes any code for \meta{hook} labeled \meta{label}.
+%
+% If the code for that \meta{label} wasn't yet added to the
+% \meta{hook}, an order is set so that when some code attempts to add
+% that label, the removal order takes action and the code is not
+% added.
+%
+% If the second argument is \texttt{*}, then all code chunks are
+% removed. This is rather dangerous as it drops code from other
+% packages one may not know about, so think twice before using
+% that!
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% \end{function}
+
+
+% \begin{function}{\hook_gset_rule:nnnn}
+% \begin{syntax}
+% \cs{hook_gset_rule:nnnn} \Arg{hook} \Arg{label1} \Arg{relation} \Arg{label2}
+% \end{syntax}
+% Relate \meta{label1} with \meta{label2} when used in \meta{hook}.
+% See \cs{DeclareHookRule} for the allowed \meta{relation}s.
+% If \meta{hook} is \texttt{??} a default rule is specified.
+%
+% The \meta{hook} and \meta{label} can be specified using the
+% dot-syntax to denote the current package name.
+% See section~\ref{sec:default-label}.
+% The dot-syntax is parsed in both \meta{label} arguments, but it
+% usually makes sense to be used in only one of them.
+% \end{function}
+%
+% \begin{function}[pTF]{\hook_if_empty:n}
+% \begin{syntax}
+% \cs{hook_if_empty:n} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} is empty (\emph{i.e.}, no code was added to
+% it using either \cs{AddToHook} or \cs{AddToHookNext}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+% \begin{function}[pTF]{\hook_if_exist:n}
+% \begin{syntax}
+% \cs{hook_if_exist:n} \Arg{hook} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{hook} exists (if it was created with either
+% \cs{NewHook}, \cs{NewReversedHook}, or \cs{NewMirroredHookPair}), and
+% branches to either \meta{true code} or \meta{false code} depending
+% on the result.
+%
+% \fmi{what are the results for generic hooks that do not need to be declared?}
+%
+% The existence of a hook usually doesn't mean much from the viewpoint
+% of code that tries to add/remove code from that hook, since package
+% loading order may vary, thus the creation of hooks is asynchronous
+% to adding and removing code from it, so this test should be used
+% sparingly.
+%
+% The \meta{hook} \emph{cannot} be specified using the dot-syntax.
+% A leading |.| is treated literally.
+% \end{function}
+%
+%
+% \begin{function}{\hook_debug_on:,\hook_debug_off:}
+% \begin{syntax}
+% \cs{hook_debug_on:}
+% \end{syntax}
+% Turns the debugging of hook code on or off. This displays changes
+% to the hook data.
+% \end{function}
+%
+%
+%
+% \subsection{On the order of hook code execution} \label{sec:order}
+%
+% Chunks of code for a \meta{hook} under different labels are supposed
+% to be independent if there are no special rules set up that
+% define a relation between the chunks. This means that you can't
+% make assumptions about the order of execution!
+%
+% Suppose you have the following declarations:
+%\begin{verbatim}
+% \NewHook{myhook}
+% \AddToHook{myhook}[packageA]{\typeout{A}}
+% \AddToHook{myhook}[packageB]{\typeout{B}}
+% \AddToHook{myhook}[packageC]{\typeout{C}}
+%\end{verbatim}
+% then executing the hook with \cs{UseHook} will produce the
+% typeout \texttt{A} \texttt{B} \texttt{C} in that order. In other
+% words, the execution order is computed to be \texttt{packageA},
+% \texttt{packageB}, \texttt{packageC} which you can verify with
+% \cs{ShowHook}\texttt{\{myhook\}}:
+%\begin{verbatim}
+% The hook 'myhook':
+% Code chunks:
+% packageA -> \typeout {A}
+% packageB -> \typeout {B}
+% packageC -> \typeout {C}
+% Extra code next invocation:
+% ---
+% Rules:
+% ---
+% Execution order:
+% packageA, packageB, packageC
+%\end{verbatim}
+% The reason is that the code chunks are internally saved in a property list
+% and the initial order of such a property list is the order in
+% which key-value pairs got added. However, that is only true if
+% nothing other than adding happens!
+%
+% Suppose, or example, you want to replace the code chunk for
+% \texttt{packageA}, e.g.,
+%\begin{verbatim}
+% \RemoveFromHook{myhook}[packageA]
+% \AddToHook{myhook}[packageA]{\typeout{A alt}}
+%\end{verbatim}
+% then your order becomes \texttt{packageB},
+% \texttt{packageC}, \texttt{packageA} because the label got removed
+% from the property list and then re-added (at its end).
+%
+% While that may not be too surprising, the execution order is
+% also sometimes altered if you add a redundant rule, e.g. if you specify
+%\begin{verbatim}
+% \DeclareHookRule{myhook}{packageA}{before}{packageB}
+%\end{verbatim}
+% instead of the previous lines we get
+%\begin{verbatim}
+% The hook 'myhook':
+% Code chunks:
+% packageA -> \typeout {A}
+% packageB -> \typeout {B}
+% packageC -> \typeout {C}
+% Extra code next invocation:
+% ---
+% Rules:
+% packageA|packageB with relation before
+% Execution order (after applying rules):
+% packageA, packageC, packageB
+%\end{verbatim}
+% As you can see the code chunks are still in the same order, but
+% in the execution order for the labels \texttt{packageB} and
+% \texttt{packageC} have
+% swapped places.
+% The reason is that, with the rule there are two orders that
+% satisfy it, and the algorithm for sorting happened to pick a
+% different one compared to the case without rules (where it
+% doesn't run at all as there is nothing to resolve).
+% Incidentally, if we had instead specified the redundant rule
+%\begin{verbatim}
+% \DeclareHookRule{myhook}{packageB}{before}{label-3}
+%\end{verbatim}
+% the execution order would not have changed.
+%
+% In summary: it is not possible to rely on the order of execution
+% unless there are rules that partially or fully define the order
+% (in which you can rely on them being fulfilled).
+%
+%
+% \subsection{The use of \enquote{reversed} hooks} \label{sec:reversed-order}
+%
+% You may have wondered why you can declare a \enquote{reversed} hook
+% with \cs{NewReversedHook} and what that does exactly.
+%
+% In short: the execution order of a reversed hook (without any
+% rules!) is exactly reversed to the order you would have gotten for
+% a hook declared with \cs{NewHook}.
+%
+% This is helpful if you have a pair of hooks where you expect to see
+% code added that involves grouping, e.g., starting an environment
+% in the first and closing that environment in the second hook.
+% To give a somewhat contrived example\footnote{there are simpler
+% ways to achieve the same effect.}, suppose there is a package
+% adding the following:
+%\begin{verbatim}
+% \AddToHook{env/quote/before}[package-1]{\begin{itshape}}
+% \AddToHook{env/quote/after} [package-1]{\end{itshape}}
+%\end{verbatim}
+% As a result, all quotes will be in italics.
+% Now suppose further that the user wants the quotes also in blue
+% and therefore adds:
+%\begin{verbatim}
+% \usepackage{color}
+% \AddToHook{env/quote/before}{\begin{color}{blue}}
+% \AddToHook{env/quote/after} {\end{color}}
+%\end{verbatim}
+% Now if the \hook{env/quote/after} hook would be a normal hook we
+% would get the same execution order in both hooks, namely:
+%\begin{verbatim}
+% package-1, top-level
+%\end{verbatim}
+% (or vice versa) and as a result, would get:
+%\begin{verbatim}
+% \begin{itshape}\begin{color}{blue} ...
+% \end{itshape}\end{color}
+%\end{verbatim}
+% and an error message that \verb=\begin{color}= ended by
+% \verb=\end{itshape}=.
+% With \hook{env/quote/after} declared as a reversed hook the
+% execution order is reversed and so all environments are closed in
+% the correct sequence and \cs{ShowHook} would give us the
+% following output:
+%\begin{verbatim}
+% The hook 'env/quote/after':
+% Code chunks:
+% package-1 -> \end {itshape}
+% top-level -> \end {color}
+% Extra code next invocation:
+% ---
+% Rules:
+% ---
+% Execution order (after reversal):
+% top-level, package-1
+%\end{verbatim}
+%
+% The reversal of the execution order happens before applying any
+% rules, so if you alter the order you will probably have to alter
+% it in both hooks, not just in one, but that depends on the use case.
+%
+%
+%
+%
+% \subsection{Private \LaTeX{} kernel hooks}
+%
+% There are a few places where it is absolutely essential for
+% \LaTeX{} to function correctly that code is executed in a precisely
+% defined order. Even that could have been implemented with the
+% 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
+% predetermined. Furthermore it forces package writers to
+% unnecessarily add such rules if they add further code to the hook
+% (or break \LaTeX{}).
+%
+% For that reason such code is not using the hook management, but
+% instead private kernel commands directly before or after a public
+% hook with the following naming
+% convention: \cs{@kernel@before@\meta{hookname}} or
+% \cs{@kernel@after@\meta{hookname}}. For example, in
+% \cs{enddocument} you find
+%\begin{verbatim}
+% \UseHook{enddocument}%
+% \@kernel@after@enddocument
+%\end{verbatim}
+% which means first the user/package-accessible \hook{enddocument}
+% hook is executed and then the internal kernel hook. As their name
+% indicates these kernel commands should not be altered by third-party
+% packages, so please refrain from that in the interest of
+% stability and instead use the public hook next to it.\footnote{As
+% with everything in \TeX{} there is not enforcement of this rule,
+% and by looking at the code it is easy to find out how the kernel
+% adds to them. The main reason of this section is therefore to say
+% \enquote{please don't do that, this is unconfigurable code!}}
+%
+%
+%
+% \subsection{Legacy \LaTeXe{} interfaces}
+%
+% \LaTeXe{} offered a small number of hooks together with commands to
+% add to them. They are listed here and are retained for backwards
+% compatibility.
+%
+% With the new hook management several additional hooks have been added
+% to \LaTeX\ and more will follow. See the next section for what
+% is already available.
+%
+%
+% \begin{function}{\AtBeginDocument}
+% \begin{syntax}
+% \cs{AtBeginDocument} \oarg{label} \Arg{code}
+% \end{syntax}
+% If used without the optional argument \meta{label}, it works essentially
+% like before, i.e., it is adding \meta{code} to the hook
+% \hook{begindocument}
+% (which is executed inside \verb=\begin{document}=).
+% However, all code added this way is labeled with the label
+% \hook{top-level} if done outside of a package or class or with the
+% package/class name if called inside such a file.
+%
+% This way one can add further code to the hook using
+% \cs{AddToHook} or \cs{AtBeginDocument} using a different label
+% and explicitly order the code chunks as necessary, e.g., run some
+% code before or after the \hook{top-level} code. When using the
+% optional argument the call is equivalent to running
+% \cs{AddToHook} \texttt{\{begindocument\}} \oarg{label}
+% \Arg{code}.
+%
+% For important packages with known order requirement we may over
+% time add rules to the kernel (or to those packages) so that they
+% work regardless of the loading-order in the document.
+% \end{function}
+%
+% \begin{function}{\AtEndDocument}
+% \begin{syntax}
+% \cs{AtEndDocument} \oarg{label} \Arg{code}
+% \end{syntax}
+% Like \cs{AtBeginDocument} but for the \hook{enddocument} hook.
+% \end{function}
+%
+%
+%
+% \begin{function}{\AtBeginDvi}
+% \begin{syntax}
+% \cs{AtBeginDvi} \oarg{label} \Arg{code}
+% \end{syntax}
+% This hook is discussed in conjunction with the shipout hooks.
+% \end{function}
+%
+%
+%
+% \subsection{\LaTeXe{} commands and environments augmented by
+% hooks}
+%
+% \emph{intro to be written}
+%
+% \subsubsection{Generic hooks for all environments}
+%
+% Every environment \meta{env} has now four associated hooks coming
+% with it:
+% \begin{description}
+% \item[\hook{env/\meta{env}/before}]
+%
+% This hook is executed as part of \cs{begin} as the very first
+% action, in particular prior to starting the environment group.
+% Its scope is therefore not restricted by the environment.
+%
+% \item[\hook{env/\meta{env}/begin}]
+%
+% This hook is executed as part of \cs{begin} directly in front
+% of the code specific to the environment start (e.g., the
+% second argument of \cs{newenvironment}). Its scope is the
+% environment body.
+%
+% \item[\hook{env/\meta{env}/end}]
+%
+% This is executed as part of \cs{end} directly in front of the
+% code specific to the end of the environment (e.g., the third
+% argument of \cs{newenvironment}).
+%
+% \item[\hook{env/\meta{env}/after}]
+%
+% This is executed as part of \cs{end} after the
+% code specific to the environment end and after the environment
+% group has ended.
+% Its scope is therefore not restricted by the environment.
+%
+% This hook is implemented as a reversed hook so if two packages
+% add code to \hook{env/\meta{env}/before} and to
+% \hook{env/\meta{env}/after} they can add surrounding
+% environments and the order of closing them happens in the
+% right sequence.
+%
+% \end{description}
+% In contrast to other hooks these hooks do not need to be declared
+% using \cs{NewHook}.
+%
+% The hooks are only executed if \cs{begin}\Arg{env} and
+% \cs{end}\Arg{env} is used. If the environment code is executed
+% via low-level calls to \cs{\meta{env}} and \cs{end\meta{env}}
+% (e.g., to avoid the environment grouping) they are not
+% available. If you want them available in code using this method,
+% you would need to add them yourself, i.e., write something like
+%\begin{verbatim}
+% \UseHook{env/quote/before}\quote
+% ...
+% \endquote\UseHook{env/quote/after}
+%\end{verbatim}
+% to add the outer hooks, etc.
+%
+%
+%
+% \subsubsection{Hooks provided by \cs{begin}\texttt{\{document\}}}
+%
+% Until 2020 \cs{begin}\texttt{\{document\}} offered exactly one
+% hook that one had to fill using \cs{AtBeginDocument}. Experience
+% has shown that this single hook in one place was not enough and
+% as part of adding the general hook management system a number of
+% additional hooks have been added at this point. The places for
+% hooks have been chosen to provide the same support as offered by
+% external packages, such as \pkg{etoolbox} and others that
+% augmented \cs{document} to gain better control.
+%
+% Supported are now the following hooks:
+% \begin{description}
+%
+% \item[\hook{env/document/before}]
+%
+% This is the generic environment hook executed effectively
+% before \verb=\begin{document}= starts, i.e., one can think of
+% it as a hook for code at the end of the preamble section.
+%
+% \item[\hook{env/document/begin}]
+%
+% This is the second generic environment hook that is executed
+% after the environment has started its group. But given that for the
+% \texttt{document} environment this group is canceled there is
+% little difference to the previous one as the two are directly
+% executed one after another (the only difference is that in this
+% hook \cs{@currenvir} is now set to \texttt{document} but
+% anybody adding to this hook would know that already).
+%
+%
+% \item[\hook{begindocument}]
+%
+% This hook is added to by \cs{AtBeginDocument} and is executed
+% after the \texttt{.aux} file as be read in and most
+% initialization are done, so they can be altered and inspected by
+% the hook code. It is followed by a small number of further
+% initializations that shouldn't be altered and are therefore
+% coming later.
+%
+% \item[\hook{begindocument/end}]
+%
+% This hook is executed at the end of the \cs{document} code in
+% other words at the beginning of the document body. The only
+% command that follows it is \cs{ignorespaces}.
+%
+% \end{description}
+%
+%
+%
+%
+% \subsubsection{Hooks provided by \cs{end}\texttt{\{document\}}}
+%
+% \LaTeXe{} always provided \cs{AtEndDocument} to add code to the
+% execution of \verb=\end{document}= just in front of the code that
+% is normally executed there. While this was a big improvement over
+% the situation in \LaTeX\,2.09 it was not flexible enough for a
+% number of use cases and so packages, such as \pkg{etoolbox},
+% \pkg{atveryend} and others patched \cs{enddocument} to add
+% additional points where code could be hooked into.
+%
+% Patching using packages is always problematical as leads to
+% conflicts (code availability, ordering of patches, incompatible
+% patches, etc.). For this reason a number of additional hooks
+% have been added to the \cs{enddocument} code to allow packages
+% to add code in various places in a controlled way without the
+% need for overwriting or patching the core code.
+%
+% Supported are now the following hooks:
+% \begin{description}
+%
+% \item[\hook{env/document/end}] The generic hook inside \cs{end}.
+%
+% \item[\hook{enddocument}]
+
+% The hook associated with \cs{AtEndDocument}. It is immediately
+% called after the previous hook so there could be just
+% one.\footnote{We could make \cs{AtEndDocument} just fill the
+% \hook{env/document/end} but maybe that is a bit confusing.}
+%
+% When this hook is executed there may be still unprocessed
+% material (e.g., floats on the deferlist) and the hook may add
+% further material to be typeset. After it, \cs{clearpage} is
+% called to ensure that all such material gets typeset. If there
+% is nothing waiting the \cs{clearpage} has no effect.
+%
+%
+% \item[\hook{enddocument/afterlastpage}]
+%
+% As the name indicates this hook should not receive code that
+% generates material for further pages. It is the right place to
+% do some final housekeeping and possibly write out some
+% information to the \texttt{.aux} file (which is still open at
+% this point to receive data). It is also the correct place to
+% set up any testing code to be run when the \texttt{.aux} file
+% is re-read in the next step.
+%
+%
+% After this hook has been executed the \texttt{.aux} file is
+% closed for writing and then read back in to do some tests
+% (e.g., looking for missing references or duplicated labels, etc.).
+%
+% \item[\hook{enddocument/afteraux}]
+%
+% At this point, the \texttt{.aux} file has been reprocessed and so
+% this is a possible place for final checks and display of
+% information to the user. However, for the latter you might
+% prefer the next hook, so that your information is displayed after the
+% (possibly longish) list of files if that got requested via \cs{listfiles}.
+%
+% \item[\hook{enddocument/info}]
+%
+% This hook is meant to receive code that write final information
+% messages to the terminal. It follows immediately after the
+% previous hook (so both could have been combined, but then
+% packages adding further code would always need to also supply
+% an explicit rule to specify where it should go.
+%
+% This hook already contains some code added by the kernel (under
+% the labels \texttt{kernel/filelist} and
+% \texttt{kernel/warnings}), namely the list of files when
+% \cs{listfiles} has been used and the warnings for duplicate
+% labels, missing references, font substitutions etc.
+%
+% \item[\hook{enddocument/end}]
+%
+% Finally, this hook is executed just in front of the final call
+% to \cs{@{}@end}.
+%
+% \end{description}
+%
+%
+% There is also the hook \hook{shipout/lastpage}. This hook is
+% executed as part of the last \cs{shipout} in the document to
+% allow package to add final \cs{special}'s to that page. Where
+% this hook is executed in relation to those from the above list
+% can vary from document to document. Furthermore to determine correctly
+% which of the \cs{shipout}s is the last one, \LaTeX{} needs to be run
+% several times, so initially it might get executed on the wrong
+% page. See section~\ref{sec:shipout} for where to find the details.
+%
+%
+% \subsubsection{Hooks provided \cs{shipout} operations}
+% \label{sec:shipout}
+%
+% There are several hooks and mechanisms added to \LaTeX{}'s
+% process of generating pages. These are documented in
+% \texttt{ltshipout-doc.pdf} or with code in
+% \texttt{ltshipout-code.pdf}.
+%
+%
+% \subsubsection{Hooks provided file loading operations}
+%
+% There are several hooks added to \LaTeX{}'s
+% process of loading file via its high-level interfaces such as
+% \cs{input}, \cs{include}, \cs{usepackage}, etc. These are documented in
+% \texttt{ltfilehook-doc.pdf} or with code in
+% \texttt{ltfilehook-code.pdf}.
+%
+%
+
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% \begin{macrocode}
+%<@@=hook>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsection{Debugging}
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hook_debug_on:,\hook_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 \hook_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \hook_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}
+
+%
+%
+% \subsection{Borrowing from internals of other kernel modules}
+%
+%
+% \begin{macro}[EXP]{\@@_str_compare:nn}
+% Private copy of \cs{__str_if_eq:nn}
+% \begin{macrocode}
+\cs_new_eq:NN \@@_str_compare:nn \__str_if_eq:nn
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Declarations}
+%
+% \begin{macro}{\l_@@_return_tl,\l_@@_tmpa_tl,\l_@@_tmpb_tl}
+% Scratch variables used throughout the package.
+% \begin{macrocode}
+\tl_new:N \l_@@_return_tl
+\tl_new:N \l_@@_tmpa_tl
+\tl_new:N \l_@@_tmpb_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_all_seq}
+% In a few places we need a list of all hook names ever defined so
+% we keep track if them in this sequence.
+% \begin{macrocode}
+\seq_new:N \g_@@_all_seq
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_removal_list_prop}
+% A property list to hold delayed removals.
+% \begin{macrocode}
+\tl_new:N \g_@@_removal_list_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\l_@@_cur_hook_tl}
+% Stores the name of the hook currently being sorted.
+% \begin{macrocode}
+\tl_new:N \l_@@_cur_hook_tl
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_code_temp_prop}
+% A property list to temporarily save the original one so that it
+% isn't permanently changed during sorting.
+% \begin{macrocode}
+\prop_new:N \g_@@_code_temp_prop
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\g_@@_hook_curr_name_tl,\g_@@_name_stack_seq}
+% Default label used for hook commands, and a stack to keep track of
+% packages within packages.
+% \begin{macrocode}
+\tl_new:N \g_@@_hook_curr_name_tl
+\seq_new:N \g_@@_name_stack_seq
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_tmp:w}
+% Temporary macro for generic usage.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_tmp:w ?
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tl_gremove_once:Nx}
+% Some variants of \pkg{expl3} functions. \fmi{should be moved to expl3}
+% \begin{macrocode}
+\cs_generate_variant:Nn \tl_gremove_once:Nn { Nx }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\s_@@_mark}
+% Scan mark used for delimited arguments.
+% \begin{macrocode}
+\scan_new:N \s_@@_mark
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Providing new hooks}
+%
+% \begin{macro}{\g_@@_..._code_prop,\g_@@_..._rules_prop,
+% \g_@@_..._code_tl,\g_@@_..._next_code_tl}
+%
+% Hooks have a \meta{name} and for each hook we have to provide a number of
+% data structures. These are
+% \begin{description}
+% \item[\cs{g_@@_\meta{name}_code_prop}] A property list holding the code
+% for the hook in separate chunks. The keys are by default the
+% package names that add code to the hook, but it is possible
+% for packages to define other keys.
+%
+% \item[\cs{g_@@_\meta{name}_rules_prop}] A property listing holding
+% relation info how the code chunks should be ordered within a
+% hook. This is used for debugging only. The actual rule for a
+% \meta{hook} is stored in a separate token lists named
+% \cs[no-index]{g_@@_\meta{hook}_rule_\meta{label1}\string|\meta{label2}_tl}
+% for a pair of labels.
+%
+% \item[\cs{g_@@_\meta{name}_code_tl}] The code that is actually executed
+% when the hook is called in the document is stored in this token
+% list. It is constructed from the code chunks applying the
+% information.
+%
+% \item[\cs{g_@@_\meta{name}_next_code_tl}] Finally there is extra code
+% (normally empty) that is used on the next invocation of the hook
+% (and then deleted). This can be used to define some special
+% behavior for a single occasion from within the document.
+%
+% \end{description}
+% \end{macro}
+
+
+%
+%
+% \begin{macro}{\hook_new:n}
+% The \cs{hook_new:n} declaration declare a new hook and expects
+% the hook \meta{name} as its argument, e.g.,
+% \hook{begindocument}.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new:n #1
+ {
+ \exp_args:Nx \@@_new:n
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ }
+\cs_new_protected:Npn \@@_new:n #1 {
+% \end{macrocode}
+% We check for one of the internal data structures and if it
+% already exists we complain.
+% \begin{macrocode}
+ \hook_if_exist:nTF {#1}
+ { \ErrorHookExists }
+% \end{macrocode}
+% Otherwise we add the hook name to the list of all hooks and
+% allocate the necessary data structures for the new hook.
+% \begin{macrocode}
+ { \seq_gput_right:Nn \g_@@_all_seq {#1}
+% \end{macrocode}
+% This is only used by the actual code of the current hook, so
+% declare it normally:
+% \begin{macrocode}
+ \tl_new:c { g_@@_#1_code_tl }
+% \end{macrocode}
+% Now ensure that the base data structure for the hook exists:
+% \begin{macrocode}
+ \@@_declare:n {#1}
+% \end{macrocode}
+% The \cs{g_@@_\meta{hook}_labels_clist} holds the sorted list of
+% labels (once it got sorted). This is used only for debugging.
+% \begin{macrocode}
+ \clist_new:c {g_@@_#1_labels_clist}
+% \end{macrocode}
+% Some hooks should reverse the default order of code chunks. To
+% signal this we have a token list which is empty for normal hooks
+% and contains a \verb=-= for reversed hooks.
+% \begin{macrocode}
+ \tl_new:c { g_@@_#1_reversed_tl }
+% \end{macrocode}
+% The above is all in L3 convention, but we also provide an
+% interface to legacy \LaTeXe{} for use in the current kernel. This
+% is done in a separate macro.
+% \begin{macrocode}
+ \@@_provide_legacy_interface:n {#1}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+%
+%
+% \begin{macro}{\@@_declare:n}
+% This function declares the basic data structures for a hook without
+% actually declaring the hook itself. This is needed to allow adding
+% to undeclared hooks. Here it is unnecessary to check whether both
+% variables exist, since both are declared at the same time (either
+% both exist, or neither).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_declare:n #1
+ {
+ \@@_if_exist:nF {#1}
+ {
+ \prop_new:c { g_@@_#1_code_prop }
+ \tl_new:c { g_@@_#1_next_code_tl }
+ \prop_new:c { g_@@_#1_rules_prop } % only for debugging
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\hook_new_reversed:n}
+%
+% Declare a new hook. The default ordering of code chunks is
+% reversed, signaled by setting the token list to a minus sign.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new_reversed:n #1 {
+ \hook_new:n {#1}
+ \tl_gset:cn { g_@@_#1_reversed_tl } { - }
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\hook_new_pair:nn}
+% A shorthand for declaring a normal and a (matching) reversed hook in one go.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_new_pair:nn #1#2 {
+ \hook_new:n {#1} \hook_new_reversed:n {#2}
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_provide_legacy_interface:n}
+% The \LaTeX{} legacy concept for hooks uses with hooks the
+% following naming scheme in the code: \cs{@...hook}.
+%
+% We follow this convention and insert the hook code using this
+% naming scheme in \LaTeXe{}. At least as long as this code is in a
+% package, some such hooks are already filled with data when we move
+% them over to the new scheme. We therefore insert already existing
+% code under the label \texttt{legacy} into the hook management
+% machinery and then replace the \cs{@...hook} with its counterpart
+% which is \cs{g_@@_\#1_code_tl}.\footnote{This means one extra
+% unnecessary expansion on each invocation in the document but
+% keeps the \LaTeXe{} and the L3 coding side properly separated.}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_provide_legacy_interface:n #1
+ {
+% \end{macrocode}
+% If the \pkg{expl3} code is run with checking on then assigning or
+% using non L3 names such as \cs{@enddocumenthook} with \pkg{expl3}
+% functions will trigger warnings so we run this code with
+% debugging explicitly suspended.
+% \begin{macrocode}
+ \debug_suspend:
+ \tl_if_exist:cT { @#1hook }
+% \end{macrocode}
+% Of course if the hook exists but is still empty, there is no need
+% to add anything under \texttt{legacy} or the current package name.
+% \begin{macrocode}
+ {
+ \tl_if_empty:cF { @#1hook }
+ {
+ \@@_gput_code:nxv {#1}
+ { \@@_parse_label_default:Vn \c_novalue_tl { legacy } }
+ { @#1hook }
+ }
+ }
+% \end{macrocode}
+% We need a global definition in case the declaration is done
+% inside a group (which happens below at the end of the file).
+% This is another reason why need to suspend checking, otherwise
+% \cs{tl_gset:co} would complain about \cs{@...hook} not starting
+% with \cs{g_}.
+% \begin{macrocode}
+ \tl_gset:co{@#1hook}{\cs:w g_@@_#1_code_tl\cs_end:}
+ \debug_resume:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Parsing a label}
+%
+% \begin{macro}[EXP]{\@@_parse_label_default:nn,\@@_parse_label_default:Vn}
+% This macro checks if a label was given (not \cs{c_novalue_tl}), and
+% if so, tries to parse the label looking for a leading \verb|.| to
+% replace for \cs{@currname}. Otherwise \cs{@@_currname_or_default:n}
+% is used to pick \cs{@currname} or the fallback value.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_label_default:nn #1 #2
+ {
+ \tl_if_novalue:nTF {#1}
+ { \@@_currname_or_default:n {#2} }
+ { \tl_trim_spaces_apply:nN {#1} \@@_parse_dot_label:nn {#2} }
+ }
+\cs_generate_variant:Nn \@@_parse_label_default:nn { V }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_parse_dot_label:nn}
+% \begin{macro}[EXP]{
+% \@@_parse_dot_label:nw,
+% \@@_parse_dot_label_cleanup:w,
+% \@@_parse_dot_label_aux:nw
+% }
+% Start by checking if the label is empty, which raises an error, and
+% uses the fallback value. If not,
+% split the label at a \verb|./|, if any, and check if no tokens are
+% before the \verb|./|, or if the only character is a \verb|.|.
+% If these requirements are fulfilled, the leading
+% \verb|.| is replaced with \cs{@@_currname_or_default:n}. Otherwise
+% the label is returned unchanged.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_dot_label:nn #1 #2
+ {
+ \tl_if_empty:nTF {#1}
+ {
+ \msg_expandable_error:nnn { hooks } { empty-label } {#2}
+ #2
+ }
+ {
+ \str_if_eq:nnTF {#1} { . }
+ { \@@_currname_or_default:n {#1} }
+ { \@@_parse_dot_label:nw {#2} #1 ./ \s_@@_mark }
+ }
+ }
+\cs_new:Npn \@@_parse_dot_label:nw #1 #2 ./ #3 \s_@@_mark
+ {
+ \tl_if_empty:nTF {#2}
+ { \@@_parse_dot_label_aux:nw {#1} #3 \s_@@_mark }
+ {
+ \tl_if_empty:nTF {#3}
+ {#2}
+ { \@@_parse_dot_label_cleanup:w #2 ./ #3 \s_@@_mark }
+ }
+ }
+\cs_new:Npn \@@_parse_dot_label_cleanup:w #1 ./ \s_@@_mark {#1}
+\cs_new:Npn \@@_parse_dot_label_aux:nw #1 #2 ./ \s_@@_mark
+ { \@@_currname_or_default:n {#1} / #2 }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_currname_or_default:n}
+% Uses \cs{g_@@_hook_curr_name_tl} if it is set, otherwise tries
+% \cs{@currname}. If neither is set, uses the fallback value
+% \verb|#1| (usually \texttt{top-level}).
+% \begin{macrocode}
+\cs_new:Npn \@@_currname_or_default:n #1
+ {
+ \tl_if_empty:NTF \g_@@_hook_curr_name_tl
+ {
+ \tl_if_empty:NTF \@currname
+ {#1}
+ { \@currname }
+ }
+ { \g_@@_hook_curr_name_tl }
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\hook_gput_code:nnn}
+% \begin{macro}{\@@_gput_code:nnn,\@@_gput_code:nxv,\@@_hook_gput_code_do:nnn}
+%
+% With \cs{hook_gput_code:nnn}\Arg{hook}\Arg{label}\Arg{code} a
+% chunk of \meta{code} is added to an existing \meta{hook} labeled
+% with \meta{label}.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gput_code:nnn #1 #2
+ {
+ \exp_args:Nxx \@@_gput_code:nnn
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ { \@@_parse_label_default:nn {#2} { top-level } }
+ }
+\cs_new_protected:Npn \@@_gput_code:nnn #1 #2 #3
+ {
+% \end{macrocode}
+% First we check if the hook exists.
+% \begin{macrocode}
+ \@@_if_marked_removal:nnTF {#1} {#2}
+ { \@@_unmark_removal:nn {#1} {#2} }
+ {
+% \end{macrocode}
+% First we check if the hook exists.
+% \begin{macrocode}
+ \hook_if_exist:nTF {#1}
+% \end{macrocode}
+% If so we simply add (or append) the new code to the property list
+% holding different chunks for the hook. At \verb=\begin{document}=
+% this is then sorted into a token list for fast execution.
+% \begin{macrocode}
+ {
+ \@@_hook_gput_code_do:nnn {#1} {#2} {#3}
+% \end{macrocode}
+% However, if there is an update within the document we need to alter
+% this execution code which is done by
+% \cs{@@_update_hook_code:n}. In the preamble this does nothing.
+% \begin{macrocode}
+ \@@_update_hook_code:n {#1}
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ { \@@_try_declaring_generic_hook:nnn {#1} {#2} {#3} }
+ }
+ }
+\cs_generate_variant:Nn \@@_gput_code:nnn { nxv }
+% \end{macrocode}
+%
+% This macro will unconditionally add a chunk of code to the given hook.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_hook_gput_code_do:nnn #1 #2 #3
+ {
+% However, first some debugging info if debugging is enabled:
+% \begin{macrocode}
+ \@@_debug:n{\iow_term:x{****~ Add~ to~
+ \hook_if_exist:nF {#1} { undeclared~ }
+ hook~ #1~ (#2)
+ \on@line\space <-~ \tl_to_str:n{#3}} }
+% \end{macrocode}
+% Then try to get the code chunk labeled \verb=#2= from the hook.
+% If there's code already there, then append \verb=#3= to that,
+% otherwise just put \verb=#3=.
+% \begin{macrocode}
+ \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+ {
+ \prop_gput:cno { g_@@_#1_code_prop } {#2}
+ { \l_@@_return_tl #3 }
+ }
+ { \prop_gput:cnn { g_@@_#1_code_prop } {#2} {#3} }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_gput_undeclared_hook:nnn}
+% Often it may happen that a package $A$ defines a hook \verb=foo=,
+% but package $B$, that adds code to that hook, is loaded before $A$.
+% In such case we need to add code to the hook before its declared.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gput_undeclared_hook:nnn #1 #2 #3
+ {
+ \@@_declare:n {#1}
+ \@@_hook_gput_code_do:nnn {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_try_declaring_generic_hook:nnn}
+% \begin{macro}{\@@_try_declaring_generic_next_hook:nn}
+% These entry-level macros just pass the arguments along to the
+% common \cs{@@_try_declaring_generic_hook:nNNnn} with the right
+% functions to execute when some action is to be taken.
+%
+% The wrapper \cs{@@_try_declaring_generic_hook:nnn} then defers
+% \cs{hook_gput_code:nnn} if the generic hook was declared, or to
+% \cs{@@_gput_undeclared_hook:nnn} otherwise (the hook was tested for
+% existence before, so at this point if it isn't generic, it doesn't
+% exist).
+%
+% The wrapper \cs{@@_try_declaring_generic_next_hook:nn} for
+% next-execution hooks does the same: it defers the code to
+% \cs{hook_gput_next_code:nn} if the generic hook was declared, or
+% to \cs{@@_gput_next_do:nn} otherwise.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_try_declaring_generic_hook:nnn #1
+ {
+ \@@_try_declaring_generic_hook:nNNnn {#1}
+ \hook_gput_code:nnn \@@_gput_undeclared_hook:nnn
+ }
+\cs_new_protected:Npn \@@_try_declaring_generic_next_hook:nn #1
+ {
+ \@@_try_declaring_generic_hook:nNNnn {#1}
+ \hook_gput_next_code:nn \@@_gput_next_do:nn
+ }
+% \end{macrocode}
+%
+% \begin{macro}{
+% \@@_try_declaring_generic_hook:nNNnn,
+% \@@_try_declaring_generic_hook_split:nNNnn
+% }
+% \begin{macro}[TF]{\@@_try_declaring_generic_hook:wn}
+% \cs{@@_try_declaring_generic_hook:nNNnn} now splits the hook name
+% at the first \texttt{/} (if any) and first checks if it is a
+% file-specific hook (they require some normalization) using
+% \cs{@@_if_file_hook:wTF}. If not then check it is one of a
+% predefined set for generic names. We also split off the second
+% component to see if we have to make a reversed hook. In either case
+% the function returns \meta{true} for a generic hook and \meta{false}
+% in other cases.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_try_declaring_generic_hook:nNNnn #1
+ {
+ \@@_if_file_hook:wTF #1 / / \s_@@_mark
+ {
+ \exp_args:Ne \@@_try_declaring_generic_hook_split:nNNnn
+ { \exp_args:Ne \@@_file_hook_normalise:n {#1} }
+ }
+ { \@@_try_declaring_generic_hook_split:nNNnn {#1} }
+ }
+\cs_new_protected:Npn \@@_try_declaring_generic_hook_split:nNNnn #1 #2 #3
+ {
+ \@@_try_declaring_generic_hook:wnTF #1 / / / \scan_stop: {#1}
+ { #2 }
+ { #3 } {#1}
+ }
+\prg_new_protected_conditional:Npnn \@@_try_declaring_generic_hook:wn
+ #1 / #2 / #3 / #4 \scan_stop: #5 { TF }
+ {
+ \tl_if_empty:nTF {#2}
+ { \prg_return_false: }
+ {
+ \prop_if_in:NnTF \c_@@_generics_prop {#1}
+ {
+ \hook_if_exist:nF {#5} { \hook_new:n {#5} }
+% \end{macrocode}
+% After having declared the hook we check the second component (for
+% file hooks) or the third component for environment hooks) and
+% if it is on the list of components for which we should have declared
+% a reversed hook we alter the hook data structure accordingly.
+% \begin{macrocode}
+ \prop_if_in:NnTF \c_@@_generics_reversed_ii_prop {#2}
+ { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
+ {
+ \prop_if_in:NnT \c_@@_generics_reversed_iii_prop {#3}
+ { \tl_gset:cn { g_@@_#5_reversed_tl } { - } }
+ }
+% \end{macrocode}
+% Now that we know that the hook is declared we can add the code to it.
+% \begin{macrocode}
+ \prg_return_true:
+ }
+ { \prg_return_false: }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_if_file_hook:w}
+% \cs{@@_if_file_hook:wTF} checks if the argument is a valid
+% file-specific hook (not, for example, |file/before|, but
+% |file/before/foo.tex|). If it is a file-specific hook, then it
+% executes the \meta{true} branch, otherwise \meta{false}.
+%
+% A file-specific hook is \texttt{file/\meta{position}/\meta{name}}.
+% If any of these parts don't exist, it is a general file hook or not
+% a file hook at all, so the conditional evaluates to \meta{false}.
+% Otherwise, it checks that the first part is |file| and that the
+% \meta{position} is in the \cs{c_@@_generics_file_prop}.
+%
+% A property list is used here to avoid having to worry with catcodes,
+% because \pkg{expl3}'s file name parsing turns all characters into
+% catcode-12 tokens, which might differ from hand-input letters.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_file_hook:w
+ #1 / #2 / #3 \s_@@_mark { TF }
+ {
+ \str_if_eq:nnTF {#1} { file }
+ {
+ \bool_lazy_or:nnTF
+ { \tl_if_empty_p:n {#3} }
+ { \str_if_eq_p:nn {#3} { / } }
+ { \prg_return_false: }
+ {
+ \prop_if_in:NnTF \c_@@_generics_file_prop {#2}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_file_hook_normalise:n}
+% \begin{macro}[EXP]{\@@_strip_double_slash:n,\@@_strip_double_slash:w}
+% When a file-specific hook is found, before being declared it is
+% lightly normalized by \cs{@@_file_hook_normalise:n}. The current
+% implementation just replaces two consecutive slashes (|//|) by a
+% single one, to cope with simple cases where the user did something
+% like \verb|\def\input@path{{./mypath/}}|, in which case a hook would
+% have to be \verb|\AddToHook{file/after/./mypath//file.tex}|.
+% \begin{macrocode}
+\cs_new:Npn \@@_file_hook_normalise:n #1
+ { \@@_strip_double_slash:n {#1} }
+\cs_new:Npn \@@_strip_double_slash:n #1
+ { \@@_strip_double_slash:w #1 // \s_@@_mark }
+\cs_new:Npn \@@_strip_double_slash:w #1 // #2 \s_@@_mark
+ {
+ \tl_if_empty:nTF {#2}
+ {#1}
+ { \@@_strip_double_slash:w #1 / #2 \s_@@_mark }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+
+
+
+% \begin{macro}{\c_@@_generics_prop}
+% Clist holding the generic names. We don't provide any user
+% interface to this as this is meant to be static.
+% \begin{description}
+% \item[\texttt{env}]
+% The generic hooks used in \cs{begin} and \cs{end}.
+% \item[\texttt{file}]
+% The generic hooks used when loading a file
+% \end{description}
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \c_@@_generics_prop
+ {env=,file=,package=,class=,include=}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c_@@_generics_reversed_ii_prop,
+% \c_@@_generics_reversed_iii_prop,
+% \c_@@_generics_file_prop}
+% Some of the generic hooks are supposed to use reverse ordering, these are
+% the following (only the second or third sub-component is checked):
+% \begin{macrocode}
+\prop_const_from_keyval:Nn \c_@@_generics_reversed_ii_prop {after=,end=}
+\prop_const_from_keyval:Nn \c_@@_generics_reversed_iii_prop {after=}
+\prop_const_from_keyval:Nn \c_@@_generics_file_prop {before=,after=}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_update_hook_code:n}
+% Before \verb=\begin{document}= this does nothing, in the body it
+% reinitializes the hook code using the altered data.
+% \begin{macrocode}
+\cs_new_eq:NN \@@_update_hook_code:n \use_none:n
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\hook_gremove_code:nn}
+% \begin{macro}{\@@_gremove_code:nn}
+%
+% With \cs{hook_gremove_code:nn}\Arg{hook}\Arg{label} any code
+% for \meta{hook} stored under \meta{label} is removed.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gremove_code:nn #1 #2
+ {
+ \exp_args:Nxx \@@_gremove_code:nn
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ { \@@_parse_label_default:nn {#2} { top-level } }
+ }
+\cs_new_protected:Npn \@@_gremove_code:nn #1 #2
+ {
+% \end{macrocode}
+% First check that the hook code pool exists. \cs{hook_if_exist:nTF}
+% isn't used here because it should be possible to remove code from a
+% hook before its defined (see section~\ref{sec:querying}).
+% \begin{macrocode}
+ \@@_if_exist:nTF {#1}
+% \end{macrocode}
+% Then remove the chunk and run \cs{@@_update_hook_code:n} so
+% that the execution token list reflects the change if we are after
+% \verb=\begin{document}=.
+% \begin{macrocode}
+ {
+ \str_if_eq:nnTF {#2} {*}
+ {
+ \prop_gclear:c { g_@@_#1_code_prop }
+ \clist_gclear:c { g_@@_#1_labels_clist } % for debugging only
+ }
+ {
+% \end{macrocode}
+% Check if the label being removed exists in the code pool. If it does,
+% just call \cs{@@_gremove_code_do:nn} to do the removal, otherwise mark it
+% to be removed.
+% \begin{macrocode}
+ \prop_get:cnNTF { g_@@_#1_code_prop } {#2} \l_@@_return_tl
+ { \@@_gremove_code_do:nn }
+ { \@@_mark_removal:nn }
+ {#1} {#2}
+ }
+% \end{macrocode}
+% Finally update the code, if the hook exists.
+% \begin{macrocode}
+ \hook_if_exist:nT {#1}
+ { \@@_update_hook_code:n {#1} }
+ }
+ { \@@_mark_removal:nn {#1} {#2} }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_gremove_code_do:nn}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gremove_code_do:nn #1 #2
+ {
+ \prop_gremove:cn { g_@@_#1_code_prop } {#2}
+% \end{macrocode}
+% Removing the dropped label from \verb=\g_@@_#1_labels_clist= is
+% rather tricky, because that clists holds the labels as strings
+% (i.e., not ordinary text which is what we have in \verb=#2=).
+% \begin{macrocode}
+ \exp_args:Nco \clist_gremove_all:Nn
+ { g_@@_#1_labels_clist } { \tl_to_str:n {#2} } % for debugging only
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+
+
+%
+% \begin{macro}{\@@_mark_removal:nn}
+% Marks \meta{label} (\verb=#2=) to be removed from \meta{hook}
+% (\verb=#1=).
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_mark_removal:nn #1 #2
+ {
+ \tl_gput_right:Nx \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_unmark_removal:nn}
+% Unmarks \meta{label} (\verb=#2=) to be removed from \meta{hook}
+% (\verb=#1=). \cs{tl_gremove_once:Nx} is used rather than
+% \cs{tl_gremove_all:Nx} so that two additions are needed to cancel
+% two marked removals, rather than only one.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_unmark_removal:nn #1 #2
+ {
+ \tl_gremove_once:Nx \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_if_marked_removal:nn}
+% Checks if the \cs{g_@@_removal_list_tl} contains the current
+% \meta{label} (\verb=#2=) and \meta{hook} (\verb=#1=).
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_if_marked_removal:nn #1 #2 { TF }
+ {
+ \exp_args:NNx \tl_if_in:NnTF \g_@@_removal_list_tl
+ { \@@_removal_tl:nn {#1} {#2} }
+ { \prg_return_true: } { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[rEXP]{\@@_removal_tl:nn}
+% Builds a token list with \verb=#1= and \verb=#2= which can only be
+% matched by \verb=#1= and \verb=#2=.
+% \begin{macrocode}
+\cs_new:Npn \@@_removal_tl:nn #1 #2
+ { & \tl_to_str:n {#2} $ \tl_to_str:n {#1} $ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+%
+%
+%
+% \begin{macro}{
+% \g_@@_??_rules_prop,
+% \g_@@_??_code_prop,
+% \g_@@_??_code_tl,
+% \g_@@_??_reversed_tl,
+% }
+%
+% Default rules applying to all hooks are stored in this property
+% list. Initially it simply used an empty ``label'' name (not two
+% question marks). This was a bit unfortunate, because then
+% \texttt{l3doc} complains about \verb=__= in the middle of a
+% command name when trying to typeset the documentation. However
+% using a ``normal'' name such as \texttt{default} has the
+% disadvantage of that being not really distinguishable from a real
+% hook name. I now have settled for \texttt{??} which needs some
+% gymnastics to get it into the csname, but since this is used a
+% lot things should be fast, so this is not done with \texttt{c}
+% expansion in the code later on.
+%
+% \cs{g_@@_??_code_tl} isn't used, but it has to be defined to trick
+% the code into thinking that \verb=??= is actually a hook.
+% \begin{macrocode}
+\prop_new:c {g_@@_??_rules_prop}
+\prop_new:c {g_@@_??_code_prop}
+\prop_new:c {g_@@_??_code_tl}
+% \end{macrocode}
+%
+% Default rules are always given in normal ordering (never in
+% reversed ordering). If such a rule is applied to a reversed
+% hook it behaves as if the rule is reversed (e.g.,
+% \texttt{after} becomes \texttt{before})
+% because those rules are applied first and then the order is reversed.
+% \begin{macrocode}
+\tl_new:c {g_@@_??_reversed_tl}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_debug_gset_rule:nnnn}
+%
+% \fmi{this needs cleanup and docu correction!}
+%
+% With
+% \cs{@@_debug_gset_rule:nnnn}\Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% a relation is defined between the two code labels for the given
+% \meta{hook}. The special hook \texttt{??} stands for \emph{any}
+% hook describing a default rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_debug_gset_rule:nnnn #1#2#3#4
+ {
+% \end{macrocode}
+% If so we drop any existing rules with the two labels (in case
+% there are any).
+% \begin{macrocode}
+ \prop_gremove:cn{g_@@_#1_rules_prop}{#2|#4}
+ \prop_gremove:cn{g_@@_#1_rules_prop}{#4|#2}
+% \end{macrocode}
+% Then we add the new one (normalizing the input a bit, e.g., we
+% always use \texttt{before} and not \texttt{after} and
+% instead reorder the labels):
+% \begin{macrocode}
+ \str_case_e:nnF {#3}
+ {
+ {before} { \prop_gput:cnn {g_@@_#1_rules_prop}{#2|#4}{<} }
+ {after} { \prop_gput:cnn {g_@@_#1_rules_prop}{#4|#2}{<} }
+% \end{macrocode}
+% More special rule types \ldots
+% \begin{macrocode}
+ {incompatible-error} { \prop_gput:cnn {g_@@_#1_rules_prop}{#2|#4}{xE} }
+ {incompatible-warning} { \prop_gput:cnn {g_@@_#1_rules_prop}{#2|#4}{xW} }
+ {removes} { \prop_gput:cnn {g_@@_#1_rules_prop}{#2|#4}{->} }
+% \end{macrocode}
+% Undo a setting:
+% \begin{macrocode}
+ {unrelated}{ \prop_gremove:cn {g_@@_#1_rules_prop}{#2|#4}
+ \prop_gremove:cn {g_@@_#1_rules_prop}{#4|#2} }
+ }
+ { \ERRORunknownrule }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Setting rules for hooks code}
+%
+% \begin{macro}{\hook_gset_rule:nnnn}
+% \begin{macro}{\@@_gset_rule:nnnn}
+%
+% \fmi{needs docu correction given new implementation}
+%
+% With
+% \cs{hook_gset_rule:nnnn}\Arg{hook}\Arg{label1}\Arg{relation}\Arg{label2}
+% a relation is defined between the two code labels for the given
+% \meta{hook}. The special hook \texttt{??} stands for \emph{any}
+% hook describing a default rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gset_rule:nnnn #1#2#3#4
+ {
+ \use:x
+ {
+ \@@_gset_rule:nnnn
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ { \@@_parse_label_default:nn {#2} { top-level } }
+ {#3}
+ { \@@_parse_label_default:nn {#4} { top-level } }
+ }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_gset_rule:nnnn #1#2#3#4
+ {
+% \end{macrocode}
+% First we ensure the basic data structure of the hook exists:
+% \begin{macrocode}
+ \@@_declare:n {#1}
+% \end{macrocode}
+% Then we clear any previous relationship between both labels.
+% \begin{macrocode}
+ \@@_rule_gclear:nnn {#1} {#2} {#4}
+% \end{macrocode}
+% Then we call the function to handle the given rule. Throw an error if the
+% rule is invalid.
+% \begin{macrocode}
+ \debug_suspend:
+ \cs_if_exist_use:cTF { @@_rule_#3_gset:nnn }
+ {
+ {#1} {#2} {#4}
+ \@@_update_hook_code:n {#1}
+ }
+ { \ERRORunknownrule }
+ \debug_resume:
+ \@@_debug_gset_rule:nnnn {#1} {#2} {#3} {#4} % for debugging
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_before_gset:nnn, \@@_rule_after_gset:nnn,
+% \@@_rule_<_gset:nnn, \@@_rule_>_gset:nnn}
+% Then we add the new rule. We need to normalize the rules here to
+% allow for faster processing later. Given a pair of labels
+% $l_A$ and $l_B$, the rule $l_A>l_B$ is the same as $l_B<l_A$\fmi{}
+% said differently. But normalizing the
+% forms of the rule to a single representation, say, $l_B<l_A$, then
+% the time spent looking for the rules later is considerably reduced.
+%
+% Here we do that normalization by using \cs[no-index]{(pdf)strcmp} to
+% lexically sort labels $l_A$ and $l_B$ to a fixed order. This order
+% is then enforced every time these two labels are used together.
+%
+% Here we use \cs{@@_label_pair:nn}~\Arg{hook}~\Arg{l_A}~\Arg{l_B}
+% to build a string \texttt{$l_B$\string|$l_A$} with a fixed order, and
+% use \cs{@@_label_ordered:nnTF} to apply the correct rule to the pair
+% of labels, depending if it was sorted or not.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_before_gset:nnn #1#2#3
+ {
+ \tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { \@@_label_ordered:nnTF {#2} {#3} { < } { > } }
+ }
+\cs_new_eq:cN { @@_rule_<_gset:nnn } \@@_rule_before_gset:nnn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_after_gset:nnn #1#2#3
+ {
+ \tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#3} {#2} _tl }
+ { \@@_label_ordered:nnTF {#3} {#2} { < } { > } }
+ }
+\cs_new_eq:cN { @@_rule_>_gset:nnn } \@@_rule_after_gset:nnn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_removes_gset:nnn}
+% This rule removes (clears, actually) the code from label |#3| if
+% label |#2| is in the hook |#1|.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_removes_gset:nnn #1#2#3
+ {
+ \tl_gset:cx { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl }
+ { \@@_label_ordered:nnTF {#2} {#3} { -> } { <- } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{
+% \@@_rule_incompatible-error_gset:nnn,
+% \@@_rule_incompatible-warning_gset:nnn,
+% }
+% These relations make an error/warning if labels |#2| and |#3| appear
+% together in hook |#1|.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_rule_incompatible-error_gset:nnn } #1#2#3
+ { \tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { xE } }
+\cs_new_protected:cpn { @@_rule_incompatible-warning_gset:nnn } #1#2#3
+ { \tl_gset:cn { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } { xW } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_rule_unrelated_gset:nnn, \@@_rule_gclear:nnn}
+% Undo a setting. \cs{@@_rule_unrelated_gset:nnn} doesn't need to do anything,
+% since we use \cs{@@_rule_gclear:nnn} before setting any rule.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_rule_unrelated_gset:nnn #1#2#3 { }
+\cs_new_protected:Npn \@@_rule_gclear:nnn #1#2#3
+ { \cs_undefine:c { g_@@_#1_rule_ \@@_label_pair:nn {#2} {#3} _tl } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_label_pair:nn}
+% Ensure that the lexically greater label comes first.
+% \begin{macrocode}
+\cs_new:Npn \@@_label_pair:nn #1#2
+ {
+ \if_case:w \@@_str_compare:nn {#1} {#2} \exp_stop_f:
+ #1 | #1 % 0
+ \or: #1 | #2 % +1
+ \else: #2 | #1 % -1
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_label_ordered:nn}
+% Check that labels |#1| and |#2| are in the correct order (as
+% returned by \cs{@@_label_pair:nn}) and if so return true, else
+% return false.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_label_ordered:nn #1#2 { TF }
+ {
+ \if_int_compare:w \@@_str_compare:nn {#1} {#2} > 0 \exp_stop_f:
+ \prg_return_true:
+ \else
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_if_label_case:nnnnn}
+% To avoid doing the string comparison twice in \cs{@@_initialize_single:NNNNn}
+% (once with \cs{str_if_eq:nn} and again with \cs{@@_label_ordered:nn}),
+% we use a three-way branching macro that will compare |#1| and |#2|
+% and expand to \cs{use_i:nnn} if they are equal, \cs{use_ii:nn} if
+% |#1| is lexically greater, and \cs{use_iii:nn} otherwise.
+% \begin{macrocode}
+\cs_new:Npn \@@_if_label_case:nnnnn #1#2
+ {
+ \cs:w use_
+ \if_case:w \@@_str_compare:nn {#1} {#2}
+ i \or: ii \else: iii \fi: :nnn
+ \cs_end:
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_initialize_all:}
+% Initialize all known hooks (at \verb=\begin{document}=), i.e.,
+% update the fast execution token lists to hold the necessary code
+% in the right order.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_all: {
+% \end{macrocode}
+% First we change \cs{@@_update_hook_code:n} which so far was a
+% no-op to now initialize one hook. This way any later updates to
+% the hook will run that code and also update the execution token
+% list.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_update_hook_code:n \@@_initialize_hook_code:n
+% \end{macrocode}
+% Now we loop over all hooks that have been defined and update each
+% of them.
+% \begin{macrocode}
+ \@@_debug:n { \prop_gclear:N \g_@@_used_prop }
+ \seq_map_inline:Nn \g_@@_all_seq
+ {
+ \@@_update_hook_code:n {##1}
+ }
+% \end{macrocode}
+% If we are debugging we show results hook by hook for all hooks
+% that have data.
+% \begin{macrocode}
+ \@@_debug:n
+ { \iow_term:x{^^JAll~ initialized~ (non-empty)~ hooks:}
+ \prop_map_inline:Nn \g_@@_used_prop
+ { \iow_term:x{^^J~ ##1~ ->~
+ \exp_not:v {g_@@_##1_code_tl}~ }
+ }
+ }
+%
+% \end{macrocode}
+% After all hooks are initialized we change the ``use'' to just
+% call the hook code and not initialize it (as it was done in the
+% preamble.
+% \begin{macrocode}
+ \cs_gset_eq:NN \hook_use:n \@@_use_initialized:n
+ \cs_gset_eq:NN \@@_preamble_hook:n \use_none:n
+}
+% \end{macrocode}
+% \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
+% and at \verb=\begin{document}= this is done for all hooks and
+% afterwards only if the hook code changes.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_hook_code:n #1 {
+ \@@_debug:n{ \iow_term:x{^^JUpdate~ code~ for~ hook~
+ '#1' \on@line :^^J} }
+% \end{macrocode}
+% This does the sorting and the updates. If there aren't any code
+% chunks for the current hook, there is no point in even starting
+% the sorting routine so we make a quick test for that and in that
+% case just update \cs{g_@@_\meta{hook}_code_tl} to hold the next
+% code. If there are code chunks we call
+% \cs{@@_initialize_single:NNNNn} 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.
+% \begin{macrocode}
+ \hook_if_exist:nT {#1}
+ {
+ \prop_if_empty:cTF {g_@@_#1_code_prop}
+ { \tl_gset:co {g_@@_#1_code_tl}
+ {\cs:w g_@@_#1_next_code_tl \cs_end: } }
+ {
+% \end{macrocode}
+% By default the algorithm sorts the code chunks and then saves the
+% result in a token list for fast execution by adding the code 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
+% in preparation is to change two definitions used later on.
+% \begin{macrocode}
+ \@@_if_reversed:nTF {#1}
+ { \cs_set_eq:NN \@@_tl_gput:NV \tl_gput_left:NV
+ \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_left:NV }
+ { \cs_set_eq:NN \@@_tl_gput:NV \tl_gput_right:NV
+ \cs_set_eq:NN \@@_clist_gput:NV \clist_gput_right:NV }
+% \end{macrocode}
+%
+% When sorting, some relations (namely \verb|->| \verb|<-|) need to
+% act destructively on the code property lists to remove code that
+% shouldn't appear in the sorted hook token list.
+% \begin{macrocode}
+ \prop_gset_eq:Nc \g_@@_code_temp_prop { g_@@_#1_code_prop }
+ \@@_initialize_single:ccccn
+ { g_@@_#1_code_prop } { g_@@_#1_code_tl }
+ { g_@@_#1_next_code_tl } { g_@@_#1_labels_clist }
+ {#1}
+ \prop_gset_eq:cN { g_@@_#1_code_prop } \g_@@_code_temp_prop
+% \end{macrocode}
+% For debug display we want to keep track of those hooks that
+% actually got code added to them, so we record that in plist. We
+% use a plist to ensure that we record each hook name only once,
+% 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}{} }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\g_@@_used_prop}
+% All hooks that receive code (for use in debugging display).
+% \begin{macrocode}
+\prop_new:N\g_@@_used_prop
+% \end{macrocode}
+% \end{macro}
+
+
+%
+% \begin{macro}[EXP]{\@@_tl_csname:n,\@@_seq_csname:n}
+% It is faster to pass a single token and expand it when necessary
+% than to pass a bunch of character tokens around.
+% \fmi{note to myself: verify}
+% \begin{macrocode}
+\cs_new:Npn \@@_tl_csname:n #1 { l_@@_label_#1_tl }
+\cs_new:Npn \@@_seq_csname:n #1 { l_@@_label_#1_seq }
+% \end{macrocode}
+% \end{macro}
+%
+
+%
+%
+% \begin{macro}{\l_@@_labels_seq,\l_@@_labels_int,\l_@@_front_tl,
+% \l_@@_rear_tl,\l_@@_label_0_tl}
+%
+% For the sorting I am basically implementing Knuth's algorithm for
+% topological sorting as given in TAOCP volume 1 pages 263--266.
+% For this algorithm we need a number of local variables:
+% \begin{itemize}
+% \item
+% List of labels used in the current hook to label code chunks:
+% \begin{macrocode}
+\seq_new:N \l_@@_labels_seq
+% \end{macrocode}
+% \item
+% Number of labels used in the current hook. In Knuth's algorithm
+% this is called $N$:
+% \begin{macrocode}
+\int_new:N \l_@@_labels_int
+% \end{macrocode}
+% \item
+% The sorted code list to be build is managed using two pointers
+% one to the front of the queue and one to the rear. We model this
+% using token list pointers. Knuth calls them $F$ and $R$:
+% \begin{macrocode}
+\tl_new:N \l_@@_front_tl
+\tl_new:N \l_@@_rear_tl
+% \end{macrocode}
+% \item
+% The data for the start of the queue is kept in this token list,
+% it corresponds to what Don calls \texttt{QLINK[0]} but since we
+% aren't manipulating individual words in memory it is slightly
+% differently done:
+% \begin{macrocode}
+\tl_new:c { \@@_tl_csname:n { 0 } }
+% \end{macrocode}
+%
+% \end{itemize}
+% \end{macro}
+
+
+% \begin{macro}{\@@_initialize_single:NNNNn,\@@_initialize_single:ccccn}
+%
+% \cs{@@_initialize_single:NNNNn} implements the sorting of the code
+% chunks for a hook and saves the result in the token list for fast
+% execution (\verb=#3=). The arguments are \meta{hook-code-plist},
+% \meta{hook-code-tl}, \meta{hook-next-code-tl},
+% \meta{hook-ordered-labels-clist} and \meta{hook-name} (the latter
+% is only used for debugging---the \meta{hook-rule-plist} is accessed
+% using the \meta{hook-name}).
+%
+% The additional complexity compared to Don's algorithm is that we
+% do not use simple positive integers but have arbitrary
+% alphanumeric labels. As usual Don's data structures are chosen in
+% a way that one can omit a lot of tests and I have mimicked that as
+% far as possible. The result is a restriction I do not test for at
+% the moment: a label can't be equal to the number 0! \fmi{Needs
+% checking for, just in case}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_initialize_single:NNNNn #1#2#3#4#5 {
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \debug_suspend:
+% \end{macrocode}
+% Step T1: Initialize the data structure \ldots
+% \begin{macrocode}
+ \seq_clear:N \l_@@_labels_seq
+ \int_zero:N \l_@@_labels_int
+% \end{macrocode}
+%
+% Store the name of the hook:
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_cur_hook_tl {#5}
+% \end{macrocode}
+%
+% We loop over the property list holding the code and record all
+% labels listed there. Only rules for those labels are of interest
+% to us. While we are at it we count them (which gives us the $N$
+% in Knuth's algorithm. The prefix |label_| is added to the variables
+% to ensure that labels named |front|, |rear|, |labels|, or |return|
+% don't interact with our code.
+% \begin{macrocode}
+ \prop_map_inline:Nn #1
+ {
+ \int_incr:N \l_@@_labels_int
+ \seq_put_right:Nn \l_@@_labels_seq {##1}
+ \tl_set:cn { \@@_tl_csname:n {##1} }{0} % the counter k for number of
+ % j before k rules
+ \seq_clear_new:c { \@@_seq_csname:n {##1} } % sequence of successors to k
+ % i.e., k before j rules (stores
+ % the names of the j's)
+ }
+% \end{macrocode}
+% Steps T2 and T3: Sort the relevant rules into the data structure\ldots
+%
+% This loop constitutes a square matrix of the labels in |#1| in the
+% vertical and the horizontal directions. However since the rule
+% $l_A\meta{rel}l_B$ is the same as $l_B\meta{rel}^{-1}l_A$ we can cut
+% the loop short at the diagonal of the matrix (\emph{i.e.}, when
+% both labels are equal), saving a good amount of time. The way the
+% rules were set up (see the implementation of \cs{@@_rule_before_gset:nnn}
+% above) ensures that we have no rule in the ignored side of the
+% matrix, and all rules are seen. The rules are applied in
+% \cs{@@_apply_label_pair:nnn}, which takes the properly-ordered pair
+% of labels as argument.
+% \begin{macrocode}
+ \prop_map_inline:Nn #1
+ {
+ \prop_map_inline:Nn #1
+ {
+ \@@_if_label_case:nnnnn {##1} {####1}
+ { \prop_map_break: }
+ { \@@_apply_label_pair:nnn {##1} {####1} }
+ { \@@_apply_label_pair:nnn {####1} {##1} }
+ {#5}
+ }
+ }
+% \end{macrocode}
+% Take a breath and take a look at the data structures that have
+% been set up:
+% \begin{macrocode}
+ \@@_debug:n { \@@_debug_label_data:N #1 }
+% \end{macrocode}
+%
+%
+% Step T4:
+% \begin{macrocode}
+ \tl_set:Nn \l_@@_rear_tl { 0 }
+ \tl_set:cn { \@@_tl_csname:n { 0 } } { 0 } % really {l_@@_label_ \l_@@_rear_tl _tl}
+ \seq_map_inline:Nn \l_@@_labels_seq
+ {
+ \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+ {
+ \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } }{##1}
+ \tl_set:Nn \l_@@_rear_tl {##1}
+ }
+ }
+ \tl_set_eq:Nc \l_@@_front_tl { \@@_tl_csname:n { 0 } }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tl_gclear:N #2
+ \clist_gclear:N #4
+% \end{macrocode}
+%
+% The whole loop combines steps T5--T7:
+% \begin{macrocode}
+ \bool_while_do:nn { ! \str_if_eq_p:Vn \l_@@_front_tl { 0 } }
+ {
+% \end{macrocode}
+% This part is step T5:
+% \begin{macrocode}
+ \int_decr:N \l_@@_labels_int
+ \prop_get:NVN #1 \l_@@_front_tl \l_@@_return_tl
+ \@@_tl_gput:NV #2 \l_@@_return_tl
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@@_clist_gput:NV #4 \l_@@_front_tl
+ \@@_debug:n{ \iow_term:x{Handled~ code~ for~ \l_@@_front_tl} }
+% \end{macrocode}
+%
+% This is step T6 except that we don't use a pointer $P$ to move
+% through the successors, but instead use \verb=##1= of the mapping
+% function.
+% \begin{macrocode}
+ \seq_map_inline:cn { \@@_seq_csname:n { \l_@@_front_tl } }
+ {
+ \tl_set:cx { \@@_tl_csname:n {##1} }
+ { \int_eval:n { \cs:w \@@_tl_csname:n {##1} \cs_end: - 1 } }
+ \int_compare:nNnT { \cs:w \@@_tl_csname:n {##1} \cs_end: } = 0
+ {
+ \tl_set:cn { \@@_tl_csname:n { \l_@@_rear_tl } } {##1}
+ \tl_set:Nn \l_@@_rear_tl {##1}
+ }
+ }
+% \end{macrocode}
+% and step T7:
+% \begin{macrocode}
+ \tl_set_eq:Nc \l_@@_front_tl { \@@_tl_csname:n { \l_@@_front_tl } }
+% \end{macrocode}
+%
+% This is step T8: If we haven't moved the code for all labels
+% (i.e., if \cs{l_@@_labels_int} is still greater than zero) we
+% have a loop and our partial order can't be flattened out.
+% \begin{macrocode}
+ }
+ \int_compare:nNnF \l_@@_labels_int = 0
+ {
+ \iow_term:x{====================}
+ \iow_term:x{Error:~ label~ rules~ are~ incompatible:}
+% \end{macrocode}
+%
+% This is not really the information one needs in the error case
+% but will do for now \ldots \fmi{fix}
+% \begin{macrocode}
+ \@@_debug_label_data:N #1
+ \iow_term:x{====================}
+ }
+% \end{macrocode}
+% After we have added all hook code to \verb=#2= we finish it off
+% with adding extra code for a one time execution. That is stored
+% in \verb=#3= but is normally empty.
+% \begin{macrocode}
+ \tl_gput_right:Nn #2 {#3}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \debug_resume:
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_generate_variant:Nn \@@_initialize_single:NNNNn {cccc}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_tl_gput:NV,\@@_clist_gput:NV}
+% These append either on the right (normal hook) or on the left
+% (reversed hook). This is setup up in
+% \cs{@@_initialize_hook_code:n}, elsewhere their behavior is undefined.
+% \begin{macrocode}
+\cs_new:Npn \@@_tl_gput:NV {\ERROR}
+\cs_new:Npn \@@_clist_gput:NV {\ERROR}
+% \end{macrocode}
+% \end{macro}
+
+
+%
+% \begin{macro}{\@@_apply_label_pair:nnn,\@@_label_if_exist_apply:nnnF}
+%
+% This is the payload of steps T2 and T3 executed in the loop described
+% above. This macro assumes |#1| and |#2| are ordered, which means that
+% any rule pertaining the pair |#1| and |#2| is
+% \cs{g_@@_\meta{hook}_rule_\#1\string|\#2_tl}, and not
+% \cs{g_@@_\meta{hook}_rule_\#2\string|\#1_tl}. This also saves a great deal
+% of time since we only need to check the order of the labels once.
+%
+% The arguments here are \meta{label1}, \meta{label2}, \meta{hook}, and
+% \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=??=
+% denoting a default hook rule.
+%
+% \cs{@@_label_if_exist_apply:nnnF} will check if the rule exists for
+% the given hook, and if so call \cs{@@_apply_rule:nnn}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_apply_label_pair:nnn #1#2#3
+ {
+% \end{macrocode}
+% Extra complication: as we use default rules and local hook specific
+% rules we first have to check if there is a local rule and if that
+% exist use it. Otherwise check if there is a default rule and use
+% that.
+% \begin{macrocode}
+ \@@_label_if_exist_apply:nnnF {#1} {#2} {#3}
+ {
+% \end{macrocode}
+% If there is no hook-specific rule we check for a default one and
+% use that if it exists.
+% \begin{macrocode}
+ \@@_label_if_exist_apply:nnnF {#1} {#2} { ?? } { }
+ }
+ }
+\cs_new_protected:Npn \@@_label_if_exist_apply:nnnF #1#2#3
+ {
+ \if_cs_exist:w g_@@_ #3 _rule_ #1 | #2 _tl \cs_end:
+% \end{macrocode}
+% What to do precisely depends on the type of rule we have
+% encountered. If it is a \texttt{before} rule it will be handled by the
+% algorithm but other types need to be managed differently. All
+% this is done in \cs{@@_apply_rule:nnnN}.
+% \begin{macrocode}
+ \@@_apply_rule:nnn {#1} {#2} {#3}
+ \exp_after:wN \use_none:n
+ \else:
+ \use:nn
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\@@_apply_rule:nnn}
+% This is the code executed in steps T2 and T3 while looping through
+% the matrix This is part of step T3. We are about to apply the next
+% rule and enter it into the data structure. The arguments are
+% \meta{label1}, \meta{label2}, \meta{hook-name}, and \meta{hook-code-plist}.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_apply_rule:nnn #1#2#3
+ {
+ \cs:w @@_apply_
+ \cs:w g_@@_#3_reversed_tl \cs_end: rule_
+ \cs:w g_@@_ #3 _rule_ #1 | #2 _tl \cs_end: :nnn \cs_end:
+ {#1} {#2} {#3}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_<:nnn,\@@_apply_rule_>:nnn}
+% The most common cases are \texttt{\string<} and \texttt{\string>} so we handle
+% that first. They are relations $\prec$ and $\succ$ in TAOCP, and
+% they dictate sorting.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_<:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \tl_set:cx { \@@_tl_csname:n {#2} }
+ { \int_eval:n{ \cs:w \@@_tl_csname:n {#2} \cs_end: + 1 } }
+ \seq_put_right:cn{ \@@_seq_csname:n {#1} }{#2}
+ }
+\cs_new_protected:cpn { @@_apply_rule_>:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \tl_set:cx { \@@_tl_csname:n {#1} }
+ { \int_eval:n{ \cs:w \@@_tl_csname:n {#1} \cs_end: + 1 } }
+ \seq_put_right:cn{ \@@_seq_csname:n {#2} }{#1}
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_xE:nnn,\@@_apply_rule_xW:nnn}
+% These relations make two labels incompatible within a hook.
+% |xE| makes raises an error if the labels are found in the same
+% hook, and |xW| makes it a warning.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_xE:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \msg_error:nnnnnn { hooks } { labels-incompatible }
+ {#1} {#2} {#3} { 1 }
+ \use:c { @@_apply_rule_->:nnn } {#1} {#2} {#3}
+ \use:c { @@_apply_rule_<-:nnn } {#1} {#2} {#3}
+ }
+\cs_new_protected:cpn { @@_apply_rule_xW:nnn } #1#2#3
+ {
+ \@@_debug:n { \@@_msg_pair_found:nnn {#1} {#2} {#3} }
+ \msg_warning:nnnnnn { hooks } { labels-incompatible }
+ {#1} {#2} {#3} { 0 }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_apply_rule_->:nnn,\@@_apply_rule_<-:nnn}
+% If we see \texttt{\detokenize{->}} we have to drop code for label
+% \verb=#3= and carry on. We could do a little better and trop
+% everything for that label since it doesn't matter where we sort
+% in the empty code. However that would complicate the algorithm a
+% lot with little gain. So we still unnecessarily try to sort it in
+% and depending on the rules that might result in a loop that is
+% otherwise resolved. If that turns 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
+% hook doesn't store any code. Removing from \cs{l_@@_cur_hook_tl}
+% makes default rules \verb=->= and \verb=<-= work properly.
+% \begin{macrocode}
+\cs_new_protected:cpn { @@_apply_rule_->:nnn } #1#2#3
+ {
+ \@@_debug:n
+ {
+ \@@_msg_pair_found:nnn {#1} {#2} {#3}
+ \iow_term:x{--->~ Drop~ '#2'~ code~ from~
+ \iow_char:N \\ g_@@_ \l_@@_cur_hook_tl _code_prop ~ because~ of~ '#1' }
+ }
+ \prop_gput:cnn { g_@@_ \l_@@_cur_hook_tl _code_prop } {#2} { }
+ }
+\cs_new_protected:cpn { @@_apply_rule_<-:nnn } #1#2#3
+ {
+ \@@_debug:n
+ {
+ \@@_msg_pair_found:nnn {#1} {#2} {#3}
+ \iow_term:x{--->~ Drop~ '#1'~ code~ from~
+ \iow_char:N \\ g_@@_ \l_@@_cur_hook_tl _code_prop ~ because~ of~ '#2' }
+ }
+ \prop_gput:cnn { g_@@_ \l_@@_cur_hook_tl _code_prop } {#1} { }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{
+% \@@_apply_-rule_<:nnn,
+% \@@_apply_-rule_>:nnn,
+% \@@_apply_-rule_<-:nnn,
+% \@@_apply_-rule_->:nnn,
+% \@@_apply_-rule_x: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_xE:nnn } { @@_apply_rule_xE:nnn }
+\cs_new_eq:cc { @@_apply_-rule_xW:nnn } { @@_apply_rule_xW:nnn }
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_msg_pair_found:nnn}
+% A macro to avoid moving this many tokens around.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_msg_pair_found:nnn #1#2#3
+ {
+ \iow_term:x{~ \str_if_eq:nnTF {#3} {??} {default} {~normal} ~
+ rule~ \@@_label_pair:nn {#1} {#2}:~
+ \use:c { g_@@_#3_rule_ \@@_label_pair:nn {#1} {#2} _tl } ~ found}
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_debug_label_data:N}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_debug_label_data:N #1 {
+ \iow_term:x{Code~ labels~ for~ sorting:}
+ \iow_term:x{~ \seq_use:Nnnn\l_@@_labels_seq {~and~}{,~}{~and~} } % fix name!
+ \iow_term:x{^^J Data~ structure~ for~ label~ rules:}
+ \prop_map_inline:Nn #1
+ {
+ \iow_term:x{~ ##1~ =~ \tl_use:c{ \@@_tl_csname:n {##1} }~ ->~
+ \seq_use:cnnn{ \@@_seq_csname:n {##1} }{~->~}{~->~}{~->~}
+ }
+ }
+ \iow_term:x{}
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\hook_log:n}
+% This writes out information about the hook given in its argument
+% onto the terminal and the \texttt{.log} file.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_log:n #1
+ {
+ \exp_args:Nx \@@_log:n
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ }
+\cs_new_protected:Npn \@@_log:n #1
+ {
+ \iow_term:x{^^JThe~ hook~ '#1':}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hook_if_exist:nF {#1}
+ { \iow_term:x {~Hook~ is~ not~ declared!} }
+ \@@_if_exist:nTF {#1}
+ {
+ \iow_term:x{~Code~ chunks:}
+ \prop_if_empty:cTF {g_@@_#1_code_prop}
+ { \iow_term:x{\@spaces ---} }
+ {
+ \prop_map_inline:cn {g_@@_#1_code_prop}
+ { \iow_term:x{\@spaces ##1~ ->~ \tl_to_str:n{##2} } }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \iow_term:x{~Extra~ code~ next~ invocation:}
+ \iow_term:x{\@spaces
+ \tl_if_empty:cTF { g_@@_#1_next_code_tl }
+ {---} {->~ \str_use:c{g_@@_#1_next_code_tl} } }
+% \end{macrocode}
+%
+% \fmi{This is currently only displaying the local rules, but it
+% should also show the matching global rules!}
+%
+% \begin{macrocode}
+ \iow_term:x{~Rules:}
+ \prop_if_empty:cTF {g_@@_#1_rules_prop}
+ { \iow_term:x{\@spaces ---} }
+ { \prop_map_inline:cn {g_@@_#1_rules_prop}
+ { \iow_term:x{\@spaces ##1~ with~ relation~ ##2} }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \hook_if_exist:nT {#1}
+ { \iow_term:x { ~Execution~ order
+ \prop_if_empty:cTF {g_@@_#1_rules_prop}
+ { \@@_if_reversed:nT {#1}
+ { ~ (after~ reversal) }
+ }
+ { ~ (after~
+ \@@_if_reversed:nT {#1} {reversal~ and~}
+ applying~ rules)
+ }
+ :
+ }
+ \iow_term:x { \@spaces
+ \clist_if_empty:cTF{g_@@_#1_labels_clist}
+ {not~ set~ yet}
+ { \clist_use:cnnn {g_@@_#1_labels_clist}
+ { ,~ } { ,~ } { ,~ } }
+ }
+ }
+ }
+ { \iow_term:n { ~The~hook~is~empty. } }
+ \iow_term:n { }
+ }
+% \end{macrocode}
+%
+% \end{macro}
+
+
+
+% \subsection{Specifying code for next invocation}
+%
+%
+%
+%
+%
+% \begin{macro}{\hook_gput_next_code:nn}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_gput_next_code:nn #1
+ {
+ \exp_args:Nx \@@_gput_next_code:nn
+ { \@@_parse_label_default:nn {#1} { top-level } }
+ }
+\cs_new_protected:Npn \@@_gput_next_code:nn #1 #2
+ {
+ \@@_declare:n {#1}
+ \hook_if_exist:nTF {#1}
+ { \@@_gput_next_do:nn {#1} {#2} }
+ { \@@_try_declaring_generic_next_hook:nn {#1} {#2} }
+ }
+\cs_new_protected:Npn \@@_gput_next_do:nn #1 #2
+ {
+ \tl_gput_right:cn { g_@@_#1_next_code_tl }
+ { #2 \tl_gclear:c { g_@@_#1_next_code_tl } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Using the hook}
+%
+% \begin{macro}{\hook_use:n}
+% \begin{macro}[EXP]{\@@_use_initialized:n}
+% \begin{macro}{\@@_preamble_hook:n}
+% \cs{hook_use:n} as defined here is used in the preamble, where
+% hooks aren't initialized by default. \cs{@@_use_initialized:n} is
+% also defined, which is the non-\tn{protected} version for use within
+% the document. Their definition is identical, except for the
+% \cs{@@_preamble_hook:n} (which wouldn't hurt in the expandable
+% version, but it would be an unnecessary extra expansion).
+%
+% \cs{@@_use_initialized:n} holds the expandable definition while in
+% the preamble. \cs{@@_preamble_hook:n} initializes the hook in the
+% preamble, and is redefined to \cs{use_none:n} at |\begin{document}|.
+%
+% Both versions do the same internally: check if the hook exist as
+% given, and if so use it as quickly as possible. If it doesn't
+% exist, the a call to \cs{@@_use:wn} checks for file hooks.
+%
+% At |\begin{document}|, all hooks are initialized, and any change in
+% them causes an update, so \cs{hook_use:n} can be made expandable.
+% This one is better not protected so that it can expand into nothing
+% if containing no code. Also important in case of generic hooks that
+% we do not generate a \cs{relax} as a side effect of checking for a
+% csname. In contrast to the \TeX{} low-level
+% \verb=\csname ...\endcsname= construct \cs{tl_if_exist:c} is
+% careful to avoid this.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_use:n #1
+ {
+ \tl_if_exist:cTF { g_@@_#1_code_tl }
+ {
+ \@@_preamble_hook:n {#1}
+ \cs:w g_@@_#1_code_tl \cs_end:
+ }
+ { \@@_use:wn #1 / \s_@@_mark {#1} }
+ }
+\cs_new:Npn \@@_use_initialized:n #1
+ {
+ \tl_if_exist:cTF { g_@@_#1_code_tl }
+ { \cs:w g_@@_#1_code_tl \cs_end: }
+ { \@@_use:wn #1 / \s_@@_mark {#1} }
+ }
+\cs_new_protected:Npn \@@_preamble_hook:n #1
+ { \@@_initialize_hook_code:n {#1} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}[EXP]{\@@_use:wn}
+% \begin{macro}{\@@_try_file_hook:n,\@@_if_exist_use:n}
+% \cs{@@_use:wn} does a quick check to test if the current hook is a
+% file hook: those need a special treatment. If it is not, the hook
+% does not exist. If it is, then \cs{@@_try_file_hook:n} is called,
+% and checks that the current hook is a file-specific hook using
+% \cs{@@_if_file_hook:wTF}. If it's not, then it's a generic |file/|
+% hook and is used if it exist.
+%
+% If it is a file-specific hook, it passes through the same
+% normalization as during declaration, and then it is used if defined.
+% \cs{@@_if_exist_use:n} checks if the hook exist, and calls
+% \cs{@@_preamble_hook:n} if so, then uses the hook.
+% \begin{macrocode}
+\cs_new:Npn \@@_use:wn #1 / #2 \s_@@_mark #3
+ {
+ \str_if_eq:nnTF {#1} { file }
+ { \@@_try_file_hook:n {#3} }
+ { } % Hook doesn't exist
+ }
+\cs_new_protected:Npn \@@_try_file_hook:n #1
+ {
+ \@@_if_file_hook:wTF #1 / / \s_@@_mark
+ {
+ \exp_args:Ne \@@_if_exist_use:n
+ { \exp_args:Ne \@@_file_hook_normalise:n {#1} }
+ }
+ { \@@_if_exist_use:n {#1} } % file/ generic hook (e.g. file/before)
+ }
+\cs_new_protected:Npn \@@_if_exist_use:n #1
+ {
+ \tl_if_exist:cT { g_@@_#1_code_tl }
+ {
+ \@@_preamble_hook:n {#1}
+ \cs:w g_@@_#1_code_tl \cs_end:
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hook_use_once:n}
+% For hooks that can and should be used only once we have a special
+% use command that remembers the hook name in
+% \cs{g_@@_execute_immediately_clist}. This has the effect that any
+% further code added to the hook is executed immediately rather
+% than stored in the hook.
+% \begin{macrocode}
+\cs_new_protected:Npn \hook_use_once:n #1
+ {
+ \tl_if_exist:cT { g_@@_#1_code_tl }
+ {
+ \clist_gput_left:Nn \g_@@_execute_immediately_clist {#1}
+ \hook_use:n {#1}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Querying a hook}
+%
+% Simpler data types, like token lists, have three possible states; they
+% can exist and be empty, exist and be non-empty, and they may not
+% exist, in which case emptiness doesn't apply (though
+% \cs{tl_if_empty:N} returns false in this case).
+%
+% Hooks are a bit more complicated: they have four possible states.
+% A hook may exist or not, and either way it may or may not be empty
+% (even a hook that doesn't exist may be non-empty).
+%
+% A hook is said to be empty when no code was added to it, either to
+% its permanent code pool, or to its ``next'' token list. The hook
+% doesn't need to be declared to have code added to its code pool
+% (it may happen that a package $A$ defines a hook \hook{foo}, but
+% it's loaded after package $B$, which adds some code to that hook.
+% In this case it is important that the code added by package $B$ is
+% remembered until package $A$ is loaded).
+%
+% A hook is said to exist when it was declared with \cs{hook_new:n} or
+% some variant thereof.
+%
+% \begin{macro}[pTF]{\hook_if_empty:n}
+% Test if a hook is empty (that is, no code was added to that hook).
+% A hook being empty means that \emph{both} its
+% \cs[no-index]{g_@@_\meta{hook}_code_prop} and its
+% \cs[no-index]{g_@@_\meta{hook}_next_code_tl} are empty.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \hook_if_empty:n #1 { p , T , F , TF }
+ {
+ \@@_if_exist:nTF {#1}
+ {
+ \bool_lazy_and:nnTF
+ { \prop_if_empty_p:c { g_@@_#1_code_prop } }
+ { \tl_if_empty_p:c { g_@@_#1_next_code_tl } }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[pTF]{\hook_if_exist:n}
+% A canonical way to test if a hook exists. A hook exists if the
+% token list that stores the sorted code for that hook,
+% \cs[no-index]{g_@@_\meta{hook}_code_tl}, exists. The property list
+% \cs[no-index]{g_@@_\meta{hook}_code_prop} cannot be used here
+% because often it is necessary to add code to a hook without knowing
+% if such hook was already declared, or even if it will ever be
+% (for example, in case the package that defines it isn't loaded).
+% \begin{macrocode}
+\prg_new_conditional:Npnn \hook_if_exist:n #1 { p , T , F , TF }
+ {
+ \tl_if_exist:cTF { g_@@_#1_code_tl }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}[pTF]{\@@_if_exist:n}
+% An internal check if the hook has already been declared with
+% \cs{@@_declare:n}. This means that the hook was already used somehow
+% (a code chunk or rule was added to it), but it still wasn't declared
+% with \cs{hook_new:n}.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_exist:n #1 { p , T , F , TF }
+ {
+ \prop_if_exist:cTF { g_@@_#1_code_prop }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[pTF]{\@@_if_reversed:n}
+% An internal conditional that checks if a hook is reversed.
+% \begin{macrocode}
+\prg_new_conditional:Npnn \@@_if_reversed:n #1 { p , T , F , TF }
+ {
+ \if_int_compare:w \cs:w g_@@_#1_reversed_tl \cs_end: 1 < 0 \exp_stop_f:
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\g_@@_execute_immediately_clist}
+% List of hooks that from no on should not longer receive code.
+% \begin{macrocode}
+\clist_new:N \g_@@_execute_immediately_clist
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\msg_new:nnnn { hooks } { labels-incompatible }
+ {
+ Labels~`#1'~and~`#2'~are~incompatible
+ \str_if_eq:nnF {#3} {??} { ~in~hook~`#3' } .~
+ \int_compare:nNnT {#4} = { 1 }
+ { The~code~for~both~labels~will~be~dropped. }
+ }
+ {
+ LaTeX~found~two~incompatible~labels~in~the~same~hook.~
+ This~indicates~an~incompatibility~between~packages.
+ }
+\msg_new:nnn { hooks } { empty-label }
+ { Empty~code~label~\msg_line_context:.~Using~`#1'~instead. }
+% \end{macrocode}
+%
+% \subsection{\LaTeXe{} package interface commands}
+%
+
+
+% \begin{macro}{\NewHook,\NewReversedHook,\NewMirroredHookPair}
+% Declaring new hooks \ldots
+% \begin{macrocode}
+\NewDocumentCommand \NewHook { m }{ \hook_new:n {#1} }
+\NewDocumentCommand \NewReversedHook { m }{ \hook_new_reversed:n {#1} }
+\NewDocumentCommand \NewMirroredHookPair { mm }{ \hook_new_pair:nn {#1}{#2} }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\AddToHook}
+%
+% \begin{macrocode}
+\NewDocumentCommand \AddToHook { m o +m }
+ {
+ \clist_if_in:NnTF \g_@@_execute_immediately_clist {#1}
+ {#3}
+ { \hook_gput_code:nnn {#1} {#2} {#3} }
+ }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\AddToHookNext}
+%
+% \begin{macrocode}
+\NewDocumentCommand \AddToHookNext { m +m }
+ { \hook_gput_next_code:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\RemoveFromHook}
+%
+% \begin{macrocode}
+\NewDocumentCommand \RemoveFromHook { m o }
+ { \hook_gremove_code:nn {#1} {#2} }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareDefaultHookLabel}
+% \begin{macro}{\@@_curr_name_push:n,\@@_curr_name_pop:}
+% The token list \cs{g_@@_hook_curr_name_tl} stores the name of the
+% current package/file to be used as label for hooks.
+% Providing a consistent interface is tricky, because packages can
+% be loaded within packages, and some packages may not use
+% \cs{DeclareDefaultHookLabel} to change the default label (in which case
+% \cs{@currname} is used, if set).
+%
+% To pull that off, we keep a stack that contains the default label
+% for each level of input. The bottom of the stack contains the
+% default label for the top-level. Since the string \verb|top-level|
+% is hardcoded, here this item of the stack is empty. Also, since
+% we're in an input level, add \verb|lthooks| to the stack as well.
+% This stack should never go empty, so we loop through \LaTeXe's
+% file name stack, and add empty entries to \cs{g_@@_name_stack_seq}
+% for each item in that stack. The last item is the \verb|top-level|,
+% which also gets an empty entry.
+%
+% Also check for the case we're loading \texttt{lthooks} in the
+% \LaTeXe{} kernel. In that case, \cs{@currname} isn't \verb|lthooks|
+% and just the top-level is added to the stack as an empty entry.
+% \begin{macrocode}
+\str_if_eq:VnTF \@currname { lthooks }
+ {
+ \seq_gpush:Nn \g_@@_name_stack_seq { lthooks }
+ \cs_set_protected:Npn \@@_tmp:w #1 #2 #3
+ {
+ \quark_if_recursion_tail_stop:n {#1}
+ \seq_gput_right:Nn \g_@@_name_stack_seq { }
+ \@@_tmp:w
+ }
+ \exp_after:wN \@@_tmp:w
+ \@currnamestack
+ \q_recursion_tail \q_recursion_tail
+ \q_recursion_tail \q_recursion_stop
+ }
+ { \seq_gpush:Nn \g_@@_name_stack_seq { } }
+% \end{macrocode}
+%
+% Two commands keep track of the stack: when a file is input,
+% \cs{@@_curr_name_push:n} pushes an (empty by default) label to the
+% stack:
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_curr_name_push:n #1
+ {
+ \seq_gpush:Nn \g_@@_name_stack_seq {#1}
+ \tl_gset:Nn \g_@@_hook_curr_name_tl {#1}
+ }
+%
+% \end{macrocode}
+% and when an input is over, the topmost item of the stack is popped,
+% since the label will not be used again, and \cs{g_@@_hook_curr_name_tl}
+% is updated to the now topmost item of the stack:
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_curr_name_pop:
+ {
+ \seq_gpop:NN \g_@@_name_stack_seq \l_@@_return_tl
+ \seq_get:NNTF \g_@@_name_stack_seq \l_@@_return_tl
+ { \tl_gset_eq:NN \g_@@_hook_curr_name_tl \l_@@_return_tl }
+ { \ERROR_should_not_happen }
+ }
+% \end{macrocode}
+%
+% The token list \cs{g_@@_hook_curr_name_tl} is but a mirror of the top
+% of the stack.
+%
+% Now define a wrapper that replaces the top of the stack with the
+% argument, and updates \cs{g_@@_hook_curr_name_tl} accordingly.
+% \begin{macrocode}
+\NewDocumentCommand \DeclareDefaultHookLabel { m }
+ {
+ \seq_gpop:NN \g_@@_name_stack_seq \l_@@_return_tl
+ \@@_curr_name_push:n {#1}
+ }
+% \begin{macrocode}
+%
+% The push and pop macros are injected in \cs{@pushfilename} and
+% \cs{@popfilename} so that they correctly keep track of the label.s
+% \begin{macrocode}
+% TODO! \pho{Properly integrate in the kernel}
+\tl_gput_left:Nn \@pushfilename { \@@_curr_name_push:n { } }
+\tl_gput_left:Nn \@popfilename { \@@_curr_name_pop: }
+% TODO! \pho{Properly integrate in the kernel}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \begin{macro}{\UseHook}
+% Avoid the overhead of \pkg{xparse} and its protection that we
+% don't want here (since the hook should vanish without trace if empty)!
+% \begin{macrocode}
+\newcommand \UseHook { \hook_use:n }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\UseOneTimeHook}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \UseOneTimeHook { \hook_use_once:n }
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\ShowHook}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \ShowHook { \hook_log:n }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\DebugHookOn,\DebugHookOff}
+%
+% \begin{macrocode}
+\cs_new_protected:Npn \DebugHookOn { \hook_debug_on: }
+\cs_new_protected:Npn \DebugHookOff { \hook_debug_off: }
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\DeclareHookRule}
+%
+% \begin{macrocode}
+\NewDocumentCommand \DeclareHookRule { m m m m }
+{ \hook_gset_rule:nnnn {#1}{#2}{#3}{#4} }
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\DeclareDefaultHookRule}
+% This declaration is only supported before \verb=\begin{document}=.
+% \begin{macrocode}
+\NewDocumentCommand \DeclareDefaultHookRule { m m m }
+ { \hook_gset_rule:nnnn {??}{#1}{#2}{#3} }
+\@onlypreamble\DeclareDefaultHookRule
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ClearHookRule}
+% A special setup rule that removes an existing relation.
+% Basically {@@_rule_gclear:nnn} plus fixing the property list for debugging.
+% \fmi{Need an L3 interface, or maybe it should get dropped}
+% \begin{macrocode}
+\NewDocumentCommand \ClearHookRule { m m m }
+{ \hook_gset_rule:nnnn {#1}{#2}{unrelated}{#3} }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\IfHookExistTF,\IfHookEmptyTF}
+% \begin{macrocode}
+\NewExpandableDocumentCommand \IfHookExistTF { m }
+ { \hook_if_exist:nTF {#1} }
+\NewExpandableDocumentCommand \IfHookEmptyTF { m }
+ { \hook_if_empty:nTF {#1} }
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\AtBeginDocument}
+%
+% \begin{macrocode}
+\renewcommand\AtBeginDocument{\AddToHook{begindocument}}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\AtEndDocument}
+%
+% \begin{macrocode}
+\renewcommand\AtEndDocument {\AddToHook{enddocument}}
+%\renewcommand\AtEndDocument {\AddToHook{env/document/end}} % alternative impl
+% \end{macrocode}
+%
+% \end{macro}
+
+
+
+% \subsection{Set up existing \LaTeXe{} hooks}
+%
+% As we are in a package calling \cs{NewHook} would label any
+% already set up hook code under the package name, but we want it
+% under the name \hook{top-level} so we pretend that \cs{@currname}
+% is empty.
+% \begin{macrocode}
+\begingroup
+ \def\@currname{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \NewHook{begindocument}
+ \NewHook{enddocument}
+% \end{macrocode}
+% We need to initialize the mechanism at \verb=\begin{document}=
+% but obviously before everything else, so we sneak\footnote{This
+% needs to move to \cs{document} directly.}
+% \cs{@@_initialize_all:} into the \LaTeXe{} hook name.
+%
+% We can't use \cs{tl_gput_left:Nn} because that complains about
+% \cs{@begindocumenthook} not starting with \cs{g_} so we do this
+% through the backdoor.
+% \begin{macrocode}
+% \tex_global:D\tl_put_left:Nn \@begindocumenthook
+% {\@@_initialize_all:}
+% \end{macrocode}
+% There aren't many other hooks at the moment:
+% \begin{macrocode}
+ \NewHook{rmfamily}
+ \NewHook{sffamily}
+ \NewHook{ttfamily}
+ \NewHook{defaultfamily}
+% \end{macrocode}
+% Not checked what this one does and whether it should be there (or
+% is a real ``hook''.
+% \begin{macrocode}
+ \NewHook{documentclass}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\endgroup
+% \end{macrocode}
+%
+%
+%
+% \section{Generic hooks for environments}
+%
+%
+% \begin{macrocode}
+\let\begin\relax % avoid redeclaration message
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\begin[1]{%
+ \UseHook{env/#1/before}%
+ \@ifundefined{#1}%
+ {\def\reserved@a{\@latex@error{Environment~#1~undefined}\@eha}}%
+ {\def\reserved@a{\def\@currenvir{#1}%
+ \edef\@currenvline{\on@line}%
+ \@execute@begin@hook{#1}%
+ \csname #1\endcsname}}%
+ \@ignorefalse
+ \begingroup\@endpefalse\reserved@a}
+% \end{macrocode}
+%
+% Before the \cs{document} code is executed we have to first undo
+% the \cs{endgroup} as there should be none for this environment to
+% avoid that changes on top-level unnecessarily go to \TeX's
+% savestack, and we have to initialize all hooks in the hook system.
+% So we need to test for this environment name. But once it has be
+% found all this testing is no longer needed and so we redefine
+% \cs{@execute@begin@hook} to simply use the hook
+% \begin{macrocode}
+\def\@execute@begin@hook #1{%
+ \expandafter\ifx\csname #1\endcsname\document
+ \endgroup
+ \gdef\@execute@begin@hook##1{\UseHook{env/##1/begin}}%
+ \@@_initialize_all:
+ \@execute@begin@hook{#1}%
+% \end{macrocode}
+% If this is an environment before \verb=\begin{document}= we just
+% run the hook.
+% \begin{macrocode}
+ \else
+ \UseHook{env/#1/begin}%
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@namedef{end~}#1{%
+ \UseHook{env/#1/end}%
+ \csname end#1\endcsname\@checkend{#1}%
+ \expandafter\endgroup\if@endpe\@doendpe\fi
+ \UseHook{env/#1/after}%
+ \if@ignore\@ignorefalse\ignorespaces\fi}%
+% \end{macrocode}
+% Version that fixes tlb3722 but the change should perhaps be made in
+% \pkg{tabularx} instead.
+% \begin{macrocode}
+\@namedef{end~}#1{%
+\romannumeral
+\IfHookEmptyTF{env/#1/end}%
+ {\expandafter\z@}%
+ {\z@\UseHook{env/#1/end}}%
+\csname end#1\endcsname\@checkend{#1}%
+\expandafter\endgroup\if@endpe\@doendpe\fi
+\UseHook{env/#1/after}%
+\if@ignore\@ignorefalse\ignorespaces\fi}%
+% \end{macrocode}
+%
+%
+%
+% We provide 4 high-level hook interfaces directly, the others only when
+% etoolbox is loaded
+% \begin{macrocode}
+\newcommand\AtBeginEnvironment[1] {\AddToHook{env/#1/begin}}
+\newcommand\AtEndEnvironment[1] {\AddToHook{env/#1/end}}
+\newcommand\BeforeBeginEnvironment[1]{\AddToHook{env/#1/before}}
+\newcommand\AfterEndEnvironment[1] {\AddToHook{env/#1/after}}
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Generic hooks for file loads}
+%
+%
+%
+%
+%
+%
+%
+% \section{Hooks in \cs{begin} document}
+%
+% Can't have \texttt{@{}@} notation here as this is \LaTeXe{} code
+% \ldots{} and makes for puzzling errors if the double \texttt{@}
+% signs get substituted.
+% \begin{macrocode}
+%<@@=>
+\ExplSyntaxOff
+% \end{macrocode}
+%
+% The \hook{begindocument} hook was already set up earlier, here is now
+% the additional one (which was originally from the \pkg{etoolbox}
+% package under the name \texttt{afterpreamble}.
+% \begin{macrocode}
+\NewHook{begindocument/end}
+% \end{macrocode}
+%
+%
+
+% \begin{macro}{\document}
+%
+% \begin{macrocode}
+\def\document{%
+% \end{macrocode}
+% We do cancel the grouping as part of the \cs{begin} handling
+% (this is now done inside \cs{begin} instead) so that the
+% \hook{env/\meta{env}/begin} hook is not hidden inside \cs{begingroup}
+% \texttt{...} \cs{endgroup}.
+% \begin{macrocode}
+% \endgroup
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@kernel@after@env@document@begin
+% \end{macrocode}
+%
+% Added hook to load \textsf{l3backend} code:
+% \begin{macrocode}
+ \@expl@sys@load@backend@@
+ \ifx\@unusedoptionlist\@empty\else
+ \@latex@warning@no@line{Unused global option(s):^^J%
+ \@spaces[\@unusedoptionlist]}%
+ \fi
+ \@colht\textheight
+ \@colroom\textheight \vsize\textheight
+ \columnwidth\textwidth
+ \@clubpenalty\clubpenalty
+ \if@twocolumn
+ \advance\columnwidth -\columnsep
+ \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue
+ \fi
+ \hsize\columnwidth \linewidth\hsize
+ \begingroup\@floatplacement\@dblfloatplacement
+ \makeatletter\let\@writefile\@gobbletwo
+ \global \let \@multiplelabels \relax
+ \@input{\jobname.aux}%
+ \endgroup
+ \if@filesw
+ \immediate\openout\@mainaux\jobname.aux
+ \immediate\write\@mainaux{\relax}%
+ \fi
+ \process@table
+ \let\glb@currsize\@empty % Force math initialization.
+ \normalsize
+ \everypar{}%
+ \ifx\normalsfcodes\@empty
+ \ifnum\sfcode`\.=\@m
+ \let\normalsfcodes\frenchspacing
+ \else
+ \let\normalsfcodes\nonfrenchspacing
+ \fi
+ \fi
+ \ifx\document@default@language\m@ne
+ \chardef\document@default@language\language
+ \fi
+ \@noskipsecfalse
+ \let \@refundefined \relax
+% \end{macrocode}
+%
+% \begin{macrocode}
+% \let\AtBeginDocument\@firstofone
+% \@begindocumenthook
+ \UseOneTimeHook{begindocument}%
+ \@kernel@after@begindocument
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifdim\topskip<1sp\global\topskip 1sp\relax\fi
+ \global\@maxdepth\maxdepth
+ \global\let\@begindocumenthook\@undefined
+ \ifx\@listfiles\@undefined
+ \global\let\@filelist\relax
+ \global\let\@addtofilelist\@gobble
+ \fi
+ \gdef\do##1{\global\let ##1\@notprerr}%
+ \@preamblecmds
+ \global\let \@nodocument \relax
+ \global\let\do\noexpand
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \UseOneTimeHook{begindocument/end}%
+ \ignorespaces}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\@kernel@after@begindocument\@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@kernel@after@env@document@begin,\@kernel@hook@begindocument}
+%
+% \begin{macrocode}
+\edef \@kernel@after@env@document@begin{%
+ \let\expandafter\noexpand\csname
+ g__hook_env/document/begin_code_tl\endcsname
+ \noexpand\@empty}
+% \end{macrocode}
+% \begin{macrocode}
+\let\@kernel@hook@begindocument\@empty
+% \end{macrocode}
+%
+% \end{macro}
+%
+%
+% \section{Hooks in \cs{enddocument}}
+%
+%
+%
+% The \hook{enddocument} hook was already set up earlier, here are now
+% the additional ones:
+% \begin{macrocode}
+\NewHook{enddocument/afterlastpage}
+\NewHook{enddocument/afteraux}
+\NewHook{enddocument/info}
+\NewHook{enddocument/end}
+% \end{macrocode}
+
+
+
+% \begin{macro}{\enddocument}
+%
+%
+% \begin{macrocode}
+\def\enddocument{%
+ \UseHook{enddocument}%
+ \@kernel@after@enddocument
+ \@checkend{document}%
+ \clearpage
+ \UseHook{enddocument/afterlastpage}%
+ \@kernel@after@enddocument@afterlastpage
+ \begingroup
+ \if@filesw
+ \immediate\closeout\@mainaux
+ \let\@setckpt\@gobbletwo
+ \let\@newl@bel\@testdef
+ \@tempswafalse
+ \makeatletter \@@input\jobname.aux
+ \fi
+ \UseHook{enddocument/afteraux}%
+% \end{macrocode}
+% Next hook is expect to contain only code for writing info
+% messages on the terminal.
+% \begin{macrocode}
+ \UseHook{enddocument/info}%
+ \endgroup
+ \UseHook{enddocument/end}%
+ \deadcycles\z@\@@end}
+% \end{macrocode}
+% The two kernel hooks above are used by the shipout code.
+% \begin{macrocode}
+\let\@kernel@after@enddocument\@empty
+\let\@kernel@after@enddocument@afterlastpage\@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@enddocument@kernel@warnings}
+%
+% \begin{macrocode}
+\def\@enddocument@kernel@warnings{%
+ \ifdim \font@submax >\fontsubfuzz\relax
+ \@font@warning{Size substitutions with differences\MessageBreak
+ up to \font@submax\space have occurred.\@gobbletwo}%
+ \fi
+ \@defaultsubs
+ \@refundefined
+ \if@filesw
+ \ifx \@multiplelabels \relax
+ \if@tempswa
+ \@latex@warning@no@line{Label(s) may have changed.
+ Rerun to get cross-references right}%
+ \fi
+ \else
+ \@multiplelabels
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\AddToHook{enddocument/info}[kernel/filelist]{\@dofilelist}
+\AddToHook{enddocument/info}[kernel/warnings]{\@enddocument@kernel@warnings}
+\DeclareHookRule{enddocument/info}{kernel/filelist}{before}{kernel/warnings}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Adjusting at \pkg{atveryend} interfaces}
+%
+% With the new hook management all of \pkg{atveryend} is taken care
+% of.
+%
+% We therefore prevent the package from loading:
+% \begin{macrocode}
+\expandafter\let\csname ver@atveryend.sty\endcsname\fmtversion
+% \end{macrocode}
+%
+%
+% Here are new definitions for its interfaces now pointing to the
+% hooks in \cs{enddocument}
+% \begin{macrocode}
+\newcommand\AfterLastShipout {\AddToHook{enddocument/afterlastpage}}
+\newcommand\AtVeryEndDocument {\AddToHook{enddocument/afteraux}}
+% \end{macrocode}
+% Next one is a bit of a fake, but the result should normally be as
+% expected. If not one needs to add a rule to sort the code chunks
+% in \hook{enddocument/info}.
+% \begin{macrocode}
+\newcommand\AtEndAfterFileList{\AddToHook{enddocument/info}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\AtVeryVeryEnd {\AddToHook{enddocument/end}}
+% \end{macrocode}
+
+% \begin{macro}{\BeforeClearDocument}
+% This one is the only one we don't implement or rather don't have
+% a dedicated hook in the code.
+% \begin{macrocode}
+\ExplSyntaxOn
+\newcommand\BeforeClearDocument[1]
+ { \AtEndDocument{#1}
+ \@DEPRECATED{BeforeClearDocument \tl_to_str:n{#1}}
+ }
+\cs_new:Npn\@DEPRECATED #1
+ {\iow_term:x{======~DEPRECATED~USAGE~#1~==========}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+
+%
+% \section{A package version of the code for testing}
+%
+
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+
+
+
+% \begin{macrocode}
+\RequirePackage{xparse}
+\ProvidesExplPackage{lthooks}{\lthooksdate}{\lthooksversion}
+ {Hook management interface for LaTeX2e}
+% \end{macrocode}
+%
+%
+% \subsection{Core hook management code (kernel part)}
+%
+% This should run in older formats so we can't use
+% \cs{IfFormatAtLeastTF} right now.
+% \begin{macrocode}
+\@ifl@t@r\fmtversion{2020/10/01}
+ {}
+ {\input{lthooks.ltx}
+ \input{ltshipout.ltx}
+ \input{ltfilehook.ltx}
+ }
+% \end{macrocode}
+%
+% \subsection{Package options}
+%
+% For now we offer a simple debug option which turns on a lot of
+% strange \cs{typeout} messages, nothing fancy.
+% \begin{macrocode}
+\ExplSyntaxOn
+% \end{macrocode}
+%
+% \begin{macrocode}
+\hook_debug_off:
+\DeclareOption { debug } { \hook_debug_on:
+ \shipout_debug_on: }
+% \end{macrocode}
+%
+%
+% For now we offer a simple debug option which turns on a lot of
+% strange \cs{typeout} messages, nothing fancy.
+% \begin{macrocode}
+\shipout_debug_off:
+\DeclareOption { debug-shipout } { \shipout_debug_on: }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+%
+% \subsection{Temporarily patching package until changed}
+%
+%
+%
+% \pkg{filehook} support until that package is patched:
+% \begin{macrocode}
+\RequirePackage{filehook-ltx}
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+%
+% \Finale
+%
+
+
diff --git a/macros/latex-dev/base/lthooks.ins b/macros/latex-dev/base/lthooks.ins
new file mode 100644
index 0000000000..4218fb8b25
--- /dev/null
+++ b/macros/latex-dev/base/lthooks.ins
@@ -0,0 +1,76 @@
+%%
+%% 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 2020 Frank Mittelbach
+%%
+%%
+%% This file is part of the lthooks 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
+
+\preamble
+
+This is a generated file.
+
+Copyright 2020 Frank Mittelbach
+
+This file was generated from file(s) of the LaTeX `lthooks 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 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`lthooks Bundle'. You may however distribute the `lthooks Bundle'
+without such generated files.
+
+The newest sources can be found below
+
+ https://github.com/FrankMittelbach/fmitex/
+
+where one can also log issues in case there are any.
+
+
+\endpreamble
+
+
+\generate{\file{lthooks.ltx}{\from{lthooks.dtx}{2ekernel}}}
+\generate{\file{ltshipout.ltx}{\from{ltshipout.dtx}{2ekernel}}}
+\generate{\file{ltfilehook.ltx}{\from{ltfilehook.dtx}{2ekernel}}}
+
+
+\generate{\file{structuredlog.sty}{\from{ltfilehook.dtx}{structuredlog}}}
+
+\generate{\file{lthooks.sty}{\from{lthooks.dtx}{package}}}
+
+\generate{\file{filehook-ltx.sty}{\from{ltfilehook.dtx}{filehook-draft}}}
+
+\generate{\file{srclfile-ltx.sty}{\from{ltfilehook.dtx}{scrlfile-draft}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/base/ltluatex.dtx b/macros/latex-dev/base/ltluatex.dtx
index d7ca7d05ec..2e692a993b 100644
--- a/macros/latex-dev/base/ltluatex.dtx
+++ b/macros/latex-dev/base/ltluatex.dtx
@@ -23,12 +23,12 @@
%<tex> \ProvidesFile\undefined\begingroup\def\ProvidesFile
%<tex> #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}}
%<tex>\fi
-%<plain>\ProvidesFile{ltluatex.tex}
+%<plain>\ProvidesFile{ltluatex.tex}%
%<*driver>
\ProvidesFile{ltluatex.dtx}
%</driver>
%<*tex>
-[2020/03/07 v1.1m
+[2020/06/10 v1.1n
%</tex>
%<plain> LuaTeX support for plain TeX (core)
%<*tex>
@@ -406,6 +406,14 @@
\fi
% \end{macrocode}
%
+% \changes{v1.1n}{2020/06/10}{Define \cs{@gobble}/\cs{@firstofone} even for \LaTeX\ to allow early loading.}
+% Two simple \LaTeX\ macros from |ltdefns.dtx| have to be defined here
+% because ltdefns.dtx is not loaded yet when ltluatex.dtx is executed.
+% \begin{macrocode}
+\long\def\@gobble#1{}
+\long\def\@firstofone#1{#1}
+% \end{macrocode}
+%
% \subsection{Older \LaTeX{}/Plain \TeX\ setup}
%
% \begin{macrocode}
@@ -521,12 +529,6 @@
\fi}%
% \end{macrocode}
%
-% Two simple \LaTeX\ macros used in |ltlatex.sty|.
-% \begin{macrocode}
-\long\def\@gobble#1{}
-\long\def\@firstofone#1{#1}
-% \end{macrocode}
-%
% Fix up allocations not to clash with |etex.src|.
%
% \begin{macrocode}
@@ -544,7 +546,6 @@
%</tex>
% \end{macrocode}
%
-%
% \subsection{Attributes}
%
% \begin{macro}{\newattribute}
diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf
index eaada989fa..515a409e89 100644
--- a/macros/latex-dev/base/ltluatex.pdf
+++ b/macros/latex-dev/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx
index 5fb4e77d90..c48384b8bd 100644
--- a/macros/latex-dev/base/ltmiscen.dtx
+++ b/macros/latex-dev/base/ltmiscen.dtx
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmiscen.dtx}
- [2020/04/24 v1.1t LaTeX Kernel (Misc. Environments)]
+ [2020/05/31 v1.1u LaTeX Kernel (Misc. Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltmiscen.dtx}
@@ -780,33 +780,39 @@
% \begin{macrocode}
%</2ekernel>
%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\centering}{Make commands robust}%
+%<latexrelease>\IncludeInRelease{2020/10/01}%
+%<latexrelease> {\centering}{Set finaldhypendemerits}%
% \end{macrocode}
%
% \begin{macro}{\centering}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\centering{%
\let\\\@centercr
\rightskip\@flushglue\leftskip\@flushglue
+ \finalhyphendemerits=\z@
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\raggedright}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\raggedright{%
\let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+ \finalhyphendemerits=\z@
\leftskip\z@skip
\parindent\z@}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\raggedleft}
+% \changes{v1.1u}{2020/05/31}{Added \cs{finalhyphendemerits} setting (gh/247)}
% \begin{macrocode}
\DeclareRobustCommand\raggedleft{%
\let\\\@centercr
\rightskip\z@skip\leftskip\@flushglue
+ \finalhyphendemerits=\z@
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% \end{macro}
@@ -814,6 +820,23 @@
% \begin{macrocode}
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\centering}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\DeclareRobustCommand\centering{%
+%<latexrelease> \let\\\@centercr
+%<latexrelease> \rightskip\@flushglue\leftskip\@flushglue
+%<latexrelease> \parindent\z@\parfillskip\z@skip}
+%<latexrelease>\DeclareRobustCommand\raggedright{%
+%<latexrelease> \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+%<latexrelease> \leftskip\z@skip
+%<latexrelease> \parindent\z@}
+%<latexrelease>\DeclareRobustCommand\raggedleft{%
+%<latexrelease> \let\\\@centercr
+%<latexrelease> \rightskip\z@skip\leftskip\@flushglue
+%<latexrelease> \parindent\z@\parfillskip\z@skip}
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>
%<latexrelease>\IncludeInRelease{0000/00/00}%
%<latexrelease> {\centering}{Make commands robust}%
%<latexrelease>
diff --git a/macros/latex-dev/base/ltnews.cls b/macros/latex-dev/base/ltnews.cls
index 08f098515b..632f068117 100644
--- a/macros/latex-dev/base/ltnews.cls
+++ b/macros/latex-dev/base/ltnews.cls
@@ -608,6 +608,10 @@
% That's it!
+%FMi temp addition until etoolbox is updated
+%\RequirePackage{etoolbox-ltx}
+%\AddToHook{env/document/begin}{\RemoveFromHook{env/document/begin}[*]} % done in \document
+
\endinput
% CHANGELOG
diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf
index ced28ce0e1..d74896f57a 100644
--- a/macros/latex-dev/base/ltnews.pdf
+++ b/macros/latex-dev/base/ltnews.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf
index fc3ed1119d..f284c0fb85 100644
--- a/macros/latex-dev/base/ltnews01.pdf
+++ b/macros/latex-dev/base/ltnews01.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf
index 34d40b49ec..2ebf8c72f6 100644
--- a/macros/latex-dev/base/ltnews02.pdf
+++ b/macros/latex-dev/base/ltnews02.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf
index df30947cd9..246e0fe7e9 100644
--- a/macros/latex-dev/base/ltnews03.pdf
+++ b/macros/latex-dev/base/ltnews03.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf
index 8b18c27fda..c953675edc 100644
--- a/macros/latex-dev/base/ltnews04.pdf
+++ b/macros/latex-dev/base/ltnews04.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf
index 7a079ebd73..319669efd6 100644
--- a/macros/latex-dev/base/ltnews05.pdf
+++ b/macros/latex-dev/base/ltnews05.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf
index e6ca705920..b13e9e0522 100644
--- a/macros/latex-dev/base/ltnews06.pdf
+++ b/macros/latex-dev/base/ltnews06.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf
index 66a1457566..cda0340e74 100644
--- a/macros/latex-dev/base/ltnews07.pdf
+++ b/macros/latex-dev/base/ltnews07.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf
index 2732f77234..8aa4e628bf 100644
--- a/macros/latex-dev/base/ltnews08.pdf
+++ b/macros/latex-dev/base/ltnews08.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf
index b81df70446..c66c8cfa4f 100644
--- a/macros/latex-dev/base/ltnews09.pdf
+++ b/macros/latex-dev/base/ltnews09.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf
index 1fa4ff2997..0e895283ca 100644
--- a/macros/latex-dev/base/ltnews10.pdf
+++ b/macros/latex-dev/base/ltnews10.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf
index 33b9db87fc..ec2365e802 100644
--- a/macros/latex-dev/base/ltnews11.pdf
+++ b/macros/latex-dev/base/ltnews11.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf
index 3df0f8da10..771d5bc088 100644
--- a/macros/latex-dev/base/ltnews12.pdf
+++ b/macros/latex-dev/base/ltnews12.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf
index 9f250dda69..bc759bc70b 100644
--- a/macros/latex-dev/base/ltnews13.pdf
+++ b/macros/latex-dev/base/ltnews13.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf
index aeef5a6352..a747c427e7 100644
--- a/macros/latex-dev/base/ltnews14.pdf
+++ b/macros/latex-dev/base/ltnews14.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf
index e2df12335b..7ed464e1e4 100644
--- a/macros/latex-dev/base/ltnews15.pdf
+++ b/macros/latex-dev/base/ltnews15.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf
index 1eb4b41399..b733ab0bb1 100644
--- a/macros/latex-dev/base/ltnews16.pdf
+++ b/macros/latex-dev/base/ltnews16.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf
index d3c7bbda62..63d06bb742 100644
--- a/macros/latex-dev/base/ltnews17.pdf
+++ b/macros/latex-dev/base/ltnews17.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf
index 3f78dcfaeb..766b54786c 100644
--- a/macros/latex-dev/base/ltnews18.pdf
+++ b/macros/latex-dev/base/ltnews18.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf
index a5c96735c9..8fd4131aa2 100644
--- a/macros/latex-dev/base/ltnews19.pdf
+++ b/macros/latex-dev/base/ltnews19.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf
index fcf4ef9a2b..a9fd7578bf 100644
--- a/macros/latex-dev/base/ltnews20.pdf
+++ b/macros/latex-dev/base/ltnews20.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf
index 948dec8917..9fe01bd05a 100644
--- a/macros/latex-dev/base/ltnews21.pdf
+++ b/macros/latex-dev/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf
index c7576c9e0e..06539b04f3 100644
--- a/macros/latex-dev/base/ltnews22.pdf
+++ b/macros/latex-dev/base/ltnews22.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf
index 513c215ff4..4f0cbf7248 100644
--- a/macros/latex-dev/base/ltnews23.pdf
+++ b/macros/latex-dev/base/ltnews23.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf
index 5d826a3aa1..2088def4ff 100644
--- a/macros/latex-dev/base/ltnews24.pdf
+++ b/macros/latex-dev/base/ltnews24.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf
index 60f2c7f203..b788f5e5c4 100644
--- a/macros/latex-dev/base/ltnews25.pdf
+++ b/macros/latex-dev/base/ltnews25.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf
index 4dce56adfa..fdda73b9d5 100644
--- a/macros/latex-dev/base/ltnews26.pdf
+++ b/macros/latex-dev/base/ltnews26.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf
index 483ff44824..cd893f6f52 100644
--- a/macros/latex-dev/base/ltnews27.pdf
+++ b/macros/latex-dev/base/ltnews27.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf
index 694668f4e7..52fa5ff2b5 100644
--- a/macros/latex-dev/base/ltnews28.pdf
+++ b/macros/latex-dev/base/ltnews28.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf
index db198ebdd8..e7178a9154 100644
--- a/macros/latex-dev/base/ltnews29.pdf
+++ b/macros/latex-dev/base/ltnews29.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf
index 5d045c4cf1..f32e6f4647 100644
--- a/macros/latex-dev/base/ltnews30.pdf
+++ b/macros/latex-dev/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews31.pdf b/macros/latex-dev/base/ltnews31.pdf
index d4eea094cc..e152614b67 100644
--- a/macros/latex-dev/base/ltnews31.pdf
+++ b/macros/latex-dev/base/ltnews31.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews32.pdf b/macros/latex-dev/base/ltnews32.pdf
index 7c8dc3fac7..931e86541d 100644
--- a/macros/latex-dev/base/ltnews32.pdf
+++ b/macros/latex-dev/base/ltnews32.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews32.tex b/macros/latex-dev/base/ltnews32.tex
index fdf8211ef0..fdea39b6e3 100644
--- a/macros/latex-dev/base/ltnews32.tex
+++ b/macros/latex-dev/base/ltnews32.tex
@@ -187,6 +187,56 @@ the kernel code; these are deprecated but still available by
explicitly loading \pkg{xparse}. All other argument types \emph{are}
now available directly within the \LaTeXe{} kernel.
+
+
+
+
+
+\section{A hook management system for \LaTeX{}}
+
+With the fall 2020 release of \LaTeX{} we provide a general hook
+management system for the kernel and for packages. This will allow
+packages to safely add code to various kernel and package hooks and if
+necessary define rules to reorder the code in the hooks to resolve
+typical package loading order issues. This hook system is written in
+the L3 programming layer and thus forms the first larger application
+within the kernel that makes use of the \LaTeX3 functionality now
+available (if we discount \pkg{xparse} which was already available for
+a long time as a separate package).
+
+The file \texttt{lthooks.dtx} holds the core management code for hooks
+and defines basic hooks for environments (as previously offered by
+\pkg{etoolbox}), \texttt{ltshipout.dtx} provides kernel hooks into the
+shipout process (making packages like \pkg{atbegshi},
+etc.\ unnecessary) and the file \texttt{ltfilehook.dtx} holds
+redefinition for commands like \cs{input} or \cs{usepackage} so that
+they offer hooks in a similar fashion to what is provided by the
+\pkg{filehook} package.
+
+At the moment the integration is lightweight, overwriting definitions
+made earlier during format generation (though this will change after
+more thorough testing). For that reason the documention isn't in its
+final form either and you have to read through three different
+documents:
+\begin{description}
+ \item[\texttt{lthooks-doc.pdf}] Core management interface and basic
+ hooks for environments provided by the kernel.
+
+ \item[\texttt{ltshipout-doc.pdf}] Hooks accessible while a page is
+ being shipped out.
+
+ \item[\texttt{ltfilehook-doc.pdf}] Hooks used when reading a file.
+\end{description}
+For those who wish to also study the code, replace \texttt{-doc} with
+\texttt{-code}, e.g., \texttt{lthooks-code.pdf}. All documents should
+be accessible via \texttt{texdoc}, e.g.,
+\begin{verbatim}
+ texdoc lthooks-doc
+\end{verbatim}
+should open the core documentation for you.
+
+
+
\section{Other changes to the \LaTeX{} kernel}
@@ -259,9 +309,18 @@ can also contain spaces with any leading and trailing spaces stripped
from the individual filenames while the spaces \emph{in} the file
names will remain intact.
%
-\githubissue{217}
+\githubissue[s]{217 and 218}
+\subsection{Avoid extra line in \cs{centering}, \cs{raggedleft} or \cs{raggedright}}
+
+If we aren't justifing paragraphs then a very long word (longer than a
+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}
+
\subsection{Set a non-zero \cs{baselineskip} in text scripts}
@@ -323,7 +382,7 @@ used in bold context (e.g., inside \cs{textbf}. Now that it is
possible in \LaTeX{} to specify different \enquote{\texttt{bf}}
defaults based for each of the three meta families (\texttt{rm},
\texttt{sf} and \texttt{tt}) via \cs{DeclareFontSeriesDefault}, it is
-not any longer easy to answer the question \enquote{am I typsetting in
+not any longer easy to answer the question \enquote{am I typesetting in
a bold context?}. To help with this problem a new command was provided:
\begin{quote}
\cs{IfFontSeriesContextTF}\Arg{context}\\
@@ -404,7 +463,7 @@ To implement compatibility code or to ensure that certain features are
available it is helpful and often necessary to check the date of the
format or that of a package or class and execute different code based
on the result. For that \LaTeX\ only had some internal commands
-(\cs{@ifpackagelater} and \cs{@ifclasslater}) for testting package or
+(\cs{@ifpackagelater} and \cs{@ifclasslater}) for testing package or
class names but nothing really for testing the format date. For the
latter one had to resort to some obscure command \cs{@ifl@t@r} that,
given its cryptic name, was clearly never intended for use even in
@@ -447,26 +506,38 @@ are ignored as elsewhere.
\githubissue{327}
-\subsection{Record the counter name stepped by \cs{refstepcounter}}
-\cs{refstepcounter} now stores the name of counter in \cs{\@currentcounter}.
-This allows packages like \pkg{zref} and \pkg{hyperref} to store the name without
-having to patch \cs{refstepcounter}.
+\subsection{Merge \pkg{l3docstrip} into \pkg{docstrip}}
+
+The file \pkg{l3docstrip.tex} offered a small extension over the
+original \pkg{docstrip.tex} file supporting the
+\texttt{\%\string<@@=\meta{module}\string>} syntax of \pkg{expl3}.
+This has now been merged into \pkg{docstrip} so that it can now be
+used both for traditional \texttt{.dtx} files and those containing
+code written in the L3 programming layer language.
%
-\githubissue{300}
+\githubissue{337}
-\subsection{Add support for Unicode soft hyphens}
+\subsection{Support vertical typesetting with \pkg{doc}}
-For a long time, the UTF-8 option for \pkg{inputenc} made the Unicode
-soft hyphen character (U+00AD) an alias for the \LaTeX\ soft hyphen
-\cs{-}. The Unicode engines \XeTeX{} and \LuaTeX{} behaved
-different though: They either ignored U+00AD or interpreted it as an
-unconditional hyphen. This inconsistency is fixed now and \LaTeX{}
-always treats \texttt{U+00AD} as \cs{-}.
+The \texttt{macrocode} environment uses a \texttt{trivlist} internally
+and as part of this sets up the \cs{@labels} box to contain some
+horizontal skips, but that box is never used. As a result this
+generates an issue in some circumstances if the typesetting direction
+is vertical. This has now been corrected to support such use cases as
+well.
%
-\githubissue{323}
+\githubissue{344}
+
+\subsection{Record the counter name stepped by \cs{refstepcounter}}
+
+\cs{refstepcounter} now stores the name of counter in \cs{@currentcounter}.
+This allows packages like \pkg{zref} and \pkg{hyperref} to store the name without
+having to patch \cs{refstepcounter}.
+%
+\githubissue{300}
\subsection{Native Lua\TeX\ behaviour for \cs{-}}
@@ -489,6 +560,40 @@ now allowed.
%
\githubissue{335}
+\subsection{Spacing commands moved from \pkg{amsmath} to the kernel}
+Originally \LaTeX{} only provided a small set of spacing commands
+for use in text and math, some of the commands like \cs{;} were
+only supported in math mode. \texttt{amsmath} normalized and
+provided all of them in text and math. This code has now been
+moved to the kernel so that it is generally available.
+%
+\githubissue{303}
+
+\begin{tabular}{lll}
+command name(s) & math & text\\\hline
+\cs{,} \cs{thinspace} & $x\,x$ & x\,x\\
+\cs{!} \cs{negthinspace} & $x\!x$ & x\!x\\
+\cs{:} \cs{>} \cs{medspace} & $x\:x$ & x\:x\\
+\cs{negmedspace} & $x\negmedspace x$ & x\negmedspace x\\
+\cs{;} \cs{thickspace} & $x\;x$ & x\;x\\
+\cs{negthickspace} & $x\negthickspace x$ & x\negthickspace x\\
+\end{tabular}
+
+
+
+\subsection{Access raw glyphs in \LuaTeX\ without reloading fonts}
+
+\LaTeX's definitions for \cs{textquotesingle}, \cs{textasciigrave}, and
+\cs{textquotedbl} for the TU encoding in \LuaTeX\ need special handling to
+stop the shaper from replacing these characters with curly quotes.
+This used to be done by reloading the current font without the \texttt{tlig}
+feature, but that came with multiple disadvantages: It behaves different
+than the corresponding \XeTeX\ code and it is not very efficient.
+This code has now been replaced with a implementation which injects a
+protected glyph nodes which is not affected by font shaping.
+%
+\githubissue{165}
+
\section{Changes to packages in the \pkg{graphics} category}
@@ -535,6 +640,25 @@ in such documents.
%
\githubissue{297}
+\subsection{\pkg{array}: Fix for \cs{firsthline} and \cs{lasthline}}
+
+Replacing \cs{hline} with \cs{firsthline} or \cs{lasthline} could lead
+in some cases to an increase of the tabular width. This has now been
+corrected.
+%
+\githubissue{322}
+
+\subsection{\pkg{varioref}: Support Japanese as a language option}
+
+The package now recognizes \texttt{japanese} as a language option.
+The extra complication is that for gramatical reasons \cs{vrefrange}
+needs a structure different from all other languages currently
+supported. To accomodate for this \cs{vrefrangeformat} was added to
+all languages.
+%
+\githubissue{352}
+
+
\subsection{\pkg{xr}: Support for spaces in filenames}
The commannd \cs{externaldocument}, provided by \pkg{xr}, now also
@@ -543,6 +667,8 @@ supports filenames with spaces, just like \cs{include} and
%
\githubissue{223}
+
+
\section{Changes to packages in the \pkg{amsmath} category}
\subsection{Placement corrections for two accent commands}
@@ -583,7 +709,7 @@ Furthermore, the traditional model to define and select languages
is still the preferred one in monolingual documents, is being extended
with a new model (which can be called \enquote{horizontal}) based on
\emph{services} provided by \pkg{babel}, which allows to define and
-redefine locales with the help of simple |ini| files based on
+redefine locales with the help of simple \texttt{ini} files based on
key/value pairs. Babel provides about of 250 of these files, which
have been generated with the help of the Unicode Common Language Data
Repository.
diff --git a/macros/latex-dev/base/ltoutenc.dtx b/macros/latex-dev/base/ltoutenc.dtx
index 8831b5655f..59c20f3770 100644
--- a/macros/latex-dev/base/ltoutenc.dtx
+++ b/macros/latex-dev/base/ltoutenc.dtx
@@ -44,7 +44,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutenc.dtx}
- [2020/04/22 v2.0p LaTeX Kernel (font encodings)]
+ [2021/07/04 v2.0q LaTeX Kernel (font encodings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutenc.dtx}
@@ -2869,28 +2869,70 @@
% \end{macrocode}
%
% LuaTeX.
+% For Lua\TeX~1.10+, define a Lua function to disable any handing by the font code.
+% Otherwise we reload the font without TeX ligatures.
+% \changes{v2.0q}{2020/07/04}{%
+% Implement \cs{remove@tlig} in Lua\TeX without font reloading}
% \begin{macrocode}
\def\UnicodeFontTeXLigatures{+tlig;}
-% \end{macrocode}
-%
-% \begin{macrocode}
- \def\reserved@a#1{%
- \def\@remove@tlig##1{\@remove@tlig@##1\@nil#1\@nil\relax}
- \def\@remove@tlig@##1#1{\@remove@tlig@@##1}}
- \edef\reserved@b{\detokenize{+tlig;}}
- \expandafter\reserved@a\expandafter{\reserved@b}
- \def\@remove@tlig@@#1\@nil#2\relax{#1}
-% \end{macrocode}
-%
-% \begin{macrocode}
- \def\remove@tlig#1{%
- \begingroup
- \font\remove@tlig
- \expandafter\@remove@tlig\expandafter{\fontname\font}%
- \remove@tlig
- \char#1\relax
- \endgroup
- }
+ \ifnum\luatexversion<110
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\reserved@a#1{%
+ \def\@remove@tlig##1{\@remove@tlig@##1\@nil#1\@nil\relax}
+ \def\@remove@tlig@##1#1{\@remove@tlig@@##1}}
+ \edef\reserved@b{\detokenize{+tlig;}}
+ \expandafter\reserved@a\expandafter{\reserved@b}
+ \def\@remove@tlig@@#1\@nil#2\relax{#1}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\remove@tlig#1{%
+ \begingroup
+ \font\remove@tlig
+ \expandafter\@remove@tlig\expandafter{\fontname\font}%
+ \remove@tlig
+ \char#1\relax
+ \endgroup
+ }
+ \else
+ \newluafunction\@remove@tlig@@@@
+% \end{macrocode}
+% We are in the format and Lua functions can not be dumped, so we have to repeat
+% the code during |\everyjob|. Therefore we first define a helper to both execute
+% some code and same it for |\everyjob|:
+% \begin{macrocode}
+ \def\now@and@everyjob#1{\toksapp\everyjob{#1}#1}
+% \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 forcehmode = tex.forcehmode
+ local put_next = token.put_next
+ local glyph_id = node.id'glyph'
+ local rawchar_token = token.new(rawchar_func, token.command_id'lua_call')
+ lua.get_functions_table()[rawchar_func] = function()
+ local mode = tex.nest.top.mode
+ if mode == 1 or mode == -1 then
+ put_next(rawchar_token)
+ return forcehmode(true)
+ end
+ local n = node.new(glyph_id, 256)
+ n.font = font.current()
+ 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.
+% \begin{macrocode}
+ \def\remove@tlig#1{\@remove@tlig@@@#1\relax}
+ \fi
% \end{macrocode}
%
% \begin{macrocode}
diff --git a/macros/latex-dev/base/ltshipout-code.pdf b/macros/latex-dev/base/ltshipout-code.pdf
new file mode 100644
index 0000000000..afc4ad7aee
--- /dev/null
+++ b/macros/latex-dev/base/ltshipout-code.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltshipout-code.tex b/macros/latex-dev/base/ltshipout-code.tex
new file mode 100644
index 0000000000..a22dd75fb9
--- /dev/null
+++ b/macros/latex-dev/base/ltshipout-code.tex
@@ -0,0 +1,10 @@
+% This will typeset documentation + code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex ltshipout.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\AlsoImplementation}
+\input{ltshipout.dtx}
diff --git a/macros/latex-dev/base/ltshipout-doc.pdf b/macros/latex-dev/base/ltshipout-doc.pdf
new file mode 100644
index 0000000000..95c0d8345e
--- /dev/null
+++ b/macros/latex-dev/base/ltshipout-doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltshipout-doc.tex b/macros/latex-dev/base/ltshipout-doc.tex
new file mode 100644
index 0000000000..de7f3e30a7
--- /dev/null
+++ b/macros/latex-dev/base/ltshipout-doc.tex
@@ -0,0 +1,12 @@
+% This will typeset only documentation but not the code
+%
+% However, you may first have to unpack the .sty file via
+%
+% latex ltshipout.ins
+%
+% as it is used when processing the doumentation.
+
+\AtBeginDocument{\OnlyDescription
+% \let\tableofcontents\relax
+ }
+\input{ltshipout.dtx}
diff --git a/macros/latex-dev/base/ltshipout.dtx b/macros/latex-dev/base/ltshipout.dtx
new file mode 100644
index 0000000000..8d6150b593
--- /dev/null
+++ b/macros/latex-dev/base/ltshipout.dtx
@@ -0,0 +1,1425 @@
+% \iffalse meta-comment
+%
+%% File: ltshipout.dtx (C) Copyright 2020 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
+%
+%
+% The development version of the bundle can be found below
+%
+% https://github.com/FrankMittelbach/...
+%
+% for those people who are interested or want to report an issue.
+%
+% \begin{macrocode}
+\providecommand\ltshipoutversion{v0.9a}
+\providecommand\ltshipoutdate{2020/07/15}
+% \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
+
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{ltshipout.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+%
+% \long\def\fmi#1{\begin{quote}\itshape Todo: #1\end{quote}}
+%
+% \newcommand\hook[1]{\texttt{#1}}
+%
+%
+% \title{The \texttt{ltshipout} package\thanks{This package has version
+% \ltshipoutversion\ dated \ltshipoutdate, \copyright\ \LaTeX\
+% Project.}}
+%
+% \author{Frank Mittelbach}
+%
+% \maketitle
+%
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% The code provides an interface to the \cs{shipout} primitive of
+% \TeX{} which is called when a finished pages is finally
+% \enquote{shipped out} to the target output file, e.g., the
+% \texttt{.dvi} or \texttt{.pdf} file.
+% A good portion of the code is based on ideas by Heiko Oberdiek
+% implemented in his packages \pkg{atbegshi} and \pkg{atenddvi}
+% even though the interfaces are somewhat
+% different.\footnote{Heiko's interfaces are emulated by the kernel
+% code, if a document requests his packages, so older documents
+% will continue to work.}
+%
+% \subsection{Overloading the \cs{shipout} primitive}
+%
+%
+% \begin{function}{\shipout}
+% With this implementation \TeX's shipout primitive is no longer
+% available for direct use. Instead \cs{shipout} is running some
+% (complicated) code that picks up the box to be shipped out
+% regardless of how that is done, i.e., as a constructed \cs{vbox}
+% or \cs{hbox} or as a box register.
+%
+% It then stores it in a named box register. This box can then be
+% manipulated through a set of hooks after which it is shipped out
+% for real.
+% \end{function}
+
+% \begin{variable}{\ShipoutBox,\l_shipout_box}
+% This box register is called \cs{ShipoutBox} (alternatively available via the
+% L3 name \cs{l_shipout_box}).
+% \end{variable}
+%
+
+% \begin{variable}{\l_shipout_box_ht_dim,
+% \l_shipout_box_dp_dim,\l_shipout_box_wd_dim,
+% \l_shipout_box_ht_plus_dp_dim}
+% The shipout box dimensions are available in the L3 registers
+% \cs{l_shipout_box_ht_dim}, etc.\ (there are no \LaTeXe{}
+% names).\footnotemark{} These variables can be used
+% inside the hook code for \hook{shipout/before},
+% \hook{shipout/foreground} and \hook{shipout/background} if needed.
+% \end{variable}
+% \footnotetext{Might need changing, but HO's version as strings
+% is not really helpful I think).}
+%
+%
+%
+%
+% \subsection{Provided hooks}
+%
+% \begin{variable}{shipout/before,
+% shipout/foreground,shipout/background,
+% shipout/firstpage,
+% shipout/lastpage}
+% The code offers a number of hooks into which packages (or the
+% user) can add code to support different use cases.
+% These are:
+% \begin{description}
+% \item[\hook{shipout/before}]
+%
+% This hook is executed after the finished page has been stored in
+% \cs{ShipoutBox} / \cs{l_shipout_box}).
+% It can be used to alter that box content or to discard it
+% completely (see \cs{DiscardShipoutBox} below).
+%
+% \item[\hook{shipout/background}]
+%
+% This hook adds a picture environment into the background of
+% the page (with the \texttt{(0,0)} coordinate in the top-left
+% corner using a \cs{unitlength} of \texttt{1pt}.
+%
+% It should therefore only receive \cs{put} commands or other
+% commands suitable in a \texttt{picture} environment and the
+% vertical coordinate values would normally be
+% negative.
+%
+% \fmi{Again, mainly \pkg{atbegshi} compatibility. Not
+% sure it is best to have to always use negative
+% coordinates.}
+%
+% Technically this is implemented by adding a zero-sized
+% \cs{hbox} as the very first item into the \cs{ShipoutBox}
+% containing that \texttt{picture} environment. Thus the rest of
+% the box content will overprint what ever is typeset by that hook.
+%
+%
+% \item[\hook{shipout/foreground}]
+%
+% This hook adds a picture environment into the foreground of
+% the page (with the \texttt{(0,0)} coordinate in the top-left
+% corner using a \cs{unitlength} of \texttt{1pt}.
+%
+% Technically this is implemented by adding a zero-sized
+% \cs{hbox} as the very last item into the \cs{ShipoutBox} and
+% raising it up so that it still has its \texttt{(0,0)} point in
+% the top-left corner.
+% But being placed after the main box content it will be typeset
+% later and thus overprints it (i.e., is in the foreground).
+%
+%
+% \item[\hook{shipout/firstpage}]
+%
+% The material from this hook is executed only once at the very
+% beginning of the first output page. It should only contain
+% \cs{special} commands needed to direct post processors
+% handling the \texttt{.dvi} or \texttt{.pdf} output.\fmi{not
+% sure it has to be that restrictive.}
+%
+% In \LaTeXe{} that was already existing but implemented as a box
+% register \cs{@begindvibox}.
+% \fmi{drop or at least mark the obsolete code in latex.ltx}
+%
+%
+% \item[\hook{shipout/lastpage}]
+%
+% The corresponding hook to add \cs{special}s at the very end of
+% the output file. It is only entered on the very last page.
+%
+% It may not be possible for \LaTeX{} to correctly determine which page is
+% the last one without several reruns. If this happens and the
+% hook is non-empty then \LaTeX{} will add an extra page to
+% place the material and also request a rerun to get the correct
+% placement sorted out.
+%
+% \end{description}
+% \end{variable}
+%
+% As mentioned above the hook \hook{shipout/before} is executed
+% first and can manipulate the prepared shipout box stored in
+% \cs{ShipoutBox} or set things up for use in \cs{write} during the
+% actual shipout. The other hooks are added inside hboxes to the
+% box being shipped out in the following
+% order:
+% \begin{center}
+% \begin{tabular}{ll}
+% \hook{shipout/firstpage} & only on the first page \\
+% \hook{shipout/background} & \\
+% \meta{boxed content of \cs{ShipoutBox}} & \\
+% \hook{shipout/foreground} & \\
+% \hook{shipout/lastpage} & only on the last page \\
+% \end{tabular}
+% \end{center}
+% If any of the hooks has no code then that particular no box is
+% added at that point.
+%
+% In a document that doesn't produce pages, e.g., only makes
+% \cs{typeout}s, none of the hooks are executed (as there is no
+% \cs{shipout}) not even the \hook{shipout/lastpage} hook.
+%
+% \begin{function}{\AtBeginDvi,\AtEndDvi}
+% \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{.dvx}.
+%
+% \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.
+%
+% \fmi{better names? Any suggestions?}
+%
+% \end{function}
+%
+% \subsection{Special commands for use inside the hooks}
+%
+% \begin{function}{\DiscardShipoutBox,\shipout_discard_box:}
+% \begin{syntax}
+% \cs{AddToHookNext} \texttt{\{shipout/before\} \{...\cs{DiscardShipoutBox}...\}}
+% \end{syntax}
+% The \cs{DiscardShipoutBox} declaration (L3 name
+% \cs{shipout_discard_box:})
+% requests that on the next
+% shipout the page box is thrown away instead of being shipped to
+% the \texttt{.dvi} or \texttt{.pdf} file.
+%
+% Typical applications wouldn't do this unconditionally, but have
+% some processing logic that decides to use or not to use the page.
+%
+% Note that if this declaration is used directly in the document it
+% may depend on the placement to which page it applies, given that
+% \LaTeX{} output routine is called in an asynchronous manner!
+%
+% \fmi{Once we have a new mark mechanism available we can improve
+% on that and make sure that the declaration applies to the page
+% that contains it.}
+% \end{function}
+%
+% In the \pkg{atbegshi} package there are a number of additional
+% commands for use inside the \hook{shipout/before} hook. They
+% should normally not be needed any more as one can instead simply
+% add code to the hooks \hook{shipout/before},
+% \hook{shipout/background} or
+% \hook{shipout/foreground}.\footnote{If that assumption turns out to
+% be wrong it would be trivial to change them to public functions
+% (right now they are private).} If \pkg{atbegshi} gets loaded then
+% those commands become available as public functions with their original
+% names as given below.
+%
+%
+% \subsection{Information counters}
+%
+%
+% \begin{variable}{\ReadonlyShipoutCounter,\g_shipout_readonly_int}
+% \begin{syntax}
+% \cs{ifnum}\cs{ReadOnlyShipoutCounter}\texttt{=...}
+% \cs{int_use:N} \cs{g_shipout_readonly_int} \texttt{\% expl3 usage}
+% \end{syntax}
+% This integer holds the number of pages shipped out up to now
+% (including the one to be shipped out when inside the output
+% routine). More precisely, it is incremented only after it is
+% clear that a page will be shipped out, i.e., after the
+% \hook{shipout/before} hook (because that might discard the page)!
+
+% Just like with the \texttt{page} counter its value is
+% only accurate within the output routine. In the body of the
+% document it may be off by one as the output routine is called
+% asynchronously!
+%
+% Also important: it \emph{must not} be set, only read. There are
+% no provisions to prevent that but if you do, chaos will be the
+% result. To emphasize this fact it is not provided as a \LaTeX{}
+% counter but as a \TeX{} counter (i.e., a command), so
+% \cs{Alph}\Arg{\cs{ReadonlyShipoutCounter}} etc, would not work.
+% \end{variable}
+%
+% \begin{variable}{totalpages,\g_shipout_totalpages_int}
+% \begin{syntax}
+% \cs{arabic}\texttt{\{totalpages\}}
+% \cs{int_use:N} \cs{g_shipout_totalpage_int} \texttt{\% expl3 usage}
+% \end{syntax}
+% In contrast to \cs{ReadonlyShipoutCounter}, the
+% \texttt{totalpages} counter is a \LaTeX{} counter and incremented
+% for each shipout attempt including those pages that are discarded
+% for one or the other reason. Again \hook{shipout/before} sees
+% the counter before it is incremented).
+%
+% Furthermore, while it is incremented for each page, its value is
+% never used by \LaTeX. It can therefore be freely reset or changed by user
+% code, for example, to additionally count a number of pages that
+% are not build by \LaTeX\ but are added in a later part of the
+% process, e.g., cover pages or picture pages made externally.
+%
+% Important: as this is a page-related counter its value is only
+% reliable inside the output routine!
+% \end{variable}
+%
+
+%
+% \subsection{Debugging shipout code}
+%
+% \begin{function}{\DebugShipoutOn,\DebugShipoutOff,
+% \shipout_debug_on:,\shipout_debug_off:}
+% \begin{syntax}
+% \cs{DebugShipoutOn}
+% \end{syntax}
+% Turn the debugging of shipout code on or off. This displays
+% changes made to the shipout data structures. \fmi{This needs
+% some rationalizing and will probably not stay this way.}
+% \end{function}
+%
+%
+
+%
+% \section{Emulating commands from other packages}
+%
+% The packages in this section are no longer necessary but as they
+% are used in other packages they are emulated when they are loaded
+% via \cs{usepackage} or \cs{RequirePackage}.
+%
+%
+% \subsection{Emulating \pkg{atbegshi}}
+%
+%
+% \begin{function}{\AtBeginShipoutUpperLeft,\AtBeginShipoutUpperLeftForeground}
+% \begin{syntax}
+% \cs{AddToHook} \texttt{\{shipout/before\} \{...\cs{AtBeginShipoutUpperLeft}}\Arg{code}\texttt{...\}}
+% \end{syntax}
+% This adds a \texttt{picture} environment into the background of the shipout
+% box expecting \meta{code} to contain \texttt{picture}
+% commands. The same effect can be obtained by simply using kernel
+% features as follows:
+% \begin{quote}
+% \cs{AddToHook}\texttt{\{shipout/background\}}\Arg{code}
+% \end{quote}
+% There is one technical difference: if
+% \cs{AtBeginShipoutUpperLeft} is used several times each
+% invocation is put into its own box inside the shipout box whereas
+% all \meta{code} going into \hook{shipout/background} ends up
+% all in the same box in the order it is added or sorted based on
+% the rules for the hook chunks.
+%
+% \cs{AtBeginShipoutUpperLeftForeground} is similar with the
+% difference that the \texttt{picture} environment is placed in the
+% foreground. To model it with the kernel functions use the hook
+% \hook{shipout/foreground} instead.
+% \end{function}
+%
+%
+% \begin{function}{\AtBeginShipoutAddToBox,\AtBeginShipoutAddToBoxForeground}
+% \begin{syntax}
+% \cs{AddToHook} \texttt{\{shipout/before\} \{...\cs{AtBeginShipoutAddToBox}}\Arg{code}\texttt{...\}}
+% \end{syntax}
+% These work like \cs{AtBeginShipoutUpperLeft} and
+% \cs{AtBeginShipoutUpperLeftForeground} with the difference that
+% \meta{code} is directly placed into an \cs{hbox} inside the
+% shipout box and not surrounded by a \texttt{picture} environment.
+%
+% To emulate them using \hook{shipout/background} or
+% \hook{shipout/foreground} you may have to wrap \meta{code} into
+% a \cs{put} statement but if the code is not doing any typesetting
+% just adding it to the hook should be sufficient.
+% \end{function}
+%
+
+
+% \begin{function}{\AtBeginShipoutBox}
+% This is the name of the shipout box as \pkg{atbegshi} knows it.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipoutInit}
+% By default \pkg{atbegshi} delayed its action until
+% \verb=\beg{document}=. This command was forcing it in an earlier
+% place. With the new concept it does nothing.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipout,\AtBeginShipoutNext}
+% \begin{syntax}
+% \cs{AtBeginShipout}\Arg{code} $\equiv$ \cs{AddToHook}\texttt{\{shipout/before\}}\Arg{code}
+% \cs{AtBeginShipoutNext}\Arg{code} $\equiv$ \cs{AddToHookNext}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% This is equivalent to filling the \hook{shipout/before} hook
+% by either using \cs{AddToHook} or \cs{AddToHookNext}, respectively.
+% \end{function}
+%
+% \begin{function}{\AtBeginShipoutFirst,\AtBeginShipoutDiscard}
+% The \pkg{atbegshi} names for \cs{AtBeginDvi} and \cs{DiscardShipoutBox}.
+% \end{function}
+%
+
+
+
+% \subsection{Emulating \pkg{everyshi}}
+%
+
+
+% \begin{function}{\EveryShipout}
+% \begin{syntax}
+% \cs{EveryShipout}\Arg{code} $\equiv$ \cs{AddToHook}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% \end{function}
+%
+% \begin{function}{\AtNextShipout}
+% \begin{syntax}
+% \cs{AtNextShipout}\Arg{code} $\equiv$ \cs{AddToHookNext}\texttt{\{shipout/before\}}\Arg{code}
+% \end{syntax}
+% \end{function}
+%
+
+
+% \subsection{Emulating \pkg{atenddvi}}
+%
+% The \pkg{atenddvi} package implemented only a single command:
+% \cs{AtEndDvi} and that is now available out of the box.
+
+
+
+% \subsection{Emulating \pkg{everypage}}
+%
+% This page takes over the original \cs{@begindvi} hook and replaces
+% it. It should be all covered by the hooks offered here (details
+% need checking) and thus could simply use the provided hooks
+% rather than defining its own.
+%
+%
+%
+% \StopEventually{\setlength\IndexMin{200pt} \PrintIndex }
+%
+%
+% \section{The Implementation}
+% \begin{macrocode}
+%<*2ekernel>
+%<@@=shipout>
+\ExplSyntaxOn
+% \end{macrocode}
+%
+%
+% \subsection{Debugging}
+%
+% \begin{macro}{\g_@@_debug_bool}
+% Holds the current debugging state.
+% \begin{macrocode}
+\bool_new:N \g_@@_debug_bool
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\shipout_debug_on:,\shipout_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 \shipout_debug_on:
+ {
+ \bool_gset_true:N \g_@@_debug_bool
+ \@@_debug_gset:
+ }
+\cs_new_protected:Npn \shipout_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}{shipout/before,
+% shipout/foreground,shipout/background,
+% shipout/firstpage,
+% shipout/lastpage}
+% Declaring all hooks for the shipout code.
+% \begin{macrocode}
+\hook_new:n{shipout/before}
+\hook_new:n{shipout/foreground}
+\hook_new:n{shipout/background}
+\hook_new:n{shipout/firstpage}
+\hook_new:n{shipout/lastpage}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\ShipoutBox,\l_shipout_box}
+% The box filled with the page to be shipped out (both L3 and
+% \LaTeXe{} name).
+% \begin{macrocode}
+\box_new:N \l_shipout_box
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_set_eq:NN \ShipoutBox \l_shipout_box
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\@@_execute:}
+% This is going to the be the code run by \cs{shipout}. The code
+% follows closely the ideas from \pkg{atbegshi}, so not
+% documenting that here for now.
+% \begin{macrocode}
+\cs_set:Npn\@@_execute: {
+ \tl_set:Nx \l_@@_group_level_tl
+ { \int_value:w \tex_currentgrouplevel:D }
+ \tex_afterassignment:D \@@_execute_test_level:
+ \tex_setbox:D \l_shipout_box
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\shipout}
+% Overloading the \cs{shipout} primitive:
+% \begin{macrocode}
+\cs_gset_eq:NN \shipout \@@_execute:
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\l_@@_group_level_tl}
+% Helper token list to record the group level at which
+% \cs{@@_execute:} is encountered. \begin{macrocode}
+\tl_new:N \l_@@_group_level_tl
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_execute_test_level:}
+% If the group level has changed then we are still constructing
+% \cs{l_shipout_box} and to continue we need to wait until the
+% current group has finished, hence the \cs{tex_aftergroup:D}.
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_test_level: {
+ \int_compare:nNnT
+ \l_@@_group_level_tl < \tex_currentgrouplevel:D
+ \tex_aftergroup:D
+ \@@_execute_cont:
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_execute_cont:}
+% When we have reached this point the shipout box has been
+% processed and is available in \cs{l_shipout_box} and ready for
+% real ship out (perhaps)..
+%
+% First we quickly check if it is void (can't happen in the
+% standard \LaTeX{} output routine but \cs{shipout} might be called
+% from a package that has some special processing logic). If it is
+% void we aren't shipping anything out and processing ends.\footnote{In that
+% case we don't reset the deadcyles, that would be up to the OR
+% processing logic to do.}
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_cont: {
+ \box_if_empty:NTF \l_shipout_box
+ { \PackageWarning{ltshipout}{Ignoring~ void~ shipout~ box} }
+ {
+% \end{macrocode}
+% Otherwise we assume that we will ship something and prepare for
+% final adjustments (in particular setting the state of
+% \cs{protect} while we are running the hook code).
+% \begin{macrocode}
+ \bool_gset_false:N \g_@@_discard_bool
+ \set@typeset@protect
+% \end{macrocode}
+% We also store the current shipout box dimension in registers, so that
+% they can be used in the hook code.\footnote{This is not really
+% necessary as the code could access them via \cs{box_ht:N}, etc.,
+% but it is perhaps convenient.}
+% \begin{macrocode}
+ \@@_get_box_size:N \l_shipout_box
+% \end{macrocode}
+% Then we execute the \hook{shipout/before} hook.
+% \begin{macrocode}
+ \hook_use:n {shipout/before}
+% \end{macrocode}
+% In \cs{g_shipout_totalpages_int} we count all shipout attempts so
+% we increment that counter already here (the other one is
+% incremented later when we know for sure that we do a
+% \cs{shipout}.
+%
+% We increment it after running the above hook so that the values
+% for \cs{g_shipout_totalpages_int} and \cs{} are in sync while the
+% hook is executed (in the case that totalpages isn't manually
+% altered or through discarding pages that is).
+% \begin{macrocode}
+ \int_gincr:N \g_shipout_totalpages_int
+% \end{macrocode}
+% The above hook might contain code that requests the page to be discarded so
+% we now test for it.
+% \begin{macrocode}
+ \bool_if:NTF \g_@@_discard_bool
+ { \PackageInfo{ltshipout}{Completed~ page~ discarded}
+ \bool_gset_false:N \g_@@_discard_bool
+% \end{macrocode}
+% As we are discarding the page box and not shipping anything out,
+% we need to do some house cleaning and reset \TeX's deadcycles so
+% that it doesn't complain about too many calls to the OR without
+% any shipout.
+% \begin{macrocode}
+ \tex_deadcycles:D \c_zero_int
+% \end{macrocode}
+% \fmi{In \pkg{atbegshi} the box was dropped but is that actually
+% needed? Or the resetting of \cs{protect} to its kernel value?}
+% \begin{macrocode}
+% \group_begin:
+% \box_set_eq_drop:NN \l_shipout_box \l_shipout_box
+% \group_end:
+% \cs_set_eq:NN \protect \exp_not:N
+ }
+% \end{macrocode}
+% Even if there was no explicit request to discard the box it is
+% possible that the code for the hook \hook{shipout/before} has
+% voided the box (by mistake or deliberately). We therefore test
+% once more but this time make it a warning, because the best
+% practice way is to use the request mechanism.
+% \begin{macrocode}
+ { \box_if_empty:NTF \l_shipout_box
+ { \PackageWarning{ltshipout}{
+ Shipout~ box~ was~ voided~ by~ hook,\MessageBreak
+ ignoring~ shipout~ box }
+ }
+% \end{macrocode}
+% Finally, if the box is still non-empty we are nearly ready to
+% ship it out.
+% First we increment the total page counter so that we can later
+% test if we have reached the final page according to our available
+% information.\footnote{Doing that earlier would be wrong because we
+% might end up with the last page counted but discard and then we
+% have no place to add the final objects into the output file.}
+% \begin{macrocode}
+ {
+ \int_gincr:N \g_shipout_readonly_int
+ \@@_debug:n {
+ \typeout{Absolute~ page~ =~ \int_use:N \g_shipout_readonly_int
+ \space (target:~ \@abspage@last)}
+ }
+% \end{macrocode}
+% Then we store the box sizes again (as they may have
+% changed) and then look at the hooks \hook{shipout/foreground}
+% and \hook{shipout/background}. If either or both are non-empty
+% we add a \texttt{picture} environment to the box (in the
+% foreground and or in the background) and execute the hook code
+% inside that environment.
+%
+% \begin{macrocode}
+ \@@_get_box_size:N \l_shipout_box
+ \@kernel@before@shipout@foreground
+ \hook_if_empty:nF {shipout/foreground}
+ { \@@_add_foreground_picture:n
+ { \hook_use:n {shipout/foreground} } }
+ \hook_if_empty:nF {shipout/background}
+ { \@@_add_background_picture:n
+ { \hook_use:n {shipout/background} } }
+% \end{macrocode}
+% We then run \cs{@@_execute_firstpage_hook:} that adds
+% the content of the hook \hook{shipout/firstpage} to the
+% start of the first page (if non-empty). It is then redefined to
+% do nothing on later pages.
+% \begin{macrocode}
+ \@@_execute_firstpage_hook:
+% \end{macrocode}
+% The we check if we have to add the \hook{shipout/lastpage} hook
+% because we have reached the last page. This test will be false for
+% all but one (and hopefully the correct) page.
+% \begin{macrocode}
+ \int_compare:nNnT \@abspage@last = \g_shipout_readonly_int
+ { \hook_if_empty:nF {shipout/lastpage}
+ { \@@_debug:n { \typeout{Executing~ lastpage~ hook~
+ on~ page~ \int_use:N \g_shipout_readonly_int } }
+ \_@@_add_foreground_box:n { \UseHook{shipout/lastpage}
+ \@kernel@after@shipout@lastpage }
+ }
+ \bool_gset_true:N \g_@@_lastpage_handled_bool
+ }
+% \end{macrocode}
+% Finally we run the actual \TeX{} primitive for shipout. As that will
+% expand delayed \cs{write} statements inside the page in which
+% protected commands should not expand we first change \cs{protect}
+% to the appropriate definition for that case.
+% \begin{macrocode}
+ \cs_set_eq:NN \protect \exp_not:N
+ \tex_shipout:D \box_use:N \l_shipout_box
+ }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@kernel@after@shipout@lastpage,\@kernel@before@shipout@foreground}
+%
+% \begin{macrocode}
+\let\@kernel@after@shipout@lastpage\@empty
+\let\@kernel@before@shipout@foreground\@empty
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_execute_firstpage_hook: }
+% This command adds any specials into a box and adds that to the
+% very beginning of the first box shipped out. After that we
+% redefine it to do nothing on later pages.
+% \begin{macrocode}
+\cs_new:Npn \@@_execute_firstpage_hook: {
+% \end{macrocode}
+% Adding something to the beginning means adding it to the
+% background as that layer is done first in the output. Of course
+% that is only needed if the hook actually contains anything.
+% \begin{macrocode}
+ \hook_if_empty:nF {shipout/firstpage}
+ { \@@_add_background_box:n { \UseHook{shipout/firstpage} } }
+% \end{macrocode}
+% Once we are here we change the definition to do nothing next time
+% and we also change the command used to implement \cs{AtBeginDvi}
+% to become a warning and not add further material to a hook that
+% is never used again.
+% \begin{macrocode}
+ \cs_gset_eq:NN \@@_execute_firstpage_hook: \prg_do_nothing:
+ \cs_gset:Npn \@@_add_firstpage_material:Nn ##1 ##2 {
+ \PackageWarning{ltshipout}{
+ First~ page~ is~ already~ shipped~ out,~ ignoring\MessageBreak
+ \string##1 }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\g_@@_lastpage_handled_bool}
+% A boolean to signal if we have already handled the
+% \hook{shipout/lastpage} hook.
+% \begin{macrocode}
+\bool_new:N \g_@@_lastpage_handled_bool
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_add_firstpage_material:Nn}
+% This command adds material to the
+% \hook{shipout/firstpage} hook. It is used in
+% \cs{AtBeginDvi}, etc. The first argument is the
+% command through which is it called. Initially this is ignored but
+% once we are passed the first page it can be used to generate a
+% warning message mentioning the right user command.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_firstpage_material:Nn #1#2 {
+ \AddToHook{shipout/firstpage}{#2}
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+
+
+
+% \begin{macro}{\@@_get_box_size:N}
+% Store the box dimensions in dimen registers.
+% \fmi{This could/should perhaps be generalized to set height depth and
+% width given an arbitrary box.}
+% \begin{macrocode}
+\cs_new:Npn \@@_get_box_size:N #1 {
+ \dim_set:Nn \l_shipout_box_ht_dim { \box_ht:N #1 }
+ \dim_set:Nn \l_shipout_box_dp_dim { \box_dp:N #1 }
+ \dim_set:Nn \l_shipout_box_wd_dim { \box_wd:N #1 }
+ \dim_set:Nn \l_shipout_box_ht_plus_dp_dim { \l_shipout_box_ht_dim +
+ \l_shipout_box_dp_dim }
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\l_shipout_box_ht_dim,
+% \l_shipout_box_dp_dim,\l_shipout_box_wd_dim,
+% \l_shipout_box_ht_plus_dp_dim}
+% And here are the variables set by \cs{@@_get_box_size:N}.
+% \begin{macrocode}
+\dim_new:N \l_shipout_box_ht_dim
+\dim_new:N \l_shipout_box_dp_dim
+\dim_new:N \l_shipout_box_wd_dim
+\dim_new:N \l_shipout_box_ht_plus_dp_dim
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+
+% \begin{macro}{\g_@@_discard_bool}
+% Indicate whether or not the current page box should be discarded
+% \begin{macrocode}
+\bool_new:N \g_@@_discard_bool
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\l_@@_tmp_box,\l_@@_saved_badness_tl}
+% We need a box for the background and foreground material and a
+% token register to remember badness settings as we disable them
+% during te buildup below.
+% \begin{macrocode}
+\box_new:N \l_@@_tmp_box
+\tl_new:N \l_@@_saved_badness_tl
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_add_background_box:n}
+% In standard \LaTeX{} the shipout box is always a \cs{vbox} but
+% here we are allow for other usage as well, in case some package
+% has its own output routine.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_background_box:n #1
+{ \@@_get_box_size:N \l_shipout_box
+% \end{macrocode}
+% But we start testing for a vertical box as that should be the
+% normal case.
+% \begin{macrocode}
+ \box_if_vertical:NTF \l_shipout_box
+ {
+% \end{macrocode}
+% Save current values of \cs{vfuzz} and \cs{vbadness} then change
+% them to allow box manipulations without warnings.
+% \begin{macrocode}
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \vfuzz=\the\vfuzz\relax
+ \vbadness=\the\vbadness\relax }
+ \vfuzz=\c_max_dim
+ \vbadness=\c_max_int
+% \end{macrocode}
+% Then we reconstruct \cs{l_shipout_box} \ldots
+% \begin{macrocode}
+ \vbox_set_to_ht:Nnn \l_shipout_box \l_shipout_box_ht_plus_dp_dim
+ {
+% \end{macrocode}
+% \ldots{} the material in \verb=#1= is placed into a horizontal
+% box with zero dimensions.
+% \begin{macrocode}
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+% \end{macrocode}
+% The we typeset that box followed by whatever was in
+% \cs{l_shipout_box} before (unpacked).
+% \begin{macrocode}
+ \skip_zero:N \baselineskip
+ \skip_zero:N \lineskip
+ \skip_zero:N \lineskiplimit
+ \box_use:N \l_@@_tmp_box
+ \vbox_unpack:N \l_shipout_box
+% \end{macrocode}
+% The \cs{kern} ensures that the box has no depth which is
+% afterwards explicitly corrected.
+% \begin{macrocode}
+ \kern \c_zero_dim
+ }
+ \box_set_ht:Nn \l_shipout_box \l_shipout_box_ht_dim
+ \box_set_dp:Nn \l_shipout_box \l_shipout_box_dp_dim
+% \end{macrocode}
+% \fmi{The whole boxing maneuver looks a bit like overkill to me, but for
+% the moment I leave.}
+% \begin{macrocode}
+ \l_@@_saved_badness_tl
+ }
+ {
+% \end{macrocode}
+% A horizontal box is handled in a similar way. The last case would
+% be a void box in which case we do nothing hence the missing
+% \texttt{F} branch.
+% \begin{macrocode}
+ \box_if_horizontal:NT \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \hfuzz=\the\hfuzz\relax
+ \hbadness=\the\hbadness\relax }
+ \hfuzz=\c_max_dim
+ \hbadness=\c_max_int
+ \hbox_set_to_wd:Nnn \l_shipout_box \l_shipout_box_wd_dim
+ {
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_move_up:nn
+ \l_shipout_box_ht_dim
+ { \box_use:N \l_@@_tmp_box }
+ \hbox_unpack:N \l_shipout_box
+ }
+ \l_@@_saved_badness_tl
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\@@_add_foreground_box:n}
+% Foreground boxes are done in the same way, only the order and
+% placement of boxes has to be done differently.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_foreground_box:n #1
+{
+ \box_if_vertical:NTF \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \vfuzz=\the\vfuzz\relax
+ \vbadness=\the\vbadness\relax }
+ \vfuzz=\c_max_dim
+ \vbadness=\c_max_int
+ \vbox_set_to_ht:Nnn \l_shipout_box \l_shipout_box_ht_plus_dp_dim
+ {
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \skip_zero:N \baselineskip
+ \skip_zero:N \lineskip
+ \skip_zero:N \lineskiplimit
+ \vbox_unpack:N \l_shipout_box
+ \kern -\l_shipout_box_ht_plus_dp_dim
+ \box_use:N \l_@@_tmp_box
+ \kern \l_shipout_box_ht_plus_dp_dim
+ }
+ \l_@@_saved_badness_tl
+ \box_set_ht:Nn \l_shipout_box \l_shipout_box_ht_dim
+ \box_set_dp:Nn \l_shipout_box \l_shipout_box_dp_dim
+ }
+ {
+ \box_if_horizontal:NT \l_shipout_box
+ {
+ \tl_set:Nx \l_@@_saved_badness_tl
+ { \hfuzz=\the\hfuzz\relax
+ \hbadness=\the\hbadness\relax }
+ \hfuzz=\c_max_dim
+ \hbadness=\c_max_int
+ \hbox_set_to_wd:Nnn \l_shipout_box \l_shipout_box_wd_dim
+ {
+ \hbox_unpack:N \l_shipout_box
+ \kern -\box_wd:N \l_shipout_box
+ \hbox_set:Nn \l_@@_tmp_box
+ { \l_@@_saved_badness_tl #1 }
+ \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_move_up:nn { \box_ht:N \l_shipout_box }
+ { \box_use:N \l_@@_tmp_box }
+ \kern \box_wd:N \l_shipout_box
+ }%
+ \l_@@_saved_badness_tl
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \begin{macro}{\c_@@_horigin_tl,\c_@@_vorigin_tl}
+% Two constants holding the offset of the top-left with respect to
+% the media box.
+%
+% Setting the constants this way is courtesy of Bruno.
+% \begin{macrocode}
+\tl_gput_right:Nn \@kernel@after@begindocument {
+ \tl_const:Nx \c_@@_horigin_tl
+ {
+ \cs_if_exist_use:NTF \pdfvariable { horigin }
+ { \cs_if_exist_use:NF \pdfhorigin { 1in } }
+ }
+ \tl_const:Nx \c_@@_vorigin_tl
+ {
+ \cs_if_exist_use:NTF \pdfvariable { vorigin }
+ { \cs_if_exist_use:NF \pdfvorigin { 1in } }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_picture_overlay:n}
+% Put the argument into a \texttt{picture} environment that doesn't take up
+% any size and uses \texttt{1pt} for \cs{unitlength}.
+% \fmi{Could perhaps be generalized as it might be useful elsewhere. For
+% not it is not.}
+% \begin{macrocode}
+\cs_new:Npn \@@_picture_overlay:n #1 {
+ \kern -\c_@@_horigin_tl \scan_stop:
+ \vbox_to_zero:n {
+ \kern -\c_@@_vorigin_tl \scan_stop:
+ \unitlength 1pt \scan_stop:
+ \hbox_set_to_wd:Nnn \l_@@_tmp_box \c_zero_dim { \ignorespaces #1 }
+% \box_set_wd:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_ht:Nn \l_@@_tmp_box \c_zero_dim
+ \box_set_dp:Nn \l_@@_tmp_box \c_zero_dim
+ \box_use:N \l_@@_tmp_box
+ \tex_vss:D
+ }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\@@_add_background_picture:n}
+% Put a \texttt{picture} env in the background of the shipout box
+% with its reference point in the top-left corner.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_background_picture:n #1 {
+ \@@_add_background_box:n { \@@_picture_overlay:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_add_foreground_picture:n}
+%
+% Put a \texttt{picture} env in the foreground of the shipout box
+% with its reference point in the top-left corner.
+% \begin{macrocode}
+\cs_new:Npn \@@_add_foreground_picture:n #1 {
+ \@@_add_foreground_box:n { \@@_picture_overlay:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\shipout_discard:}
+% Request that the next shipout box should be discarded. At the
+% moment this is just setting a boolean, but we may want to augment
+% this behavior that the position of the call is taken into account
+% (in case \LaTeX{} looks ahead and is not using the position for
+% on the next page).
+% \begin{macrocode}
+\cs_new:Npn \shipout_discard: {
+ \bool_gset_true:N \g_@@_discard_bool
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \subsection{Handling the end of job hook}
+
+% At the moment this is partly solved by using the existing hooks.
+% But rather than putting the code into these hooks it should be
+% moved to the right place directly as we shouldn't prefill hooks
+% with material unless it needs to interact with other code.
+%
+
+%
+% \begin{macro}{\g_shipout_readonly_int,\ReadonlyShipoutCounter}
+% We count every shipout activity that makes a page (but not those
+% that are discarded) in order to know how many pages got produced.
+% \begin{macrocode}
+\int_new:N \g_shipout_readonly_int
+% \end{macrocode}
+% For \LaTeXe{} it is available as a command (i.e., a \TeX{}
+% counter only.
+% \begin{macrocode}
+\cs_new_eq:NN \ReadonlyShipoutCounter \g_shipout_readonly_int
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\g_shipout_totalpages_int,\c@totalpages}
+% We count every shipout attempt (even those that are discarded) in
+% tis counter. It is not used in the code but may get used in user
+% code.
+% \begin{macrocode}
+\int_new:N \g_shipout_totalpages_int
+% \end{macrocode}
+% For \LaTeXe{} this is offered as a \LaTeX{} counter so can be
+% easily typeset inside the output routine to display things like
+% \enquote{\cs{thepage}\texttt{/}\cs{thetotalpages}}, etc.
+% \begin{macrocode}
+\cs_new_eq:NN \c@totalpages \g_shipout_totalpages_int
+\cs_new:Npn \thetotalpages { \arabic{totalpages} }
+% \end{macrocode}
+% \end{macro}
+%
+
+
+
+% \begin{macro}{\@abspage@last}
+% In \cs{@abspage@last} record the number of pages from the last
+% run. This is written to the \texttt{.aux} and this way made
+% available to the next run. In case there is no \texttt{.aux} file
+% or the statement is missing from it we initialize it with the
+% largest possible number in \TeX{}. We use this a s the default
+% because then we are inserting the \hook{shipout/lastpage} on
+% the last page (or after the last page but not on page 1 for a
+% multipage document.
+% \begin{macrocode}
+\xdef\@abspage@last{\number\maxdimen}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\enddocument}
+%
+% Instead of using the hooks \hook{enddocument} and
+% \hook{enddocument/afterlastpage} we add this code to private
+% kernel hooks to be 100\% when it is executed and to avoid
+% cluttering the hooks with data that is always there.
+%
+% Inside \cs{enddocument} there is a \cs{clearpage}. Just before
+% that we execute this code here. There is a good change that we
+% are on the last page. Therefore, if we don't know the value from
+% the last run, we assume that the current page is the right
+% one. So we set \cs{@abspage@last} and as a result the next
+% shipout will run the \hook{shipout/lastpage} code. Of course,
+% if there are floats that still need a placement this guess will
+% be wrong but then rerunning the document will give us the correct
+% value next time around.
+%
+% \begin{macro}{\@kernel@after@enddocument}
+% \begin{macrocode}
+\g@addto@macro \@kernel@after@enddocument {
+ \int_compare:nNnT \@abspage@last = \maxdimen
+ {
+% \end{macrocode}
+% We use \LaTeXe{} coding as \cs{@abspage@last} is not an L3 name.
+% \begin{macrocode}
+ \xdef\@abspage@last{ \int_eval:n {\g_shipout_readonly_int + 1} }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@kernel@after@enddocument@afterlastpage}
+% Once the \cs{clearpage} has done its work inside \cs{enddocument}
+% we know for sure how many pages this document has, so we record
+% that in the \texttt{.aux} file for the next run.
+%
+% \begin{macrocode}
+\g@addto@macro \@kernel@after@enddocument@afterlastpage {
+% \end{macrocode}
+% There is one special case: If no output is produced then there is
+% no point in a) recording the number as 0 will never match the
+% page number of a real page and b) adding an extra page to ran the
+% \hook{shipout/lastpage} is pointless as well (as it would
+% remain forever). So we test for this and run the code only if
+% there have been pages.
+% \begin{macrocode}
+ \int_compare:nNnF \g_shipout_readonly_int = 0
+ {
+% \end{macrocode}
+% This ends up in the \texttt{.aux} so we use \LaTeXe{} names here.
+% \fmi{this needs an interface for \cs{nofiles} in expl3, doesn't at the moment!}
+% \begin{macrocode}
+ \if@filesw
+ \iow_now:Nx \@auxout {
+ \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
+% \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.
+% \begin{macrocode}
+ \bool_if:NF \g_@@_lastpage_handled_bool
+ { \tex_shipout:D\vbox to\textheight{
+ \hbox{\UseHook{shipout/lastpage} \@kernel@after@shipout@lastpage }
+% \end{macrocode}
+% This extra page could be totally empty except for the hook
+% content, but to help the user understanding why it is there we
+% put some text into it.
+% \begin{macrocode}
+ \@@_excuse_extra_page:
+ \null
+ }
+% \end{macrocode}
+% At this point we should also signal to \LaTeX{} that a rerun is
+% necessary so that an appropriate message can be shown on the
+% terminal.
+%
+% \fmi{integrate warning ``Rerun \ldots'' }
+% \begin{macrocode}
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+
+% \begin{macro}{\@@_excuse_extra_page:}
+% Say mea culpa \ldots
+% \begin{macrocode}
+\cs_new:Npn \@@_excuse_extra_page: {
+ \vfil
+ \begin{center}
+ \bfseries Temporary~ page!
+ \end{center}
+ \LaTeX{}~ was~ unable~ to~ guess~ the~ total~ number~ of~ pages~
+ correctly.~ ~ As~ there~ was~ some~ unprocessed~ data~ that~
+ should~ have~ been~ added~ to~ the~ final~ page~ this~ extra~
+ page~ has~ been~ added~ to~ receive~ it.
+ \par
+ If~ you~ rerun~ the~ document~ (without~ altering~ it)~ this~
+ surplus~ page~ will~ go~ away,~ because~ \LaTeX{}~ now~ knows~
+ how~ many~ pages~ to~ expect~ for~ this~ document.
+ \vfil
+}
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+% \section{Legacy \LaTeXe{} interfaces}
+
+
+
+% \begin{macro}{\DiscardShipoutBox}
+% Request that the next shipout box is to be discarded.
+% \begin{macrocode}
+\cs_new_eq:NN \DiscardShipoutBox \shipout_discard:
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\AtBeginDvi}
+%
+% \begin{macrocode}
+\renewcommand \AtBeginDvi {\@@_add_firstpage_material:Nn \AtBeginDvi}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\DebugShipoutOn,\DebugShipoutOff}
+%
+% \begin{macrocode}
+\cs_new_eq:NN \DebugShipoutOn \shipout_debug_on:
+\cs_new_eq:NN \DebugShipoutOff \shipout_debug_off:
+% \end{macrocode}
+% \end{macro}
+
+
+
+
+
+% \section{Package emulation for compatibility}
+
+
+% \subsection{Package \pkg{atbegshi} emulation}
+
+% \begin{macro}{\AtBeginShipoutBox}
+% \begin{macrocode}
+\cs_new_eq:NN \AtBeginShipoutBox \ShipoutBox
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\AtBeginShipoutInit}
+% Compatibility only, we aren't delaying \ldots
+% \begin{macrocode}
+\cs_set_eq:NN\AtBeginShipoutInit\@empty
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\AtBeginShipout,\AtBeginShipoutNext}
+% Filling hooks
+% \begin{macrocode}
+\newcommand\AtBeginShipout {\AddToHook{shipout/before}}
+\newcommand\AtBeginShipoutNext {\AddToHookNext{shipout/before}}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\AtBeginShipoutFirst}
+% Slightly more complex as we need to know the name of the command under which the
+% \hook{shipout/firstpage} hook is filled.
+% \begin{macrocode}
+\newcommand\AtBeginShipoutFirst{\@@_add_firstpage_material:Nn \AtBeginShipoutFirst}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% This is somewhat different from the original where
+% \cs{ShipoutBoxHeight} etc.\ only holds the \verb=\the\ht<box>= value. This
+% may has some implications in some use cases and if that is a problem
+% then it might need changing.
+%
+% \begin{macrocode}
+\cs_new:Npn \ShipoutBoxHeight { \dim_use:N \l_shipout_box_ht_dim }
+\cs_new:Npn \ShipoutBoxDepth { \dim_use:N \l_shipout_box_dp_dim }
+\cs_new:Npn \ShipoutBoxWidth { \dim_use:N \l_shipout_box_wd_dim }
+% \end{macrocode}
+
+
+% \begin{macro}{\AtBeginShipoutDiscard}
+% Just a different name.
+% \begin{macrocode}
+\cs_new_eq:NN \AtBeginShipoutDiscard \DiscardShipoutBox
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\AtBeginShipoutAddToBox,\AtBeginShipoutAddToBoxForeground,
+% \AtBeginShipoutUpperLeft,\AtBeginShipoutUpperLeftForeground}
+% We don't expose them.
+% \begin{macrocode}
+\cs_new_eq:NN \AtBeginShipoutAddToBox \@@_add_background_box:n
+\cs_new_eq:NN \AtBeginShipoutAddToBoxForeground \@@_add_foreground_box:n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\cs_new_eq:NN\AtBeginShipoutUpperLeft \@@_add_background_picture:n
+\cs_new_eq:NN\AtBeginShipoutUpperLeftForeground \@@_add_foreground_picture:n
+% \end{macrocode}
+% \end{macro}
+
+%
+%
+% We prevent the package \pkg{atbegshi} from loading:
+% \begin{macrocode}
+\expandafter\cs_set_eq:NN\csname ver@atbegshi.sty\endcsname\fmtversion
+% \end{macrocode}
+% \pkg{hyperref} code (and \pkg{ltxcmds}) doesn't understand 2020-10-01
+% and thinks it is before 1994, so for now \ldots
+% \begin{macrocode}
+\@namedef {ver@atbegshi.sty}{2020/10/01}
+% \end{macrocode}
+
+
+
+% \subsection{Package \pkg{everyshi} emulation}
+%
+% \begin{macro}{\EveryShipout,\AtNextShipout}
+% This package has only two public commands to simulating it is easy:
+% \begin{macrocode}
+\cs_new_eq:NN\EveryShipout\AtBeginShipout
+\cs_new_eq:NN\AtNextShipout\AtBeginShipoutNext
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\expandafter\cs_set_eq:NN\csname ver@everyshi.sty\endcsname\fmtversion
+\@namedef {ver@everyshi.sty}{2020/10/01}
+% \end{macrocode}
+
+
+
+% \subsection{Package \pkg{atenddvi} emulation}
+%
+% \begin{macro}{\AtEndDvi}
+% This package has only one public command to simulating it is easy:
+% \begin{macrocode}
+\cs_new:Npn \AtEndDvi {\AddToHook{shipout/lastpage}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\expandafter\cs_set_eq:NN\csname ver@atenddvi.sty\endcsname\fmtversion
+\@namedef {ver@atenddvi.sty}{2020/10/01}
+% \end{macrocode}
+
+
+
+
+% \begin{macrocode}
+\ExplSyntaxOff
+%</2ekernel>
+% \end{macrocode}
+
+% \Finale
+%
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\endinput
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx
index dd39a67896..ff6c9ef244 100644
--- a/macros/latex-dev/base/ltvers.dtx
+++ b/macros/latex-dev/base/ltvers.dtx
@@ -115,7 +115,7 @@
{2020-10-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-6}
+\def\patch@level{-7}
% \end{macrocode}
%
% \begin{macro}{\development@branch@name}
diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf
index cee525e113..978ee6da26 100644
--- a/macros/latex-dev/base/ltx3info.pdf
+++ b/macros/latex-dev/base/ltx3info.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltxdoc.dtx b/macros/latex-dev/base/ltxdoc.dtx
index f250b2cb19..3b82ccd759 100644
--- a/macros/latex-dev/base/ltxdoc.dtx
+++ b/macros/latex-dev/base/ltxdoc.dtx
@@ -30,7 +30,7 @@
%
%<class>\NeedsTeXFormat{LaTeX2e}
%<class>\ProvidesClass{ltxdoc}
-%<class> [2019/09/16 v2.0y Standard LaTeX documentation class]
+%<class> [2020/05/17 v2.0z Standard LaTeX documentation class]
%
%<*driver>
\documentclass{ltxdoc}
@@ -422,6 +422,8 @@
\def\partname{File}
% \end{macrocode}
%
+% \changes{v2.0z}{2020/05/17}{Support spaces \emph{within} filenames
+% (gh/218)}
% \begin{macrocode}
\newcommand*{\DocInclude}[1]{%
\relax
@@ -432,13 +434,16 @@
{\def\currentfile{#1.dtx}}%
\ifnum\@auxout=\@partaux
\@latexerr{\string\include\space cannot be nested}\@eha
- \else \@docinclude#1 \fi}
+ \else
+ \set@curr@file@trim@spaces{#1}%
+ \expandafter\@docinclude\expandafter{\@curr@file}
+ \fi}
\def\@docinclude#1 {\clearpage
-\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi
+\if@filesw \immediate\write\@mainaux{\string\@input{"#1.aux"}}\fi
\@tempswatrue\if@partsw \@tempswafalse\edef\@tempb{#1}\@for
\@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi
\if@tempswa \let\@auxout\@partaux \if@filesw
-\immediate\openout\@partaux #1.aux
+\immediate\openout\@partaux "#1.aux"
\immediate\write\@partaux{\relax}\fi
% \end{macrocode}
% We need to save (and later restore) various index-related
diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf
index ed04747867..f6e9112d73 100644
--- a/macros/latex-dev/base/ltxdoc.pdf
+++ b/macros/latex-dev/base/ltxdoc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf
index fc3f0bb507..3b35cf18bf 100644
--- a/macros/latex-dev/base/makeindx.pdf
+++ b/macros/latex-dev/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex-dev/base/manual.pdf b/macros/latex-dev/base/manual.pdf
index 19aca62958..c0e6bba420 100644
--- a/macros/latex-dev/base/manual.pdf
+++ b/macros/latex-dev/base/manual.pdf
Binary files differ
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
index 8b9cf82d07..1a7d261cd3 100644
--- a/macros/latex-dev/base/modguide.pdf
+++ b/macros/latex-dev/base/modguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf
index bd5c9aef0f..b1f82eb3eb 100644
--- a/macros/latex-dev/base/nfssfont.pdf
+++ b/macros/latex-dev/base/nfssfont.pdf
Binary files differ
diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf
index 4a2bf11846..b86a51575c 100644
--- a/macros/latex-dev/base/proc.pdf
+++ b/macros/latex-dev/base/proc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf
index 5922db016b..73f6b017a8 100644
--- a/macros/latex-dev/base/slides.pdf
+++ b/macros/latex-dev/base/slides.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf
index 638b84873b..1236827191 100644
--- a/macros/latex-dev/base/slifonts.pdf
+++ b/macros/latex-dev/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf
index 882d7b2cc6..2e8a083187 100644
--- a/macros/latex-dev/base/source2e.pdf
+++ b/macros/latex-dev/base/source2e.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.tex b/macros/latex-dev/base/source2e.tex
index ccb19a8b2e..3529d43737 100644
--- a/macros/latex-dev/base/source2e.tex
+++ b/macros/latex-dev/base/source2e.tex
@@ -242,6 +242,8 @@ page_precedence "rnaA"
\DocInclude{ltvers} % Current version date
+ \DocInclude{ltluatex} % Luatex support
+
\DocInclude{ltdefns} % Initial definitions.
\DocInclude{ltalloc} % Allocation of counters and others.
@@ -318,8 +320,6 @@ page_precedence "rnaA"
\DocInclude{lthyphen} % Hyphenation (hyphen.ltx).
- \DocInclude{ltluatex} % Luatex support
-
\DocInclude{ltfinal} % Last minute initialisations and dump
\includeltpatch % Corrections distributed after the full release
diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf
index e2387a21b2..689a9b868b 100644
--- a/macros/latex-dev/base/syntonly.pdf
+++ b/macros/latex-dev/base/syntonly.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf
index 90de5dd226..4ed83c61ba 100644
--- a/macros/latex-dev/base/tlc2.pdf
+++ b/macros/latex-dev/base/tlc2.pdf
Binary files differ
diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf
index 483f155a56..858d723cf0 100644
--- a/macros/latex-dev/base/tulm.pdf
+++ b/macros/latex-dev/base/tulm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/unpack.ins b/macros/latex-dev/base/unpack.ins
index b03dd5c6b1..ed8cb572c7 100644
--- a/macros/latex-dev/base/unpack.ins
+++ b/macros/latex-dev/base/unpack.ins
@@ -123,6 +123,7 @@
\batchinput{latexrelease.ins}
+\batchinput{lthooks.ins}
\Msg{}
\Msg{*********************************************}
diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf
index a2dcf1b785..de2858ad8e 100644
--- a/macros/latex-dev/base/usrguide.pdf
+++ b/macros/latex-dev/base/usrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf
index c27ce9669b..644e2935e3 100644
--- a/macros/latex-dev/base/utf8ienc.pdf
+++ b/macros/latex-dev/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf
index 32a69c71c9..2e8dc80d01 100644
--- a/macros/latex-dev/base/webcomp.pdf
+++ b/macros/latex-dev/base/webcomp.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/README.md b/macros/latex-dev/required/graphics/README.md
index 9195e612d1..08cd8cabde 100644
--- a/macros/latex-dev/required/graphics/README.md
+++ b/macros/latex-dev/required/graphics/README.md
@@ -1,7 +1,7 @@
The LaTeX `graphics` bundle
===========================
-Release 2020-10-01 pre-release 1
+Release 2020-10-01 pre-release 2
Overview
--------
diff --git a/macros/latex-dev/required/graphics/changes.txt b/macros/latex-dev/required/graphics/changes.txt
index 42ce0dea02..bbe1893e63 100644
--- a/macros/latex-dev/required/graphics/changes.txt
+++ b/macros/latex-dev/required/graphics/changes.txt
@@ -4,6 +4,10 @@ completeness or accuracy and it contains some references to files that
are not part of the distribution.
=======================================================================
+2020-05-28 David Carlisle <David.Carlisle@latex-project.org>
+
+ * lscape.dtx: delay saving \cs{@makefcolumn} gh340
+
2020-02-24 Ulrike Fischer <Ulrike.Fischer@latex-project.org>
* color.dtx: corrected a tests, graphics/3635
diff --git a/macros/latex-dev/required/graphics/color.pdf b/macros/latex-dev/required/graphics/color.pdf
index 4749ea345f..dca850b128 100644
--- a/macros/latex-dev/required/graphics/color.pdf
+++ b/macros/latex-dev/required/graphics/color.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/drivers.pdf b/macros/latex-dev/required/graphics/drivers.pdf
index 418d8f8f47..3e6c1a9d76 100644
--- a/macros/latex-dev/required/graphics/drivers.pdf
+++ b/macros/latex-dev/required/graphics/drivers.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/epsfig.pdf b/macros/latex-dev/required/graphics/epsfig.pdf
index 3949a190c2..816d353c51 100644
--- a/macros/latex-dev/required/graphics/epsfig.pdf
+++ b/macros/latex-dev/required/graphics/epsfig.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/graphics.pdf b/macros/latex-dev/required/graphics/graphics.pdf
index f7fb560c23..aeac04b4c0 100644
--- a/macros/latex-dev/required/graphics/graphics.pdf
+++ b/macros/latex-dev/required/graphics/graphics.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/graphicx.pdf b/macros/latex-dev/required/graphics/graphicx.pdf
index 75b1f1e532..6bc77b28ee 100644
--- a/macros/latex-dev/required/graphics/graphicx.pdf
+++ b/macros/latex-dev/required/graphics/graphicx.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/grfguide.pdf b/macros/latex-dev/required/graphics/grfguide.pdf
index caf1b70912..b385e64957 100644
--- a/macros/latex-dev/required/graphics/grfguide.pdf
+++ b/macros/latex-dev/required/graphics/grfguide.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/keyval.pdf b/macros/latex-dev/required/graphics/keyval.pdf
index 8536c2c716..cbefa8b143 100644
--- a/macros/latex-dev/required/graphics/keyval.pdf
+++ b/macros/latex-dev/required/graphics/keyval.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/lscape.dtx b/macros/latex-dev/required/graphics/lscape.dtx
index e14462c9d4..ac5c16d7c2 100644
--- a/macros/latex-dev/required/graphics/lscape.dtx
+++ b/macros/latex-dev/required/graphics/lscape.dtx
@@ -17,7 +17,7 @@
%<driver> \ProvidesFile{lscape.drv}
% \fi
% \ProvidesFile{lscape.dtx}
- [2000/10/22 v3.01 Landscape Pages (DPC)]
+ [2020/05/28 v3.02 Landscape Pages (DPC)]
%
% \iffalse
%<*driver>
@@ -61,6 +61,7 @@
% \changes{v3.00}{1994/10/05}{Update using LaTeX2e graphics package}
% \changes{v3.01}{1999/06/22}{Added better pdfTeX support
% by Scott Pakin, from graphics/3063}
+% \changes{v3.02}{2020/05/28}{delay saving \cs{@makefcolumn} gh340}
%
%
% \begin{macrocode}
@@ -90,8 +91,6 @@
% \end{macrocode}
%
% \begin{macrocode}
-\let\LS@makecol=\@makecol
-\let\LS@makefcolumn=\@makefcolumn
\def\LS@rot{%
\setbox\@outputbox\vbox{\hbox{\rotatebox{90}{\box\@outputbox}}}}
% \end{macrocode}
@@ -99,6 +98,8 @@
% First set up the page size for landscape.
% \begin{macrocode}
\def\landscape{%
+ \let\LS@makecol=\@makecol
+ \let\LS@makefcolumn=\@makefcolumn
\clearpage
\begingroup
\vsize=\textwidth
diff --git a/macros/latex-dev/required/graphics/lscape.pdf b/macros/latex-dev/required/graphics/lscape.pdf
index 02d9c42d63..020b0f8af2 100644
--- a/macros/latex-dev/required/graphics/lscape.pdf
+++ b/macros/latex-dev/required/graphics/lscape.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/rotating.pdf b/macros/latex-dev/required/graphics/rotating.pdf
index 5abe51370c..822bc41879 100644
--- a/macros/latex-dev/required/graphics/rotating.pdf
+++ b/macros/latex-dev/required/graphics/rotating.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/rotex.pdf b/macros/latex-dev/required/graphics/rotex.pdf
index 98919825a3..2481248e53 100644
--- a/macros/latex-dev/required/graphics/rotex.pdf
+++ b/macros/latex-dev/required/graphics/rotex.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/trig.pdf b/macros/latex-dev/required/graphics/trig.pdf
index 9863ea585e..08570f5753 100644
--- a/macros/latex-dev/required/graphics/trig.pdf
+++ b/macros/latex-dev/required/graphics/trig.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/README.md b/macros/latex-dev/required/tools/README.md
index 9167c2292c..1cc4996d92 100644
--- a/macros/latex-dev/required/tools/README.md
+++ b/macros/latex-dev/required/tools/README.md
@@ -1,7 +1,7 @@
The LaTeX `tools` bundle
========================
-Release 2020-10-01 pre-release 3
+Release 2020-10-01 pre-release 4
Overview
--------
diff --git a/macros/latex-dev/required/tools/afterpage.pdf b/macros/latex-dev/required/tools/afterpage.pdf
index 8b7c701c7a..a23f13ee6d 100644
--- a/macros/latex-dev/required/tools/afterpage.pdf
+++ b/macros/latex-dev/required/tools/afterpage.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/array.dtx b/macros/latex-dev/required/tools/array.dtx
index a84d4faf51..ff963d7f51 100644
--- a/macros/latex-dev/required/tools/array.dtx
+++ b/macros/latex-dev/required/tools/array.dtx
@@ -33,7 +33,7 @@
%<+package>\DeclareCurrentRelease{}{2020-10-01}
%<+package>
%<+package>\ProvidesPackage{array}
-%<+package> [2020/10/01 v2.5b Tabular extension package (FMi)]
+%<+package> [2020/10/01 v2.5c Tabular extension package (FMi)]
%
% \fi
%
@@ -552,14 +552,16 @@
% \item rules can be placed between columns or rows thereby enlarging
% the table.
% \end{enumerate}
-% \texttt{array.sty} implements the second possibility while the
-% default implementation in the \LaTeX{} kernel implements the first
-% concept. Both concepts have their merits but one has to be aware of
-% the individual implications.
+% For vertical rules \texttt{array.sty} implements the second
+% possibility while the default implementation in the \LaTeX{} kernel
+% implements the first concept.
+% Both concepts have their merits but
+% one has to be aware of the individual implications.
% \begin{itemize}
% \item
-% With standard \LaTeX{} adding rules to a table will not affect the
-% width or height of the table (unless double rules are used), e.g.,
+% With standard \LaTeX{} adding vertical rules to a table will
+% not affect the
+% width of the table (unless double rules are used), e.g.,
% changing a preamble from \verb=lll= to \verb=l|l|l= does not
% affect the document other than adding rules to the table. In
% contrast, with \texttt{array.sty} a table that just fit the
@@ -602,6 +604,12 @@
% \end{center}
% \end{itemize}
%
+% Horizontal rules produced with \cs{hline} add to the table height in
+% both implementations but they differ in handling double \cs{hline}s.
+% In contrast a \cs{cline} does not change the table
+% height.\footnote{All a bit inconsistent, but nothing that can be
+% changed after being 30+ years in existence.}
+%
% \subsection{Comparisons with older versions of \texttt{array.sty}}
%
% There are some differences in the way version 2.1 treats incorrect
@@ -731,7 +739,11 @@
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\documentclass{ltxdoc}
-\AtBeginDocument{\DeleteShortVerb{\|}} % undo the default is not used
+% undo the default is not used:
+
+\IfFormatAtLeastTF {2020/10/01}
+ {\AtBeginDocument[ltxdoc]{\DeleteShortVerb{\|}} }
+ {\AtBeginDocument{\DeleteShortVerb{\|}} }
\usepackage{array}
@@ -747,6 +759,7 @@
%\OnlyDescription % comment out for implementation details
%\OldMakeindex % use if your MakeIndex is pre-v2.9
+
\begin{document}
\DocInput{array.dtx}
\end{document}
@@ -2210,7 +2223,7 @@
% \cs{@yargarraycr} is the same as in the \LaTeX{} kernel
% (depending on the date of the kernel with one of the two
% definitions below). We therefore do not define it again.
-% \changes{v2.5b}{200/04/22}{Don't define \cs{@yargarraycr} unnecessarily}
+% \changes{v2.5b}{2020/04/22}{Don't define \cs{@yargarraycr} unnecessarily}
% \begin{macrocode}
%\def\@yargarraycr#1{\cr\noalign{\@vspace@calcify{#1}}} % 2020-10-01
%\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
@@ -2922,10 +2935,13 @@
%
% We start by producing a single tabular row without any visible
% content that will produce the external reference point in case
-% "[t]" is used.
+% "[t]" is used. We need to suppress the \cs{tabcolsep} in the
+% \cs{multicolumn} in case there wasn't any in the real column.
+%
+% \changes{v2.5c}{2020/07/20}{Suppress all column space (gh/322)}
% \begin{macrocode}
\newcommand{\firsthline}{%
- \multicolumn1c{%
+ \multicolumn1{@{}c@{}}{%
% \end{macrocode}
% Within this row we calculate "\backup@length" to be the height
% plus depth of a standard line. In addition we have to add the
@@ -2942,6 +2958,10 @@
% \begin{macrocode}
\raise\extratabsurround\copy\@arstrutbox
% \end{macrocode}
+% And we should also cancel the guard otherwise we end up with two.
+% \begin{macrocode}
+ \kern-1sp%
+% \end{macrocode}
% Having done all this we end the line and back up by the value of
% "\backup@length" and then finally place our "\hline". This should
% place the line exactly at the right place but keep the reference
@@ -2963,9 +2983,12 @@
% depth of this last line increased by "\extratabsurround" without
% changing the placement "\hline".
%
-% We start by placing the rule followed by an invisible row.
+% We start by placing the rule followed by an invisible row. We
+% need to suppress the \cs{tabcolsep} in the multicol in case there
+% wasn't any in the real column.
+% \changes{v2.5c}{2020/07/20}{Suppress all column space (gh/322)}
% \begin{macrocode}
-\newcommand{\lasthline}{\hline\multicolumn1c{%
+\newcommand{\lasthline}{\hline\multicolumn1{@{}c@{}}{%
% \end{macrocode}
% We now calculate "\backup@length" to be the height and depth of
% two lines plus the width of the rule.
@@ -2983,8 +3006,9 @@
% reference for the whole tabular). Since this row is invisible we
% can enlarge its depth by the desired amount.
% \begin{macrocode}
- \multicolumn1c{%
+ \multicolumn1{@{}c@{}}{%
\lower\extratabsurround\copy\@arstrutbox
+ \kern-1sp%
}%
}
% \end{macrocode}
diff --git a/macros/latex-dev/required/tools/array.pdf b/macros/latex-dev/required/tools/array.pdf
index 508b57f29b..af15a8f1d7 100644
--- a/macros/latex-dev/required/tools/array.pdf
+++ b/macros/latex-dev/required/tools/array.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/bm.pdf b/macros/latex-dev/required/tools/bm.pdf
index b780310b89..d6a1d0c8a5 100644
--- a/macros/latex-dev/required/tools/bm.pdf
+++ b/macros/latex-dev/required/tools/bm.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/calc.pdf b/macros/latex-dev/required/tools/calc.pdf
index bb3cbeacf0..e507bc2536 100644
--- a/macros/latex-dev/required/tools/calc.pdf
+++ b/macros/latex-dev/required/tools/calc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/changes.txt b/macros/latex-dev/required/tools/changes.txt
index fc18afe98a..b06956271d 100644
--- a/macros/latex-dev/required/tools/changes.txt
+++ b/macros/latex-dev/required/tools/changes.txt
@@ -5,11 +5,28 @@ completeness or accuracy and it contains some references to files that
are not part of the distribution.
=======================================================================
+2020-07-20 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx (subsection{Support for \firsthline ...):
+ Ensure that the tabular width isn't changed (gh/322)
+
+ * array.dtx (subsection{Handling of rules}):
+ Clarified the handling of rules, no code change (gh/319).
+
+ * varioref.dtx (subsection{Options}):
+ Option japanese added (gh/352)
+
+2020-06-06 Johannes Braams <Johannes.Braams@latex-project.org>
+
+ * verbatim.dtx: Save the value if \@filef@und before the call to
+ \@verbatim to make sure that \verbatiminput reads the right
+ file. (gh/222).
+
2020-05-10 Johannes Braams <Johannes.Braams@latex-project.org>
* xr.dtx: Remove leading and trailing spaces from the argument to
\externaldocument, making sure that spaces *in* filenames are
- supprted (gh/217).
+ supprted (gh/217).
2020-04-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
diff --git a/macros/latex-dev/required/tools/dcolumn.pdf b/macros/latex-dev/required/tools/dcolumn.pdf
index d6cf6917e8..c0d24f3df9 100644
--- a/macros/latex-dev/required/tools/dcolumn.pdf
+++ b/macros/latex-dev/required/tools/dcolumn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/delarray.pdf b/macros/latex-dev/required/tools/delarray.pdf
index c171247f78..4d6ad2efcd 100644
--- a/macros/latex-dev/required/tools/delarray.pdf
+++ b/macros/latex-dev/required/tools/delarray.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/enumerate.pdf b/macros/latex-dev/required/tools/enumerate.pdf
index 753327a1ab..e2efd5f4e4 100644
--- a/macros/latex-dev/required/tools/enumerate.pdf
+++ b/macros/latex-dev/required/tools/enumerate.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fileerr.pdf b/macros/latex-dev/required/tools/fileerr.pdf
index 6e98faa540..bf6941329c 100644
--- a/macros/latex-dev/required/tools/fileerr.pdf
+++ b/macros/latex-dev/required/tools/fileerr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fontsmpl.pdf b/macros/latex-dev/required/tools/fontsmpl.pdf
index a8cfedb50a..1e989bbf8b 100644
--- a/macros/latex-dev/required/tools/fontsmpl.pdf
+++ b/macros/latex-dev/required/tools/fontsmpl.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/ftnright.pdf b/macros/latex-dev/required/tools/ftnright.pdf
index adea07ca13..21f5d84058 100644
--- a/macros/latex-dev/required/tools/ftnright.pdf
+++ b/macros/latex-dev/required/tools/ftnright.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/hhline.pdf b/macros/latex-dev/required/tools/hhline.pdf
index 934fe19a13..e5adddce65 100644
--- a/macros/latex-dev/required/tools/hhline.pdf
+++ b/macros/latex-dev/required/tools/hhline.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/indentfirst.pdf b/macros/latex-dev/required/tools/indentfirst.pdf
index b03eec1024..96c0754ff7 100644
--- a/macros/latex-dev/required/tools/indentfirst.pdf
+++ b/macros/latex-dev/required/tools/indentfirst.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/layout.pdf b/macros/latex-dev/required/tools/layout.pdf
index 65c765dbc0..78737b787b 100644
--- a/macros/latex-dev/required/tools/layout.pdf
+++ b/macros/latex-dev/required/tools/layout.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/longtable.pdf b/macros/latex-dev/required/tools/longtable.pdf
index e2efb5af88..0d6ec2e8dd 100644
--- a/macros/latex-dev/required/tools/longtable.pdf
+++ b/macros/latex-dev/required/tools/longtable.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/multicol.pdf b/macros/latex-dev/required/tools/multicol.pdf
index 5749c44295..087a089b43 100644
--- a/macros/latex-dev/required/tools/multicol.pdf
+++ b/macros/latex-dev/required/tools/multicol.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/rawfonts.pdf b/macros/latex-dev/required/tools/rawfonts.pdf
index ac87123c56..24240a6b22 100644
--- a/macros/latex-dev/required/tools/rawfonts.pdf
+++ b/macros/latex-dev/required/tools/rawfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/shellesc.pdf b/macros/latex-dev/required/tools/shellesc.pdf
index 45dcd372a2..363244517d 100644
--- a/macros/latex-dev/required/tools/shellesc.pdf
+++ b/macros/latex-dev/required/tools/shellesc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/showkeys.pdf b/macros/latex-dev/required/tools/showkeys.pdf
index 853da80f2b..2651d5f308 100644
--- a/macros/latex-dev/required/tools/showkeys.pdf
+++ b/macros/latex-dev/required/tools/showkeys.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/somedefs.pdf b/macros/latex-dev/required/tools/somedefs.pdf
index a0b4cab54d..5a8e6f9981 100644
--- a/macros/latex-dev/required/tools/somedefs.pdf
+++ b/macros/latex-dev/required/tools/somedefs.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tabularx.pdf b/macros/latex-dev/required/tools/tabularx.pdf
index ac1b6bf40e..29171267e0 100644
--- a/macros/latex-dev/required/tools/tabularx.pdf
+++ b/macros/latex-dev/required/tools/tabularx.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/theorem.pdf b/macros/latex-dev/required/tools/theorem.pdf
index a3695260c7..baa8ebf95e 100644
--- a/macros/latex-dev/required/tools/theorem.pdf
+++ b/macros/latex-dev/required/tools/theorem.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tools-overview.pdf b/macros/latex-dev/required/tools/tools-overview.pdf
index 599af2d14f..16764202ae 100644
--- a/macros/latex-dev/required/tools/tools-overview.pdf
+++ b/macros/latex-dev/required/tools/tools-overview.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/trace.pdf b/macros/latex-dev/required/tools/trace.pdf
index 07e50dc222..4cf9f71bfd 100644
--- a/macros/latex-dev/required/tools/trace.pdf
+++ b/macros/latex-dev/required/tools/trace.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/varioref.dtx b/macros/latex-dev/required/tools/varioref.dtx
index 077103eb97..06af00bc28 100644
--- a/macros/latex-dev/required/tools/varioref.dtx
+++ b/macros/latex-dev/required/tools/varioref.dtx
@@ -40,7 +40,7 @@
%<package>\DeclareCurrentRelease{}{2019-10-01}
%<package>
%<package>\ProvidesPackage{varioref}
-%<package> [2020/01/23 v1.6c package for extended references (FMi)]
+%<package> [2020/07/20 v1.6d package for extended references (FMi)]
% \fi
%
%%
@@ -230,6 +230,11 @@
% The optional argument the command may take is the text to use in case
% both labels are placed on the current page.
%
+% In some languages (currently only for Japanese) the generated text
+% has to typeset the page range first and the reference range
+% afterwards. To accomodate for this \cs{vrefrangeformat} has been
+% added to allow to alter this on a per language basis.
+%
%
% \DescribeMacro\vpagerefrange This command is similar to |\vpageref|
% but takes two mandatory arguments which are two labels denoting a
@@ -708,6 +713,7 @@
\def\reftextfaraway#1{op bladsy~\pageref{#1}}%
\def\reftextpagerange#1#2{op bladsye~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} tot~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
%
@@ -723,6 +729,7 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Arabic option text was contributed by Ihab Samir Mattar
@@ -743,6 +750,7 @@
\def\reftextfaraway#1{بالصفحة رقم~\pageref{#1}}%
\def\reftextpagerange#1#2{بالصفحات~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} حتى~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \end{allowtofu}
@@ -759,6 +767,7 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2d}{2000/01/11}{Added naustrian defaults (identical to german)}
@@ -774,6 +783,7 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for basque defaults was contributed by
@@ -791,6 +801,7 @@
\def\reftextfaraway#1{~\pageref{#1}. orrialdean}%
\def\reftextpagerange#1#2{~\pageref{#1}--\pageref{#2} orrialdeetan}%
\def\reftextlabelrange#1#2{\ref{#1}.etik \ref{#2}.eraino}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for the Bahasa Malaysia defaults was contributed by
@@ -815,6 +826,7 @@
\def\reftextfaraway#1{pada muka surat~\pageref{#1}}%
\def\reftextpagerange#1#2{pada muka surat~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for brazil defaults was contributed by
@@ -837,6 +849,7 @@
\def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
\def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for Breton defaults was contributed by
@@ -858,6 +871,7 @@
on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for Bulgarian defaults was contributed by
@@ -892,6 +906,7 @@
\cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyri
~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \cyrd\cyro~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for catalan defaults was contributed by Robert Fuster\\
@@ -910,6 +925,7 @@
\def\reftextpagerange#1#2{a les
p\`agines~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for croatian defaults was contributed by \v{S}ime Ungar
@@ -926,6 +942,7 @@
\def\reftextfaraway#1{na stranici~\pageref{#1}}%
\def\reftextpagerange#1#2{na stranicama~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} do~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for the Czech option provided by Milan Vancura
@@ -943,6 +960,7 @@
\def\reftextfaraway#1{na stran\v{e}~\pageref{#1}}%
\def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}\--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a\v{z}~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for Danish provided by Torsten Martinsen
@@ -965,6 +983,7 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Default string for dutch have been contributed by Frank Poppe
@@ -1004,6 +1023,7 @@
% \begin{macrocode}
\def\reftextpagerange#1#2{op pagina's~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2a}{1998/08/22}{Added english defaults for
@@ -1021,6 +1041,7 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
%
@@ -1041,6 +1062,7 @@
\def\reftextfaraway#1{en pa\^go~\pageref{#1}}%
\def\reftextpagerange#1#2{en pa\^goj~\pageref{#1} \^gis \pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \^gis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The finnish strings were suggested by Matti Rintala
@@ -1064,6 +1086,7 @@
% Can't combine numbers with the necessary suffix well.
% \begin{macrocode}
\def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% French defaults are provided by Daniel Flippo
@@ -1083,6 +1106,7 @@
\def\reftextfaraway#1{page~\pageref{#1}}%
\def\reftextpagerange#1#2{pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} \`a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Galician defaults are provided by Matthias Moebius\\
@@ -1104,6 +1128,7 @@
\def\reftextpagerange#1#2{%
nas p\'axinas~\pageref{#1}-\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% There are no good variants for German (I think and still think but
@@ -1138,6 +1163,7 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% \changes{v1.2d}{2000/01/11}{Added ngerman defaults (identical to german)}
@@ -1155,6 +1181,7 @@
\def\reftextfaraway#1{auf Seite~\pageref{#1}}%
\def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for greek suggested by Apostolos Syropoulos\\
@@ -1174,6 +1201,7 @@
\def\reftextpagerange#1#2{stis sel'ides\nobreakspace
\pageref{#1}---\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} ws\nobreakspace\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Icelandic defaults suggested by Thorhallur Sverrisson
@@ -1194,6 +1222,7 @@
\def\reftextfaraway#1{\'{a} s\'{i}{\dh}u~\pageref{#1}}%
\def\reftextpagerange#1#2{\'{a} s\'{i}{\dh}um~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Defaults for Italian suggested by Giovanni Pensa
@@ -1218,8 +1247,32 @@
\def\reftextfaraway#1{a pagina~\pageref{#1}}%
\def\reftextpagerange#1#2{nelle pagine~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{da~\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
+ }}
+% \end{macrocode}
+% Defaults for Japanese. It needs a special \cs{vrefrangeformat}
+% for gramatical 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.
+% \changes{v1.6d}{2020/07/20}{Option japanese added (gh/352)}
+% \begin{allowtofu}
+% \begin{macrocode}
+\DeclareOption{japanese}
+ {\vref@addto\extrasjapanese{%
+ \def\reftextfaceafter {\reftextvario{見開き}{次}頁}%
+ \def\reftextfacebefore{\reftextvario{見開き}{前}頁}%
+ \def\reftextafter {\reftextvario{直後の}{次}頁}%
+ \def\reftextbefore {\reftextvario{直前の}{前}頁}%
+ \def\reftextcurrent {\reftextvario{この}{現}頁}%
+ \def\reftextfaraway#1{\pageref{#1}頁}%
+ \def\reftextpagerange#1#2{\pageref{#1}頁から\pageref{#2}頁}%
+ \def\reftextlabelrange#1#2{\ref{#1}から\ref{#2}}%
+ \def\vrefrangeformat#1#2#3{\vpagerefrange[{#1}]{#2}{#3}の%
+ \reftextlabelrange{#2}{#3}}%
}}
% \end{macrocode}
+% \end{allowtofu}
% Defaults for Hungarian by Jeff Goldberg
% (\verb=jeffrey@goldmark.org=).
% There is a problem with the use of the definite article
@@ -1264,6 +1317,7 @@
on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}%
% \end{macrocode}
% The |\AtBeginDocument| needs to be executed when the option is
@@ -1304,6 +1358,7 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
\DeclareOption{nynorsk}
{\vref@addto\extrasnynorsk{%
@@ -1315,6 +1370,7 @@
\def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
\def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The polish translations have been provided by
@@ -1342,6 +1398,7 @@
\def\reftextfaraway#1{na stronie~\pageref{#1}}%
\def\reftextpagerange#1#2{na stronach~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The portuguese default text has been provided by
@@ -1362,6 +1419,7 @@
\def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
\def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Updates to the default text for Romanian have been suggested by Florin Oprina
@@ -1381,6 +1439,7 @@
\def\reftextfaraway#1{pe pagina~\pageref{#1}}%
\def\reftextpagerange#1#2{pe paginile~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} la~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for russian was taken from the book in Russian by
@@ -1414,6 +1473,7 @@
\def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn
\cyri\cyrc\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\cyrs~\ref{#1}\ \cyrp\cyro~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for slovak defaults was contributed by Miroslav Sedivy\\
@@ -1434,6 +1494,7 @@
\def\reftextfaraway#1{na strane~\pageref{#1}}%
\def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a\v z~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for slovene defaults was contributed by Roman Maurer\\
@@ -1450,6 +1511,7 @@
\def\reftextfaraway#1{na strani~\pageref{#1}}%
\def\reftextpagerange#1#2{na straneh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% Text for spanish defaults was contributed by Julio Sanchez
@@ -1470,6 +1532,7 @@
\def\reftextpagerange#1#2{en las p\'aginas~\pageref{#1}%
-\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for swedish was contributed by Mats Dahlgren
@@ -1492,6 +1555,7 @@
\def\reftextpagerange#1#2{p\aa\
sidorna~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} till~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
\DeclareOption{turkish}
{\vref@excuse{turkish}%
@@ -1505,6 +1569,7 @@
\def\reftextfaraway#1{on page~\pageref{#1}}%
\def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% The text for Ukrainian defaults was contributed by Mykola Lyakhovych\\
@@ -1532,6 +1597,7 @@
\def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyro\cyrr\cyrii
\cyrn\cyrk\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
\def\reftextlabelrange#1#2{\cyrz~\ref{#1}\ \cyrd\cyro~\ref{#2}}%
+ \let\vrefrangeformat\vrefrangedefaultformat
}}
% \end{macrocode}
% We support francais as an alternative to french since people
@@ -2286,13 +2352,28 @@
% \changes{v1.2a}{1998/08/01}{Macro added}
% \changes{v1.4s}{2006/08/07}
% {Prevent loss of brackets}
+% \changes{v1.6d}{2020/07/20}{Changed for Japanese (gh/352)}
+% Argument two and three are implicitly picked up.
% \begin{macrocode}
-\newcommand\vrefrange[3][\reftextcurrent]
- {\reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+\newcommand\vrefrange[1][\reftextcurrent]{\vrefrangeformat{#1}}
% \end{macrocode}
+%
% \end{macro}
%
%
+% \begin{macro}{\vrefrangeformat,\vrefrangedefaultformat}
+% Japanese needs a different word order in \cs{vrefrange} so this
+% is separated out o that it can be changed on language level.
+% \changes{v1.6d}{2020/07/20}{Macro added (gh/352)}
+% \begin{macrocode}
+\def\vrefrangedefaultformat#1#2#3{%
+ \reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+% \end{macrocode}
+% Most languages need the above definition.
+% \begin{macrocode}
+\let\vrefrangeformat\vrefrangedefaultformat
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\Vref}
% \changes{v1.4a}{2002/02/24}{Macro added}
diff --git a/macros/latex-dev/required/tools/varioref.pdf b/macros/latex-dev/required/tools/varioref.pdf
index 2ecf15a73a..4f6e71a2a2 100644
--- a/macros/latex-dev/required/tools/varioref.pdf
+++ b/macros/latex-dev/required/tools/varioref.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/verbatim.dtx b/macros/latex-dev/required/tools/verbatim.dtx
index 121e2d4b39..e62886e003 100644
--- a/macros/latex-dev/required/tools/verbatim.dtx
+++ b/macros/latex-dev/required/tools/verbatim.dtx
@@ -69,6 +69,8 @@
%\fi
%
%
+% \changes{v1.5u}{2020-07-07}{Typo repair and added a missing comment
+% character}
% \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular
% request.}
% \changes{v1.5i}{1996/06/04}{Move setting of verbatim font and
@@ -462,9 +464,12 @@
% the spacing.
% Then we open the file and set the category codes of all special
% characters:
+% \changes{v1.5t}{2020-07-05}{Added quotes around the filename in
+% order to allow a filename with spaces; also added a space and
+% comment-character to allow for thespace dlimited argument.}
% \begin{verbatim}
% \@bsphack
-% \immediate\openout \verbatim@out #1
+% \immediate\openout \verbatim@out "#1" %
% \let\do\@makeother\dospecials
% \catcode`\^^M\active
%\end{verbatim}
@@ -503,7 +508,7 @@
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{verbatim}
- [2019/11/10 v1.5r LaTeX2e package for verbatim enhancements]
+ [2020-07-07 v1.5u LaTeX2e package for verbatim enhancements]
\@ifundefined{verbatim@@@}{}{\endinput}
% \end{macrocode}
%
@@ -1567,19 +1572,31 @@
% existence of file.}
% |\verbatim@input| first checks whether the file exists, using
% the standard macro |\IfFileExists| which leaves the name of the
-% file found in |\@filef@und|.
-% Then everything is set up as in the |\verbatim| macro.
+% file found in |\@filef@und|.
+% Then everything is set up as in the |\verbatim| macro. But, as
+% |\@verbatim| contains a call to |\every@verbatim| which
+% \emph{might} contain an |\input| statement, which would overwrite
+% the contents of |\@filef@und|, we need to save it by expanding it
+% first. The use of |\@swaptwoargs| makes it so that the
+% \emph{expansion} of |\@filef@und| gets to be the second argument
+% of |\verbatim@readfile|.
+% \changes{v1.5t}{2020-07-06}{Expand \cs{@filef@und} before the call
+% of \cs{@verbatim} (gh/222)}m
% \begin{macrocode}
\def\verbatim@input#1#2{%
- \IfFileExists {#2}{\@verbatim #1\relax
+ \IfFileExists {#2}{%
+ \expandafter\@swaptwoargs\expandafter
+ {\expandafter{\@filef@und}}%
+ {\@verbatim #1\relax
% \end{macrocode}
% Then it reads in the file, finishes off the \texttt{trivlist}
% environment started by |\@verbatim| and closes the group.
% This restores everything to its normal settings.
% \begin{macrocode}
- \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
+ \verbatim@readfile}%
+ \endtrivlist\endgroup\@doendpe}%
% \end{macrocode}
-% If the file is not found a more or less helpful message is
+% If the file is not found a more or less helpful message is
% printed. The final |\endgroup| is needed to close the group
% started in |\verbatiminput| above.
% \begin{macrocode}
diff --git a/macros/latex-dev/required/tools/verbatim.pdf b/macros/latex-dev/required/tools/verbatim.pdf
index b0452349ba..3f3905dbc3 100644
--- a/macros/latex-dev/required/tools/verbatim.pdf
+++ b/macros/latex-dev/required/tools/verbatim.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xr.pdf b/macros/latex-dev/required/tools/xr.pdf
index 8e3c988fc2..90910f21cc 100644
--- a/macros/latex-dev/required/tools/xr.pdf
+++ b/macros/latex-dev/required/tools/xr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xspace.pdf b/macros/latex-dev/required/tools/xspace.pdf
index 7eeda19972..4a4c7f2dde 100644
--- a/macros/latex-dev/required/tools/xspace.pdf
+++ b/macros/latex-dev/required/tools/xspace.pdf
Binary files differ
diff --git a/macros/latex/contrib/achemso/CHANGELOG.md b/macros/latex/contrib/achemso/CHANGELOG.md
index c2b7a3dac8..3c6c98dbad 100644
--- a/macros/latex/contrib/achemso/CHANGELOG.md
+++ b/macros/latex/contrib/achemso/CHANGELOG.md
@@ -4,8 +4,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a
Changelog](https://keepachangelog.com/en/1.0.0/).
+## [Unreleased]
+
+## [v3.13b]
+### Added
+- Style for _Acc. Mater. Res._ (`amrcda`)
+- Style for _ACS Agr. Sci. Tech._ (`aastgj`)
+- Style for _ACS Food Sci. Tech._ (`afsthl`)
+
## [v3.13a]
-## Fixed
+### Fixed
- Swap TOC height and width to give landscape output
## [v3.13]
@@ -455,7 +463,9 @@ Changelog](https://keepachangelog.com/en/1.0.0/).
### Added
- Initial release of package by Mats Dahlgren
-[Unreleased]: https://github.com/josephwright/achemso/compare/v3.13...HEAD
+[Unreleased]: https://github.com/josephwright/achemso/compare/v3.13b...HEAD
+[v3.13b]: https://github.com/josephwright/achemso/compare/v3.13...v3.13b
+[v3.13a]: https://github.com/josephwright/achemso/compare/v3.13...v3.13a
[v3.13]: https://github.com/josephwright/achemso/compare/v3.12a...v3.13
[v3.12a]: https://github.com/josephwright/achemso/compare/v3.12...v3.12a
[v3.12]: https://github.com/josephwright/achemso/compare/v3.11b...v3.12
diff --git a/macros/latex/contrib/achemso/achemso-demo.pdf b/macros/latex/contrib/achemso/achemso-demo.pdf
index ff7bde7bbb..a873bdf444 100644
--- a/macros/latex/contrib/achemso/achemso-demo.pdf
+++ b/macros/latex/contrib/achemso/achemso-demo.pdf
Binary files differ
diff --git a/macros/latex/contrib/achemso/achemso.dtx b/macros/latex/contrib/achemso/achemso.dtx
index 7fcc65541e..b64421f0bc 100644
--- a/macros/latex/contrib/achemso/achemso.dtx
+++ b/macros/latex/contrib/achemso/achemso.dtx
@@ -289,13 +289,17 @@
% Journal & \rmfamily Setting & Journal & \rmfamily Setting \\
% \midrule
% Acc.\ Chem.\ Res. & achre4 &
+% Bioconjugate Chem. & bcches \\
+% Acc.\ Mater.\ Res. & amrcda &
+% Biomacromolecules & bomaf6 \\
+% ACS Agri.\ Sci. Tech. & aastgj &
% Chem.\ Mater. & cmatex \\
% ACS Appl.\ Energy Mater. & aaemcq &
-% Chem.\ Res.\ Toxicol. & crtoec \\
-% ACS Appl.\ Electron.\ Mater. & aaembp &
% Chem.\ Rev. & chreay \\
-% ACS Appl.\ Mater.\ Interfaces & aamick &
+% ACS Appl.\ Electron.\ Mater. & aaembp &
% Cryst.\ Growth Des. & cgdefu \\
+% ACS Appl.\ Mater.\ Interfaces & aamick &
+% Chem.\ Res.\ Toxicol. & crtoec \\
% ACS Appl.\ Nano Mater. & aanmf6 &
% Environ.\ Sci.\ Technol. & esthag \\
% ACS Appl.\ Polym.\ Mater. & aapmcd &
@@ -320,33 +324,32 @@
% J.~Med.\ Chem. & jmcmar \\
% ACS ES\&T Water & aewcaa &
% J.~Nat.\ Prod. & jnprdf \\
-% ACS Infect.\ Dis. & ascefj &
+% ACS Food Sci. Tech. & afsthl &
% J.~Org.\ Chem. & joceah \\
-% ACS Macro Lett. & amlccd &
+% ACS Infect.\ Dis. & ascefj &
% J.~Phys.\ Chem.~A & jpcafh \\
-% ACS Mater.\ Lett. & amlcef &
+% ACS Macro Lett. & amlccd &
% J.~Phys.\ Chem.~B & jpcbfk \\
-% ACS Med.\ Chem.\ Lett. & amclct &
+% ACS Mater.\ Lett. & amlcef &
% J.~Phys.\ Chem.~C & jpccck \\
-% ACS Nano & ancac3 &
+% ACS Med.\ Chem.\ Lett. & amclct &
% J.~Phys.\ Chem.\ Lett. & jpclcd \\
-% ACS Omega & acsodf &
+% ACS Nano & ancac3 &
% J.~Proteome Res. & jprobs \\
-% ACS Photon. & apchd5 &
+% ACS Omega & acsodf &
% J.~Am.\ Chem.\ Soc. & jacsat \\
-% ACS Sensors & ascefj &
+% ACS Photon. & apchd5 &
% Langmuir & langd5 \\
-% ACS Sustainable Chem.\ Eng. & ascecg &
+% ACS Sensors & ascefj &
% Macromolecules & mamobx \\
-% ACS Synth.\ Biol. & asbcd6 &
+% ACS Sustainable Chem.\ Eng. & ascecg &
% Mol.\ Pharm. & mpohbp \\
-% Anal.\ Chem. & ancham &
+% ACS Synth.\ Biol. & asbcd6 &
% Nano Lett. & nalefd \\
-% Biochemistry & bichaw &
+% Anal.\ Chem. & ancham &
% Org.\ Lett. & orlef7 \\
-% Bioconjugate Chem. & bcches &
+% Biochemistry & bichaw &
% Organometallics & orgnd7 \\
-% Biomacromolecules & bomaf6 \\
% \bottomrule
% \end{tabular}
% \caption{Values for \opt{journal} option}
@@ -762,7 +765,7 @@
% \begin{macrocode}
%<*class>
\ProvidesClass{achemso}
- [2020-05-27 v3.13a Submission to ACS journals]
+ [2020-07-21 v3.13b Submission to ACS journals]
\LoadClass[12pt,letter]{article}
% \end{macrocode}
%
@@ -782,7 +785,7 @@
% \begin{macrocode}
%<*package>
\ProvidesPackage{achemso}
- [2020-05-27 v3.13a Support for ACS journals]
+ [2020-07-21 v3.13b Support for ACS journals]
\@ifclassloaded{achemso}{%
\PackageInfo{achemso}{%
You have already loaded the `achemso' class:\MessageBreak
@@ -3309,64 +3312,70 @@
% \begin{macrocode}
%<*achre4>
\ProvidesFile{achemso-achre4.cfg}
- [2020-05-27 v3.13a achemso configuration: Acc. Chem. Res.]
+ [2020-07-21 v3.13b achemso configuration: Acc. Chem. Res.]
\setkeys{acs}{biblabel = plain}
\def\acs@type@list{article,suppinfo}
\def\abstractname{Conspectus}
%</achre4>
%<*aaembp>
\ProvidesFile{achemso-aaembp.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Appl. Electron. Mater.]
+ [2020-07-21 v3.13b achemso configuration: ACS Appl. Electron. Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aaembp>
%<*aaemcq>
\ProvidesFile{achemso-aaemcq.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Appl. Energy Mater.]
+ [2020-07-21 v3.13b achemso configuration: ACS Appl. Energy Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aaemcq>
%<*aamick>
\ProvidesFile{achemso-aamick.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Appl. Mater. Interfaces]
+ [2020-07-21 v3.13b achemso configuration: ACS Appl. Mater. Interfaces]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aamick>
%<*aanmf6>
\ProvidesFile{achemso-aanmf6.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Appl. Nano Mater.]
+ [2020-07-21 v3.13b achemso configuration: ACS Appl. Nano Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aanmf6>
%<*aapmcd>
\ProvidesFile{achemso-aapmcd.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Appl. Polym. Mater.]
+ [2020-07-21 v3.13b achemso configuration: ACS Appl. Polym. Mater.]
\def\acs@type@list{article,letter,suppinfo}
\setkeys{acs}{keywords = true}
%</aapmcd>
+%<*aastgj>
+\ProvidesFile{achemso-aastgj.cfg}
+ [2020-07-21 v3.13b achemso configuration: ACS Agri. Sci. Tech.]
+\def\acs@type@list{account,article,letter,retraction,review,viewpoint,suppinfo}
+\setkeys{acs}{keywords = true}
+%</aastgj>
%<*abseba>
\ProvidesFile{achemso-abseba.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Biomater. Sci. Eng.]
+ [2020-07-21 v3.13b achemso configuration: ACS Biomater. Sci. Eng.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,review,suppinfo}
%</abseba>
%<*accacs>
\ProvidesFile{achemso-accacs.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Catal.]
+ [2020-07-21 v3.13b achemso configuration: ACS Catal.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,letter,perspective,review,viewpoints,suppinfo}
\SectionNumbersOff
%</accacs>
%<*acscii>
\ProvidesFile{achemso-acscii.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Central Sci.]
+ [2020-07-21 v3.13b achemso configuration: ACS Central Sci.]
\def\acs@type@list{article,review,suppinfo}
\setkeys{acs}{doi = true}
\SectionNumbersOff
%</acscii>
%<*acbcct>
\ProvidesFile{achemso-acbcct.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Chem. Biol.]
+ [2020-07-21 v3.13b achemso configuration: ACS Chem. Biol.]
\setkeys{acs}{
biblabel = fullstop,
biochem = true,
@@ -3377,7 +3386,7 @@
%</acbcct>
%<*acncdm>
\ProvidesFile{achemso-acncdm.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Chem. Neurosci.]
+ [2020-07-21 v3.13b achemso configuration: ACS Chem. Neurosci.]
\def\acs@type@list{article,review,letter,suppinfo,viewpoint}
\setkeys{acs}{
biblabel = fullstop,
@@ -3388,43 +3397,49 @@
%</acncdm>
%<*acsccc>
\ProvidesFile{achemso-acsccc.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Combinatorial Sci.]
+ [2020-07-21 v3.13b achemso configuration: ACS Combinatorial Sci.]
\def\acs@type@list{article,letter,review,perspective,account,note,suppinfo}
\setkeys{acs}{keywords = true}
\SectionNumbersOff
%</acsccc>
%<*aesccq>
\ProvidesFile{achemso-aesccq.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Earth Space Chem.]
+ [2020-07-21 v3.13b achemso configuration: ACS Earth Space Chem.]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{keywords = true}
%</aesccq>
%<*aelccp>
\ProvidesFile{achemso-aelccp.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Energy Lett.]
+ [2020-07-21 v3.13b achemso configuration: ACS Energy Lett.]
\def\acs@type@list{letter,perspective,review,viewpoint,focus}
\SectionsOff
%</aelccp>
%<*aeecco>
\ProvidesFile{achemso-aeecco.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS ES&T Eng.]
+ [2020-07-21 v3.13b achemso configuration: ACS ES&T Eng.]
\def\acs@type@list{article,feature,perspective,review,viewpoint}
%</aeecco>
%<*aewcaa>
\ProvidesFile{achemso-aewcaa.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS ES&T Water]
+ [2020-07-21 v3.13b achemso configuration: ACS ES&T Water]
\def\acs@type@list{article,feature,perspective,review,viewpoint}
%</aewcaa>
+%<*afsthl>
+\ProvidesFile{achemso-afsthl.cfg}
+ [2020-07-21 v3.13b achemso configuration: ACS Food Sci. Tech.]
+\def\acs@type@list{account,article,perspective,retraction,review,viewpoint}
+\setkeys{acs}{keywords = true}
+%</afsthl>
%<*ascefj>
\ProvidesFile{achemso-ascefj.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Infect. Dis.]
+ [2020-07-21 v3.13b achemso configuration: ACS Infect. Dis.]
\def\acs@type@list{article,letter,perspective,review,viewpoint,suppinfo}
\setkeys{acs}{keywords = true}
\SectionsOff
%</ascefj>
%<*amlccd>
\ProvidesFile{achemso-amlccd.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Macro Lett.]
+ [2020-07-21 v3.13b achemso configuration: ACS Macro Lett.]
\def\acs@type@list{letter,suppinfo}
\SectionsOff
\setlength{\acs@tocentry@height}{8 cm}
@@ -3432,19 +3447,24 @@
%</amlccd>
%<*amlcef>
\ProvidesFile{achemso-amlcef.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Mater. Lett.]
+ [2020-07-21 v3.13b achemso configuration: ACS Mater. Lett.]
\def\acs@type@list{letter,perspective,review,viewpoint,focus}
\SectionsOff
%</amlcef>
%<*amclct>
\ProvidesFile{achemso-amclct.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Med. Chem. Lett.]
+ [2020-07-21 v3.13b achemso configuration: ACS Med. Chem. Lett.]
\def\acs@type@list{article,letter,perspective,suppinfo}
\SectionNumbersOff
%</amclct>
+%<*amrcda>
+\ProvidesFile{achemso-amrcda.cfg}
+ [2020-07-21 v3.13b achemso configuration: Acc. Mater. Res.]
+\def\acs@type@list{account,article,editorial,retraction,suppinfo}
+%</amrcda>
%<*ancac3>
\ProvidesFile{achemso-ancac3.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Nano]
+ [2020-07-21 v3.13b achemso configuration: ACS Nano]
\setkeys{acs}{
abbreviations = true,
biblabel = fullstop,
@@ -3458,12 +3478,12 @@
%</ancac3>
%<*acsodf>
\ProvidesFile{achemso-acsodf.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Omega.]
+ [2020-07-21 v3.13b achemso configuration: ACS Omega.]
\def\acs@type@list{article}
%</acsodf>
%<*apchd5>
\ProvidesFile{achemso-apchd5.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Photon.]
+ [2020-07-21 v3.13b achemso configuration: ACS Photon.]
\def\acs@type@list{article,letter,perspective,review,suppinfo}
\setkeys{acs}{keywords = true}
\ifx\acs@manuscript\acs@manuscript@letter
@@ -3472,14 +3492,14 @@
%</apchd5>
%<*aidcbc>
\ProvidesFile{achemso-aidcbc.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Sensors]
+ [2020-07-21 v3.13b achemso configuration: ACS Sensors]
\def\acs@type@list{article,letter,perspective,review,suppinfo}
\setkeys{acs}{keywords = true}
\SectionNumbersOff
%</aidcbc>
%<*ascecg>
\ProvidesFile{achemso-ascecg.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Sustainable Chem Eng.]
+ [2020-07-21 v3.13b achemso configuration: ACS Sustainable Chem Eng.]
\setkeys{acs}{
biblabel = fullstop,
keywords = true
@@ -3489,7 +3509,7 @@
%</ascecg>
%<*asbcd6>
\ProvidesFile{achemso-asbcd6.cfg}
- [2020-05-27 v3.13a achemso configuration: ACS Synth. Biol.]
+ [2020-07-21 v3.13b achemso configuration: ACS Synth. Biol.]
\setkeys{acs}{
abbreviations = true,
biblabel = fullstop,
@@ -3501,13 +3521,13 @@
%</asbcd6>
%<*ancham>
\ProvidesFile{achemso-ancham.cfg}
- [2020-05-27 v3.13a achemso configuration: Anal. Chem.]
+ [2020-07-21 v3.13b achemso configuration: Anal. Chem.]
\def\acs@type@list{article,note,suppinfo}
\SectionNumbersOff
%</ancham>
%<*bichaw>
\ProvidesFile{achemso-bichaw.cfg}
- [2020-05-27 v3.13a achemso configuration: Biochemistry]
+ [2020-07-21 v3.13b achemso configuration: Biochemistry]
\setkeys{acs}{
abbreviations = true,
biblabel = brackets,
@@ -3555,7 +3575,7 @@
%</bichaw>
%<*bcches>
\ProvidesFile{achemso-bcches.cfg}
- [2020-05-27 v3.13a achemso configuration: Bioconjugate Chem.]
+ [2020-07-21 v3.13b achemso configuration: Bioconjugate Chem.]
\setkeys{acs}{
biochem = true,
super = false
@@ -3564,14 +3584,14 @@
%</bcches>
%<*bomaf6>
\ProvidesFile{achemso-bomaf6.cfg}
- [2020-05-27 v3.13a achemso configuration: Biomacromolecules]
+ [2020-07-21 v3.13b achemso configuration: Biomacromolecules]
\def\acs@type@list{article,comment,communication,note,review,suppinfo}
\SectionNumbersOff
\AtEndOfClass{\SectionsOn}
%</bomaf6>
%<*crtoec>
\ProvidesFile{achemso-crtoec.cfg}
- [2020-05-27 v3.13a achemso configuration: Chem. Res. Toxicol.]
+ [2020-07-21 v3.13b achemso configuration: Chem. Res. Toxicol.]
\setkeys{acs}{
abbreviations = true,
biochem = true,
@@ -3588,7 +3608,7 @@
%</crtoec>
%<*chreay>
\ProvidesFile{achemso-chreay.cfg}
- [2020-05-27 v3.13a achemso configuration: Chem. Rev.]
+ [2020-07-21 v3.13b achemso configuration: Chem. Rev.]
\def\acs@type@default{review}
\def\acs@type@list{review}
% \end{macrocode}
@@ -3599,7 +3619,7 @@
%<*cmatex>
% \begin{macrocode}
\ProvidesFile{achemso-cmatex.cfg}
- [2020-05-27 v3.13a achemso configuration: Chem. Mater.]
+ [2020-07-21 v3.13b achemso configuration: Chem. Mater.]
\setkeys{acs}{keywords = true}
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication
@@ -3609,7 +3629,7 @@
%</cmatex>
%<*cgdefu>
\ProvidesFile{achemso-cgdefu.cfg}
- [2020-05-27 v3.13a achemso configuration: Cryst. Growth Des.]
+ [2020-07-21 v3.13b achemso configuration: Cryst. Growth Des.]
\def\acs@type@list{%
article,communication,perspective,suppinfo%
}
@@ -3622,31 +3642,31 @@
%</cgdefu>
%<*enfuem>
\ProvidesFile{achemso-enfuem.cfg}
- [2020-05-27 v3.13a achemso configuration: Energy Fuels]
+ [2020-07-21 v3.13b achemso configuration: Energy Fuels]
\def\acs@type@list{article,review,suppinfo}
\SectionNumbersOff
%</enfuem>
%<*esthag>
\ProvidesFile{achemso-esthag.cfg}
- [2020-05-27 v3.13a achemso configuration: Environ. Sci. Technol.]
+ [2020-07-21 v3.13b achemso configuration: Environ. Sci. Technol.]
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</esthag>
%<*estlcu>
\ProvidesFile{achemso-estlcu.cfg}
- [2020-05-27 v3.13a achemso configuration: Environ. Sci. Technol. Lett.]
+ [2020-07-21 v3.13b achemso configuration: Environ. Sci. Technol. Lett.]
\def\acs@type@list{letter,suppinfo}
\SectionNumbersOff
%</estlcu>
%<*iecred>
\ProvidesFile{achemso-iecred.cfg}
- [2020-05-27 v3.13a achemso configuration: Ind. Eng. Chem. Res.]
+ [2020-07-21 v3.13b achemso configuration: Ind. Eng. Chem. Res.]
\setkeys{acs}{biblabel = brackets}
\SectionNumbersOff
%</iecred>
%<*inoraj>
\ProvidesFile{achemso-inoraj.cfg}
- [2020-05-27 v3.13a achemso configuration: Inorg. Chem.]
+ [2020-07-21 v3.13b achemso configuration: Inorg. Chem.]
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication
\AbstractOff
@@ -3656,14 +3676,14 @@
%</inoraj>
%<*jafcau>
\ProvidesFile{achemso-jafcau.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Agric. Food Chem.]
+ [2020-07-21 v3.13b achemso configuration: J. Agric. Food Chem.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</jafcau>
%<*jceda8>
\ProvidesFile{achemso-jceda8.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Chem. Ed.]
+ [2020-07-21 v3.13b achemso configuration: J. Chem. Ed.]
\setkeys{acs}{keywords = true}
\SectionNumbersOff
\def\acs@type@list{article,suppinfo}
@@ -3671,26 +3691,26 @@
%</jceda8>
%<*jceaax>
\ProvidesFile{achemso-jceaax.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Chem. Eng. Data]
+ [2020-07-21 v3.13b achemso configuration: J. Chem. Eng. Data]
\def\acs@type@list{article,suppinfo}
\def\refname{Literature Cited}
\SectionNumbersOff
%</jceaax>
%<*jcisd8>
\ProvidesFile{achemso-jcisd8.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Chem. Inf. Model.]
+ [2020-07-21 v3.13b achemso configuration: J. Chem. Inf. Model.]
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</jcisd8>
%<*jctcce>
\ProvidesFile{achemso-jctcce.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Chem. Theory Comput.]
+ [2020-07-21 v3.13b achemso configuration: J. Chem. Theory Comput.]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{maxauthors = 0}
%</jctcce>
%<*jmcmar>
\ProvidesFile{achemso-jmcmar.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Med. Chem.]
+ [2020-07-21 v3.13b achemso configuration: J. Med. Chem.]
\def\acs@type@list{article,letter,perspective,suppinfo}
\SectionNumbersOff
\setlength{\acs@tocentry@height}{5.5cm}
@@ -3698,7 +3718,7 @@
%</jmcmar>
%<*jnprdf>
\ProvidesFile{achemso-jnprdf.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Nat. Prod.]
+ [2020-07-21 v3.13b achemso configuration: J. Nat. Prod.]
\renewcommand*{\abstractname}{ABSTRACT}
\renewcommand*{\acknowledgementname}{ACKNOWLEDGEMENT}
\renewcommand*{\suppinfoname}{ASSOCIATED CONTENT}
@@ -3720,7 +3740,7 @@
%</jnprdf>
%<*joceah>
\ProvidesFile{achemso-joceah.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Org. Chem.]
+ [2020-07-21 v3.13b achemso configuration: J. Org. Chem.]
\ifx\acs@manuscript\acs@manuscript@communication
\AbstractOff
\SectionsOff
@@ -3734,7 +3754,7 @@
% \begin{macrocode}
%<*jpcafh>
\ProvidesFile{achemso-jpcafh.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Phys. Chem. A]
+ [2020-07-21 v3.13b achemso configuration: J. Phys. Chem. A]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3749,7 +3769,7 @@
%</jpcafh>
%<*jpcbfk>
\ProvidesFile{achemso-jpcbfk.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Phys. Chem. B]
+ [2020-07-21 v3.13b achemso configuration: J. Phys. Chem. B]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3761,7 +3781,7 @@
%</jpcbfk>
%<*jpccck>
\ProvidesFile{achemso-jpccck.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Phys. Chem. C]
+ [2020-07-21 v3.13b achemso configuration: J. Phys. Chem. C]
\def\acs@type@list{article,suppinfo}
\setkeys{acs}{
etalmode = truncate,
@@ -3775,7 +3795,7 @@
% \begin{macrocode}
%<*jpclcd>
\ProvidesFile{achemso-jpclcd.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Phys. Chem. Lett.]
+ [2020-07-21 v3.13b achemso configuration: J. Phys. Chem. Lett.]
\setkeys{acs}{
etalmode = truncate,
maxauthors = 10
@@ -3800,7 +3820,7 @@
%</jpclcd>
%<*jprobs>
\ProvidesFile{achemso-jprobs.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Proteome Res.]
+ [2020-07-21 v3.13b achemso configuration: J. Proteome Res.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,review,suppinfo}
\SectionNumbersOff
@@ -3812,7 +3832,7 @@
% \begin{macrocode}
%<*jacsat>
\ProvidesFile{achemso-jacsat.cfg}
- [2020-05-27 v3.13a achemso configuration: J. Am. Chem. Soc.]
+ [2020-07-21 v3.13b achemso configuration: J. Am. Chem. Soc.]
\SectionNumbersOff
\ifx\acs@manuscript\acs@manuscript@communication\else
\expandafter\endinput
@@ -4016,26 +4036,26 @@
%</jacsat>
%<*langd5>
\ProvidesFile{achemso-langd5.cfg}
- [2020-05-27 v3.13a achemso configuration: Langmuir]
+ [2020-07-21 v3.13b achemso configuration: Langmuir]
\def\acs@type@list{article,letter,suppinfo}
\SectionNumbersOff
%</langd5>
%<*mamobx>
\ProvidesFile{achemso-mamobx.cfg}
- [2020-05-27 v3.13a achemso configuration: Macromolecules]
+ [2020-07-21 v3.13b achemso configuration: Macromolecules]
\SectionNumbersOff
\setkeys{acs}{doi = true}
%</mamobx>
%<*mpohbp>
\ProvidesFile{achemso-mpohbp.cfg}
- [2020-05-27 v3.13a achemso configuration: Mol. Pharm.]
+ [2020-07-21 v3.13b achemso configuration: Mol. Pharm.]
\setkeys{acs}{keywords = true}
\def\acs@type@list{article,suppinfo}
\SectionNumbersOff
%</mpohbp>
%<*nalefd>
\ProvidesFile{achemso-nalefd.cfg}
- [2020-05-27 v3.13a achemso configuration: Nano Lett.]
+ [2020-07-21 v3.13b achemso configuration: Nano Lett.]
\setkeys{acs}{keywords = true}
\def\acs@type@default{letter}
\def\acs@type@list{letter}
@@ -4043,7 +4063,7 @@
%</nalefd>
%<*orlef7>
\ProvidesFile{achemso-orlef7.cfg}
- [2020-05-27 v3.13a achemso configuration: Org. Lett.]
+ [2020-07-21 v3.13b achemso configuration: Org. Lett.]
\def\acs@type@default{communication}
\def\acs@type@list{communication}
\SectionNumbersOff
@@ -4053,13 +4073,13 @@
%</orlef7>
%<*oprdfk>
\ProvidesFile{achemso-oprdfk.cfg}
- [2020-05-27 v3.13a achemso configuration: Org. Proc. Res. Dev.]
+ [2020-07-21 v3.13b achemso configuration: Org. Proc. Res. Dev.]
\def\acs@type@list{article,highlight,review,suppinfo}
\SectionNumbersOff
%</oprdfk>
%<*orgnd7>
\ProvidesFile{achemso-orgnd7.cfg}
- [2020-05-27 v3.13a achemso configuration: Organometallics]
+ [2020-07-21 v3.13b achemso configuration: Organometallics]
\SectionNumbersOff
%</orgnd7>
% \end{macrocode}
@@ -4724,7 +4744,7 @@ FUNCTION { count.entries } {
% Start and end of bibliography functions
FUNCTION { begin.bib } {
- "achemso 2020-05-27 v3.13a" top$
+ "achemso 2020-07-21 v3.13b" top$
preamble$ empty$
{ }
{
diff --git a/macros/latex/contrib/achemso/achemso.ins b/macros/latex/contrib/achemso/achemso.ins
index a1237e114a..55bd49fc09 100644
--- a/macros/latex/contrib/achemso/achemso.ins
+++ b/macros/latex/contrib/achemso/achemso.ins
@@ -77,65 +77,68 @@ This work consists of the files achemso.dtx,
\file{achemso-aamick.cfg}{\from{achemso.dtx}{aamick}}
\file{achemso-aanmf6.cfg}{\from{achemso.dtx}{aanmf6}}
\file{achemso-aapmcd.cfg}{\from{achemso.dtx}{aapmcd}}
+ \file{achemso-aastgj.cfg}{\from{achemso.dtx}{aastgj}}
\file{achemso-abseba.cfg}{\from{achemso.dtx}{abseba}}
\file{achemso-accacs.cfg}{\from{achemso.dtx}{accacs}}
- \file{achemso-achre4.cfg}{\from{achemso.dtx}{achre4}}
}
-\generate{\file{achemso-acscii.cfg}{\from{achemso.dtx}{acscii}}
+\generate{\file{achemso-achre4.cfg}{\from{achemso.dtx}{achre4}}
+ \file{achemso-acscii.cfg}{\from{achemso.dtx}{acscii}}
\file{achemso-acbcct.cfg}{\from{achemso.dtx}{acbcct}}
\file{achemso-acncdm.cfg}{\from{achemso.dtx}{acncdm}}
\file{achemso-acsccc.cfg}{\from{achemso.dtx}{acsccc}}
\file{achemso-aeecco.cfg}{\from{achemso.dtx}{aeecco}}
\file{achemso-aesccq.cfg}{\from{achemso.dtx}{aesccq}}
\file{achemso-aelccp.cfg}{\from{achemso.dtx}{aelccp}}
- \file{achemso-aewcaa.cfg}{\from{achemso.dtx}{aewcaa}}
}
-\generate{\file{achemso-ascefj.cfg}{\from{achemso.dtx}{ascefj}}
+\generate{\file{achemso-aewcaa.cfg}{\from{achemso.dtx}{aewcaa}}
+ \file{achemso-afsthl.cfg}{\from{achemso.dtx}{afsthl}}
+ \file{achemso-ascefj.cfg}{\from{achemso.dtx}{ascefj}}
\file{achemso-amlccd.cfg}{\from{achemso.dtx}{amlccd}}
\file{achemso-amlcef.cfg}{\from{achemso.dtx}{amlcef}}
\file{achemso-amclct.cfg}{\from{achemso.dtx}{amclct}}
+ \file{achemso-amrcda.cfg}{\from{achemso.dtx}{amrcda}}
\file{achemso-ancac3.cfg}{\from{achemso.dtx}{ancac3}}
- \file{achemso-acsodf.cfg}{\from{achemso.dtx}{acsodf}}
+}
+\generate{\file{achemso-acsodf.cfg}{\from{achemso.dtx}{acsodf}}
\file{achemso-apchd5.cfg}{\from{achemso.dtx}{apchd5}}
\file{achemso-aidcbc.cfg}{\from{achemso.dtx}{aidcbc}}
-}
-\generate{\file{achemso-ascecg.cfg}{\from{achemso.dtx}{ascecg}}
+ \file{achemso-ascecg.cfg}{\from{achemso.dtx}{ascecg}}
\file{achemso-asbcd6.cfg}{\from{achemso.dtx}{asbcd6}}
\file{achemso-ancham.cfg}{\from{achemso.dtx}{ancham}}
\file{achemso-bichaw.cfg}{\from{achemso.dtx}{bichaw}}
\file{achemso-bcches.cfg}{\from{achemso.dtx}{bcches}}
- \file{achemso-bomaf6.cfg}{\from{achemso.dtx}{bomaf6}}
+}
+\generate{\file{achemso-bomaf6.cfg}{\from{achemso.dtx}{bomaf6}}
\file{achemso-crtoec.cfg}{\from{achemso.dtx}{crtoec}}
\file{achemso-chreay.cfg}{\from{achemso.dtx}{chreay}}
-}
-\generate{\file{achemso-cmatex.cfg}{\from{achemso.dtx}{cmatex}}
+ \file{achemso-cmatex.cfg}{\from{achemso.dtx}{cmatex}}
\file{achemso-cgdefu.cfg}{\from{achemso.dtx}{cgdefu}}
\file{achemso-enfuem.cfg}{\from{achemso.dtx}{enfuem}}
\file{achemso-esthag.cfg}{\from{achemso.dtx}{esthag}}
\file{achemso-estlcu.cfg}{\from{achemso.dtx}{estlcu}}
- \file{achemso-iecred.cfg}{\from{achemso.dtx}{iecred}}
+}
+\generate{\file{achemso-iecred.cfg}{\from{achemso.dtx}{iecred}}
\file{achemso-inoraj.cfg}{\from{achemso.dtx}{inoraj}}
\file{achemso-jafcau.cfg}{\from{achemso.dtx}{jafcau}}
-}
-\generate{\file{achemso-jceda8.cfg}{\from{achemso.dtx}{jceda8}}
+ \file{achemso-jceda8.cfg}{\from{achemso.dtx}{jceda8}}
\file{achemso-jceaax.cfg}{\from{achemso.dtx}{jceaax}}
\file{achemso-jcisd8.cfg}{\from{achemso.dtx}{jcisd8}}
\file{achemso-jctcce.cfg}{\from{achemso.dtx}{jctcce}}
\file{achemso-jmcmar.cfg}{\from{achemso.dtx}{jmcmar}}
- \file{achemso-jnprdf.cfg}{\from{achemso.dtx}{jnprdf}}
+}
+\generate{\file{achemso-jnprdf.cfg}{\from{achemso.dtx}{jnprdf}}
\file{achemso-joceah.cfg}{\from{achemso.dtx}{joceah}}
\file{achemso-jpcafh.cfg}{\from{achemso.dtx}{jpcafh}}
-}
-\generate{\file{achemso-jpcbfk.cfg}{\from{achemso.dtx}{jpcbfk}}
+ \file{achemso-jpcbfk.cfg}{\from{achemso.dtx}{jpcbfk}}
\file{achemso-jpccck.cfg}{\from{achemso.dtx}{jpccck}}
\file{achemso-jpclcd.cfg}{\from{achemso.dtx}{jpclcd}}
\file{achemso-jprobs.cfg}{\from{achemso.dtx}{jprobs}}
\file{achemso-jacsat.cfg}{\from{achemso.dtx}{jacsat}}
- \file{achemso-langd5.cfg}{\from{achemso.dtx}{langd5}}
+}
+\generate{\file{achemso-langd5.cfg}{\from{achemso.dtx}{langd5}}
\file{achemso-mamobx.cfg}{\from{achemso.dtx}{mamobx}}
\file{achemso-mpohbp.cfg}{\from{achemso.dtx}{mpohbp}}
-}
-\generate{\file{achemso-nalefd.cfg}{\from{achemso.dtx}{nalefd}}
+ \file{achemso-nalefd.cfg}{\from{achemso.dtx}{nalefd}}
\file{achemso-orlef7.cfg}{\from{achemso.dtx}{orlef7}}
\file{achemso-oprdfk.cfg}{\from{achemso.dtx}{oprdfk}}
\file{achemso-orgnd7.cfg}{\from{achemso.dtx}{orgnd7}}
diff --git a/macros/latex/contrib/achemso/achemso.pdf b/macros/latex/contrib/achemso/achemso.pdf
index 5fa9b9e2b1..decb0adfeb 100644
--- a/macros/latex/contrib/achemso/achemso.pdf
+++ b/macros/latex/contrib/achemso/achemso.pdf
Binary files differ
diff --git a/macros/latex/contrib/horoscop/README b/macros/latex/contrib/horoscop/README
index 0f1f53d116..5fbcef74bd 100644
--- a/macros/latex/contrib/horoscop/README
+++ b/macros/latex/contrib/horoscop/README
@@ -1,10 +1,11 @@
-This is version 0.92 of the horoscop package for typesetting astrological
+This is version 1.0 of the horoscop package for typesetting astrological
charts in LaTeX.
Features include:
* A unified interface for astrological symbols/glyphs, supporting three
- different astrological fonts as well as text abbreviations.
+ different astrological fonts as well as text abbreviations and Unicode
+ astrological symbol code points.
* Support for invoking Astrolog or Swiss Ephemeris to calculate charts.
Positions can also be specified manually.
* Loading and saving object and cusp positions into TeX macros.
@@ -63,7 +64,9 @@ Typesetting astrological symbols requires an appropriate font. The horoscop
package can work with the marvosym, wasysym, and starfont LaTeX packages,
with varying quality in the results; starfont is recommended and default.
It can also use text-only substitutes if none of those packages are
-available.
+available, or in XeLaTeX or LuaTeX it can use Unicode code points, in which
+case font management to typeset those code points is left to the TeX
+enginge to resolve.
Other, less significant, dependencies may exist; consult the PDF manual.
@@ -73,12 +76,21 @@ The horoscop package is public domain. External calculation software might
not be; you are responsible for any relevant licensing issues for any other
software you use.
-CONTACT AND LINKS
+LINKS AND TUG 2016 PRESENTATION
-LaTeX astrology page: http://ansuz.sooke.bc.ca/entry/107
-GitHub repository: http://github.com/mskala/horoscop
-Online demo: http://ansuz.sooke.bc.ca/astrology/makechart.php
+LaTeX astrology page: https://ansuz.sooke.bc.ca/entry/107
+Online demo: https://edifyingfellowship.org/astro/
+
+Skala, M. 2016. Astrological charts with horoscop and starfont. TUGboat,
+37(2):p. 182. Proceedings of the 37th Annual Meeting of the TeX Users
+Group (TUG 2016), Toronto, Ontario, July 25-27, 2016.
+
+PDF from proceedings: https://tug.org/TUGboat/tb37-2/tb116skala.pdf
+PDF of slides: https://tug.org/tug2016/slides/skala.pdf
+Video of talk: http://zeeba.tv/astrological-charts-with-horoscop-and-starfont/
+
+CONTACT
Matthew Skala
mskala@ansuz.sooke.bc.ca
-http://ansuz.sooke.bc.ca/
+https://ansuz.sooke.bc.ca/
diff --git a/macros/latex/contrib/horoscop/horoscop.dtx b/macros/latex/contrib/horoscop/horoscop.dtx
index 12ea6a98fe..dfcf84b7af 100644
--- a/macros/latex/contrib/horoscop/horoscop.dtx
+++ b/macros/latex/contrib/horoscop/horoscop.dtx
@@ -2,13 +2,13 @@
%
% This work is hereby released into the Public Domain. To view a
% copy of the public domain dedication, visit
-% http://creativecommons.org/licenses/publicdomain/
+% https://creativecommons.org/licenses/publicdomain/
% or send a letter to Creative Commons, 171 Second Street, Suite 300,
% San Francisco, California, 94105, USA.
%
% Matthew Skala
% mskala@ansuz.sooke.bc.ca
-% http://ansuz.sooke.bc.ca/
+% https://ansuz.sooke.bc.ca/
% August 30, 2008
%
% \fi
@@ -22,8 +22,9 @@
\usepackage{fmtcount}
\usepackage{graphicx}
\usepackage[scaled=0.9]{helvet}
-\usepackage[textsym,wasysym,marvosym,starfont]{horoscop}[2013/05/16]
+\usepackage[textsym,unicode,wasysym,marvosym,starfont]{horoscop}[2020/07/21]
\usepackage{mathpazo}
+\usepackage{metalogo}
\usepackage{titlesec}
\usepackage[letterpaper,breaklinks,bookmarks,plainpages=false,
colorlinks,pagebackref,citecolor=darkgreen,linkcolor=purplish]{hyperref}
@@ -81,7 +82,7 @@
%</driver>
% \fi
%
-% \CheckSum{4087}
+% \CheckSum{4317}
%
% \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
@@ -113,38 +114,40 @@
%
% \title{Typesetting astrology with \textsf{horoscop}}
% \author{Matthew Skala}
-% \date{May 16, 2013}
+% \date{July 21, 2020}
%
-% \begin{titlepage}
-% \phantomsection
-% \mybookmark{section}{Title Page}
-% \centering
-% \vspace{0.75in}
-% {\Huge\scshape Typesetting}
+% \thispagestyle{empty}
+% \phantomsection
+% \mybookmark{section}{Title Page}
+% {\centering
+% \vspace{0.75in}
+% {\Huge\scshape Typesetting}
%
-% \vspace{2pc}
-% {\Huge\scshape Astrology}
+% \vspace{2pc}
+% {\Huge\scshape Astrology}
%
-% \vspace{2pc}
-% {\LARGE\itshape with}
+% \vspace{2pc}
+% {\LARGE\itshape with}
%
-% \vspace{2pc}
-% {\Huge\sffamily horoscop}
+% \vspace{2pc}
+% {\Huge\sffamily horoscop}
%
-% \vspace{3pc}
-% {\Huge\docornament}
+% \vspace{3pc}
+% {\Huge\docornament}
%
-% \vspace{\fill}
-% {\Large{\scshape Matthew Skala}\\
-% \href{mailto:mskala@ansuz.sooke.bc.ca}%
-% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}}
+% \vspace{\fill}
+% {\Large{\scshape Matthew Skala}\\
+% \href{mailto:mskala@ansuz.sooke.bc.ca}%
+% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}}
%
-% \vspace{0.5in}
-% {\Large\itshape Version 0.92, May 16, 2013}
-% \vspace{2.5pc}
-% \end{titlepage}
+% \vspace{0.5in}
+% {\Large\itshape Version 1.0, July 21, 2020}
+% \vspace{2.5pc}
+% \par}
%
% \clearpage
+% \changes{v1.0}{2020/07/20}{Make page after title page page 2 for clearer
+% numbering in PDF}
% \phantomsection
% \mybookmark{section}{Contents}
% \tableofcontents
@@ -153,13 +156,15 @@
%
% \section{Introduction}
%
+% \changes{v1.0}{2020/07/20}{General updates to intro after seven years}
% This document describes the design and use of a \LaTeX\ package named
% \textsf{horoscop}, which supports typesetting of astrological charts.
% Features include:
%
% \begin{itemize}
% \item A unified interface for astrological symbols/glyphs, supporting three
-% different astrological fonts as well as text abbreviations.
+% different astrological fonts as well as text abbreviations and Unicode
+% astrological symbol code points.
% \item Support for invoking Astrolog or Swiss Ephemeris to calculate
% charts. Positions can also be specified manually.
% \item Loading and saving object and cusp positions into \TeX\ macros.
@@ -216,21 +221,59 @@
% whatever comes out of the calculation software but it will be your own
% fault if that is nonsense.
%
-% This 0.92 release is the first one to be submitted to CTAN. I still feel
-% like \textsf{horoscop} is beta software, but it has existed since 2004, it
-% has not changed much in years, the recent switch to \textsf{pict2e} makes
-% it a lot more useful with modern \TeX\ installations, and I think the time
-% has come to share it more widely. Next version will probably be 1.0.
-%
-% This package has a GitHub repository at
-% \url{http://github.com/mskala/horoscop}. Bug reports should be filed
-% there using GitHub's issue tracking system.
-%
+% I presented this package at TUG~2016, with a one-page summary in the
+% conference proceedings: Skala, M. 2016. Astrological
+% charts with \textsf{horoscop} and \textsf{starfont}.
+% \emph{TUGboat,} 37(2):p.\ 182. Proceedings of the 37th Annual Meeting of
+% the TeX Users Group (TUG 2016), Toronto, Ontario, July 25-27, 2016. A PDF
+% of the summary is at \url{https://tug.org/TUGboat/tb37-2/tb116skala.pdf};
+% a PDF of the slides from my talk is at
+% \url{https://tug.org/tug2016/slides/skala.pdf}; and there is video of most
+% of the presentation at
+% \url{http://zeeba.tv/astrological-charts-with-horoscop-and-starfont/}.
+%
+% This release, version 1.0, represents a mature version of the package.
+% The last release, version 0.92, was called a beta test, but it has
+% been in use seven years now without needing any significant bug fixing or
+% updates. The most serious issue in 0.92 was in the documentation of
+% how to enter manually-calculated object positions; the underlying macros
+% for it worked well.
+%
+% So this 1.0 release is primarily an update to the documentation to fix
+% that issue, as well as to bump the version number and recognize the fact
+% that the package is mature and fully usable. I have also taken the
+% opportunity to add the Unicode-symbols feature, to reduce
+% \textsf{horoscop}'s ties to classical \TeX\ and its font systems as users
+% increasingly move toward Unicode engines and Unicode-based font selection;
+% and I have updated such things as Web links and development contacts to
+% reflect the inevitable changes in human institutitons over the years.
+%
+% \changes{v1.0}{2020/07/20}{In memoriam Axel}
+% I encourage readers to think of Axel Harvey, a close friend of mine and
+% a professional astrologer who contributed greatly to the testing of this
+% software and its associated Web service. He died in 2016, and is missed.
+%
+% \changes{v1.0}{2020/07/20}{New links for my own Web sites}
% There is an online chart service demonstrating \textsf{horoscop} at
-% \url{http://ansuz.sooke.bc.ca/astrology/makechart.php}. I also maintain a
-% page pointing to recent versions of this, my \textsf{starfont} package,
-% and any other \LaTeX\ astrology resources I can find, at
-% \url{http://ansuz.sooke.bc.ca/entry/107}.
+% \href{https://edifyingfellowship.org/astro/}{\nolinkurl https://edifying}
+% \href{https://edifyingfellowship.org/astro/}{\nolinkurl fellowship.org/astro/}.
+% I also maintain a page pointing to \LaTeX\ astrology resources, at
+% \url{https://ansuz.sooke.bc.ca/entry/107}.
+%
+% I no longer encourage the use of GitHub and it is unlikely that the
+% existing GitHub repository for \textsf{horoscop} will be updated further.
+% Bug reports and other correspondence related to \textsf{horoscop} should
+% be directed to \href{mailto:mskala@ansuz.sooke.bc.ca}%
+% {\nolinkurl{mskala@ansuz.sooke.bc.ca}}.
+%
+% As of 2016, I am no longer pursuing a career in academic computer science.
+% I have started a business selling modules of my own design for
+% Eurorack modular synthesizers, and kits for building them, through a Web
+% storefront at \url{https://northcoastsynthesis.com/}. If you are
+% interested in electronic music, please consider buying my products; if
+% not, please pass on the link to others. My ability to spend time
+% making free resources to share, such as the \textsf{horoscop} package,
+% depends on the success of my business.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -249,14 +292,20 @@
% missing or unsuitable.
% Instead of using an astrological font
% at all, the |textsym| option may be used to substitute abbreviations
-% written in \LaTeX's ordinary text font.
+% written in \LaTeX's ordinary text font, which should work in any
+% \LaTeX\ environment; or the |unicode| option may
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% be used with \XeLaTeX\ or \LuaLaTeX\@. With |unicode|, \textsf{horoscop}
+% will use Unicode code points for the astrological symbols and leave it up to
+% the Unicode-supporting \TeX\ engine to typeset them in an appropriate font.
%
% Sources for astrological font packages:
% \changes{v0.92}{2013/05/16}{Update links for font packages}
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
% \begin{itemize}
-% \item \textsf{marvosym}: \url{http://www.ctan.org/pkg/marvosym}
-% \item \textsf{starfont}: \url{http://www.ctan.org/pkg/starfont}
-% \item \textsf{wasysym}: \url{http://www.ctan.org/pkg/wasysym}
+% \item \textsf{marvosym}: \url{https://ctan.org/pkg/marvosym}
+% \item \textsf{starfont}: \url{https://ctan.org/pkg/starfont}
+% \item \textsf{wasysym}: \url{https://ctan.org/pkg/wasysym}
% \end{itemize}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -285,12 +334,13 @@
% using this feature, by coding all the object locations into the \LaTeX\
% source file instead of having them calculated on the fly.
%
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
% Sources for external calculation programs:
% \begin{itemize}
% \item Astrolog:
-% \url{http://www.astrolog.org/astrolog.htm}
+% \url{https://www.astrolog.org/astrolog.htm}
% \item Swiss Ephemeris:
-% \url{http://www.astro.com/swisseph/}
+% \url{https://www.astro.com/swisseph/}
% \end{itemize}
%
% {\em External calculation programs require |\write18| support in \TeX.}
@@ -356,7 +406,8 @@
%
% \subsection{Astrological Symbol Options}
%
-% The options |textsym|, |wasysym|, |marvosym|, and |starfont| control the
+% The options |textsym|, |unicode|, |wasysym|, |marvosym|, and
+% |starfont| control the
% font used for astrological symbols. You may choose more than one of these
% options, in which case more than one set will be available in your
% document. The set in force at the start of the document will be the last
@@ -374,16 +425,28 @@
% The abbreviations are also used to replace missing symbols in the other
% sets.
%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% The |unicode| option is normally only useful in \XeLaTeX\ and \LuaLaTeX;
+% it causes \textsf{horoscop} to use non-ASCII Unicode characters for
+% astrological symbols. It is up to the \TeX\ engine, or the user, to
+% select a font or combination of fonts in which these characters can be
+% typeset. Both \XeLaTeX\ and \LuaLaTeX\ offer relevant font-selection
+% features, and if \textsf{horoscop} detects (using the \textsf{iftex}
+% package) some other engine, it will fall back to a text indication of
+% the desired code points, which looks like $\langle$U+263D$\rangle$.
+%
% \DescribeMacro{\horotextsym}
+% \DescribeMacro{\horounicode}
% \DescribeMacro{\horowasysym}
% \DescribeMacro{\horomarvosym}
% \DescribeMacro{\horostarfont}
-% The macros |\horotextsym|, |\horowasysym|, |\horomarvosym|, and
-% |\horostar|-|font| switch to the corresponding set of astrological symbols,
+% The macros |\horotextsym|, |\horounicode|, |\horowasysym|,
+% |\horomarvosym|, and |\horostarfont| switch to the corresponding set
+% of astrological symbols,
% so that documents can mix the different sets. Any symbols not defined by
% the new set remain in the state left by the old set. To use these macros
% the corresponding symbol sets must have been loaded with the appropriate
-% package options, except |\horotextsym| which is always available.
+% package options, except that |\horotextsym| is always available.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -583,154 +646,188 @@
% the entire zodiac by redefining |\Zodiac| instead of redefining individual
% symbols.
%
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |marvosym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |marvosym| & |starfont| \\
% |\AriesSymbol| & \horotextsym\AriesSymbol
+% & \horounicode\AriesSymbol
% & \horowasysym\AriesSymbol
% & \horomarvosym\AriesSymbol
% & \horostarfont\AriesSymbol \\
% |\TaurusSymbol| & \horotextsym\TaurusSymbol
+% & \horounicode\TaurusSymbol
% & \horowasysym\TaurusSymbol
% & \horomarvosym\TaurusSymbol
% & \horostarfont\TaurusSymbol \\
% |\GeminiSymbol| & \horotextsym\GeminiSymbol
+% & \horounicode\GeminiSymbol
% & \horowasysym\GeminiSymbol
% & \horomarvosym\GeminiSymbol
% & \horostarfont\GeminiSymbol \\
% |\CancerSymbol| & \horotextsym\CancerSymbol
+% & \horounicode\CancerSymbol
% & \horowasysym\CancerSymbol
% & \horomarvosym\CancerSymbol
% & \horostarfont\CancerSymbol \\
% |\LeoSymbol| & \horotextsym\LeoSymbol
+% & \horounicode\LeoSymbol
% & \horowasysym\LeoSymbol
% & \horomarvosym\LeoSymbol
% & \horostarfont\LeoSymbol \\
% |\VirgoSymbol| & \horotextsym\VirgoSymbol
+% & \horounicode\VirgoSymbol
% & \horowasysym\VirgoSymbol
% & \horomarvosym\VirgoSymbol
% & \horostarfont\VirgoSymbol \\
% |\LibraSymbol| & \horotextsym\LibraSymbol
+% & \horounicode\LibraSymbol
% & \horowasysym\LibraSymbol
% & \horomarvosym\LibraSymbol
% & \horostarfont\LibraSymbol \\
% |\ScorpioSymbol| & \horotextsym\ScorpioSymbol
+% & \horounicode\ScorpioSymbol
% & \horowasysym\ScorpioSymbol
% & \horomarvosym\ScorpioSymbol
% & \horostarfont\ScorpioSymbol \\
% |\SagittariusSymbol| & \horotextsym\SagittariusSymbol
+% & \horounicode\SagittariusSymbol
% & \horowasysym\SagittariusSymbol
% & \horomarvosym\SagittariusSymbol
% & \horostarfont\SagittariusSymbol \\
% |\CapricornSymbol| & \horotextsym\CapricornSymbol
+% & \horounicode\CapricornSymbol
% & \horowasysym\CapricornSymbol
% & \horomarvosym\CapricornSymbol
% & \horostarfont\CapricornSymbol \\
% |\AquariusSymbol| & \horotextsym\AquariusSymbol
+% & \horounicode\AquariusSymbol
% & \horowasysym\AquariusSymbol
% & \horomarvosym\AquariusSymbol
% & \horostarfont\AquariusSymbol \\
% |\PiscesSymbol| & \horotextsym\PiscesSymbol
+% & \horounicode\PiscesSymbol
% & \horowasysym\PiscesSymbol
% & \horomarvosym\PiscesSymbol
% & \horostarfont\PiscesSymbol
-% \end{tabular}
+% \end{tabular}}
%
% \subsubsection{Luminaries and traditional planets}
%
% These are well-supported by the various fonts.
%
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |marvosym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |marvosym| & |starfont| \\
% |\SunSymbol| & \horotextsym\SunSymbol
+% & \horounicode\SunSymbol
% & \horowasysym\SunSymbol
% & \horomarvosym\SunSymbol
% & \horostarfont\SunSymbol \\
% |\MoonSymbol| & \horotextsym\MoonSymbol
+% & \horounicode\MoonSymbol
% & \horowasysym\MoonSymbol
% & \horomarvosym\MoonSymbol
% & \horostarfont\MoonSymbol \\
% |\MercurySymbol| & \horotextsym\MercurySymbol
+% & \horounicode\MercurySymbol
% & \horowasysym\MercurySymbol
% & \horomarvosym\MercurySymbol
% & \horostarfont\MercurySymbol \\
% |\VenusSymbol| & \horotextsym\VenusSymbol
+% & \horounicode\VenusSymbol
% & \horowasysym\VenusSymbol
% & \horomarvosym\VenusSymbol
% & \horostarfont\VenusSymbol \\
% |\MarsSymbol| & \horotextsym\MarsSymbol
+% & \horounicode\MarsSymbol
% & \horowasysym\MarsSymbol
% & \horomarvosym\MarsSymbol
% & \horostarfont\MarsSymbol \\
% |\JupiterSymbol| & \horotextsym\JupiterSymbol
+% & \horounicode\JupiterSymbol
% & \horowasysym\JupiterSymbol
% & \horomarvosym\JupiterSymbol
% & \horostarfont\JupiterSymbol \\
% |\SaturnSymbol| & \horotextsym\SaturnSymbol
+% & \horounicode\SaturnSymbol
% & \horowasysym\SaturnSymbol
% & \horomarvosym\SaturnSymbol
% & \horostarfont\SaturnSymbol \\
% |\UranusSymbol| & \horotextsym\UranusSymbol
+% & \horounicode\UranusSymbol
% & \horowasysym\UranusSymbol
% & \horomarvosym\UranusSymbol
% & \horostarfont\UranusSymbol \\
% |\NeptuneSymbol| & \horotextsym\NeptuneSymbol
+% & \horounicode\NeptuneSymbol
% & \horowasysym\NeptuneSymbol
% & \horomarvosym\NeptuneSymbol
% & \horostarfont\NeptuneSymbol \\
% |\PlutoSymbol| & \horotextsym\PlutoSymbol
+% & \horounicode\PlutoSymbol
% & \horowasysym\PlutoSymbol
% & \horomarvosym\PlutoSymbol
% & \horostarfont\PlutoSymbol
-% \end{tabular}
+% \end{tabular}}
%
% \subsubsection{Other objects, cusps, and angles}
% The \textsf{starfont} package provides symbols for asteroids, derived
% points, angles, and so on. Without it, these things default to the
-% |textsym| abbreviations. Cusp symbols are listed here too, although they
+% |textsym| abbreviations. The |unicode| option also has code points for
+% these. Cusp symbols are listed in this table, but they
% generally do not appear in the default templates and will seldom be used
% in actual practice.
%
-% \begin{tabular}{lcc}
-% macro & |textsym| & |starfont| \\
+% {\setlength{\tabcolsep}{0.2em}
+% \begin{tabular}{lccc}
+% macro & |textsym| & |unicode| &|starfont| \\
% |\ChironSymbol| & \horotextsym\ChironSymbol
+% & \horounicode\ChironSymbol
% & \horostarfont\ChironSymbol \\
% |\CeresSymbol| & \horotextsym\CeresSymbol
+% & \horounicode\CeresSymbol
% & \horostarfont\CeresSymbol \\
% |\PallasSymbol| & \horotextsym\PallasSymbol
+% & \horounicode\PallasSymbol
% & \horostarfont\PallasSymbol \\
% |\JunoSymbol| & \horotextsym\JunoSymbol
+% & \horounicode\JunoSymbol
% & \horostarfont\JunoSymbol \\
% |\VestaSymbol| & \horotextsym\VestaSymbol
+% & \horounicode\VestaSymbol
% & \horostarfont\VestaSymbol \\
% |\NorthNodeSymbol| & \horotextsym\NorthNodeSymbol
+% & \horounicode\NorthNodeSymbol
% & \horostarfont\NorthNodeSymbol \\
% |\SouthNodeSymbol| & \horotextsym\SouthNodeSymbol
+% & \horounicode\SouthNodeSymbol
% & \horostarfont\SouthNodeSymbol \\
% |\LilithSymbol| & \horotextsym\LilithSymbol
+% & \horounicode\LilithSymbol
% & \horostarfont\LilithSymbol \\
% |\CuspISymbol| & \horotextsym\CuspISymbol
-% & \horostarfont\CuspISymbol \\
+% & & \horostarfont\CuspISymbol \\
% |\CuspIISymbol| & \horotextsym\CuspIISymbol & \\
% |\CuspIIISymbol| & \horotextsym\CuspIIISymbol & \\
% |\CuspIVSymbol| & \horotextsym\CuspIVSymbol
-% & \horostarfont\CuspIVSymbol \\
+% & & \horostarfont\CuspIVSymbol \\
% |\CuspVSymbol| & \horotextsym\CuspVSymbol & \\
% |\CuspVISymbol| & \horotextsym\CuspVISymbol & \\
% |\CuspVIISymbol| & \horotextsym\CuspVIISymbol
-% & \horostarfont\CuspVIISymbol \\
+% & & \horostarfont\CuspVIISymbol \\
% |\CuspVIIISymbol| & \horotextsym\CuspVIIISymbol & \\
% |\CuspIXSymbol| & \horotextsym\CuspIXSymbol & \\
% |\CuspXSymbol| & \horotextsym\CuspXSymbol
-% & \horostarfont\CuspXSymbol \\
+% & & \horostarfont\CuspXSymbol \\
% |\CuspXISymbol| & \horotextsym\CuspXISymbol & \\
% |\CuspXIISymbol| & \horotextsym\CuspXIISymbol & \\
% |\AscendantSymbol| & \horotextsym\AscendantSymbol
-% & \horostarfont\AscendantSymbol \\
+% & & \horostarfont\AscendantSymbol \\
% |\MCSymbol| & \horotextsym\MCSymbol
-% & \horostarfont\MCSymbol \\
+% & & \horostarfont\MCSymbol \\
% |\VertexSymbol| & \horotextsym\VertexSymbol
-% & \horostarfont\VertexSymbol \\
-% \end{tabular}
+% & & \horostarfont\VertexSymbol \\
+% \end{tabular}}
%
% Note that \textsf{wasysym} provides a symbol it calls |\ascnode|, but it's
% actually identical to the symbol it calls |\leo|, and the symbol (\leo)
@@ -770,35 +867,44 @@
% below also shows the default angles and orbs for the aspects; see
% Subsection~\ref{sub:aspect-web}.
%
-% {\renewcommand{\tabcolsep}{0.2em}
-% \begin{tabular}{lcccc}
-% macro & |textsym| & |wasysym| & |starfont| & angle\\
+% \noindent{\setlength{\tabcolsep}{0.1em}
+% \begin{tabular}{lccccc}
+% macro & |textsym| & |unicode| & |wasysym| & |starfont| & angle\\
% |\horoConjunctionSymbol| & \horotextsym\horoConjunctionSymbol
+% & \horounicode\horoConjunctionSymbol
% & \horowasysym\horoConjunctionSymbol
% & \horostarfont\horoConjunctionSymbol & $0\horodegrees\pm6\horodegrees$ \\
% |\horoOppositionSymbol| & \horotextsym\horoOppositionSymbol
+% & \horounicode\horoOppositionSymbol
% & \horowasysym\horoOppositionSymbol
% & \horostarfont\horoOppositionSymbol & $180\horodegrees\pm6\horodegrees$ \\
% |\horoTrineSymbol| & \horotextsym\horoTrineSymbol
+% & \horounicode\horoTrineSymbol
% & \horowasysym\horoTrineSymbol
% & \horostarfont\horoTrineSymbol & $120\horodegrees\pm5\horodegrees$ \\
% |\horoSquareSymbol| & \horotextsym\horoSquareSymbol
+% & \horounicode\horoSquareSymbol
% & \horowasysym\horoSquareSymbol
% & \horostarfont\horoSquareSymbol & $90\horodegrees\pm5\horodegrees$ \\
% |\horoQuintileSymbol| & \horotextsym\horoQuintileSymbol
-% & & \horostarfont\horoQuintileSymbol & $72\horodegrees\pm2\horodegrees$ \\
+% & & & \horostarfont\horoQuintileSymbol & $72\horodegrees\pm2\horodegrees$ \\
% |\horoBiquintileSymbol| & \horotextsym\horoBiquintileSymbol
-% & & \horostarfont\horoBiquintileSymbol & $144\horodegrees\pm2\horodegrees$ \\
+% & & & \horostarfont\horoBiquintileSymbol & $144\horodegrees\pm2\horodegrees$ \\
% |\horoSextileSymbol| & \horotextsym\horoSextileSymbol
+% & \horounicode\horoSextileSymbol
% & \horowasysym\horoSextileSymbol
% & \horostarfont\horoSextileSymbol & $60\horodegrees\pm4\horodegrees$ \\
% |\horoQuincunxSymbol| & \horotextsym\horoQuincunxSymbol
+% & \horounicode\horoQuincunxSymbol
% & & \horostarfont\horoQuincunxSymbol & $150\horodegrees\pm3\horodegrees$ \\
% |\horoSemisextileSymbol| & \horotextsym\horoSemisextileSymbol
+% & \horounicode\horoSemisextileSymbol
% & & \horostarfont\horoSemisextileSymbol & $30\horodegrees\pm3\horodegrees$ \\
% |\horoSemisquareSymbol| & \horotextsym\horoSemisquareSymbol
+% & \horounicode\horoSemisquareSymbol
% & & \horostarfont\horoSemisquareSymbol & $45\horodegrees\pm2\horodegrees$ \\
% |\horoSesquiquadrateSymbol| & \horotextsym\horoSesquiquadrateSymbol
+% & \horounicode\horoSesquiquadrateSymbol
% & & \horostarfont\horoSesquiquadrateSymbol & $135\horodegrees\pm2\horodegrees$
% \end{tabular}}
%
@@ -967,7 +1073,8 @@
% would be better to assign house positions in a way that takes latitude
% into account. See the article ``The Problems of House Division'' by
% Deborah Houlding, available online at
-% \url{http://www.skyscript.co.uk/houprob_print.html}, for more discussion
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
+% \url{https://www.skyscript.co.uk/houprob_print.html}, for more discussion
% of this issue. In some future version \textsf{horoscop} may be extended
% to provide more options for handling of this kind of thing.
%
@@ -995,6 +1102,7 @@
% that would be created by |\horocalculate| simply need to be created
% directly, as in the example below.
%
+% \changes{v1.0}{2020/07/20}{Correct macro names for manual position example}
% \begin{verbatim}
% \def\horoSunPos{267.5002492}\def\horoSunVel{1.0185515}
% \def\horoMoonPos{229.2067659}\def\horoMoonVel{11.9237313}
@@ -1008,18 +1116,18 @@
% \def\horoPlutoPos{133.0955746}\def\horoPlutoVel{-0.0150157}
% \def\horoNorthNodePos{70.7814892}\def\horoNorthNodeVel{-0.0529425}
% \def\horoLilithPos{265.3475147}\def\horoLilithVel{0.1108368}
-% \def\horoCuspI{207.9120843}
-% \def\horoCuspII{236.5553269}
-% \def\horoCuspIII{267.6976404}
-% \def\horoCuspIV{300.5365877}
-% \def\horoCuspV{332.9973490}
-% \def\horoCuspVI{2.5292853}
-% \def\horoCuspVII{27.9120843}
-% \def\horoCuspVIII{56.5553269}
-% \def\horoCuspIX{87.6976404}
-% \def\horoCuspX{120.5365877}
-% \def\horoCuspXI{152.9973490}
-% \def\horoCuspXII{182.5292853}
+% \def\horoCuspPosI{207.9120843}
+% \def\horoCuspPosII{236.5553269}
+% \def\horoCuspPosIII{267.6976404}
+% \def\horoCuspPosIV{300.5365877}
+% \def\horoCuspPosV{332.9973490}
+% \def\horoCuspPosVI{2.5292853}
+% \def\horoCuspPosVII{27.9120843}
+% \def\horoCuspPosVIII{56.5553269}
+% \def\horoCuspPosIX{87.6976404}
+% \def\horoCuspPosX{120.5365877}
+% \def\horoCuspPosXI{152.9973490}
+% \def\horoCuspPosXII{182.5292853}
% \end{verbatim}
%
% A few less obvious macros also need to be set for manually-entered
@@ -1185,6 +1293,20 @@
% |\horowheelVancouver|, as in the birth chart for John Lennon shown in
% Figure~\ref{fig:basic-wheel}.
%
+% \changes{v1.0}{2020/07/21}{Emphasize that template names do not determine
+% geographic locations of charts}
+% Please note that the standard templates are named after Canadian cities,
+% but these names are only \emph{thematic names for the visual styles of the
+% charts}\footnote{I was inspired to use this naming theme by Ruskey and
+% Weston's work on Venn diagrams; see
+% \url{https://www.combinatorics.org/files/Surveys/ds5/ds5v3-2005/VennEJC.html}.}
+% and the names of the templates have no connection with the geographic
+% locations the charts refer to. You can plot a chart for any location in
+% Vancouver style, and you can plot a chart that does happen to be for
+% Vancouver (any of the multiple places in the world with that name) using any
+% template. The geographic location for the chart must be specified by
+% latitude and longitude, independently of the template name.
+%
% \begin{figure}
% \horocalcparms{1940}{10}{9}{17:30:0}{W2:55:0}{N53:25:0}
% \horocalculate
@@ -2081,7 +2203,8 @@
% exist \emph{even in theory}. He was probably joking, but so might I be.
% See \emph{``Real'' Analysis is a Degenerate Case of Discrete Analysis},
% D.~Zeilberger,
-% \url{http://www.math.rutgers.edu/~zeilberg/mamarim/mamarimhtml/real.html}.}
+% \changes{v1.0}{2020/07/20}{Upgrade links to HTTPS}
+% \url{https://sites.math.rutgers.edu/~zeilberg/mamarim/mamarimhtml/real.html}.}
% so the decision on how to represent truly exact cusps seems not to be of
% much practical consequence anyway.
%
@@ -2552,7 +2675,7 @@
%
% Note that the spring strength settings are for adjusting
% the {\em relative} strengths of the different kind of adjustments. It
-% will not work to increase or decrese all three uniformly to make
+% will not work to increase or decrease all three uniformly to make
% the overall layout looser or tighter, because the system will simply make
% more or fewer iterations and end up with substantially the same solution.
% Overall looser-tighter control should instead be exercised by changing
@@ -2878,12 +3001,15 @@
%
% These can all be turned on and off independently.
%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
% \begin{macrocode}
\newif\ifhoro@textsym\horo@textsymfalse
+\newif\ifhoro@unicode\horo@unicodefalse
\newif\ifhoro@wasysym\horo@wasysymfalse
\newif\ifhoro@marvosym\horo@marvosymfalse
\newif\ifhoro@starfont\horo@starfontfalse
\DeclareOption{textsym}{\horo@textsymtrue}
+\DeclareOption{unicode}{\horo@unicodetrue}
\DeclareOption{wasysym}{\horo@wasysymtrue}
\DeclareOption{marvosym}{\horo@marvosymtrue}
\DeclareOption{starfont}{\horo@starfonttrue}
@@ -2935,14 +3061,25 @@
%
% \begin{macrocode}
\ifhoro@textsym\else
- \ifhoro@wasysym\else
- \ifhoro@marvosym\else
- \horo@starfonttrue
+ \ifhoro@unicode\else
+ \ifhoro@wasysym\else
+ \ifhoro@marvosym\else
+ \horo@starfonttrue
+ \fi
\fi
\fi
\fi
% \end{macrocode}
%
+% Because \textsf{iftex} defines conditionals, we must load it
+% unconditionally. Otherwise the parse of our style file (when it skims
+% over not-taken conditional bodies) fails.
+%
+% \changes{v1.0}{2020/07/02}{Require \textsf{iftex}}
+% \begin{macrocode}
+\RequirePackage{iftex}%
+% \end{macrocode}
+%
% Load other packages as needed by the selected options. Since
% there are some name conflicts between macros defined by in different
% packages and we want to retain access to both versions, we save each
@@ -3150,12 +3287,195 @@
\horotextsym
% \end{macrocode}
%
+% \subsubsection{Unicode astrological symbols}
+%
+% \changes{v1.0}{2020/07/20}{\texttt{unicode} option}
+% As with |textsym|, the actual setting of the symbol macros is all inside a
+% |unicode|-specific macro so that we can switch back to it easily
+% after using other symbol sets. The macro |\horounicode@| contains the
+% actual code points in caret notation, which traditional \TeX\ engines
+% cannot process; this macro is called by |\horounicode| conditionally
+% on its detecting a Unicode-compatible engine.
+%
+% \begin{macro}{\horounicode@}
+% \begin{macrocode}
+\ifhoro@unicode\newcommand{\horounicode@}{%
+% \end{macrocode}
+%
+% Signs of the Zodiac:
+% \begin{macrocode}
+\gdef\AriesSymbol{^^^^2648}%
+\gdef\TaurusSymbol{^^^^2649}%
+\gdef\GeminiSymbol{^^^^264a}%
+\gdef\CancerSymbol{^^^^264b}%
+\gdef\LeoSymbol{^^^^264c}%
+\gdef\VirgoSymbol{^^^^264d}%
+\gdef\LibraSymbol{^^^^264e}%
+\gdef\ScorpioSymbol{^^^^264f}%
+\gdef\SagittariusSymbol{^^^^2650}%
+\gdef\CapricornSymbol{^^^^2651}%
+\gdef\AquariusSymbol{^^^^2652}%
+\gdef\PiscesSymbol{^^^^2653}%
+% \end{macrocode}
+%
+% Traditional planets and luminaries:
+% \begin{macrocode}
+\gdef\SunSymbol{^^^^2609}%
+\gdef\MoonSymbol{^^^^263d}%
+\gdef\MercurySymbol{^^^^263f}%
+\gdef\VenusSymbol{^^^^2640}%
+\gdef\MarsSymbol{^^^^2642}%
+\gdef\JupiterSymbol{^^^^2643}%
+\gdef\SaturnSymbol{^^^^2644}%
+\gdef\UranusSymbol{^^^^2645}%
+\gdef\NeptuneSymbol{^^^^2646}%
+\gdef\PlutoSymbol{^^^^2647}%
+% \end{macrocode}
+%
+% Minor planets:
+% \begin{macrocode}
+\gdef\ChironSymbol{^^^^26b7}%
+\gdef\CeresSymbol{^^^^26b3}%
+\gdef\PallasSymbol{^^^^26b4}%
+\gdef\JunoSymbol{^^^^26b5}%
+\gdef\VestaSymbol{^^^^26b6}%
+% \end{macrocode}
+%
+% Derived points:
+% \begin{macrocode}
+\gdef\NorthNodeSymbol{^^^^260a}%
+\gdef\SouthNodeSymbol{^^^^260b}%
+\gdef\LilithSymbol{^^^^26b8}%
+% \end{macrocode}
+%
+% Direction:
+% \begin{macrocode}
+\gdef\horoRetrogradeSymbol{^^^^211e}%
+% \end{macrocode}
+%
+% Aspects:
+% \begin{macrocode}
+\gdef\horoConjunctionSymbol{^^^^260c}%
+\gdef\horoOppositionSymbol{^^^^260d}%
+\gdef\horoTrineSymbol{^^^^25b3}%
+\gdef\horoSquareSymbol{^^^^25a1}%
+\gdef\horoSextileSymbol{^^^^26b9}%
+\gdef\horoQuincunxSymbol{^^^^26bb}%
+\gdef\horoSemisextileSymbol{^^^^26ba}%
+\gdef\horoSemisquareSymbol{^^^^2220}%
+\gdef\horoSesquiquadrateSymbol{^^^^26bc}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% This helper macro typesets a notation that describes a code point in text:
+%
+% \begin{macro}{\horounicode@point}
+% \begin{macrocode}
+\newcommand{\horounicode@point}[1]{\ensuremath{\langle\mbox{U+#1}\rangle}}
+% \end{macrocode}
+% \end{macro}
+%
+% The |\horounicode| driver can either call |\horounicode@| to really
+% use Unicode, or display text-based descriptions of the Unicode code points
+% it wants, depending on the engine. Factoring |\horounicode@| into a
+% separate macro reduces repetition, since |\horounicode| wants to call it in
+% two different places.
+%
+% \begin{macro}{\horounicode}
+% \changes{v1.0}{2020/07/20}{New macro}
+% \begin{macrocode}
+\newcommand{\horounicode}{%
+% \end{macrocode}
+%
+% Call |\horounicode@| if it is safe to do so:
+% \begin{macrocode}
+\ifxetex\horounicode@\else
+\ifluatex\horounicode@\else
+% \end{macrocode}
+%
+% Now define all the code points, as above, but in text notation.
+%
+% Signs of the Zodiac:
+% \begin{macrocode}
+\gdef\AriesSymbol{\horounicode@point{2648}}%
+\gdef\TaurusSymbol{\horounicode@point{2649}}%
+\gdef\GeminiSymbol{\horounicode@point{264A}}%
+\gdef\CancerSymbol{\horounicode@point{264B}}%
+\gdef\LeoSymbol{\horounicode@point{264C}}%
+\gdef\VirgoSymbol{\horounicode@point{264D}}%
+\gdef\LibraSymbol{\horounicode@point{264E}}%
+\gdef\ScorpioSymbol{\horounicode@point{264F}}%
+\gdef\SagittariusSymbol{\horounicode@point{2650}}%
+\gdef\CapricornSymbol{\horounicode@point{2651}}%
+\gdef\AquariusSymbol{\horounicode@point{2652}}%
+\gdef\PiscesSymbol{\horounicode@point{2653}}%
+% \end{macrocode}
+%
+% Traditional planets and luminaries:
+% \begin{macrocode}
+\gdef\SunSymbol{\horounicode@point{2609}}%
+\gdef\MoonSymbol{\horounicode@point{263D}}%
+\gdef\MercurySymbol{\horounicode@point{263F}}%
+\gdef\VenusSymbol{\horounicode@point{2640}}%
+\gdef\MarsSymbol{\horounicode@point{2642}}%
+\gdef\JupiterSymbol{\horounicode@point{2643}}%
+\gdef\SaturnSymbol{\horounicode@point{2644}}%
+\gdef\UranusSymbol{\horounicode@point{2645}}%
+\gdef\NeptuneSymbol{\horounicode@point{2646}}%
+\gdef\PlutoSymbol{\horounicode@point{2647}}%
+% \end{macrocode}
+%
+% Minor planets:
+% \begin{macrocode}
+\gdef\ChironSymbol{\horounicode@point{26B7}}%
+\gdef\CeresSymbol{\horounicode@point{26B3}}%
+\gdef\PallasSymbol{\horounicode@point{26B4}}%
+\gdef\JunoSymbol{\horounicode@point{26B5}}%
+\gdef\VestaSymbol{\horounicode@point{26B6}}%
+% \end{macrocode}
+%
+% Derived points:
+% \begin{macrocode}
+\gdef\NorthNodeSymbol{\horounicode@point{260A}}%
+\gdef\SouthNodeSymbol{\horounicode@point{260B}}%
+\gdef\LilithSymbol{\horounicode@point{26B8}}%
+% \end{macrocode}
+%
+% Direction:
+% \begin{macrocode}
+\gdef\horoRetrogradeSymbol{\horounicode@point{211E}}%
+% \end{macrocode}
+%
+% Aspects:
+% \begin{macrocode}
+\gdef\horoConjunctionSymbol{\horounicode@point{260C}}%
+\gdef\horoOppositionSymbol{\horounicode@point{260D}}%
+\gdef\horoTrineSymbol{\horounicode@point{25B3}}%
+\gdef\horoSquareSymbol{\horounicode@point{25A1}}%
+\gdef\horoSextileSymbol{\horounicode@point{26B9}}%
+\gdef\horoQuincunxSymbol{\horounicode@point{26BB}}%
+\gdef\horoSemisextileSymbol{\horounicode@point{26BA}}%
+\gdef\horoSemisquareSymbol{\horounicode@point{2220}}%
+\gdef\horoSesquiquadrateSymbol{\horounicode@point{26BC}}%
+\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now invoke |\horounicode| to make these symbols default at the start of
+% the document, except for the few (house cusps, and quintiles) that
+% don't exist in Unicode.
+% \begin{macrocode}
+\horounicode
+\fi
+% \end{macrocode}
+%
% \subsubsection{Symbols from \textsf{wasysym}}
%
% \begin{macro}{\horowasysym}
-% As with |textsym|, the actual setting of the symbol macros is all inside a
-% \textsf{wasysym}-specific macro so that we can switch back to it easily
-% after using other symbol sets.
+% These, too, are inside a macro specific to the package so that we can
+% switch among multiple symbol sets when more than one is loaded.
% \begin{macrocode}
\ifhoro@wasysym\newcommand{\horowasysym}{%
% \end{macrocode}
diff --git a/macros/latex/contrib/horoscop/horoscop.pdf b/macros/latex/contrib/horoscop/horoscop.pdf
index 34bff09192..d7874d4c46 100644
--- a/macros/latex/contrib/horoscop/horoscop.pdf
+++ b/macros/latex/contrib/horoscop/horoscop.pdf
Binary files differ
diff --git a/macros/latex/contrib/semantex/README.md b/macros/latex/contrib/semantex/README.md
index fc47222981..6da44d3d9c 100644
--- a/macros/latex/contrib/semantex/README.md
+++ b/macros/latex/contrib/semantex/README.md
@@ -1,4 +1,4 @@
-SemanTeX - object-oriented mathematics
+SemanTeX - semantic mathematics
--------------------------------------
The SemanTeX package for LaTeX delivers a more semantic,
diff --git a/macros/latex/contrib/semantex/semantex.pdf b/macros/latex/contrib/semantex/semantex.pdf
index 8c9f32df7e..240ae06b3c 100644
--- a/macros/latex/contrib/semantex/semantex.pdf
+++ b/macros/latex/contrib/semantex/semantex.pdf
Binary files differ
diff --git a/macros/latex/contrib/semantex/semantex.sty b/macros/latex/contrib/semantex/semantex.sty
index 1fb42b0bbd..e5125e921f 100644
--- a/macros/latex/contrib/semantex/semantex.sty
+++ b/macros/latex/contrib/semantex/semantex.sty
@@ -1,5 +1,16 @@
\RequirePackage{expl3,xparse}
-\ProvidesExplPackage{semantex}{2020/07/07}{0.201alpha}{}
+\ProvidesExplPackage{semantex}{2020/07/21}{0.3alpha}{}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% SemanTeX -- semantic mathematics %
+% https://ctan.org/pkg/semantex %
+% (C) 2020 Sebastian Ørsted %
+% sorsted@gmail.com %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -32,9 +43,15 @@
\msg_new:nnnn { semantex } { object_not_found } { You~set~#1~as~#2~of~unknown~object~#3~on~line~\msg_line_number: } {}
-\msg_new:nnnn { semantex } { created_object_of_unknown_class } { Unknown~class~#1~declared~as~class~of~object~#2~on~line~\msg_line_number: } {}
+\msg_new:nnnn { semantex } { created_object_of_unknown_class } { Unknown~class~#1~declared~as~class~of~#2~on~line~\msg_line_number: } {}
+
+\msg_new:nnnn { semantex } { setup_unknown_class } { You~tried~setting~up~an~unknown~#1~on~line~\msg_line_number: } {}
-\msg_new:nnnn { semantex } { created_a_SemantexVariable } { Never~create~objects~of~class~\SemantexVariable;~create~a~new~class~yourself~instead.~You~created~the~object~#1~on~line~\msg_line_number: } {}
+\msg_new:nnnn { semantex } { setup_unknown_object } { You~tried~setting~up~an~unknown~#1~on~line~\msg_line_number: } {}
+
+\msg_new:nnnn { semantex } { created_a_SemantexBaseObject } { Never~create~objects~of~class~\SemantexBaseObject;~create~a~new~class~yourself~instead.~You~created~the~object~#1~on~line~\msg_line_number: } {}
+
+\msg_new:nnnn { semantex } { generic_error } { #2~#1~on~line~\msg_line_number: } {}
\cs_generate_variant:Nn \msg_error:nnnn { nnnx }
@@ -50,6 +67,8 @@
\tl_set_eq:NN #2 \l__semantex_error_output_format_temp
}
+\cs_generate_variant:Nn \semantex_error_output_format:nN { xN }
+
\cs_generate_variant:Nn \msg_error:nnnnn { nnxnn }
\cs_generate_variant:Nn \msg_error:nnnn { nnxn }
@@ -87,29 +106,89 @@
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\DeclareDocumentCommand\semantex_new_plain_class:Nw{mO{}} % new simple-type class
+{
+ % #1 = class name
+ % #2 = options
+ \semantex_new_class:Nn { #1 } { \semantex_class_set_keys:Nn #1 { #2 } }
+ %\semantex_new_class:Nn { #1 } { #2 }
+ \DeclareDocumentCommand{#1}{m}{
+ % the actual \#1 command
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ }
+ }
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mm}{
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ }
+ }
+ \exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}}
+ {
+ % the command for creating a new object of class #1
+ % ##1 = command name, with backslash
+ % ##2 = symbol
+ % ##3 = options
+ \IfValueTF{##2}
+ {
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_symbol:Nn ##1 { ##2 }
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
+ }
+ {
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
+ }
+ % create the object with name ##1
+ \DeclareDocumentCommand{##1}{}{
+ % the actual \##1 command
+ \semantex_render_object:Nn ##1 { }
+ }
+ }
+}
+
+\tl_set_eq:NN\NewPlainClass\semantex_new_plain_class:Nw
\DeclareDocumentCommand\semantex_new_simple_class:Nw{mO{}} % new simple-type class
{
% #1 = class name
% #2 = options
- \semantex_new_class:Nn { #1 } { #2 }
+ \semantex_new_class:Nn { #1 } { \semantex_class_set_keys:Nn #1 { #2 } }
+ %\semantex_new_class:Nn { #1 } { #2 }
\DeclareDocumentCommand{#1}{mo}{
% the actual \#1 command
\IfValueTF{##2}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol = { ##1 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ }
}
}
\exp_args:Nc\DeclareDocumentCommand{__semantex_make_object_of_class_\cs_to_str:N #1_with_options:nnw}{mmo}{
\IfValueTF{##3}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ }
}
}
\exp_args:Nc\DeclareDocumentCommand{__semantex_new_object_of_class_\cs_to_str:N #1:Nw}{mgO{}}
@@ -120,17 +199,25 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_symbol:Nn ##1 { ##2 }
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
{
- \semantex_new_object:NNn { #1 } ##1 { ##3 }
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
% create the object with name ##1
\DeclareDocumentCommand{##1}{o}{
% the actual \##1 command
\IfValueTF { ####1 }
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ }
}
{
\semantex_render_object:Nn ##1 { }
@@ -147,26 +234,42 @@
{
% #1 = class name
% #2 = options
- \semantex_new_class:Nn { #1 } { #2 }
+ \semantex_new_class:Nn { #1 } { \semantex_class_set_keys:Nn #1 { #2 } }
+ %\semantex_new_class:Nn #1 { #2 }
\DeclareDocumentCommand{#1}{mog}{
% the actual \#1 command
\IfValueTF { ##2 }
{
\IfValueTF { ##3 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2,arg={##3} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_set_arg:Nn #1 { ##3 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},##2}
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ }
}
}
{
\IfValueTF { ##3 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1},arg={##3} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_arg:Nn #1 { ##3 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol={##1} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ }
}
}
}
@@ -174,19 +277,38 @@
\IfValueTF { ##3 }
{
\IfValueTF { ##4 }{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3,arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ }
}
}
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol={##2}, ##1 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ }
}
}
}
@@ -198,10 +320,15 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantex_new_object:NNn { #1 } ##1 { symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_symbol:Nn ##1 { ##2 }
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
{
- \semantex_new_object:NNn { #1 } ##1 { ##3 }
+ \semantex_new_object:NNn #1 ##1 {
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
% creates the object with name ##1
\DeclareDocumentCommand{##1}{og}{
@@ -209,16 +336,26 @@
\IfValueTF{####1}{
\IfValueTF{####2}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={####2} }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_set_arg:Nn ##1 { ####2 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1}
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ }
}
}
{
\IfValueTF{####2}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,arg={####2} }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####2 }
+ }
}
{
\semantex_render_object:Nn ##1 {}
@@ -234,7 +371,7 @@
{
% #1 = class name
% #2 = options
- \semantex_new_class:Nn { #1 } { #2 }
+ \semantex_new_class:Nn { #1 } { \semantex_class_set_keys:Nn #1 { #2 } }
\DeclareDocumentCommand{#1}{mogg}{
% the actual \#1 command
\IfValueTF{##2}
@@ -245,10 +382,21 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, *, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_use_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, * }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_use_bullet:N #1
+ }
}
}
{
@@ -256,19 +404,41 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, **, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_use_double_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, ** }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_use_double_bullet:N #1
+ }
}
}
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3}, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, degreedefault={##3} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ }
}
}
}
@@ -276,10 +446,19 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ##2 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ }
}
}
}
@@ -290,10 +469,19 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_use_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##1}, *}
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_use_bullet:N #1
+ }
}
}
{
@@ -301,19 +489,37 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, **, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_use_double_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, ** }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_use_double_bullet:N #1
+ }
}
}
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3}, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, degreedefault={##3} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:N #1 { ##1 }
+ \semantex_class_set_degreedefault:Nn #1 { ##3 }
+ }
}
}
}
@@ -321,10 +527,16 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##1}, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol={##1}, arg={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ }
}
}
}
@@ -338,10 +550,23 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, *, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_use_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, * }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_use_bullet:N #1
+ }
}
}
{
@@ -349,19 +574,45 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, **, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_use_double_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 {ifoutput=true, symbol={##2}, ##1, ##3, ** }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_use_double_bullet:N #1
+ }
}
}
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4}, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1,##3, degreedefault={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ }
}
}
}
@@ -369,10 +620,21 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, ##3 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ }
}
}
}
@@ -383,10 +645,21 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_use_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} ,##1, *}
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_use_bullet:N #1
+ }
}
}
{
@@ -394,19 +667,41 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, **, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_use_double_bullet:N #1
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2} , ##1, ** }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_use_double_bullet:N #1
+ }
}
}
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4}, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol={##2}, ##1, degreedefault={##4} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_degreedefault:Nn #1 { ##4 }
+ }
}
}
}
@@ -414,10 +709,18 @@
{
\IfValueTF { ##5 }
{
- \semantex_render_class:Nn #1 { ifoutput=true,symbol={##2}, ##1, arg={##5} }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_arg:Nn #1 { ##5 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol={##2}, ##1 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ }
}
}
}
@@ -430,10 +733,15 @@
% ##3 = options
\IfValueTF{##2}
{
- \semantex_new_object:NNn { #1 } { ##1 }{ symbol = { ##2 }, ##3 }
+ \semantex_new_object:NNn #1 { ##1 }{
+ \semantex_object_set_symbol:Nn ##1 { ##2 }
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
{
- \semantex_new_object:NNn { #1 } { ##1 }{ ##3 }
+ \semantex_new_object:NNn #1 { ##1 }{
+ \semantex_object_set_keys:Nn ##1 { ##3 }
+ }
}
% creates the object with name ##1
\DeclareDocumentCommand{##1}{ogg}{
@@ -446,10 +754,19 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, *, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_use_bullet:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, * }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_use_bullet:N ##1
+ }
}
}
{
@@ -457,19 +774,37 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true, ####1, **, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_use_double_bullet:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true, ####1, ** }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_use_double_bullet:N ##1
+ }
}
}
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 }, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, degreedefault={ ####2 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ }
}
}
}
@@ -477,10 +812,17 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ }
}
}
}
@@ -491,10 +833,17 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true, *, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_use_bullet:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true, * }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_use_bullet:N ##1
+ }
}
}
{
@@ -502,19 +851,33 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,**, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_use_double_bullet:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,** }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_use_double_bullet:N ##1
+ }
}
}
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 }, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,degreedefault={ ####2 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_degreedefault:Nn ##1 { ####2 }
+ }
}
}
}
@@ -522,7 +885,10 @@
{
\IfValueTF{####3}
{
- \semantex_render_object:Nn ##1 { ifoutput=true, arg={ ####3 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####3 }
+ }
}
{
\semantex_render_object:Nn ##1 { }
@@ -539,28 +905,41 @@
{
% #1 = class name
% #2 = options
- \semantex_new_class:Nn { #1 } {
- #2
- }
+ \semantex_new_class:Nn { #1 } { \semantex_class_set_keys:Nn #1 { #2 } }
\DeclareDocumentCommand{#1}{mog} % maybe this does not even make sense for delimiters
{
\IfValueTF { ##2 }
{
\IfValueTF { ##3 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2, arg = { ##3 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ \semantex_class_set_arg:Nn #1 { ##3 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, ##2 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_keys:Nn #1 { ##2 }
+ }
}
}
{
\IfValueTF { ##3 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##1 }, arg = { ##3 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ \semantex_class_set_arg:Nn #1 { ##3 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol = { ##1 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##1 }
+ }
}
}
}
@@ -571,19 +950,38 @@
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3, arg = { ##4 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1 { ##3 }
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, ##3 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_keys:Nn #1{ ##3 }
+ }
}
}
{
\IfValueTF { ##4 }
{
- \semantex_render_class:Nn #1 { ifoutput=true, symbol = { ##2 }, ##1, arg = { ##4 } }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_do_output:N #1
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ \semantex_class_set_arg:Nn #1 { ##4 }
+ }
}
{
- \semantex_render_class:Nn #1 { symbol = { ##2 }, ##1 }
+ \semantex_render_class:Nn #1 {
+ \semantex_class_set_symbol:Nn #1 { ##2 }
+ ##1
+ }
}
}
}
@@ -593,7 +991,11 @@
% ##1 = command name, with backslash
% ##2 = symbol
% ##3 = options
- \semantex_new_object:NNn { #1 } { ##1 }{ leftpar = { ##2 }, rightpar = { ##3 }, ##4 }
+ \semantex_new_object:NNn #1 { ##1 }{
+ \semantex_object_set_leftpar:Nn ##1 { ##2 }
+ \semantex_object_set_rightpar:Nn ##1 { ##3 }
+ \semantex_object_set_keys:Nn ##1 { ##4 }
+ }
% creates the object with name ##1
\DeclareDocumentCommand{##1}{og}{
% the actual \##1 command
@@ -601,16 +1003,26 @@
{
\IfValueTF { ####2 }
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1, arg = { ####2 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ \semantex_object_set_arg:Nn ##1 { ####2 }
+ }
}
{
- \semantex_render_object:Nn ##1 { ifoutput=true,####1 }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_keys:Nn ##1 { ####1 }
+ }
}
}
{
\IfValueTF { ####2 }
{
- \semantex_render_object:Nn ##1 { ifoutput=true, arg = { ####2 } }
+ \semantex_render_object:Nn ##1 {
+ \semantex_object_do_output:N ##1
+ \semantex_object_set_arg:Nn ##1 { ####2 }
+ }
}
{
\semantex_render_object:Nn ##1 { }
@@ -636,35 +1048,36 @@
}
}
-%\cs_new:Npn\MakeObject#1{ \use:c { __semantex_make_object_of_class_#1:nw } }
-
-\cs_new:Npn \__semantex_new_class_or_object:nn#1#2{
+\cs_new:Npn \__semantex_new_class_or_object:nn#1#2
+{
% create new object
% #1 = name of command, without backslash
% #2 = standard keyval setup
\semantex_data_tl_provide:nn { #1 } { parent }
- \semantex_data_tl_set:nnn { #1 } { parent } { class_SemantexVariable }
+ \semantex_data_tl_set:nnn { #1 } { parent } { class_SemantexBaseObject }
\cs_set:cpn { __semantex_data_cs_#1_valuekey:nn } ##1##2 % command controlling valuekeys
- { \semantex_valuekey:nnn { ##2 } { ##1 } { #1 } }
+ { \semantex_valuekey:nnn { #1 } { ##1 } { ##2 } }
\cs_set:cpn { __semantex_data_cs_#1_singlekey:n } ##1 % command controlling singlekeys
- { \semantex_singlekey:nn { ##1 } { #1 } }
-
+ { \semantex_singlekey:nn { #1 } { ##1 } }
+
% Now a similar collection of keyval commands for the *argument*
\cs_set:cpn { __semantex_data_cs_#1_arg_valuekey:nn } ##1##2
- { \semantex_arg_valuekey:nnn { ##2 } { ##1 }{ #1 } }
+ { \semantex_arg_valuekey:nnn { #1 } { ##1 } { ##2 } }
\cs_set:cpn { __semantex_data_cs_#1_arg_singlekey:n } ##1
- { \semantex_arg_singlekey:nn { ##1 } { #1 } }
+ { \semantex_arg_singlekey:nn { #1 } { ##1 } }
- % initially sets up the keyval interface of the object
- \semantex_keys_set:nn { #1 } { #2 }
+ \cs_set:cpn { __semantex_data_cs_#1_outputoptions:n } ##1 {}
+
+ \cs_set:cpn { __semantex_data_cs_#1_parseoptions:n } ##1 {}
-% \seq_put_right:Nx \g__semantex_all_objects_seq { #1 }
+ % This is used to set up the class/object when creating it
+ #2
}
\cs_generate_variant:Nn \__semantex_new_class_or_object:nn { xn }
@@ -672,29 +1085,134 @@
\cs_new:Npn \semantex_new_class:Nn#1#2{
% create a new class
% #1 = name of class
- % #2 = standard keyval setup; the parent class by default is SemantexVariable
- \semantex_class_if_exist:NTF { #1 }
+ % #2 = standard keyval setup; the parent class by default is SemantexBaseObject
+ \semantex_class_if_exist:NTF #1
{
\msg_error:nnn { semantex } { class_already_defined } { #1 }
}
{
- \semantex_class_register:N { #1 }
+ \semantex_class_register:N #1
\__semantex_new_class_or_object:xn { class_\cs_to_str:N #1 } { #2 }
}
}
\cs_set:Npn \semantex_new_object:NNn#1#2#3
{
- \semantex_object_if_exist:NTF { #2 }
+ \semantex_object_if_exist:NTF #2
{
\msg_error:nnn { semantex } { object_already_defined } { #2 }
}
{
- \semantex_object_register:N { #2 }
- \__semantex_new_class_or_object:xn { object_\cs_to_str:N #2 } { class=#1, #3 }
+ \semantex_object_register:N #2
+ \__semantex_new_class_or_object:xn { object_\cs_to_str:N #2 } {
+ %class=#1, #3
+ \semantex_object_set_class:Nn #2 { #1 }
+ #3
+ }
}
}
+% The following commands are used in the code for creating class types:
+
+\cs_set:Npn\semantex_class_set_symbol:Nn#1#2
+{
+ %\semantex_data_tl_set:xnn { class_\cs_to_str:N#1 } { symbol } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbol:xn { class_\cs_to_str:N #1 } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_symbol:Nn#1#2
+{
+ %\semantex_data_tl_set:xnn { object_\cs_to_str:N#1 } { symbol } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbol:xn { object_\cs_to_str:N #1 } { #2 }
+}
+
+\cs_set:Npn\semantex_class_do_output:N#1
+{
+ \semantex_data_bool_set_true:xn { class_\cs_to_str:N#1 } { output }
+}
+
+\cs_set:Npn\semantex_object_do_output:N#1
+{
+ \semantex_data_bool_set_true:xn { object_\cs_to_str:N#1 } { output }
+}
+
+\cs_set:Npn\semantex_class_set_keys:Nn#1#2
+{
+ \semantex_keys_set:xn { class_\cs_to_str:N #1 } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_keys:Nn#1#2
+{
+ \semantex_keys_set:xn { object_\cs_to_str:N #1 } { #2 }
+}
+
+\cs_set:Npn\semantex_class_set_arg:Nn#1#2
+{
+ \semantex_valuekey:xnn { class_\cs_to_str:N#1 } { arg } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_arg:Nn#1#2
+{
+ \semantex_valuekey:xnn { object_\cs_to_str:N#1 } { arg } { #2 }
+}
+
+\cs_set:Npn\semantex_class_set_degreedefault:Nn#1#2
+{
+ \semantex_valuekey:xnn { class_\cs_to_str:N#1 } { degreedefault } { #2 }
+ % should there be \exp_not:n around #2? Probably not, based on the above
+}
+
+\cs_set:Npn\semantex_object_set_degreedefault:Nn#1#2
+{
+ \semantex_valuekey:xnn { object_\cs_to_str:N#1 } { degreedefault } { #2 }
+ % should there be \exp_not:n around #2? Probably not, based on the above
+}
+
+\cs_set:Npn\semantex_class_use_bullet:N#1
+{
+ \semantex_singlekey:xn { class_\cs_to_str:N#1 } { * }
+}
+
+\cs_set:Npn\semantex_object_use_bullet:N#1
+{
+ \semantex_singlekey:xn { object_\cs_to_str:N#1 } { * }
+}
+
+\cs_set:Npn\semantex_class_use_double_bullet:N#1
+{
+ \semantex_singlekey:xn { class_\cs_to_str:N#1 } { * }
+}
+
+\cs_set:Npn\semantex_object_use_double_bullet:N#1
+{
+ \semantex_singlekey:xn { object_\cs_to_str:N#1 } { * }
+}
+
+\cs_set:Npn\semantex_class_set_leftpar:Nn#1#2
+{
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftpar:xn { class_\cs_to_str:N#1 } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_leftpar:Nn#1#2
+{
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftpar:xn { object_\cs_to_str:N#1 } { #2 }
+}
+
+\cs_set:Npn\semantex_class_set_rightpar:Nn#1#2
+{
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightpar:xn { class_\cs_to_str:N#1 } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_rightpar:Nn#1#2
+{
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightpar:xn { object_\cs_to_str:N#1 } { #2 }
+}
+
+\cs_set:Npn\semantex_object_set_class:Nn#1#2
+{
+ \semantex_data_class_set:xn { object_\cs_to_str:N #1 } { #2 }
+}
+
\seq_new:N \g__semantex_all_classes_seq % a register for all objects created
\cs_new:Npn\semantex_class_register:N#1
@@ -733,20 +1251,22 @@
% #1 = name of object
% #2 = options
\group_begin:
+ \semantex_provide_user_commands:n { #1 }
\semantex_data_tl_inherit:nn { #1 } { symbol } % Inherit the symbol from parent if not done already
- \semantex_keys_set:nn { #1 } { #2 } % Setup the keys
- \semantex_primitive_valuekey_parse:nn { #1 } { } % Run the "parse" routine, i.e. the collection of code that the user has added to the parse register
+ %\semantex_keys_set:nn { #1 } { #2 } % Setup the keys
+ #2
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parse:nn { #1 } { } % Run the "parse" routine, i.e. the collection of code that the user has added to the parse register
\semantex_data_bool_get:nnTF { #1 } { output } % Checks if the object/class is supposed to output
{
- \semantex_primitive_valuekey_innerreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_innerreturn:nn { #1 }{}
\semantex_data_int_if_positive:nnTF { #1 } { numberofarguments } % Checks if more than one argument has been received, i.e. whether we want to render any argument
{
\semantex_data_bool_get:nnTF { #1 } { leftargument } % Checks if left or right argument
{
- \semantex_primitive_valuekey_leftreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftreturn:nn { #1 }{}
}
{
- \semantex_primitive_valuekey_rightreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightreturn:nn { #1 }{}
}
}
{
@@ -759,20 +1279,28 @@
__semantex_make_object_of_\semantex_data_tl_get:nn { #1 } { output }_with_options:nnw
} % This is for outputting -- the command \__semantex_make_object_of_class_???_with_options:nnw makes a one-time object of class ??? and allows us to immediately parse options to it
{
- upperputleft={\semantex_data_tl_get_exp_not:nn { #1 } { upper }},
- lowerputleft={\semantex_data_tl_get_exp_not:nn { #1 } { lower }},
- upperleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { upperleft }},
- lowerleftputright={\semantex_data_tl_get_exp_not:nn { #1 } { lowerleft }},
- preupper={\semantex_data_tl_get_exp_not:nn { #1 } { preupper }},
- postupper={\semantex_data_tl_get_exp_not:nn { #1 } { postupper }},
- prelower={\semantex_data_tl_get_exp_not:nn { #1 } { prelower }},
- postlower={\semantex_data_tl_get_exp_not:nn { #1 } { postlower }},
- preupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { preupperleft }},
- postupperleft={\semantex_data_tl_get_exp_not:nn { #1 } { postupperleft }},
- prelowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft }},
- postlowerleft={\semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft }},
- texclass={\semantex_data_tl_get:nn { #1 } { texclass }},
- \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions },
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperputleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { upper } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerputleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { lower } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftputright:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { upperleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftputright:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { lowerleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupper:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { preupper } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupper:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { postupper } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelower:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { prelower } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlower:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { postlower } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupperleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { preupperleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupperleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { postupperleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelowerleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { prelowerleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlowerleft:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { postlowerleft } }
+ \exp_not:N\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_texclass:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get:nn { #1 } { texclass } }
+ %\exp_not:N\semantex_keys_set:nn { \semantex_data_tl_get:nn { #1 } { output } } { \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions } }
+ %\semantex_data_tl_get_exp_not:nn { #1 } { outputoptions }
+ %\exp_not:c
+% \exp_args:Nc\exp_not:N
+% { __semantex_data_cs_#1_outputoptions:n } {
+% \semantex_data_tl_get:nn { #1 } { output }
+% }
+% \semantex_data_cs_get_exp_not:nn { #1 } { outputoptions:n } { \semantex_data_tl_get:nn { #1 } { output } }
+ \semantex_data_cs_get:nn { #1 } { outputoptions:n } { \semantex_data_tl_get:nn { #1 } { output } }
% These are the options we parse to our object -- this is all
% information that we pass on to the output class so that it
% can eventually render it
@@ -781,7 +1309,7 @@
}
}
{
- \semantex_primitive_valuekey_return:nn { #1 }{} % Returns the object/class, i.e. adds all remaining indices and arguments to it
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_return:nn { #1 }{} % Returns the object/class, i.e. adds all remaining indices and arguments to it
\tl_if_blank:xTF { \semantex_data_tl_get:nn { #1 } { texclass } }
% Checks whether the texclass register has been declared -- this is
% where you store \mathord, \mathbin, \mathrel, etc., if you want
@@ -801,6 +1329,20 @@
\l__semantex_render_temp % This neat trick allows outputting to different classes to work as expected
}
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperputleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerputleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftputright:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftputright:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupper:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupper:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelower:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlower:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupperleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupperleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelowerleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlowerleft:nn { nx }
+%\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_texclass:nn { nx }
+
\cs_generate_variant:Nn \__semantex_render:nn { xn }
\cs_set:Npn\semantex_render_class:Nn#1#2 % a front-end command
@@ -1019,7 +1561,7 @@
% \use:c { g__semantex_data_tl_#1_#2 }
% }
% {
-% \tl_if_eq:nnTF { #1 } { SemantexVariable }
+% \tl_if_eq:nnTF { #1 } { SemantexBaseObject }
% {
% \msg_error:nnnn { semantex } { data_tl_not_found } { #2 } { #3 }
% }
@@ -1052,8 +1594,8 @@
\tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_data_parent_set_temp
- \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_parent_set_temp } { parent } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_parent_set_temp_tl
+ \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_parent_set_temp_tl } { parent } { #2 }
}
}
@@ -1064,11 +1606,13 @@
\tl_set:cx { g__semantex_data_tl_#1_parent } { class_\cs_to_str:N#2 }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_data_class_set_temp
- \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_class_set_temp } { class } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_class_set_temp_tl
+ \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_class_set_temp_tl } { class } { #2 }
}
}
+\cs_generate_variant:Nn \semantex_data_class_set:nn { xn }
+
\cs_new:Npn \semantex_data_copy_object:nn#1#2
{
\semantex_object_if_exist:NTF { #2 }
@@ -1076,8 +1620,8 @@
\tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_data_copy_object_temp
- \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_copy_object_temp } { copy } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_copy_object_temp_tl
+ \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_copy_object_temp_tl } { copy } { #2 }
}
}
@@ -1088,11 +1632,69 @@
\tl_set:cx { g__semantex_data_tl_#1_parent } { object_\cs_to_str:N#2 }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_data_clone_object_temp
- \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_clone_object_temp } { clone } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_clone_object_temp_tl
+ \msg_error:nnxnn { semantex } { object_not_found } { \l__semantex_data_clone_object_temp_tl } { clone } { #2 }
+ }
+}
+
+% COMMANDS FOR HANDLING DATA CONSISTING OF COMMAND SEQUENCES:
+
+\cs_new:Npn\semantex_data_cs_set:nnn#1#2#3
+{
+ \cs_set:cn { __semantex_data_cs_#1_#2 } { #3 }
+}
+
+\cs_generate_variant:Nn \cs_set:Nn { cn }
+
+\cs_generate_variant:Nn \semantex_data_cs_set:nnn { nno , nnV , nnv }
+
+\cs_new:Npn\semantex_data_cs_get:nn#1#2
+{
+ % #1 = name of the object
+ % #2 = command sequence to get
+ \cs_if_exist:cTF { __semantex_data_cs_#1_#2 }
+ {
+ \use:c { __semantex_data_cs_#1_#2 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ % should probably throw an error by now, but later!
+ }
+ {
+ \semantex_data_cs_get:fn { \semantex_data_parent_get:n {#1} } { #2 }
+ }
}
}
+\cs_generate_variant:Nn \semantex_data_cs_get:nn { fn }
+
+\cs_new:Npn\semantex_data_cs_get_exp_not:nn#1#2
+{
+ % #1 = name of the object
+ % #2 = command sequence to get
+ \cs_if_exist:cTF { __semantex_data_cs_#1_#2 }
+ {
+ \exp_not:c { __semantex_data_cs_#1_#2 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ {
+ % should probably throw an error by now, but later!
+ }
+ {
+ \semantex_data_cs_get_exp_not:fn { \semantex_data_parent_get:n {#1} } { #2 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_data_cs_get_exp_not:nn { fn }
+
+\cs_new:Npn\semantex_data_cs_clear:nn#1#2
+{
+ \cs_set:cn { __semantex_data_cs_#1_#2 } {}
+}
+
% COMMANDS FOR HANDLING DATA CONSISTING OF TOKEN LISTS
\cs_new:Npn \semantex_data_tl_get:nn#1#2
@@ -1116,10 +1718,10 @@
\use:c { g__semantex_data_tl_#1_#2 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject } % Apparently, f-type expansion seemed to work here for once
{
- \semantex_error_output_format:nN { #3 } \__semantex_data_tl_get_auxiliary_temp
- \msg_error:nnxn { semantex } { data_tl_not_found } { \__semantex_data_tl_get_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #3 } \l__semantex_data_tl_get_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_tl_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
@@ -1159,10 +1761,10 @@
\exp_not:v { g__semantex_data_tl_#1_#2 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable } % Apparently, f-type expansion seemed to work here for once
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject } % Apparently, f-type expansion seemed to work here for once
{
- \semantex_error_output_format:nN { #3 } \l__semantex_data_tl_get_exp_not_auxiliary_temp
- \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_exp_not_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #3 } \l__semantex_data_tl_get_exp_not_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_exp_not_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_tl_get_exp_not_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
@@ -1191,10 +1793,10 @@
\tl_set_eq:Nc #3 { g__semantex_data_tl_#1_#2 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
- \semantex_error_output_format:nN { #4 } \l__semantex_data_tl_get_store_auxiliary_temp
- \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_store_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_tl_get_store_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_tl_not_found } { \l__semantex_data_tl_get_store_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_tl_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
@@ -1240,7 +1842,7 @@
\tl_set:cn { g__semantex_data_tl_#1_#2 } { #3 }
}
-\cs_generate_variant:Nn \semantex_data_tl_set:nnn { nnx }
+\cs_generate_variant:Nn \semantex_data_tl_set:nnn { nnx , xnn , xnx }
\cs_new:Npn \semantex_data_tl_put_right:nnn#1#2#3
{
@@ -1318,10 +1920,10 @@
\int_use:c { g__semantex_data_int_#1_#2 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
- \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp
- \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
@@ -1329,10 +1931,10 @@
}
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
- \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp
- \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #3 } \__semantex_data_int_get_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_int_not_found } { \__semantex_data_int_get_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_int_get_auxiliary:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
@@ -1361,10 +1963,10 @@
\int_set_eq:Nc#3 { g__semantex_data_int_#1_#2 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
- \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp
- \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
@@ -1372,10 +1974,10 @@
}
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
- \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp
- \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp } { #2 }
+ \semantex_error_output_format:nN { #4 } \l__semantex_data_int_get_store_auxiliary_temp_tl
+ \msg_error:nnxn { semantex } { data_int_not_found } { \l__semantex_data_int_get_store_auxiliary_temp_tl } { #2 }
}
{
\__semantex_data_int_get_store_auxiliary:fnNn { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 }
@@ -1424,6 +2026,21 @@
\semantex_data_int_if_greater_than_one:nnTF { #1 } { #2 } { } { #3 }
}
+\cs_new:Npn\semantex_data_int_if_greater_than:nnnTF#1#2#3#4#5
+{
+ \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } > { #3 } { #4 } { #5 }
+}
+
+\cs_new:Npn\semantex_data_int_if_less_than:nnnTF#1#2#3#4#5
+{
+ \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } < { #3 } { #4 } { #5 }
+}
+
+\cs_new:Npn\semantex_data_int_if_equal:nnnTF#1#2#3#4#5
+{
+ \int_compare:nNnTF { \semantex_data_int_get:nn { #1 } { #2 } } < { #3 } { #4 } { #5 }
+}
+
\cs_new:Npn\semantex_data_int_clear:nn#1#2
{
\semantex_data_int_provide:nn { #1 } { #2 }
@@ -1499,143 +2116,6 @@
\seq_clear:c { g__semantex_data_seq_#1_#2 }
}
-% COMMANDS FOR HANDLING DATA OF TYPE PROPERTY LIST:
-
-\cs_new:Npn \semantex_data_prop_provide:nn#1#2
-{
- % #1 = name of the object
- % #2 = name of the prop
- \prop_if_exist:cF { g__semantex_data_prop_#1_#2 } { \prop_new:c { g__semantex_data_prop_#1_#2 } }
-}
-
-\cs_new:Npn \semantex_data_prop_put:nnnn#1#2#3#4
-{
- \semantex_data_prop_provide:nn { #1 } { #2 } % important that we do not inherit! This is crucial for getting the right inheritance for key interfaces
- \prop_put:cnn { g__semantex_data_prop_#1_#2 } { #3 } { #4 }
-}
-
-\cs_new:Npn\semantex_data_prop_remove:nnn#1#2#3
-{
- \prop_if_exist:cT { g__semantex_data_prop_#1_#2 }
- {
- \prop_remove:cn { g__semantex_data_prop_#1_#2 } { #3 }
- }
-}
-
-
-\cs_new:Npn \semantex_valuekey_get:nnNTF#1#2#3#4#5{%
- % #1 = name of the object
- % #2 = keyval data to get
- % #3 = command to store possible data in
- % #4 = if true (not to be used)
- % #5 = if false
- \prop_get:cnNTF { g__semantex_data_prop_#1_custom_valuekeys } { #2 } #3
- {
- #4
- }
- {
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
- {
- #5
- }
- {
- \semantex_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
- }
- }
-}
-
-\cs_new:Npn\semantex_valuekey_remove:nn#1#2
-{
- \semantex_data_prop_remove:nnn { #1 } { custom_valuekeys } { #2 }
-}
-
-\cs_generate_variant:Nn \semantex_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
-
-\cs_new:Npn \semantex_singlekey_get:nnNTF#1#2#3#4#5{%
- % #1 = name of the object
- % #2 = singlekey data to get
- % #3 = command to store possible data in
- % #4 = if true (not to be used)
- % #5 = if false
- \prop_get:cnNTF { g__semantex_data_prop_#1_custom_singlekeys } { #2 } #3
- {
- #4
- }
- {
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
- {
- #5
- }
- {
- \semantex_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
- }
- }
-}
-
-\cs_new:Npn\semantex_singlekey_remove:nn#1#2
-{
- \semantex_data_prop_remove:nnn { #1 } { custom_singlekeys } { #2 }
-}
-
-\cs_generate_variant:Nn \semantex_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
-
-\cs_new:Npn \semantex_arg_valuekey_get:nnNTF#1#2#3#4#5{%
- % #1 = name of the object
- % #2 = keyval data to get
- % #3 = command to store possible data in
- % #4 = if true (not to be used)
- % #5 = if false
- \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_valuekeys } { #2 }#3%\l_semantex_valuekey_get_temp
- {
- #4
- }
- {
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
- {
- #5
- }
- {
- \semantex_arg_valuekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
- }
- }
-}
-
-\cs_generate_variant:Nn \semantex_arg_valuekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
-
-\cs_new:Npn\semantex_arg_valuekey_remove:nn#1#2
-{
- \semantex_data_prop_remove:nnn { #1 } { custom_arg_valuekeys } { #2 }
-}
-
-
-\cs_new:Npn \semantex_arg_singlekey_get:nnNTF#1#2#3#4#5{%
- % #1 = name of the object
- % #2 = singlekey data to get
- % #3 = command to store possible data in
- % #4 = if true (not to be used)
- % #5 = if false
- \prop_get:cnNTF { g__semantex_data_prop_#1_custom_arg_singlekeys } { #2 } #3
- {
- #4
- }
- {
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
- {
- #5
- }
- {
- \semantex_arg_singlekey_get:fnNTF { \semantex_data_parent_get:n { #1 } } { #2 } #3 { #4 } { #5 }
- }
- }
-}
-
-\cs_generate_variant:Nn \semantex_arg_singlekey_get:nnNTF { fnNTF, vnNTF, xnNTF }
-
-\cs_new:Npn\semantex_arg_singlekey_remove:nn#1#2
-{
- \semantex_data_prop_remove:nnn { #1 } { custom_arg_singlekeys } { #2 }
-}
-
% COMMANDS FOR HANDLING DATA OF TYPE BOOLEAN:
\cs_new:Npn\semantex_data_bool_get:nnTF#1#2#3#4
@@ -1651,7 +2131,7 @@
\bool_if:cTF { g__semantex_data_bool_#1_if_#2 } { #3 } { #4 }
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
#4
}
@@ -1661,7 +2141,7 @@
}
}
{
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
{
#4
}
@@ -1704,6 +2184,8 @@
\bool_set_true:c { g__semantex_data_bool_#1_if_#2 }
}
+\cs_generate_variant:Nn \semantex_data_bool_set_true:nn { xn }
+
\cs_new:Npn\semantex_data_bool_set_false:nn#1#2
{
% #1 = name of the object
@@ -1714,36 +2196,15 @@
% COMMANDS FOR HANDLING COMMAND SEQUENCE DATA AND KEYVAL SYNTAX:
-\cs_new:Npn\semantex_data_cs_get:nnn#1#2#3
-{
- % #1 = name of the object
- % #2 = command sequence to get
- % #3 = what to apply said command sequence to
- \cs_if_exist:cTF { __semantex_data_cs_#1_#2:n }
- {
- \use:c { __semantex_data_cs_#1_#2:n } { #3 }
- }
- {
- \str_if_eq:nnTF { #1 } { class_SemantexVariable }
- {
- % should probably throw an error by now, but later!
- }
- {
- \semantex_data_cs_get:xnn { \semantex_data_parent_get:n {#1} } { #2 } { #3 }
- }
- }
-}
-
-\cs_generate_variant:Nn \semantex_data_cs_get:nnn { xnn }
-
-\cs_generate_variant:Nn \keyval_parse:NNn { cco }
+\cs_generate_variant:Nn \keyval_parse:NNn { cco , ccn }
\cs_new:Npn \semantex_keys_set:nn#1#2
{
+ \semantex_provide_user_commands:n { #1 }
% The central command for doing keyval setup
% #1 = object
% #2 = keys
- \keyval_parse:cco % Could be nice to get rid of o-type expansion, but so far has not been possible
+ \keyval_parse:ccn % Used to use o-type expansions, but no longer seems necessary
{ __semantex_data_cs_#1_singlekey:n }
{ __semantex_data_cs_#1_valuekey:nn }
{ #2 }
@@ -1754,7 +2215,7 @@
% The central command for doing keyval setup for the argument
% #1 = object
% #2 = keys
- \keyval_parse:cco % See last command
+ \keyval_parse:ccn % See last command
{ __semantex_data_cs_#1_arg_singlekey:n }
{ __semantex_data_cs_#1_arg_valuekey:nn }
{ #2 }
@@ -1775,35 +2236,163 @@
\DeclareDocumentCommand\SetupClass{mm}{ % a user-level command for setting up the object
% #1 = class
% #2 = setup
- \semantex_keys_set:xn { class_\cs_to_str:N #1 }{ #2 }
+ \semantex_class_if_exist:NTF #1
+ {
+ \semantex_keys_set:xn { class_\cs_to_str:N #1 }{ #2 }
+ }
+ {
+ \semantex_error_output_format:xN { class_\cs_to_str:N #1 } \l__setup_class_temp_tl
+ \msg_error:nnx { semantex } { setup_unknown_class } { \l__setup_class_temp_tl }
+ }
}
\DeclareDocumentCommand\SetupObject{mm}{%
% #1 = object
% #2 = setup
- \semantex_keys_set:xn { object_\cs_to_str:N #1 } { #2 }
+ \semantex_object_if_exist:NTF #1
+ {
+ \semantex_keys_set:xn { object_\cs_to_str:N #1 }{ #2 }
+ }
+ {
+ \semantex_error_output_format:xN { object_\cs_to_str:N #1 } \l__setup_object_temp_tl
+ \msg_error:nnx { semantex } { setup_unknown_object } { \l__setup_object_temp_tl }
+ }
+}
+
+\cs_new:Npn\semantex_valuekey:nnn#1#2#3
+{
+ \__semantex_valuekey:nnnn { #1 } { #2 } { #3 } { #1 }
+}
+
+\cs_new:Npn \__semantex_valuekey:nnnn#1#2#3#4
+{
+ % Takes care of valuekeys, keys taking a value
+ % #1 = class/object
+ % #2 = name of the key
+ % #3 = value
+ \cs_if_exist:cTF { __semantex_data_cs_custom_valuekey_#1_#2:nn }
+ {
+ \use:c { __semantex_data_cs_custom_valuekey_#1_#2:nn } { #4 } { #3 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \semantex_error_output_format:nN { #4 } \l__semantex_valuekey_unknown_key_temp_tl
+ \msg_error:nnxn { semantex } { valuekey_not_found } { \l__semantex_valuekey_unknown_key_temp_tl } { #2 }
+ }
+ {
+ \__semantex_valuekey:fnnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_valuekey:nnnn { fnnn }
+
+\cs_generate_variant:Nn \semantex_valuekey:nnn { xnn }
+
+\cs_new:Npn\semantex_singlekey:nn#1#2
+{
+ \__semantex_singlekey:nnn { #1 } { #2 } { #1 }
+}
+
+\cs_new:Npn\__semantex_singlekey:nnn#1#2#3
+{
+ % #1 = class/object
+ % #2 = name of the key
+ \cs_if_exist:cTF { \tl_to_str:n{__semantex_data_cs_custom_singlekey_#1_#2:n } }
+ {
+ \use:c { __semantex_data_cs_custom_singlekey_#1_#2:n } { #3 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \semantex_valuekey:nnn { #3 } { default } { #2 }
+ %#2
+ }
+ {
+ \__semantex_singlekey:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_singlekey:nnn { fnn }
+
+\cs_generate_variant:Nn \semantex_singlekey:nn { xn }
+
+\cs_new:Npn\semantex_arg_valuekey:nnn#1#2#3
+{
+ % CHANGE ORDER OF KEYS
+ \__semantex_arg_valuekey:nnnn { #1 } { #2 } { #3 } { #1 }
}
+\cs_new:Npn \__semantex_arg_valuekey:nnnn#1#2#3#4
+{
+ % Takes care of valuekeys, keys with a value
+ % For the sake of implementation, the arguments
+ % come in a strange order
+ % #1 = class/object
+ % #2 = name of the key
+ % #3 = value of the key
+ \cs_if_exist:cTF { __semantex_data_cs_custom_arg_valuekey_#1_#2:nn }
+ {
+ \use:c { __semantex_data_cs_custom_arg_valuekey_#1_#2:nn } { #4 } { #3 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \semantex_error_output_format:nN { #4 } \l__semantex_valuekey_unknown_arg_key_temp_tl
+ \msg_error:nnxn { semantex } { arg_valuekey_not_found } { \l__semantex_valuekey_unknown_arg_key_temp_tl } { #2 }
+ }
+ {
+ \__semantex_arg_valuekey:fnnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 } { #4 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_arg_valuekey:nnnn { fnnn }
+
+\cs_new:Npn \semantex_arg_singlekey:nn#1#2
+{
+ \__semantex_arg_singlekey:nnn { #1 } { #2 } { #1 }
+}
+
+\cs_new:Npn \__semantex_arg_singlekey:nnn#1#2#3
+{
+ % #1 = class/object
+ % #2 = name of the key
+ \cs_if_exist:cTF { \tl_to_str:n{__semantex_data_cs_custom_arg_singlekey_#1_#2:n } }
+ {
+ \use:c { __semantex_data_cs_custom_arg_singlekey_#1_#2:n } { #3 }
+ }
+ {
+ \str_if_eq:nnTF { #1 } { class_SemantexBaseObject }
+ {
+ \semantex_arg_valuekey:nnn { #3 } { default } { #2 }
+ %#2
+ }
+ {
+ \__semantex_arg_singlekey:fnn { \semantex_data_parent_get:n { #1 } } { #2 } { #3 }
+ }
+ }
+}
+
+\cs_generate_variant:Nn \__semantex_arg_singlekey:nnn { fnn }
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% THE PRIMITIVE VALUEKEYS
+% THE VALUEKEYS FOR \SemantexBaseObject
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Now for the commands that are the basis of the keyval interface.
-% This basis consists of a collection of so-called "primitive"
-% valuekeys, which all use the syntax
-% \semantex_primitive_<nameOfValuekey>:nn
-% These are like primitive TeX commands -- they are not defined in
-% terms of other keys, and all other keys have to defined in terms
-% of these, one way or another.
+% Now for the commands that are the basis of the keyval interface,
+% namely the keys providing the keyval interface for the
+% class \SemantexBaseObject. For historical reasons, they are defined
+% as below as standalone commands and not when delcaring the
+% class \SemantexBaseObject. I hope to change this in the future, but
+% this is purely a matter of aesthetics, with no practical consequences.
% For all of them, #1 = name of the class/object, and #2 = value of
-% the key. To keep the system as simple as possible, I chose only to
-% make primitive valuekeys, so there is no such thing as a primitive
-% singlekey. Therefore, for instance, the singlekey "return" is
-% defined as "return=", where return is a primitive valuekey that
-% does not use the value of the key for anything.
+% the key.
% First, some very simple keys that we shall need over and over again:
@@ -1870,22 +2459,22 @@
\cs_generate_variant:Nn \tl_if_blank:nF { xF }
-\cs_new:Npn\semantex_primitive_valuekey_execute:nn#1#2
+\cs_new:Npn\semantex_provide_user_commands:n#1
{
% This keys just executes whatever data you plug into it.
% Possibly, going forward, it might make more sense to define all
% of these commands in the keyval handling command
% so that the get commands are accessible from all keys.
- \cs_set:Npn\SemantexDataProvide##1{\semantex_data_tl_provide:nn{#1}{##1}}
- \cs_set:Npn\SemantexDataSet##1##2{\semantex_data_tl_set:nnn{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataSetx##1##2{\semantex_data_tl_set:nnx{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataPutRight##1##2{\semantex_data_tl_put_right:nnn{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataPutRightx##1##2{\semantex_data_tl_put_right:nnx{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataPutLeft##1##2{\semantex_data_tl_put_left:nnn{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataPutLeftx##1##2{\semantex_data_tl_put_left:nnx{#1}{##1}{##2}}
- \cs_set:Npn\SemantexDataGet##1{\semantex_data_tl_get:nn{#1}{##1}}
- \cs_set:Npn\SemantexDataGetExpNot##1{\semantex_data_tl_get_exp_not:nn{#1}{##1}}
- \cs_set:Npn\SemantexDataClear##1{\semantex_data_tl_clear:nn{#1}{##1}}
+ \cs_set:Npn\SemantexDataProvide##1{\semantex_data_tl_provide:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexDataSet##1##2{\semantex_data_tl_set:nnn{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataSetx##1##2{\semantex_data_tl_set:nnx{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataPutRight##1##2{\semantex_data_tl_put_right:nnn{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataPutRightx##1##2{\semantex_data_tl_put_right:nnx{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataPutLeft##1##2{\semantex_data_tl_put_left:nnn{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataPutLeftx##1##2{\semantex_data_tl_put_left:nnx{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexDataGet##1{\semantex_data_tl_get:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexDataGetExpNot##1{\semantex_data_tl_get_exp_not:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexDataClear##1{\semantex_data_tl_clear:nn{#1}{\tl_trim_spaces:n{##1}}}
\cs_set:Npn\SemantexKeysSet##1{\semantex_keys_set:nn{#1}{##1}}
\cs_set:Npn\SemantexKeysSetx##1{\semantex_keys_set:nx{#1}{##1}}
\cs_set:Npn\SemantexStrIfEqTF##1##2##3##4{\str_if_eq:xxTF{##1}{##2}{##3}{##4}}
@@ -1894,56 +2483,515 @@
\cs_set:Npn\SemantexIfBlankTF##1##2##3{\tl_if_blank:xTF{##1}{##2}{##3}}
\cs_set:Npn\SemantexIfBlankT##1##2{\tl_if_blank:xT{##1}{##2}}
\cs_set:Npn\SemantexIfBlankF##1##2{\tl_if_blank:xF{##1}{##2}}
- \cs_set:Npn\SemantexBoolProvide##1{\semantex_data_bool_provide:nn{#1}{##1}}
- \cs_set:Npn\SemantexBoolSetTrue##1{\semantex_data_bool_set_true:nn{#1}{##1}}
- \cs_set:Npn\SemantexBoolSetFalse##1{\semantex_data_bool_set_false:nn{#1}{##1}}
- \cs_set:Npn\SemantexBoolIfTF##1##2##3{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{##3}}
- \cs_set:Npn\SemantexBoolIfT##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{##2}{}}
- \cs_set:Npn\SemantexBoolIfF##1##2{\semantex_data_bool_get:nnTF{#1}{##1}{}{##2}}
- \cs_set:Npn\SemantexIntProvide##1{\semantex_data_int_provide:nn{#1}{##1}}
- \cs_set:Npn\SemantexIntGet##1{\semantex_data_int_get:nn{#1}{##1}}
- \cs_set:Npn\SemantexIntClear##1{\semantex_data_int_clear:nn{#1}{##1}}
- \cs_set:Npn\SemantexIntIncr##1{\semantex_data_int_incr:nn{#1}{##1}}
- \cs_set:Npn\SemantexIntSet##1##2{\semantex_data_int_set:nnn{#1}{##1}{##2}}
- \cs_set:Npn\SemantexIntIfPositiveTF##1##2##3{\semantex_data_int_if_positive:nnTF{#1}{##1}{##2}{##3}}
- \cs_set:Npn\SemantexIntIfPositiveT##1##2{\semantex_data_int_if_positive:nnT{#1}{##1}{##2}}
- \cs_set:Npn\SemantexIntIfPositiveF##1##2{\semantex_data_int_if_positive:nnF{#1}{##1}{##2}}
- \cs_set:Npn\SemantexIntIfGreaterThanOneTF##1##2##3{\semantex_data_int_if_greater_than_one:nnTF{#1}{##1}{##2}{##3}}
- \cs_set:Npn\SemantexIntIfGreaterThanOneT##1##2{\semantex_data_int_if_greater_than_one:nnT{#1}{##1}{##2}}
- \cs_set:Npn\SemantexIntIfGreaterThanOneF##1##2{\semantex_data_int_if_greater_than_one:nnF{#1}{##1}{##2}}
+ \cs_set:Npn\SemantexBoolProvide##1{\semantex_data_bool_provide:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexBoolSetTrue##1{\semantex_data_bool_set_true:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexBoolSetFalse##1{\semantex_data_bool_set_false:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexBoolIfTF##1##2##3{\semantex_data_bool_get:nnTF{#1}{\tl_trim_spaces:n{##1}}{##2}{##3}}
+ \cs_set:Npn\SemantexBoolIfT##1##2{\semantex_data_bool_get:nnTF{#1}{\tl_trim_spaces:n{##1}}{##2}{}}
+ \cs_set:Npn\SemantexBoolIfF##1##2{\semantex_data_bool_get:nnTF{#1}{\tl_trim_spaces:n{##1}}{}{##2}}
+ \cs_set:Npn\SemantexIntProvide##1{\semantex_data_int_provide:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexIntGet##1{\semantex_data_int_get:nn{#1}{\tl_trim_spaces:n{\tl_trim_spaces:n{##1}}}}
+ \cs_set:Npn\SemantexIntClear##1{\semantex_data_int_clear:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexIntIncr##1{\semantex_data_int_incr:nn{#1}{\tl_trim_spaces:n{##1}}}
+ \cs_set:Npn\SemantexIntSet##1##2{\semantex_data_int_set:nnn{#1}{\tl_trim_spaces:n{##1}}{##2}}
+ \cs_set:Npn\SemantexIntIfGreaterThanTF##1##2##3##4
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ >
+ { ##2 }
+ { ##3 }
+ { ##4 }
+ }
+ \cs_set:Npn\SemantexIntIfGreaterThanT##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ >
+ { ##2 }
+ { ##3 }
+ { }
+ }
+ \cs_set:Npn\SemantexIntIfGreaterThanF##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ >
+ { ##2 }
+ { }
+ { ##3 }
+ }
+ \cs_set:Npn\SemantexIntIfEqualTF##1##2##3##4
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ =
+ { ##2 }
+ { ##3 }
+ { ##4 }
+ }
+ \cs_set:Npn\SemantexIntIfEqualT##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ =
+ { ##2 }
+ { ##3 }
+ { }
+ }
+ \cs_set:Npn\SemantexIntIfEqualF##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ =
+ { ##2 }
+ { }
+ { ##3 }
+ }
+ \cs_set:Npn\SemantexIntIfLessThanTF##1##2##3##4
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ <
+ { ##2 }
+ { ##3 }
+ { ##4 }
+ }
+ \cs_set:Npn\SemantexIntIfLessThanT##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ <
+ { ##2 }
+ { ##3 }
+ { }
+ }
+ \cs_set:Npn\SemantexIntIfLessThanF##1##2##3
+ {
+ \int_compare:nNnTF
+ { ##1 }
+ <
+ { ##2 }
+ { }
+ { ##3 }
+ }
\cs_set:Npn\SemantexExpNot##1{\exp_not:n{##1}}
+ \cs_set:Npn\SemantexERRORKeyValueNotFound##1
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERRORkeyvaluenotfound_temp_tl
+ \msg_error:nnxoo { semantex } { key_value_not_found }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERRORkeyvaluenotfound_temp_tl }
+ { \semantex_grab_first_argument_of_two:nn ##1 }
+ { \semantex_grab_second_argument_of_two:nn ##1 }
+ }
+
+ \cs_set:Npn\SemantexERROR##1
+ {
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERROR_temp_tl
+ \msg_error:nnxoo { semantex } { generic_error }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERROR_temp_tl }
+ { \semantex_grab_first_argument_of_two:nn ##1 }
+ { \semantex_grab_second_argument_of_two:nn ##1 }
+ }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataprovide:nn#1#2
+{
+ \semantex_data_tl_provide:nn { #1 } { #2 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_set:nnn { noo , nox , nno , nnx }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataset:nn#1#2
+{
+ \semantex_data_tl_set:nno { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_datasetx:nn#1#2
+{
+ \semantex_data_tl_set:nnx { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_put_right:nnn { noo , nox }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataputright:nn#1#2{
+ \semantex_data_tl_put_right:nno { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataputrightx:nn#1#2{
+ \semantex_data_tl_put_right:nnx { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_generate_variant:Nn \semantex_data_tl_put_left:nnn { noo , nox }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataputleft:nn#1#2
+{
+ \semantex_data_tl_put_left:nno { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataputleftx:nn#1#2
+{
+ \semantex_data_tl_put_left:nnx { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dataclear:nn#1#2
+{
+ \semantex_data_tl_clear:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_keysset:nn#1#2
+{
+ \semantex_keys_set:nn { #1 } { #2 }
+}
+
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setkeys:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_keysset:nn
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_keyssetx:nn#1#2
+{
+ \semantex_keys_set:nx { #1 }{ #2 }
+}
+
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setkeysx:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_keyssetx:nn
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifeqTF:nn#1#2
+{
+ \str_if_eq:xxTF
+ { \semantex_grab_first_argument_of_four:nnnn #2 }
+ { \semantex_grab_second_argument_of_four:nnnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_four:nnnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_fourth_argument_of_four:nnnn #2 } }
+}
+
+\cs_generate_variant:Nn \str_if_eq:nnTF { ffTF }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifeqT:nn#1#2
+{
+ \str_if_eq:xxTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifeqF:nn#1#2
+{
+ \str_if_eq:xxTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_keys_set:nn { no }
+
+\cs_generate_variant:Nn \tl_if_blank:nTF { fTF }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifblankTF:nn#1#2
+{
+ \tl_if_blank:xTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_three:nnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifblankT:nn#1#2
+{
+ \tl_if_blank:xTF
+ { \semantex_grab_first_argument_of_two:nn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_two:nn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifblankF:nn#1#2
+{
+ \tl_if_blank:xTF
+ { \semantex_grab_first_argument_of_two:nn #2 }
+ { }
+ { semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_two:nn #2 } }
+}
+
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolprovide:nn#1#2
+{
+ \semantex_data_bool_provide:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolsettrue:nn#1#2
+{
+ \semantex_data_bool_set_true:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolsetfalse:nn#1#2
+{
+ \semantex_data_bool_set_false:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_data_bool_get:nnTF { noTF, nfTF , neTF , ffTF }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolifTF:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_three:nnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_three:nnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolifT:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_two:nn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_boolifF:nn#1#2
+{
+ \semantex_data_bool_get:nnTF { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_second_argument_of_two:nn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intprovide:nn#1#2
+{
+ \semantex_data_int_provide:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intclear:nn#1#2
+{
+ \semantex_data_int_clear:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intincr:nn#1#2
+{
+ \semantex_data_int_incr:nn { #1 } { \tl_trim_spaces:n { #2 } }
+}
+
+\cs_generate_variant:Nn \semantex_data_int_set:nnn { noo , nno }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intset:nn#1#2
+{
+ \semantex_data_int_set:noo { #1 }
+ { \tl_trim_spaces:n { \semantex_grab_first_argument_of_two:nn #2 } }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_generate_variant:Nn \int_compare:nNnTF { oNoTF , fNfTF , xNxTF }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifgreaterthanTF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_four:nnnn #2 }
+ >
+ { \semantex_grab_second_argument_of_four:nnnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_four:nnnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_fourth_argument_of_four:nnnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifgreaterthanT:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ >
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifgreaterthanF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ >
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifequalTF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_four:nnnn #2 }
+ =
+ { \semantex_grab_second_argument_of_four:nnnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_four:nnnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_fourth_argument_of_four:nnnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifequalT:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ =
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intifequalF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ =
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intiflessthanTF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_four:nnnn #2 }
+ <
+ { \semantex_grab_second_argument_of_four:nnnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_four:nnnn #2 } }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_fourth_argument_of_four:nnnn #2 } }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intiflessthanT:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ <
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+ { }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_intiflessthanF:nn#1#2
+{
+ \int_compare:oNoTF
+ { \semantex_grab_first_argument_of_three:nnn #2 }
+ <
+ { \semantex_grab_second_argument_of_three:nnn #2 }
+ { }
+ { \semantex_keys_set:no { #1 } { \semantex_grab_third_argument_of_three:nnn #2 } }
+}
+
+\cs_generate_variant:Nn\msg_error:nnnnn { nnxoo }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERRORkeyvaluenotfound:nn#1#2
+{
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERRORkeyvaluenotfound_temp_tl
+ \msg_error:nnxoo { semantex } { key_value_not_found }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERRORkeyvaluenotfound_temp_tl }
+ { \semantex_grab_first_argument_of_two:nn #2 }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERROR:nn#1#2
+{
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERROR_temp_tl
+ \msg_error:nnxoo { semantex } { generic_error }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ERROR_temp_tl }
+ { \semantex_grab_first_argument_of_two:nn #2 }
+ { \semantex_grab_second_argument_of_two:nn #2 }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_execute:nn#1#2
+{
%\exp_not:n{#2}
% how about forget?
#2
}
-\cs_new:Npn\semantex_primitive_valuekey_parse:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parse:nn#1#2
{
% This command runs all the keys that the user may have
% stored via the parseoptions key
%\semantex_data_tl_inherit:nn { #1 } { parseoptions }
- \semantex_keys_set:nx { #1 } {
+% \semantex_keys_set:nx { #1 } {
+% \semantex_data_tl_get_exp_not:nn { #1 } { parseoptions }
+% }
+% \semantex_data_tl_clear:nn { #1 } { parseoptions } % this is probably necessary
+ \semantex_data_cs_get:nn { #1 } { parseoptions:n } { #1 }
+ \semantex_data_tl_clear:nn { #1 } { parseoptions } % this is probably necessary
+ \semantex_data_cs_clear:nn { #1 } { parseoptions:n }
+}
+
+%\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parseoptions:nn#1#2
+%{
+% % This adds keys to the parseoptions token list
+% \semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 }
+%}
+
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parseoptions:nn#1#2{
+ \tl_set:Nn\l__semantex_parseoptions_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_parseoptions_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_parseoptions_process_singlekey:nnN { ####1 } { ##1 } \l__semantex_parseoptions_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_parseoptions_auxiliary_valuekey_temp_cs:nn##1##2
+ {
+ \__semantex_parseoptions_process_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_parseoptions_auxiliary_temp_tl
+ }
+ \keyval_parse:NNn
+ \l__semantex_parseoptions_auxiliary_singlekey_temp_cs:n
+ \l__semantex_parseoptions_auxiliary_valuekey_temp_cs:nn
+ { #2 }
+ \semantex_data_tl_put_right:nno { #1 } { parseoptions } { \l__semantex_parseoptions_auxiliary_temp_tl }
+ %\exp_args:NNno\exp_args:Nno\cs_set:co { __semantex_data_cs_#1_parseoptions:n }
+ %\exp_args:Nnno
+ \semantex_data_cs_set:nnx { #1 } { parseoptions:n }
+ {
+% g__semantex_data_tl_#1_parseoptions
+% \semantex_data_tl_get:nn { #1 } { parseoptions }
\semantex_data_tl_get_exp_not:nn { #1 } { parseoptions }
+ %\l__semantex_parseoptions_auxiliary_temp_tl
+ }
+}
+
+
+\cs_new:Npn\__semantex_parseoptions_process_singlekey:nnN#1#2#3
+{
+ \tl_put_right:Nn#3
+ {
+ \semantex_singlekey:nn { #1 } { #2 }
}
- \semantex_data_tl_clear:nn { #1 } { parseoptions } % this is probably necessary
}
-\cs_new:Npn\semantex_primitive_valuekey_parseoptions:nn#1#2
+\cs_new:Npn\__semantex_parseoptions_process_valuekey:nnnN#1#2#3#4
{
- % This adds keys to the parseoptions token list
- \semantex_data_tl_put_right:nnn { #1 } { parseoptions } { #2 }
+ \tl_if_eq:nnTF { #2 } { execute }
+ {
+ \tl_put_right:Nn#4
+ {
+ #3
+ }
+ }
+ {
+ \tl_put_right:Nn#4
+ {
+ \semantex_valuekey:nnn { #1 } { #2 } { #3 }
+ }
+ }
}
-\cs_new:Npn\semantex_primitive_valuekey_return:nn#1#2
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_return:nn#1#2
{
% This is an umbrella key that runs all of the three
% return routines, innerreturn, rightreturn, and leftreturn
- \semantex_primitive_valuekey_innerreturn:nn { #1 }{}
- \semantex_primitive_valuekey_rightreturn:nn { #1 }{}
- \semantex_primitive_valuekey_leftreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_innerreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightreturn:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftreturn:nn { #1 }{}
}
-\cs_new:Npn\semantex_primitive_valuekey_innerreturn:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_innerreturn:nn#1#2
{
% This adds all of the commands added via the command key
% to the symbol
@@ -1966,7 +3014,7 @@
\cs_generate_variant:Nn \semantex_keys_set:nn { nx , no }
-\cs_new:Npn\semantex_primitive_valuekey_rightreturn:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightreturn:nn#1#2
{
\semantex_right_indices_return_store:nN { #1 } \l_semantex_rightreturn_right_indices_temp
\semantex_data_tl_put_right:nnx { #1 } { symbol }
@@ -1987,7 +3035,7 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_leftreturn:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftreturn:nn#1#2
{
\semantex_left_indices_return_store:nN { #1 } \l_semantex_leftreturn_left_indices_temp
\semantex_data_tl_put_left:nnx { #1 } { symbol }
@@ -2081,13 +3129,13 @@
\semantex_data_tl_inherit_x:nn { #1 } { arg }
\semantex_data_int_inherit:nn { #1 } { numberofarguments }
%\semantex_data_tl_inherit:nn { #1 } { parsize } % This was necessary for unkonwn reasons -- otherwise it will fail when doing inheritance
- \semantex_data_tl_get_store:nnN { #1 } { parsize } \l__semantex_primitive_valuekey_rightreturn_parsize_temp
+ \semantex_data_tl_get_store:nnN { #1 } { parsize } \l__arg_return_store_parsize_temp_tl
\semantex_data_bool_get:nnTF { #1 } { par }
{
\semantex_data_int_if_positive:nnTF { #1 } { numberofarguments }
{
\__semantex_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_rightreturn_parsize_temp }
+ { \l__arg_return_store_parsize_temp_tl }
{ \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } }
{
@@ -2107,7 +3155,7 @@
\semantex_data_int_if_greater_than_one:nnTF { #1 } { numberofarguments }
{
\__semantex_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_rightreturn_parsize_temp }
+ { \l__arg_return_store_parsize_temp_tl }
{ \semantex_data_tl_get_exp_not:nn { #1 } { leftpar } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { rightpar } }
{
@@ -2210,724 +3258,818 @@
-\cs_new:Npn\semantex_primitive_valuekey_parent:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parent:nn#1#2{
% Must inherit everything from the parent class
\semantex_data_parent_set:nn { #1 } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_class:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_class:nn#1#2{
% Must inherit everything from the parent class
\semantex_data_class_set:nn { #1 } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_copy:nn#1#2{
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_class:nn { xn }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_copy:nn#1#2{
% Similarly to parent and class, but inherits from other objects rather than classes
\semantex_data_copy_object:nn { #1 } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_clone:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clone:nn#1#2{
% Similarly to parent and class, but inherits from other objects rather than classes
\semantex_data_clone_object:nn { #1 } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_valuekeys:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_valuekeys:nn#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_valuekey_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn\__semantex_process_singlekey:nnN#1#2#3
+{
+ \tl_put_right:Nn#3
+ {
+ \semantex_singlekey:nn { #1 } { #2 }
}
}
-\cs_generate_variant:Nn\semantex_data_prop_put:nnnn {nnno}
+\cs_generate_variant:Nn \semantex_valuekey:nnn { nnx }
-\cs_new:Npn\__semantex_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_process_valuekey:nnnN#1#2#3#4
{
- \cs_set:Npn\l__semantex_valuekey_equality_format_auxiliary_temp:n##1{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \tl_if_eq:nnTF { #2 } { execute }
{
- \l__semantex_valuekey_equality_format_auxiliary_temp:n
+ \tl_put_right:Nn#4
{
- \l__semantex_key_value_temp
+ #3
}
}
- %IM Remove spaces in #2
+ {
+ \tl_put_right:Nn#4
+ {
+ \semantex_valuekey:nnn { #1 } { #2 } { #3 }
+ }
+ }
+}
+
+\cs_new:Npn\__semantex_valuekey_format_auxiliary:nnn#1#2#3
+{
+ \tl_set:Nn\l__semantex_valuekey_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_valuekey_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_process_singlekey:nnN { ####1 } { ##1 } \l__semantex_valuekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
+ {
+ \__semantex_process_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_valuekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_valuekey_auxiliary_temp_cs:n##1 { #3 }
+ \keyval_parse:NNo
+ \l__semantex_valuekey_auxiliary_singlekey_temp_cs:n
+ \l__semantex_valuekey_auxiliary_valuekey_temp_cs:nn
+ {
+ \l__semantex_valuekey_auxiliary_temp_cs:n { ##2 }
+ }
+ \cs_set:cpo { __semantex_data_cs_custom_valuekey_#1_#2:nn } ##1##2 {
+ \l__semantex_valuekey_auxiliary_temp_tl
+ }
+ % remove spaces
+}
+
+\cs_generate_variant:Nn \cs_set:Npn { cpo }
+
+\cs_generate_variant:Nn \keyval_parse:NNn { NNo }
+
+%CHECK
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_singlekeys:nn#1#2{
+ % Add keys taking no values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_singlekeys_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn \__semantex_singlekeys_format_auxiliary:nnn#1#2#3{
+ \tl_set:Nn\l__semantex_singlekey_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_singlekey_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_process_singlekey:nnN { ####1 } { ##1 } \l__semantex_singlekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_singlekey_auxiliary_valuekey_temp_cs:nn##1##2
+ {
+ \__semantex_process_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_singlekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_singlekey_auxiliary_temp_cs: { #3 }
+ \keyval_parse:NNo
+ \l__semantex_singlekey_auxiliary_singlekey_temp_cs:n
+ \l__semantex_singlekey_auxiliary_valuekey_temp_cs:nn
+ { \l__semantex_singlekey_auxiliary_temp_cs: }
+ \cs_set:cpo { __semantex_data_cs_custom_singlekey_#1_#2:n } ##1 {
+ \l__semantex_singlekey_auxiliary_temp_tl
+ }
+% \seq_put_right:cn { g__semantex_data_seq_#1_list_of_singlekeys } { #2 }
+% %IM Remove spaces in #2
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removesinglekey:nn#1#2
+{
+ \cs_undefine:c { __semantex_data_cs_custom_singlekey_#1_#2:n }
}
-\cs_new:Npn\semantex_primitive_valuekey_removevaluekey:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removevaluekey:nn#1#2
{
- \semantex_valuekey_remove:nn { #1 } { #2 }
+ \cs_undefine:c { __semantex_data_cs_custom_valuekey_#1_#2:nn }
}
-\cs_set_eq:cN { semantex_primitive_valuekey_1valuekeys:nn } \semantex_primitive_valuekey_valuekeys:nn
+\cs_set_eq:cN { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_1valuekeys:nn } \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_valuekeys:nn
-\cs_new:cpn { semantex_primitive_valuekey_2valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_2valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_two_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_two_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_two_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_two_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_two_valuekey_equality_format_auxiliary_temp:nn##1##2{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_two_valuekey_format_auxiliary_temp:nn##1##2{#3}
+ %IM Remove spaces in #2
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_two_valuekey_equality_format_auxiliary_temp:nn
+ \l__semantex_two_valuekey_format_auxiliary_temp:nn
{
- \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_two:nn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_two:nn ##1
}
}
- %IM Remove spaces in #2
}
+\cs_generate_variant:Nn \__semantex_valuekey_format_auxiliary:nnn { nno }
-\cs_new:cpn { semantex_primitive_valuekey_3valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_3valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_three_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_three_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_three_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_three_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_three_valuekey_format_auxiliary_temp:nnn##1##2##3{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_three_valuekey_equality_format_auxiliary_temp:nnn
+ \l__semantex_three_valuekey_format_auxiliary_temp:nnn
{
- \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_three:nnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_three:nnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_three:nnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_4valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_4valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_four_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_four_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_four_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_four_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_four_valuekey_format_auxiliary_temp:nnnn##1##2##3##4{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_four_valuekey_equality_format_auxiliary_temp:nnnn
+ \l__semantex_four_valuekey_format_auxiliary_temp:nnnn
{
- \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_four:nnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_5valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_5valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_five_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_five_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_five_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_five_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_five_valuekey_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_five_valuekey_equality_format_auxiliary_temp:nnnnn
+ \l__semantex_five_valuekey_format_auxiliary_temp:nnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_key_value_temp
+ \semantex_grab_fifth_argument_of_five:nnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_6valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_6valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_six_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_six_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_six_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_six_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_six_valuekey_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_six_valuekey_equality_format_auxiliary_temp:nnnnnn
+ \l__semantex_six_valuekey_format_auxiliary_temp:nnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fifth_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_key_value_temp
+ \semantex_grab_sixth_argument_of_six:nnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_7valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_7valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_seven_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_seven_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_seven_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_seven_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_seven_valuekey_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_seven_valuekey_equality_format_auxiliary_temp:nnnnnnn
+ \l__semantex_seven_valuekey_format_auxiliary_temp:nnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fifth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_sixth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_seventh_argument_of_seven:nnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_8valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_8valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_eight_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_eight_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_eight_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_eight_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_eight_valuekey_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_eight_valuekey_equality_format_auxiliary_temp:nnnnnnnn
+ \l__semantex_eight_valuekey_format_auxiliary_temp:nnnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fifth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_sixth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_seventh_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_eighth_argument_of_eight:nnnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_9valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_9valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_nine_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_nine_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_nine_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_nine_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
- \semantex_data_prop_put:nnno {#1} {custom_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_nine_valuekey_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
+ \__semantex_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_nine_valuekey_equality_format_auxiliary_temp:nnnnnnnnn
+ \l__semantex_nine_valuekey_format_auxiliary_temp:nnnnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_first_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_second_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_third_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fourth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_fifth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_sixth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_seventh_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_eighth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_key_value_temp
+ \semantex_grab_ninth_argument_of_nine:nnnnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:Npn\semantex_primitive_valuekey_singlekeys:nn#1#2{
- % Add keys taking no values
- \semantex_data_prop_provide:nn { #1 } { custom_singlekeys }
- \clist_map_inline:nn { #2 }{
- \__semantex_singlekeys_noequality_format_auxiliary:nnn{#1}##1
- }
-}
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_novaluekeys:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_singlekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-\cs_new:Npn \__semantex_singlekeys_noequality_format_auxiliary:nnn#1#2#3{
- \semantex_data_prop_put:nnnn {#1} {custom_singlekeys} {#2} {#3}
-}
+\cs_set_eq:cN { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_0valuekeys:nn } \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_singlekeys:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_novaluekeys:nn\semantex_primitive_valuekey_singlekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-\cs_set_eq:cN { semantex_primitive_valuekey_0valuekeys:nn } \semantex_primitive_valuekey_singlekeys:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removenovaluekey:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removesinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+
+\cs_set_eq:cN { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_remove0valuekey:nn } \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removesinglekey:nn
+
+% KEYS FOR SETTING UP THE ARGUMENT KEYVAL INTERFACE:
-\cs_new:Npn\semantex_primitive_valuekey_removesinglekey:nn#1#2
+\cs_new:Npn\__semantex_process_arg_singlekey:nnN#1#2#3
{
- \semantex_singlekey_remove:nn { #1 } { #2 }
+ \tl_put_right:Nn#3
+ {
+ \semantex_arg_singlekey:nn { #1 } { #2 }
+ }
}
-\cs_set_eq:NN\semantex_primitive_valuekey_removenovaluekey:nn\semantex_primitive_valuekey_removesinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-
-\cs_set_eq:cN { semantex_primitive_valuekey_remove0valuekey:nn } \semantex_primitive_valuekey_removesinglekey:nn
+\cs_generate_variant:Nn \semantex_valuekey:nnn { nnx }
-% KEYS FOR SETTING UP THE ARGUMENT KEYVAL INTERFACE:
+\cs_new:Npn\__semantex_process_arg_valuekey:nnnN#1#2#3#4
+{
+ \tl_put_right:Nn#4
+ {
+ \semantex_arg_valuekey:nnn { #1 } { #2 } { #3 }
+ }
+}
-\cs_new:Npn\semantex_primitive_valuekey_argvaluekeys:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argvaluekeys:nn#1#2{
% Add argument valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn \__semantex_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn \__semantex_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_arg_valuekey_equality_format_auxiliary_temp:n##1{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \tl_set:Nn\l__semantex_arg_valuekey_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_arg_valuekey_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_process_arg_singlekey:nnN { ####1 } { ##1 } \l__semantex_arg_valuekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_arg_valuekey_auxiliary_valuekey_temp_cs:nn##1##2
{
- \l__semantex_arg_valuekey_equality_format_auxiliary_temp:n{
- \l__semantex_arg_key_value_temp
+ \__semantex_process_arg_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_arg_valuekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_arg_valuekey_auxiliary_temp_cs:n##1 { #3 }
+ \keyval_parse:NNo
+ \l__semantex_arg_valuekey_auxiliary_singlekey_temp_cs:n
+ \l__semantex_arg_valuekey_auxiliary_valuekey_temp_cs:nn
+ {
+ \l__semantex_arg_valuekey_auxiliary_temp_cs:n { ##2 }
}
+ \cs_set:cpo { __semantex_data_cs_custom_arg_valuekey_#1_#2:nn } ##1##2 {
+ \l__semantex_arg_valuekey_auxiliary_temp_tl
+ }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argsinglekeys:nn#1#2{
+ % Add argument keys taking no values
+ \clist_map_inline:nn { #2 }{
+ \__semantex_arg_singlekeys_format_auxiliary:nnn{#1}##1
+ }
+}
+
+\cs_new:Npn \__semantex_arg_singlekeys_format_auxiliary:nnn#1#2#3{
+ \tl_set:Nn\l__semantex_arg_singlekey_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_arg_singlekey_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_process_arg_singlekey:nnN { ####1 } { ##1 } \l__semantex_arg_singlekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_arg_singlekey_auxiliary_valuekey_temp_cs:nn##1##2
+ {
+ \__semantex_process_arg_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_arg_singlekey_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_arg_singlekey_auxiliary_temp_cs: { #3 }
+ \keyval_parse:NNo
+ \l__semantex_arg_singlekey_auxiliary_singlekey_temp_cs:n
+ \l__semantex_arg_singlekey_auxiliary_valuekey_temp_cs:nn
+ { \l__semantex_arg_singlekey_auxiliary_temp_cs: }
+ \cs_set:cpo { __semantex_data_cs_custom_arg_singlekey_#1_#2:n } ##1 {
+ \l__semantex_arg_singlekey_auxiliary_temp_tl
}
}
-\cs_new:Npn\semantex_primitive_valuekey_removeargvaluekey:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removeargsinglekey:nn#1#2
+{
+ \cs_undefine:c { __semantex_data_cs_custom_arg_singlekey_#1_#2:n }
+}
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removeargvaluekey:nn#1#2
{
- \semantex_arg_valuekey_remove:nn { #1 } { #2 }
+ \cs_undefine:c { __semantex_data_cs_custom_arg_valuekey_#1_#2:nn }
}
-\cs_set_eq:cN { semantex_primitive_valuekey_arg1valuekeys:nn } \semantex_primitive_arg_valuekey_arg_valuekeys:nn
+\cs_set_eq:cN { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg1valuekeys:nn } \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_arg_valuekeys:nn
-\cs_new:cpn { semantex_primitive_valuekey_arg2valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg2valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_two_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_two_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_two_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_generate_variant:Nn \__semantex_arg_valuekey_format_auxiliary:nnn { nno }
+
+\cs_new:Npn\__semantex_two_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn##1##2{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_two_arg_valuekey_format_auxiliary_temp:nn##1##2{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_two_arg_valuekey_equality_format_auxiliary_temp:nn
+ \l__semantex_two_arg_valuekey_format_auxiliary_temp:nn
{
- \exp_not:N\semantex_grab_first_argument_of_two:nn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_two:nn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_two:nn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_two:nn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg3valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg3valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_three_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_three_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_three_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_three_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn##1##2##3{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_three_arg_valuekey_format_auxiliary_temp:nnn##1##2##3{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_three_arg_valuekey_equality_format_auxiliary_temp:nnn
+ \l__semantex_three_arg_valuekey_format_auxiliary_temp:nnn
{
- \exp_not:N\semantex_grab_first_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_three:nnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_three:nnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_three:nnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_three:nnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg4valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg4valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_four_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_four_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_four_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_four_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn##1##2##3##4{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_four_arg_valuekey_format_auxiliary_temp:nnnn##1##2##3##4{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_four_arg_valuekey_equality_format_auxiliary_temp:nnnn
+ \l__semantex_four_arg_valuekey_format_auxiliary_temp:nnnn
{
- \exp_not:N\semantex_grab_first_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_four:nnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_four:nnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_four:nnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg5valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg5valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_five_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_five_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_five_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_five_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_five_arg_valuekey_format_auxiliary_temp:nnnnn##1##2##3##4##5{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_five_arg_valuekey_equality_format_auxiliary_temp:nnnnn
+ \l__semantex_five_arg_valuekey_format_auxiliary_temp:nnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_five:nnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_five:nnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fifth_argument_of_five:nnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg6valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg6valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_six_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_six_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_six_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_six_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_six_arg_valuekey_format_auxiliary_temp:nnnnnn##1##2##3##4##5##6{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_six_arg_valuekey_equality_format_auxiliary_temp:nnnnnn
+ \l__semantex_six_arg_valuekey_format_auxiliary_temp:nnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fifth_argument_of_six:nnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_six:nnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_sixth_argument_of_six:nnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg7valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg7valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_seven_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_seven_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_seven_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_seven_arg_valuekey_format_auxiliary_temp:nnnnnnn##1##2##3##4##5##6##7{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_seven_arg_valuekey_equality_format_auxiliary_temp:nnnnnnn
+ \l__semantex_seven_arg_valuekey_format_auxiliary_temp:nnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fifth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_sixth_argument_of_seven:nnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_seven:nnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_seventh_argument_of_seven:nnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg8valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg8valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_eight_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_eight_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_eight_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_eight_arg_valuekey_format_auxiliary_temp:nnnnnnnn##1##2##3##4##5##6##7##8{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_eight_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnn
+ \l__semantex_eight_arg_valuekey_format_auxiliary_temp:nnnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fifth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_sixth_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_seventh_argument_of_eight:nnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_eighth_argument_of_eight:nnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_eighth_argument_of_eight:nnnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:cpn { semantex_primitive_valuekey_arg9valuekeys:nn }#1#2{
+\cs_new:cpn { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_arg9valuekeys:nn }#1#2{
% Add new valuekeys
- \semantex_data_prop_provide:nn { #1 } { custom_arg_valuekeys }
\clist_map_inline:nn { #2 }{
- \__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn{#1}##1
+ \__semantex_nine_arg_valuekey_format_auxiliary:nnn{#1}##1
}
}
-\cs_new:Npn\__semantex_nine_arg_valuekey_equality_format_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_nine_arg_valuekey_format_auxiliary:nnn#1#2#3
{
- \cs_set:Npn\l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
- \semantex_data_prop_put:nnno {#1} {custom_arg_valuekeys} {#2}
+ \cs_set:Npn\l__semantex_nine_arg_valuekey_format_auxiliary_temp:nnnnnnnnn##1##2##3##4##5##6##7##8##9{#3}
+ \__semantex_arg_valuekey_format_auxiliary:nno { #1 } { #2 }
{
- \l__semantex_nine_arg_valuekey_equality_format_auxiliary_temp:nnnnnnnnn
+ \l__semantex_nine_arg_valuekey_format_auxiliary_temp:nnnnnnnnn
{
- \exp_not:N\semantex_grab_first_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_first_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_second_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_second_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_third_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_third_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fourth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fourth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_fifth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_fifth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_sixth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_sixth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_seventh_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_seventh_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_eighth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_eighth_argument_of_nine:nnnnnnnnn ##1
}
{
- \exp_not:N\semantex_grab_ninth_argument_of_nine:nnnnnnnnn\l__semantex_arg_key_value_temp
+ \semantex_grab_ninth_argument_of_nine:nnnnnnnnn ##1
}
}
%IM Remove spaces in #2
}
-\cs_new:Npn\semantex_primitive_valuekey_argsinglekeys:nn#1#2{
- % Add argument keys taking no values
- \semantex_data_prop_provide:nn { #1 } { custom_arg_singlekeys }
- \clist_map_inline:nn { #2 }{
- \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn{#1}##1
- }
-}
-
-\cs_new:Npn \__semantex_arg_singlekeys_noequality_format_auxiliary:nnn#1#2#3{
- \semantex_data_prop_put:nnnn {#1} {custom_arg_singlekeys} {#2} {#3}
-}
-
-\cs_set_eq:NN\semantex_primitive_valuekey_argnovaluekeys:nn\semantex_primitive_valuekey_argsinglekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-
-\cs_new:Npn\semantex_primitive_valuekey_removeargsinglekey:nn#1#2
-{
- \semantex_arg_singlekey_remove:nn { #1 } { #2 }
-}
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argnovaluekeys:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argsinglekeys:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-\cs_set_eq:NN\semantex_primitive_valuekey_removeargnovaluekey:nn\semantex_primitive_valuekey_removeargsinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removeargnovaluekey:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removeargsinglekey:nn % Previously, "singlekeys" was called "novaluekeys", so I am keeping this alias for backwards compatibility
-\cs_set_eq:cN { semantex_primitive_valuekey_removearg0valuekey:nn } \semantex_primitive_valuekey_removeargsinglekey:nn
+\cs_set_eq:cN { __semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removearg0valuekey:nn } \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_removeargsinglekey:nn
% THESE ARE REALLY THE COMMANDS MANIPULATING DATA:
-\cs_new:Npn\semantex_primitive_valuekey_symbol:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbol:nn#1#2{
% Sets the value of the symbol
\semantex_data_tl_set:nnn { #1 } { symbol } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_texclass:nn#1#2{
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbol:nn { xn }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_texclass:nn#1#2{
% Sets the TeX class of the output, e.g. \mathord, \mathbin, \mathop etc.
\semantex_data_tl_set:nnn { #1 } { texclass } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setslot:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setslot:nn#1#2{
% Sets the argument slot, i.e. the - in f(-,x)
\semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_symbolputright:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbolputright:nn#1#2{
% Add something to the right of the symbol
\semantex_data_tl_put_right:nnn { #1 } { symbol } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_symbolputleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_symbolputleft:nn#1#2{
% Add something to the left of the symbol
\semantex_data_tl_put_left:nnn { #1 } { symbol } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_command:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_command:nn#1#2{
% Adds one entry on the left of the command
% sequence to be applied to the symbol
\semantex_data_seq_put_right:nnn { #1 } { commands_sequence } { #2 } %IM maybe \exp_not:n { #2 }?
}
-\cs_new:Npn\semantex_primitive_valuekey_clearcommand:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearcommand:nn#1#2{
% Adds one entry on the left of the command
% sequence to be applied to the symbol
\semantex_data_seq_clear:nn { #1 } { commands_sequence }
}
-\cs_new:Npn\semantex_primitive_valuekey_argwithkeyval:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argwithkeyval:nn#1#2{
% Sets the argument (allows keyval interface)
\semantex_arg_keys_set:nn { #1 } { #2 }
%IMPORTANT: Previously, we needed three braces around #2, but suddenly
@@ -2936,17 +4078,17 @@
% to arg keyvals)
}
-\cs_new:Npn\semantex_primitive_valuekey_argwithsinglekeys:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argwithsinglekeys:nn#1#2{
% Sets the argument (only allows singlekeys)
\semantex_arg_singlekeys_set:nn { #1 } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_argwithonesinglekey:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argwithonesinglekey:nn#1#2{
% Sets the argument (only allows one singlekey)
- \use:c { __semantex_data_cs_#1_arg_singlekey:n } {{{{ #2 }}}}
+ \use:c { __semantex_data_cs_#1_arg_singlekey:n } { #2 }
}
-\cs_new:Npn\semantex_primitive_valuekey_argwithoutkeyval:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_argwithoutkeyval:nn#1#2{
% Sets the argument (no keyval interface allowed)
\semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
\semantex_data_int_incr:nn { #1 } { numberofarguments } % Check if this has been added elsewhere
@@ -2954,26 +4096,26 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_setargsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setargsep:nn#1#2
{
% Sets the argument separator
\semantex_data_tl_set:nnn { #1 } { argsep } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setargdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setargdots:nn#1#2
{
% Sets the argument dot command
\semantex_data_tl_set:nnn { #1 } { argdots } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setargslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setargslot:nn#1#2
{
% Sets the argument dot command
\semantex_data_tl_set:nnn { #1 } { argslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_prearg:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prearg:nn#1#2{
% Sets something to write before the argument
\tl_if_blank:nF{#2}
{
@@ -2981,12 +4123,12 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_clearprearg:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprearg:nn#1#2
{
\semantex_data_tl_clear:nn { #1 } { prearg }
}
-\cs_new:Npn\semantex_primitive_valuekey_postarg:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postarg:nn#1#2{
% Sets something to write after the argument
\tl_if_blank:nF{#2}
{
@@ -2994,12 +4136,12 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpostarg:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostarg:nn#1#2
{
\semantex_data_tl_clear:nn { #1 } { postarg }
}
-\cs_new:Npn\semantex_primitive_valuekey_output:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_output:nn#1#2
{
% Tells what class the object is supposed to output
\semantex_class_if_exist:NTF { #2 }
@@ -3007,19 +4149,74 @@
\semantex_data_tl_set:nnx { #1 } { output } { class_\cs_to_str:N #2 }
}
{
- \semantex_error_output_format:nN { #1 } \__semantex_primitive_valuekey_output_temp
- \msg_error:nnxnn { semantex } { class_not_found } { \__semantex_primitive_valuekey_output_temp } { output } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_output_temp_tl
+ \msg_error:nnxnn { semantex } { class_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_output_temp_tl } { output } { #2 }
}
% Maybe allow output=self
}
-\cs_new:Npn\semantex_primitive_valuekey_outputoptions:nn#1#2{
- % Sets possible options to pass to the output class
- \semantex_data_tl_put_right:nnn { #1 } { outputoptions } { ,#2, }
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_outputoptions:nn#1#2{
+ \tl_set:Nn\l__semantex_outputoptions_auxiliary_temp_tl{}
+ \cs_set:Npn\l__semantex_outputoptions_auxiliary_singlekey_temp_cs:n##1
+ {
+ \__semantex_outputoptions_process_singlekey:nnN { ####1 } { ##1 } \l__semantex_outputoptions_auxiliary_temp_tl
+ }
+ \cs_set:Npn\l__semantex_outputoptions_auxiliary_valuekey_temp_cs:nn##1##2
+ {
+ \__semantex_outputoptions_process_valuekey:nnnN { ####1 } { ##1 } { ##2 } \l__semantex_outputoptions_auxiliary_temp_tl
+ }
+ \keyval_parse:NNn
+ \l__semantex_outputoptions_auxiliary_singlekey_temp_cs:n
+ \l__semantex_outputoptions_auxiliary_valuekey_temp_cs:nn
+ { #2 }
+ \semantex_data_tl_put_right:nno { #1 } { outputoptions } { \l__semantex_outputoptions_auxiliary_temp_tl }
+ %\exp_args:NNno\exp_args:Nno\cs_set:co { __semantex_data_cs_#1_outputoptions:n }
+ %\exp_args:Nnno
+ \semantex_data_cs_set:nnx { #1 } { outputoptions:n }
+ {
+% g__semantex_data_tl_#1_outputoptions
+% \semantex_data_tl_get:nn { #1 } { outputoptions }
+ \semantex_data_tl_get_exp_not:nn { #1 } { outputoptions }
+ %\l__semantex_outputoptions_auxiliary_temp_tl
+ }
+}
+
+\cs_generate_variant:Nn \semantex_data_cs_set:nnn { nnf , nnv , nnx }
+
+\cs_generate_variant:Nn \semantex_data_tl_put_right:nnn { nno }
+
+
+\cs_new:Npn\__semantex_outputoptions_process_singlekey:nnN#1#2#3
+{
+ \tl_put_right:Nn#3
+ {
+ \exp_not:N\semantex_singlekey:nn { #1 } { \exp_not:n { #2 } }
+ }
+}
+
+\cs_generate_variant:Nn \semantex_valuekey:nnn { nnx }
+
+\cs_new:Npn\__semantex_outputoptions_process_valuekey:nnnN#1#2#3#4
+{
+ \tl_if_eq:nnTF { #2 } { execute }
+ {
+ \tl_put_right:Nn#4
+ {
+ \exp_not:n { #3 }
+ }
+ }
+ {
+ \tl_put_right:Nn#4
+ {
+ \exp_not:N\semantex_valuekey:nnn { #1 } { #2 } { \exp_not:n { #3 } }
+ }
+ }
}
-\cs_new:Npn\semantex_primitive_valuekey_ifleftargument:nn#1#2{
+%----------------
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifleftargument:nn#1#2{
% Tells whether to rightreturn before rendering the output.
\str_if_eq:nnTF { #2 } { true }
{
@@ -3031,13 +4228,13 @@
\semantex_data_bool_set_false:nn { #1 } { leftargument }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifleftargumen_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifleftargumen_temp } { ifleftargument } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifleftargumen_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifleftargumen_temp_tl } { ifleftargument } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifoutput:nn#1#2{ %IMPLEMENT THIS
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifoutput:nn#1#2{ %IMPLEMENT THIS
% Tells whether to output or not
\str_if_eq:nnTF { #2 } { true }
{
@@ -3049,13 +4246,13 @@
\semantex_data_bool_set_false:nn { #1 } { output }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifoutput_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifoutput_temp } { ifoutput } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifoutput_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifoutput_temp_tl } { ifoutput } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_gradingposition:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_gradingposition:nn#1#2{
% Tells whether to use upper or lower indices
\semantex_data_bool_provide:nn { #1 } { uppergrading }
\str_if_eq:nnTF { #2 } { upper }
@@ -3068,17 +4265,17 @@
\semantex_data_bool_set_false:nn { #1 } { uppergrading }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_gradingposition_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_gradingposition_temp } { gradingposition } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_gradingposition_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_gradingposition_temp_tl } { gradingposition } { #2 }
}
}
}
-\cs_set_eq:NN \semantex_primitive_valuekey_gradingpos:nn \semantex_primitive_valuekey_gradingposition:nn
+\cs_set_eq:NN \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_gradingpos:nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_gradingposition:nn
% Upper and lower right indices:
-\cs_new:Npn\semantex_primitive_valuekey_upper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nn#1#2{
% adds to the upper index
\tl_if_blank:nF{#2}{
\semantex_data_tl_put_right:nnn { #1 } { upper } { \exp_not:n{ #2 } }
@@ -3089,7 +4286,7 @@
-\cs_new:Npn\semantex_primitive_valuekey_supper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nn#1#2{
% Adds to the upper index, with a separator
\tl_if_blank:nF{#2}
{
@@ -3107,7 +4304,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_upperputleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperputleft:nn#1#2{
% Adds to the left of the upper index
\tl_if_blank:nF{#2}{
\semantex_data_tl_put_left:nnn { #1 } { upper } { \exp_not:n{ #2 } }
@@ -3116,14 +4313,14 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_preupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupper:nn#1#2{
% Sets what to write before upper
\tl_if_blank:nF{#2}
{
- \semantex_data_tl_put_left:cn { #1 } { preupper } { \exp_not:n{ #2 } }
+ \semantex_data_tl_put_left:nnn { #1 } { preupper } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\semantex_primitive_valuekey_postupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupper:nn#1#2{
% Sets what to write after upper
\tl_if_blank:nF{#2}
{
@@ -3131,79 +4328,79 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_clearupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearupper:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { upper }
\semantex_data_bool_set_false:nn { #1 } { nextupperwithsep }
\semantex_data_int_clear:nn { #1 } { numberofupperindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpreupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpreupper:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { preupper }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpostupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostupper:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { postupper }
}
-\cs_new:Npn\semantex_primitive_valuekey_setupperdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperdots:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { upperdots } { \exp_not:n { #2 } }
}
-\cs_generate_variant:Nn\semantex_primitive_valuekey_upper:nn { nx }
+\cs_generate_variant:Nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_upperdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdots:nn#1#2
{
- \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setupperslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperslot:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { upperslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_upperslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslot:nn#1#2
{
- \semantex_primitive_valuekey_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_supper:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_supperdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperdots:nn#1#2
{
- \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_supperslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperslot:nn#1#2
{
- \semantex_primitive_valuekey_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_cupper:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_cupperdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperdots:nn#1#2
{
- \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_cupperslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperslot:nn#1#2
{
- \semantex_primitive_valuekey_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_upperwithothersep:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_upperdotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdotswithothersep:nn#1#2
{
- \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperdots } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperdots } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_upperslotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslotwithothersep:nn#1#2
{
- \semantex_primitive_valuekey_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperslot } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperslot } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nn#1#2{
% Adds to the lower index
\tl_if_blank:nF{#2}
{
@@ -3213,7 +4410,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_slower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nn#1#2{
% Adds to the lower index, with a separator
\tl_if_blank:nF{#2}
{
@@ -3231,7 +4428,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerputleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerputleft:nn#1#2{
% Adds to the lower index
\tl_if_blank:nF{#2}
{
@@ -3241,7 +4438,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_prelower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelower:nn#1#2{
% Sets what to write before the lower index
\tl_if_blank:nF{#2}
{
@@ -3249,7 +4446,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_postlower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlower:nn#1#2{
% Sets what to write after the lower index
\tl_if_blank:nF{#2}
{
@@ -3257,79 +4454,79 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_clearlower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearlower:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { lower }
\semantex_data_bool_set_false:nn { #1 } { nextlowerwithsep }
\semantex_data_int_clear:nn { #1 } { numberoflowerindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearprelower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprelower:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { prelower }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpostlower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostlower:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { postlower }
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowerdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerdots:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { lowerdots } { \exp_not:n { #2 } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_lower:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_lowerdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdots:nn#1#2
{
- \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowerslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerslot:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { lowerslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslot:nn#1#2
{
- \semantex_primitive_valuekey_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_slower:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_slowerdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerdots:nn#1#2
{
- \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_slowerslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerslot:nn#1#2
{
- \semantex_primitive_valuekey_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_clower:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_clowerdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerdots:nn#1#2
{
- \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_clowerslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerslot:nn#1#2
{
- \semantex_primitive_valuekey_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerwithothersep:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_lowerdotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdotswithothersep:nn#1#2
{
- \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerdots } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerdots } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerslotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslotwithothersep:nn#1#2
{
- \semantex_primitive_valuekey_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerslot } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerslot } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_upperwithothersep:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nn#1#2{
% upperwithsep={separator}{contents} adds contents to the upper index
% with the appropriate index separator
\semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
@@ -3353,7 +4550,7 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerwithothersep:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nn#1#2{
% lowerwithsep={separator}{contents} adds contents to the lower index
% with the appropriate index separator
\semantex_data_bool_get:nnTF { #1 } { nextlowerwithsep }
@@ -3376,7 +4573,7 @@
\semantex_data_int_incr:nn { #1 } { numberofupperindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_cupper:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nn#1#2{
% Adds to the upper index, with a comma as separator
\tl_if_blank:nF{#2}
{
@@ -3393,7 +4590,7 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_clower:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nn#1#2{
% Adds to the lower index, with a comma as separator
\tl_if_blank:nF{#2}
{
@@ -3409,7 +4606,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifnextupperwithsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep:nn#1#2
{
% Tells whether the upper index is the first one
\tl_if_eq:nnTF { #2 } { false }
@@ -3422,13 +4619,13 @@
\semantex_data_bool_set_true:nn { #1 } { nextupperwithsep }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperwithsep_temp } { ifnextupperwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep_temp_tl } { ifnextupperwithsep } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerwithsep:nn#1#2 % should be removed later
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep:nn#1#2 % should be removed later
{
% Tells whether the lower index is the first one
\tl_if_eq:nnTF { #2 } { false }
@@ -3441,19 +4638,19 @@
\semantex_data_bool_set_true:nn { #1 } { nextlowerwithsep }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerwithsep_temp } { ifnextlowerwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep_temp_tl } { ifnextlowerwithsep } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_setuppersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setuppersep:nn#1#2
{
% Sets the separator for the upper index
\semantex_data_tl_set:nnn { #1 } { uppersep } { \exp_not:n { #2 }}
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowersep:nn#1#2
{
% Sets the separator for the lower index
\semantex_data_tl_set:nnn { #1 } { lowersep } { \exp_not:n { #2 }}
@@ -3461,7 +4658,7 @@
%--------------- Left indices: (I don't repeat all of the documentation)
-\cs_new:Npn\semantex_primitive_valuekey_upperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleft:nn#1#2{
% adds to the upper left index
\tl_if_blank:nF{#2}{
\semantex_data_tl_put_left:nnn { #1 } { upperleft } { \exp_not:n{ #2 } }
@@ -3470,7 +4667,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_supperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_bool_get:nnTF { #1 } { nextupperwithsep }
@@ -3487,7 +4684,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_upperleftputright:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftputright:nn#1#2{
\tl_if_blank:nF{#2}{
\semantex_data_tl_put_right:nnn { #1 } { upperleft } { \exp_not:n{ #2 } }
\semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
@@ -3495,14 +4692,14 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_preupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_tl_put_left:nnn { #1 } { preupperleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\semantex_primitive_valuekey_postupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupperleft:nn#1#2{
% adds to the lower index
\tl_if_blank:nF{#2}
{
@@ -3510,79 +4707,79 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_clearupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearupperleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { upperleft }
\semantex_data_bool_set_false:nn { #1 } { nextupperleftwithsep }
\semantex_data_int_clear:nn { #1 } { numberofupperleftindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpreupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpreupperleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { preupperleft }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpostupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostupperleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { preupperleft }
}
-\cs_new:Npn\semantex_primitive_valuekey_setupperleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperleftdots:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { upperleftdots } { \exp_not:n { #2 } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_upperleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftdots:nn#1#2
{
- \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setupperleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperleftslot:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { upperleftslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_upperleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftslot:nn#1#2
{
- \semantex_primitive_valuekey_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_supperleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_supperleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleftdots:nn#1#2
{
- \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_supperleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleftslot:nn#1#2
{
- \semantex_primitive_valuekey_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_cupperleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_cupperleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleftdots:nn#1#2
{
- \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_cupperleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleftslot:nn#1#2
{
- \semantex_primitive_valuekey_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { upperleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_upperleftwithothersep:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftwithothersep:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_upperleftdotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftdotswithothersep:nn#1#2
{
- \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftdots } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_upperleftslotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftslotwithothersep:nn#1#2
{
- \semantex_primitive_valuekey_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { upperleftslot } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_tl_put_left:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } }
@@ -3591,7 +4788,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_slowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
@@ -3608,7 +4805,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftputright:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftputright:nn#1#2{
\tl_if_blank:nF{#2} %This test really shouldn’t be made.
{
\semantex_data_tl_put_right:nnn { #1 } { lowerleft } { \exp_not:n{ #2 } }
@@ -3617,21 +4814,21 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_prelowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_tl_put_left:nnn { #1 } { prelowerleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\semantex_primitive_valuekey_postlowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_tl_put_right:nnn { #1 } { postlowerleft } { \exp_not:n{ #2 } }
}
}
-\cs_new:Npn\semantex_primitive_valuekey_upperleftwithothersep:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperleftwithothersep:nn#1#2{
\semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep }
{
\semantex_data_tl_put_left:nnn { #1 } { upperleft } {
@@ -3648,7 +4845,7 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftwithothersep:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftwithothersep:nn#1#2{
\semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
{
\semantex_data_tl_put_left:nnn { #1 } { lowerleft } {
@@ -3664,79 +4861,79 @@
\semantex_data_int_incr:nn { #1 } { numberoflowerleftindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearlowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearlowerleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { lowerleft }
\semantex_data_bool_set_false:nn { #1 } { nextlowerleftwithsep }
\semantex_data_int_clear:nn { #1 } { numberoflowerleftindices }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearprelowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprelowerleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { prelowerleft }
}
-\cs_new:Npn\semantex_primitive_valuekey_clearpostlowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostlowerleft:nn#1#2{
\semantex_data_tl_clear:nn { #1 } { prelowerleft }
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowerleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerleftdots:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { lowerleftdots } { \exp_not:n { #2 } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftdots:nn#1#2
{
- \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowerleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerleftslot:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { lowerleftslot } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftslot:nn#1#2
{
- \semantex_primitive_valuekey_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_slowerleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_slowerleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleftdots:nn#1#2
{
- \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_slowerleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleftslot:nn#1#2
{
- \semantex_primitive_valuekey_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_clowerleft:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleft:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_clowerleftdots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleftdots:nn#1#2
{
- \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } }
}
-\cs_new:Npn\semantex_primitive_valuekey_clowerleftslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleftslot:nn#1#2
{
- \semantex_primitive_valuekey_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleft:nx { #1 } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } }
}
-\cs_generate_variant:Nn \semantex_primitive_valuekey_lowerleftwithothersep:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftwithothersep:nn { nx }
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftdotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftdotswithothersep:nn#1#2
{
- \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftdots } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_lowerleftslotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftslotwithothersep:nn#1#2
{
- \semantex_primitive_valuekey_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerleftwithothersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get:nn { #1 } { lowerleftslot } } }
}
-\cs_new:Npn\semantex_primitive_valuekey_cupperleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_bool_get:nnTF { #1 } { nextupperleftwithsep }
@@ -3752,7 +4949,7 @@
}
-\cs_new:Npn\semantex_primitive_valuekey_clowerleft:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerleft:nn#1#2{
\tl_if_blank:nF{#2}
{
\semantex_data_bool_get:nnTF { #1 } { nextlowerleftwithsep }
@@ -3767,7 +4964,7 @@
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifnextupperleftwithsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperleftwithsep:nn#1#2
{
\tl_if_eq:nnTF { #2 } { false }
{
@@ -3779,14 +4976,14 @@
\semantex_data_bool_set_true:nn { #1 } { nextupperleftwithsep }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextupperleftwithsep_temp } { ifnextupperleftwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperleftwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperleftwithsep_temp_tl } { ifnextupperleftwithsep } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifnextlowerleftwithsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerleftwithsep:nn#1#2
{
\tl_if_eq:nnTF { #2 } { false }
{
@@ -3798,18 +4995,18 @@
\semantex_data_bool_set_true:nn { #1 } { nextlowerleftwithsep }
}
{
- semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextlowerleftwithsep_temp } { ifnextlowerleftwithsep } { #2 }
+ semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerleftwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerleftwithsep_temp_tl } { ifnextlowerleftwithsep } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_setupperleftsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperleftsep:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { upperleftsep } { \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_setlowerleftsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerleftsep:nn#1#2
{
\semantex_data_tl_set:nnn { #1 } { lowerleftsep } { \exp_not:n { #2 } }
}
@@ -3817,351 +5014,351 @@
% Contrary to what you might think, the following commands ARE
% sometimes needed.
-\cs_new:Npn\semantex_primitive_valuekey_ifnextdwithsep:nn#1#2 % should be removed later
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdwithsep:nn#1#2 % should be removed later
{
% Tells whether the d (degree) is empty or not
\str_if_eq:nnTF { #2 } { true }
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
- { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
- { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep:nn { #1 } { #2 } }
}
{
\str_if_eq:nnTF { #2 } { false }
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
- { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
- { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep:nn { #1 } { #2 } }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextdwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextdwithsep_temp } { ifnextdwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdwithsep_temp_tl } { ifnextdwithsep } { #2 }
}
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegwithsep:nn\semantex_primitive_valuekey_ifnextdwithsep
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdegwithsep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdwithsep
-\cs_set_eq:NN\semantex_primitive_valuekey_ifnextdegreewithsep:nn\semantex_primitive_valuekey_ifnextdwithsep
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdegreewithsep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextdwithsep
-\cs_new:Npn\semantex_primitive_valuekey_ifnextiwithsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextiwithsep:nn#1#2
{
% Tells whether the i (index) is empty or not
\str_if_eq:nnTF { #2 } { true }
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
- { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
- { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep:nn { #1 } { #2 } }
}
{
\str_if_eq:nnTF { #2 } { false }
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
- { \semantex_primitive_valuekey_ifnextlowerwithsep:nn { #1 } { #2 } }
- { \semantex_primitive_valuekey_ifnextupperwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextlowerwithsep:nn { #1 } { #2 } }
+ { \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextupperwithsep:nn { #1 } { #2 } }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextiwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextiwithsep_temp } { ifnextiwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextiwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextiwithsep_temp_tl } { ifnextiwithsep } { #2 }
}
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_ifnextindexwithsep:nn\semantex_primitive_valuekey_ifnextiwithsep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextindexwithsep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextiwithsep:nn
-\cs_new:Npn\semantex_primitive_valuekey_d:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_d:nn#1#2
{
% adds to the d-index (upper by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_deg:nn\semantex_primitive_valuekey_d:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_deg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_d:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degree:nn\semantex_primitive_valuekey_d:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_d:nn
-\cs_new:Npn\semantex_primitive_valuekey_sd:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sd:nn#1#2
{
% adds to the d-index (upper by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_supper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_slower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_sd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sd:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_sd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sd:nn
-\cs_new:Npn\semantex_primitive_valuekey_cd:nn#1#2{ %IM Maybe remove this.
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cd:nn#1#2{ %IM Maybe remove this.
% adds to the d-index (upper by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sdeg:nn\semantex_primitive_valuekey_cd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cd:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegree:nn\semantex_primitive_valuekey_cd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cd:nn
-\cs_new:Npn\semantex_primitive_valuekey_i:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_i:nn#1#2{
% adds to the i-index (lower by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_index:nn\semantex_primitive_valuekey_i:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_index:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_i:nn
-\cs_new:Npn\semantex_primitive_valuekey_si:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_si:nn#1#2{
% adds to the i-index (lower by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_slower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_supper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sindex:nn\semantex_primitive_valuekey_si:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_si:nn
-\cs_new:Npn\semantex_primitive_valuekey_ci:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ci:nn#1#2{
% adds to the i-index (lower by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_cupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cindex:nn\semantex_primitive_valuekey_ci:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ci:nn
-\cs_new:Npn\semantex_primitive_valuekey_dwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dwithothersep:nn#1#2
{
% adds to the d-index (upper by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_degwithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degwithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dwithothersep:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreewithothersep:nn\semantex_primitive_valuekey_dwithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreewithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dwithothersep:nn
-\cs_new:Npn\semantex_primitive_valuekey_iwithothersep:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_iwithothersep:nn#1#2{
% adds to the i-index (lower by default)
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lowerwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerwithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upperwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperwithothersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_indexwithothersep:nn\semantex_primitive_valuekey_iwithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_indexwithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_iwithothersep:nn
-\cs_new:Npn\semantex_primitive_valuekey_setdsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdsep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setuppersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegsep:nn\semantex_primitive_valuekey_setdsep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegsep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdsep:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegreesep:nn\semantex_primitive_valuekey_setdsep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegreesep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdsep:nn
-\cs_new:Npn\semantex_primitive_valuekey_setisep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setisep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_setlowersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_setuppersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setuppersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setindexsep:nn\semantex_primitive_valuekey_setisep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setindexsep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setisep:nn
-\cs_new:Npn\semantex_primitive_valuekey_pred:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_pred:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_preupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_prelower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_predeg:nn\semantex_primitive_valuekey_pred:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_predeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_pred:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_predegree:nn\semantex_primitive_valuekey_pred:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_predegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_pred:nn
-\cs_new:Npn\semantex_primitive_valuekey_postd:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postd:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_postupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_postlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_postdeg:nn\semantex_primitive_valuekey_postd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postdeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postd:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_postdegree:nn\semantex_primitive_valuekey_postd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postdegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postd:nn
-\cs_set:Npn\semantex_primitive_valuekey_cleard:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleard:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearlower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cleardeg:nn\semantex_primitive_valuekey_cleard:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleardeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleard:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_cleardegree:nn\semantex_primitive_valuekey_cleard:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleardegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleard:nn
-\cs_set:Npn\semantex_primitive_valuekey_clearpred:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpred:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpreupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprelower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpredeg:nn\semantex_primitive_valuekey_clearpred:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpredeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpred:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpredegree:nn\semantex_primitive_valuekey_clearpred:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpredegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpred:nn
-\cs_set:Npn\semantex_primitive_valuekey_clearpostd:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostd:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostupper:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostlower:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdeg:nn\semantex_primitive_valuekey_clearpostd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostdeg:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostd:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpostdegree:nn\semantex_primitive_valuekey_clearpostd:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostdegree:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostd:nn
-\cs_new:Npn\semantex_primitive_valuekey_prei:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prei:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_prelower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prelower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_preupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_preindex:nn\semantex_primitive_valuekey_prei:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_preindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_prei:nn
-\cs_new:Npn\semantex_primitive_valuekey_posti:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_posti:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_postlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postlower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_postupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_postindex:nn\semantex_primitive_valuekey_posti:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_postindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_posti:nn
-\cs_set:Npn\semantex_primitive_valuekey_cleari:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleari:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearlower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_clearindex:nn\semantex_primitive_valuekey_cleari:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cleari:nn
-\cs_set:Npn\semantex_primitive_valuekey_clearprei:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprei:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearprelower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprelower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearpreupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpreupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpreindex:nn\semantex_primitive_valuekey_clearprei:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpreindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearprei:nn
-\cs_set:Npn\semantex_primitive_valuekey_clearposti:nn#1#2
+\cs_set:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearposti:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clearpostlower:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostlower:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clearpostupper:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostupper:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_clearpostindex:nn\semantex_primitive_valuekey_clearposti:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearpostindex:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clearposti:nn
-\cs_new:Npn\semantex_primitive_valuekey_setddots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setddots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
@@ -4172,139 +5369,139 @@
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegdots:nn\semantex_primitive_valuekey_setddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setddots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setddots:nn
-\cs_new:Npn\semantex_primitive_valuekey_ddots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_degdots:nn\semantex_primitive_valuekey_ddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_ddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddots:nn
-\cs_new:Npn\semantex_primitive_valuekey_setdslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdslot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegslot:nn\semantex_primitive_valuekey_setdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdslot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdslot:nn
-\cs_new:Npn\semantex_primitive_valuekey_dslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_degslot:nn\semantex_primitive_valuekey_dslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_dslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslot:nn
-\cs_new:Npn\semantex_primitive_valuekey_sddots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sddots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegdots:nn\semantex_primitive_valuekey_sddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sddots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sddots:nn
-\cs_new:Npn\semantex_primitive_valuekey_sdslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdslot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegslot:nn\semantex_primitive_valuekey_sdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdslot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdslot:nn
-\cs_new:Npn\semantex_primitive_valuekey_cddots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cddots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegdots:nn\semantex_primitive_valuekey_cddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cddots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cddots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cddots:nn
-\cs_new:Npn\semantex_primitive_valuekey_cdslot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdslot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegslot:nn\semantex_primitive_valuekey_cdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdslot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cdslot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdslot:nn
-\cs_new:Npn\semantex_primitive_valuekey_ddotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddotswithothersep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdotswithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdotswithothersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_degdotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degdotswithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddotswithothersep:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_ddotswithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreedotswithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ddotswithothersep:nn
-\cs_new:Npn\semantex_primitive_valuekey_dslotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslotwithothersep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslotwithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslotwithothersep:nn { #1 } { #2 }
}
}
@@ -4312,7 +5509,7 @@
%----------------------------------------------------------
-\cs_new:Npn\semantex_primitive_valuekey_setidots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setidots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
@@ -4323,168 +5520,172 @@
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setindexdots:nn\semantex_primitive_valuekey_setidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setindexdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setidots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegreedots:nn\semantex_primitive_valuekey_setidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setidots:nn
-\cs_new:Npn\semantex_primitive_valuekey_idots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_indexdots:nn\semantex_primitive_valuekey_idots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_indexdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreedots:nn\semantex_primitive_valuekey_idots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idots:nn
-\cs_new:Npn\semantex_primitive_valuekey_setislot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setislot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_setlowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setlowerslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_setupperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setupperslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_setindexslot:nn\semantex_primitive_valuekey_setislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setindexslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setislot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_setdegreeslot:nn\semantex_primitive_valuekey_setislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_setislot:nn
-\cs_new:Npn\semantex_primitive_valuekey_islot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_islot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_indexslot:nn\semantex_primitive_valuekey_islot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_indexslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_islot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreeslot:nn\semantex_primitive_valuekey_islot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_islot:nn
-\cs_new:Npn\semantex_primitive_valuekey_sidots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sidots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_slowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_supperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sindexdots:nn\semantex_primitive_valuekey_sidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sindexdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sidots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegreedots:nn\semantex_primitive_valuekey_sidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sidots:nn
-\cs_new:Npn\semantex_primitive_valuekey_sislot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sislot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_slowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_slowerslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_supperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_supperslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_sindexslot:nn\semantex_primitive_valuekey_sislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sindexslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sislot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_sdegreeslot:nn\semantex_primitive_valuekey_sislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sislot:nn
-\cs_new:Npn\semantex_primitive_valuekey_cidots:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cidots:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clowerdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerdots:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_cupperdots:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperdots:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cindexdots:nn\semantex_primitive_valuekey_cidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cindexdots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cidots:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegreedots:nn\semantex_primitive_valuekey_cidots:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegreedots:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cidots:nn
-\cs_new:Npn\semantex_primitive_valuekey_cislot:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cislot:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_clowerslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_clowerslot:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_cupperslot:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cupperslot:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_cindexslot:nn\semantex_primitive_valuekey_cislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cindexslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cislot:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_cdegreeslot:nn\semantex_primitive_valuekey_cislot:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cdegreeslot:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_cislot:nn
-\cs_new:Npn\semantex_primitive_valuekey_idotswithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idotswithothersep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lowerdotswithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerdotswithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upperdotswithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperdotswithothersep:nn { #1 } { #2 }
}
}
-\cs_set_eq:NN\semantex_primitive_valuekey_indexdotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_indexdotswithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idotswithothersep:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreedotswithothersep:nn\semantex_primitive_valuekey_idotswithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreedotswithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_idotswithothersep:nn
-\cs_new:Npn\semantex_primitive_valuekey_islotwithothersep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_islotwithothersep:nn#1#2
{
\semantex_data_bool_get:nnTF { #1 } { uppergrading }
{
- \semantex_primitive_valuekey_lowerslotwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_lowerslotwithothersep:nn { #1 } { #2 }
}
{
- \semantex_primitive_valuekey_upperslotwithothersep:nn { #1 } { #2 }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_upperslotwithothersep:nn { #1 } { #2 }
}
}
%----------------------------------------------------------
-\cs_set_eq:NN\semantex_primitive_valuekey_degslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degslotwithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslotwithothersep:nn
-\cs_set_eq:NN\semantex_primitive_valuekey_degreeslotwithothersep:nn\semantex_primitive_valuekey_dslotwithothersep:nn
+\cs_set_eq:NN\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_degreeslotwithothersep:nn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_dslotwithothersep:nn
-\cs_new:Npn\semantex_primitive_valuekey_par:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_par:nn#1#2{
% Turns parentheses on, and sets their size
\semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } }
- \semantex_primitive_valuekey_ifpar:nn { #1 } { true }
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifpar:nn { #1 } { true }
}
-\cs_new:Npn\semantex_primitive_valuekey_parsize:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_parsize:nn#1#2{
% Sets the size of the parentheses
\semantex_data_tl_set:nnn { #1 } { parsize }{ \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_leftpar:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftpar:nn#1#2{
\semantex_data_tl_set:nnn { #1 } { leftpar }{ \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_rightpar:nn#1#2{
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftpar:nn { xn }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightpar:nn#1#2{
\semantex_data_tl_set:nnn { #1 } { rightpar }{ \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_ifpar:nn#1#2{ %IMPLEMENT THIS
+\cs_generate_variant:Nn \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightpar:nn { xn }
+
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifpar:nn#1#2{ %IMPLEMENT THIS
% tells whether to use the output class or not
\semantex_data_bool_provide:nn { #1 } { par }
\str_if_eq:nnTF { #2 } { true }
@@ -4505,50 +5706,50 @@
\semantex_data_bool_set_true:nn { #1 } { flexpar }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifpar_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifpar_temp } { ifpar } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifpar_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifpar_temp_tl } { ifpar } { #2 }
}
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_spar:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar:nn#1#2
{
% Abbreviation for "symbol parentheses"
% Adds parentheses around the current symbol
- \semantex_primitive_valuekey_return:nn { #1 }{}
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_return:nn { #1 }{}
\semantex_data_tl_inherit:nn { #1 } { symbol } % Check if really necessary
\tl_if_blank:nTF { #2 }
{
- \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_spar_sparsize_temp
+ \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_sparsize_temp_tl
\__semantex_symbol_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_spar_sparsize_temp }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_sparsize_temp_tl }
{ \semantex_data_tl_get:nn { #1 } { leftspar } }
{ \semantex_data_tl_get:nn { #1 } { rightspar } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
- \l__semantex_primitive_valuekey_spar_temp
+ \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_temp_tl
\semantex_data_tl_set:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_primitive_valuekey_spar_temp
+ \exp_not:V\l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_temp_tl
}
}
{
- \tl_set:Nn \l__semantex_primitive_valuekey_spar_sparsize_temp { \exp_not:n { #2 } }
+ \tl_set:Nn \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_sparsize_temp_tl { \exp_not:n { #2 } }
\__semantex_symbol_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_spar_sparsize_temp }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_sparsize_temp_tl }
{ \semantex_data_tl_get:nn { #1 } { leftspar } }
{ \semantex_data_tl_get:nn { #1 } { rightspar } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
- \l__semantex_primitive_valuekey_spar_temp
+ \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_temp_tl
\semantex_data_tl_set:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_primitive_valuekey_spar_temp
+ \exp_not:V\l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_spar_temp_tl
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_ifnextargwithsep:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextargwithsep:nn#1#2
{
% Tells whether it is the first argument or not
\tl_if_eq:nnTF { #2 } { true }
@@ -4561,72 +5762,72 @@
\semantex_data_bool_set_false:nn { #1 } { nextargwithsep }
}
{
- \semantex_error_output_format:nN { #1 } \l__semantex_primitive_valuekey_ifnextargwithsep_temp
- \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_primitive_valuekey_ifnextargwithsep_temp } { ifnextargwithsep } { #2 }
+ \semantex_error_output_format:nN { #1 } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextargwithsep_temp_tl
+ \msg_error:nnxnn { semantex } { key_value_not_found } { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifnextargwithsep_temp_tl } { ifnextargwithsep } { #2 }
}
}
}
-\cs_new:Npn\semantex_primitive_valuekey_otherspar:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar:nn#1#2
{
% Uses the syntax otherspar={leftpar}{rightpar}
% Adds a new spar, but with these as parentheses
- \__semantex_primitive_valuekey_otherspar_auxiliary:nnn { #1 } #2
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_auxiliary:nnn { #1 } #2
}
-\cs_new:Npn\__semantex_primitive_valuekey_otherspar_auxiliary:nnn#1#2#3
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_auxiliary:nnn#1#2#3
{
\semantex_data_tl_inherit:nn { #1 } { sparsize } % This is necessary for unknown reasons -- otherwise, it will crash when inheriting sparsize
\semantex_data_tl_inherit:nn { #1 } { symbol }
- \semantex_primitive_valuekey_return:nn { #1 }{}
- \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_primitive_valuekey_otherspar_sparsize_temp
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_return:nn { #1 }{}
+ \semantex_data_tl_get_store:nnN { #1 } { sparsize } \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_sparsize_temp_tl
\__semantex_symbol_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_otherspar_sparsize_temp }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_sparsize_temp_tl }
{ \exp_not:n { \exp_not:n { #2 } } }
{ \exp_not:n { \exp_not:n { #3 } } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
- \l__semantex_primitive_valuekey_otherspar_temp
+ \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_temp_tl
\semantex_data_tl_set:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_primitive_valuekey_otherspar_temp
+ \exp_not:V\l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_otherspar_temp_tl
}
}
-\cs_new:Npn\semantex_primitive_valuekey_Otherspar:nn#1#2
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar:nn#1#2
{
% Uses the syntax otherspar={leftpar}{rightpar}{size}
% Adds a new spar, but with these as parentheses and size
- \__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn { #1 } #2
+ \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_auxiliary:nnnn { #1 } #2
}
-\cs_new:Npn\__semantex_primitive_valuekey_Otherspar_auxiliary:nnnn#1#2#3#4
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_auxiliary:nnnn#1#2#3#4
{
- \tl_set:Nn\l__semantex_primitive_valuekey_Otherspar_sparsize_temp
+ \tl_set:Nn\l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_sparsize_temp_tl
{ \exp_not:n { #4 } }
\__semantex_symbol_parentheses_store:nnnnN
- { \l__semantex_primitive_valuekey_Otherspar_sparsize_temp }
+ { \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_sparsize_temp_tl }
{ \exp_not:n { \exp_not:n { #2 } } }
{ \exp_not:n { \exp_not:n { #3 } } }
{ \semantex_data_tl_get_exp_not:nn { #1 } { symbol } }
- \l__semantex_primitive_valuekey_Otherspar_temp
+ \l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_temp_tl
\semantex_data_tl_set:nnx { #1 } { symbol }
{
- \exp_not:V\l__semantex_primitive_valuekey_Otherspar_temp
+ \exp_not:V\l__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_Otherspar_temp_tl
}
}
-\cs_new:Npn\semantex_primitive_valuekey_sparsize:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_sparsize:nn#1#2{
% sets the size of the parentheses
\semantex_data_tl_set:nnn { #1 } { sparsize }{ \exp_not:n { #2 } }
}
-\cs_new:Npn\semantex_primitive_valuekey_leftspar:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_leftspar:nn#1#2{
\semantex_data_tl_set:nnn { #1 } { leftspar }{ \exp_not:n { \exp_not:n { #2 } } }
%IM Two \exp_not necessary for unknown reasons
%IM Doing the same at leftpar yields an error.
}
-\cs_new:Npn\semantex_primitive_valuekey_rightspar:nn#1#2{
+\cs_new:Npn\__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_rightspar:nn#1#2{
\semantex_data_tl_set:nnn { #1 } { rightspar }{ \exp_not:n { \exp_not:n { #2 } } }
%IM Two \exp_not necessary for unknown reasons
%IM Doing the same at leftpar yields an error.
@@ -4634,56 +5835,13 @@
\cs_generate_variant:Nn \semantex_keys_set:nn { nx, no, nV } % Only the first one is currently being used
-\cs_new:Npn \semantex_valuekey:nnn#1#2#3{
- % Takes care of valuekeys, keys taking a value
- % For the sake of implementation, the arguments
- % come in a strange order
- % #1 = value of key
- % #2 = name of the key
- % #3 = object
- \tl_set:Nn\l__semantex_key_value_temp{\exp_not:n{#1}}
- %IM think about using extra {...} to avoid interference with keyval str
- \semantex_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_valuekey_temp
- {
- \semantex_keys_set:nx { #3 }
- { \l__semantex_custom_valuekey_temp }
- }
- {
- \cs_if_exist:cTF { semantex_primitive_valuekey_#2:nn }
- {
- \use:c { semantex_primitive_valuekey_#2:nn }{ #3 }{ #1 }
- }
- {
- \semantex_error_output_format:nN { #3 } \__semantex_valuekey_unknown_key_temp
- \msg_error:nnxn { semantex } { valuekey_not_found } { \__semantex_valuekey_unknown_key_temp } { #2 }
- }
- }
-}
-
-\cs_new:Npn \semantex_singlekey:nn#1#2
-{
- % #1 = name of the key
- % #2 = object
-% Takes care of single keys, keys without a value
- \semantex_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_singlekey_temp
- {
- \semantex_keys_set:nx { #2 }
- {
- \l__semantex_custom_singlekey_temp
- }
- }
- {
- \semantex_keys_set:nn { #2 } { default = { #1 } }
- }
-}
-
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% COMMANDS CONTROLLING THE ARGUMENT KEYVAL INTERFACE
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\cs_new:Npn \semantex_primitive_arg_valuekey_othersep:nn#1#2
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_othersep:nn#1#2
{
% Uses syntax sep={separator}{argument}; adds an argument
% with the specified separator
@@ -4708,7 +5866,9 @@
\semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
}
-\cs_new:Npn \semantex_primitive_arg_valuekey_s:nn#1#2
+\cs_generate_variant:Nn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_othersep:nn { nx }
+
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_s:nn#1#2
{
% Adds to the argument, with the standard separator
\semantex_data_bool_get:nnTF { #1 } { nextargwithsep }
@@ -4725,207 +5885,204 @@
% this was mostly to create symmetry with the below case where
% cx is strictly necessary.
}
-% \semantex_primitive_valuekey_ifoutput:nn { #1 } { true }
+% \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifoutput:nn { #1 } { true }
+ \semantex_data_int_incr:nn { #1 } { numberofarguments }
+ \semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
+}
+
+\cs_generate_variant:Nn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_s:nn { nx }
+
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_c:nn#1#2
+{
+ % Adds to the argument, with the standard separator
+ \semantex_data_bool_get:nnTF { #1 } { nextargwithsep }
+ {
+ \semantex_data_tl_put_right:nnn { #1 } { arg } { , \exp_not:n { #2 } }
+ % As an experiment, I tried changing cx to cn, and it failed
+ % when changing the separator on the fly.
+ }
+ {
+ \semantex_data_tl_put_right:nnn { #1 } { arg } { \exp_not:n { #2 } }
+ %IM Recently corrected
+ % Previously, this was cx, but I didn’t see any point of this;
+ % this was mostly to create symmetry with the below case where
+ % cx is strictly necessary.
+ }
+% \__semantex_data_cs_custom_valuekey_class_SemantexBaseObject_ifoutput:nn { #1 } { true }
\semantex_data_int_incr:nn { #1 } { numberofarguments }
\semantex_data_bool_set_true:nn { #1 } { nextargwithsep }
}
-\cs_generate_variant:Nn \semantex_primitive_arg_valuekey_s:nn { nx }
+\cs_generate_variant:Nn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_c:nn { nx }
-\cs_new:Npn \semantex_primitive_arg_valuekey_dots:nn#1#2
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_dots:nn#1#2
{
% Writes dots in the argument
- \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } }
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } }
}
-\cs_new:Npn \semantex_primitive_arg_valuekey_slot:nn#1#2
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_slot:nn#1#2
{
% Writes the slot in teh argument
- \semantex_primitive_arg_valuekey_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } }
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_s:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } }
}
-\cs_generate_variant:Nn \semantex_arg_keys_set:nn { nx }
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_cdots:nn#1#2
+{
+ % Writes dots in the argument
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_c:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } }
+}
-\cs_new:Npn \semantex_arg_valuekey:nnn#1#2#3
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_cslot:nn#1#2
{
- % Takes care of valuekeys, keys with a value
- % For the sake of implementation, the arguments
- % come in a strange order
- % #1 = value of key
- % #2 = name of the key
- % #3 = object
- \tl_set:Nn\l__semantex_arg_key_value_temp{\exp_not:n{#1}} % stores the content of the key in the temporary command \l__semantex_key_value_temp
- \semantex_arg_valuekey_get:nnNTF { #3 } { #2 } \l__semantex_custom_arg_valuekey_temp
- {
- \semantex_arg_keys_set:nx { #3 } { \l__semantex_custom_arg_valuekey_temp }
- }
- {
- \cs_if_exist:cTF { semantex_primitive_arg_valuekey_#2:nn }
- {
- \use:c { semantex_primitive_arg_valuekey_#2:nn }{ #3 }{ #1 }
- }
- {
-% \msg_error:nnnn { semantex } { arg_valuekey_not_found } { #2 } { #3 }
- \semantex_error_output_format:nN { #3 } \__semantex_arg_valuekey_unknown_key_temp
- \msg_error:nnxn { semantex } { arg_valuekey_not_found } { \__semantex_arg_valuekey_unknown_key_temp } { #2 }
- }
- }
+ % Writes the slot in teh argument
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_c:nx { #1 } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } }
}
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_dotswithothersep:nn#1#2
+{
+ % Writes dots in the argument
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_othersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get_exp_not:nn { #1 } { argdots } } }
+}
-\cs_new:Npn \semantex_arg_singlekey:nn#1#2
+\cs_new:Npn \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_slotwithothersep:nn#1#2
{
- % #1 = name of the key
- % #2 = object
-% % takes care of single keys, keys without a value
-% the class key is not actually necessary
- \semantex_arg_singlekey_get:nnNTF { #2 } { #1 } \l__semantex_custom_arg_singlekey_temp
- {
- %\exp_args:NNno
- %\exp_args:Nno
- \semantex_arg_keys_set:nx { #2 }
- {
- \l__semantex_custom_arg_singlekey_temp
- }
- }
- {
- \semantex_data_tl_inherit_x:nn { #2 } { arg }
- \semantex_arg_keys_set:nn { #2 } { default={\exp_not:n { #1 } }}
- %IM THis \exp_not:n was added late, might be needed elsewhere, too.
- }
+ % Writes the slot in teh argument
+ \__semantex_data_cs_custom_arg_valuekey_class_SemantexBaseObject_othersep:nx { #1 } { { \exp_not:n { #2 } } { \semantex_data_tl_get_exp_not:nn { #1 } { argslot } } }
}
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% SETTING UP THE BASE CLASS SemantexVariable
+% SETTING UP THE BASE CLASS SemantexBaseObject
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\semantex_data_tl_provide:nn { class_SemantexVariable } { output }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { output }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { output } { class_SemantexVariable }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { output } { class_SemantexBaseObject }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upper }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upper }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { uppersep }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { uppersep }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { uppersep } { , }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { uppersep } { , }
%IM Also, need commands like forgetupperindex, reverting to the class standard
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lower }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lower }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowersep }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowersep }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { lowersep } { , }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { lowersep } { , }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { preupper }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { preupper }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { postupper }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { postupper }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { prelower }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { prelower }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { postlower }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { postlower }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperleft }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftsep }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperleftsep }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { upperleftsep } { , }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { upperleftsep } { , }
%IM do the same with all the others, INCLUDING if_uppergrading and symbol
%IM Also, need commands like forgetupperindex, reverting to the class standard
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerleft }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftsep }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerleftsep }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { lowerleftsep } { , }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { lowerleftsep } { , }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { preupperleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { preupperleft }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { postupperleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { postupperleft }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { prelowerleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { prelowerleft }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { postlowerleft }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { postlowerleft }
-\semantex_data_int_provide:nn { class_SemantexVariable } { numberofarguments }
+\semantex_data_int_provide:nn { class_SemantexBaseObject } { numberofarguments }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { nextargwithsep }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { nextargwithsep }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperleftwithsep }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerleftwithsep }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { nextupperleftwithsep }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { nextlowerleftwithsep }
-\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperleftindices }
-\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerleftindices }
+\semantex_data_int_provide:nn { class_SemantexBaseObject } { numberofupperleftindices }
+\semantex_data_int_provide:nn { class_SemantexBaseObject } { numberoflowerleftindices }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { prearg }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { prearg }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { postarg }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { postarg }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { arg }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { arg }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { argsep }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { argsep } {,}
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { argsep }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { argsep } {,}
-\semantex_data_tl_provide:nn { class_SemantexVariable } { argslot }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { argslot } { \SemantexSlot }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { argslot }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { argslot } { \SemantexSlot }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { argdots }
-\semantex_data_tl_set:nnn { class_SemantexVariable } { argdots } {\dots}
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { argdots }
+\semantex_data_tl_set:nnn { class_SemantexBaseObject } { argdots } {\dots}
-\semantex_data_tl_provide:nn { class_SemantexVariable } { symbol }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { symbol }
-\semantex_data_seq_provide:nn { class_SemantexVariable } { commands_sequence }
+\semantex_data_seq_provide:nn { class_SemantexBaseObject } { commands_sequence }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { uppergrading }
-\semantex_data_bool_set_true:nn { class_SemantexVariable } { uppergrading }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { uppergrading }
+\semantex_data_bool_set_true:nn { class_SemantexBaseObject } { uppergrading }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { output }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { output }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { outputoptions }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { outputoptions }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { nextupperwithsep }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { nextlowerwithsep }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { nextupperwithsep }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { nextlowerwithsep }
-\semantex_data_int_provide:nn { class_SemantexVariable } { numberofupperindices }
-\semantex_data_int_provide:nn { class_SemantexVariable } { numberoflowerindices }
+\semantex_data_int_provide:nn { class_SemantexBaseObject } { numberofupperindices }
+\semantex_data_int_provide:nn { class_SemantexBaseObject } { numberoflowerindices }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { par }
-\semantex_data_bool_set_true:nn { class_SemantexVariable } { par }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { par }
+\semantex_data_bool_set_true:nn { class_SemantexBaseObject } { par }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { flexpar }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { flexpar }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { parseoptions }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { parseoptions }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { texclass }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { texclass }
-\semantex_data_bool_provide:nn { class_SemantexVariable } { leftargument }
+\semantex_data_bool_provide:nn { class_SemantexBaseObject } { leftargument }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperdots }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperslot }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperdots }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperslot }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerdots }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerslot }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerdots }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerslot }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftdots }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { upperleftslot }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperleftdots }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { upperleftslot }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftdots }
-\semantex_data_tl_provide:nn { class_SemantexVariable } { lowerleftslot }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerleftdots }
+\semantex_data_tl_provide:nn { class_SemantexBaseObject } { lowerleftslot }
-%\tl_set:Nn\g_objectmath_SemantexVariable_upper { hej }
-%\tl_set:Nn \SemantexVariable_output { class_SemantexVariable }
-%\bool_new:N \SemantexVariable_output_if_provided
-%\bool_set_true:N \SemantexVariable_output_if_provided
+%\tl_set:Nn\g_objectmath_SemantexBaseObject_upper { hej }
+%\tl_set:Nn \SemantexBaseObject_output { class_SemantexBaseObject }
+%\bool_new:N \SemantexBaseObject_output_if_provided
+%\bool_set_true:N \SemantexBaseObject_output_if_provided
-\semantex_new_variable_class:Nw \SemantexVariable [
- %parent=SemantexVariable,
- output=\SemantexVariable,
+\semantex_new_plain_class:Nw \SemantexBaseObject [
+ %parent=SemantexBaseObject,
+ output=\SemantexBaseObject,
ifoutput=false,
symbol=,
gradingposition=upper,
@@ -4983,14 +6140,37 @@
{si**}{si=\g_semantex_double_bullet},
{ci*}{ci=\g_semantex_bullet},
{ci**}{ci=\g_semantex_double_bullet},
- {smash}{command=\noexpand\smash},
-% (widebar}{command=\noexpand\widebar},%For unknown reasons, this only seems to work when run as a primitive
- {tilde}{command=\noexpand\tilde},
+ {upper*}{upper=\g_semantex_bullet},
+ {upper**}{upper=\g_semantex_double_bullet},
+ {supper*}{supper=\g_semantex_bullet},
+ {supper**}{supper=\g_semantex_double_bullet},
+ {cupper*}{cupper=\g_semantex_bullet},
+ {cupper**}{cupper=\g_semantex_double_bullet},
+ {lower*}{lower=\g_semantex_bullet},
+ {lower**}{lower=\g_semantex_double_bullet},
+ {slower*}{slower=\g_semantex_bullet},
+ {slower**}{slower=\g_semantex_double_bullet},
+ {clower*}{clower=\g_semantex_bullet},
+ {clower**}{clower=\g_semantex_double_bullet},
+ {upperleft*}{upperleft=\g_semantex_bullet},
+ {upperleft**}{upperleft=\g_semantex_double_bullet},
+ {supperleft*}{supperleft=\g_semantex_bullet},
+ {supperleft**}{supperleft=\g_semantex_double_bullet},
+ {cupperleft*}{cupperleft=\g_semantex_bullet},
+ {cupperleft**}{cupperleft=\g_semantex_double_bullet},
+ {lowerleft*}{lowerleft=\g_semantex_bullet},
+ {lowerleft**}{lowerleft=\g_semantex_double_bullet},
+ {slowerleft*}{slowerleft=\g_semantex_bullet},
+ {slowerleft**}{slowerleft=\g_semantex_double_bullet},
+ {clowerleft*}{clowerleft=\g_semantex_bullet},
+ {clowerleft**}{clowerleft=\g_semantex_double_bullet},
+ {smash}{command=\smash},
+ {tilde}{command=\tilde},
{widetilde}{command=\widetilde},
- {overline}{command=\noexpand\overline},
- {bar}{command=\noexpand\bar},
- {bold}{command=\noexpand\mathbf},
- {roman}{command=\noexpand\mathrm},
+ {overline}{command=\overline},
+ {bar}{command=\bar},
+ {bold}{command=\mathbf},
+ {roman}{command=\mathrm},
{mathord}{texclass=\mathord},
{mathbin}{texclass=\mathbin},
{mathop}{texclass=\mathop},
@@ -5124,32 +6304,29 @@
{sdegree-}{sdegreeslot=},
{...}{sidots=},
{-}{sislot=},
- % The following four commands do not work due to expansion issues:
-% {useargwithkeyval}{useargwithkeyval=},
% {argwithkeyval}{
% valuekeys={
-% {arg}{argwithkeyval={\noexpand\l__semantex_key_value_temp}},
+% {arg}{argwithkeyval={####1}},
% },
% },
% {argwithsinglekeys}{
% valuekeys={
-% {arg}{argwithsinglekeys={\noexpand\l__semantex_key_value_temp}},
+% {arg}{argwithsinglekeys={####1}},
% },
% },
% {argwithoutkeyval}{
% valuekeys={
-% {arg}{argwithoutkeyval={\noexpand\l__semantex_key_value_temp}},
+% {arg}{argwithoutkeyval={####1}},
% },
% },
% {argwithonesinglekey}{
% valuekeys={
-% {arg}{argwithonesinglekey={\noexpand\l__semantex_key_value_temp}},
+% {arg}{argwithonesinglekey={####1}},
% },
% },
},
valuekeys={
{default}{sindex={#1}},
-% {arg}{argwithkeyval={#1}},
{arg}{argwithsinglekeys={#1}},
{degreedefault}{sdegree={#1}},
{*withothersep}{degreewithothersep={#1}{\g_semantex_bullet}},
@@ -5164,25 +6341,87 @@
{index**withothersep}{indexwithothersep={#1}{\g_semantex_double_bullet}},
{i*withothersep}{iwithothersep={#1}{\g_semantex_bullet}},
{i**withothersep}{iwithothersep={#1}{\g_semantex_double_bullet}},
+ {upper*withothersep}{upperwithothersep={#1}{\g_semantex_bullet}},
+ {upper**withothersep}{upperwithothersep={#1}{\g_semantex_double_bullet}},
+ {lower*withothersep}{lowerwithothersep={#1}{\g_semantex_bullet}},
+ {lower**withothersep}{lowerwithothersep={#1}{\g_semantex_double_bullet}},
+ {upperleft*withothersep}{upperleftwithothersep={#1}{\g_semantex_bullet}},
+ {upperleft**withothersep}{upperleftwithothersep={#1}{\g_semantex_double_bullet}},
+ {lowerleft*withothersep}{lowerleftwithothersep={#1}{\g_semantex_bullet}},
+ {lowerleft**withothersep}{lowerleftwithothersep={#1}{\g_semantex_double_bullet}},
+ {sarg}{argwithkeyval={s={#1}}},
+ {carg}{argwithkeyval={c={#1}}},
+ {argwithothersep}{argwithkeyval={othersep={#1}}},
+ {argdots}{argwithkeyval={...}},
+ {arg...}{argwithkeyval={...}},
+ {cargdots}{argwithkeyval={cdots=}},
+ {carg...}{argwithkeyval={cdots=}},
+ {argdotswithothersep}{argwithkeyval={dotswithothersep={#1}}},
+ {arg...withothersep}{argwithkeyval={dotswithothersep={#1}}},
+ {argdots}{argwithkeyval={-}},
+ {arg-}{argwithkeyval={-}},
+ {cargslot}{argwithkeyval={cslot=}},
+ {carg-}{argwithkeyval={cslot=}},
+ {argslotwithothersep}{argwithkeyval={slotwithothersep={#1}}},
+ {arg-withothersep}{argwithkeyval={slotwithothersep={#1}}},
+ {argkeyval}{
+ ifeqTF={#1}{true}
+ {
+ valuekeys={
+ {arg}{argwithkeyval={####1}},
+ },
+ }
+ {
+ ifeqTF={#1}{false}
+ {
+ valuekeys={
+ {arg}{argwithoutkeyval={####1}},
+ },
+ }
+ {
+ ifeqTF={#1}{singlekeys}
+ {
+ valuekeys={
+ {arg}{argwithsinglekeys={####1}},
+ },
+ }
+ {
+ ifeqTF={#1}{onesinglekey}
+ {
+ valuekeys={
+ {arg}{argwithonesinglekey={####1}},
+ },
+ }
+ {
+ ERRORkeyvaluenotfound={argkeyval}{#1},
+ },
+ },
+ },
+ },
+ },
},
-% argwithsinglekeys,
argvaluekeys={
{default}{s={#1}},
+ {-withothersep}{slotwithothersep={#1}},
+ {...withothersep}{dotswithothersep={#1}},
},
argsinglekeys={
{slot}{slot=},
{-}{slot=},
+ {cslot}{cslot=},
+ {c-}{cslot=},
% {*}{slot=}, % would be confusing since * does not correspond to slot in the indices
+ {dots}{dots=},
{...}{dots=},
+ {cdots}{cdots=},
+ {c...}{cdots=},
},
- %command=,
-% useargwithkeyval,
]
-\cs_set_eq:NN\__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw \__semantex_new_object_of_class_SemantexVariable:Nw
+\cs_set_eq:NN\__semantex_old_version_of_semantex_new_object_of_class_SemantexBaseObject:Nw \__semantex_new_object_of_class_SemantexBaseObject:Nw
-\cs_set:Npn \__semantex_new_object_of_class_SemantexVariable:Nw#1
+\cs_set:Npn \__semantex_new_object_of_class_SemantexBaseObject:Nw#1
{
- \msg_error:nnn { semantex } { created_a_SemantexVariable } { #1 }
- \__semantex_old_version_of_semantex_new_object_of_class_SemantexVariable:Nw #1
+ \msg_error:nnn { semantex } { created_a_SemantexBaseObject } { #1 }
+ \__semantex_old_version_of_semantex_new_object_of_class_SemantexBaseObject:Nw #1
} \ No newline at end of file
diff --git a/macros/latex/contrib/semantex/semantex.tex b/macros/latex/contrib/semantex/semantex.tex
index 2a3bee0153..f4cf279f0e 100644
--- a/macros/latex/contrib/semantex/semantex.tex
+++ b/macros/latex/contrib/semantex/semantex.tex
@@ -34,7 +34,7 @@
\usepackage[nameinlink]{cleveref}
-\title{Seman\!\TeX: Semantic mathematics (v$0.201\alpha$)}
+\title{Seman\!\TeX: Semantic mathematics (v$0.3\alpha$)}
\date{\today}
\author{Sebastian Ørsted (\href{mailto:sorsted@gmail.com}{sorsted@gmail.com})}
@@ -293,6 +293,7 @@ $ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
\NewObject\MyVar\vn{n}
\NewObject\MyVar\vp{p}
\NewObject\MyVar\vU{U}
+\NewObject\MyVar\vx{x}
\NewObject\MyVar\sheafF{\mathcal{F}}
% Now we set up the class \MyVar:
@@ -318,7 +319,7 @@ $ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
$ \vf[conj,der=\vn] $
-$ \vg[inv,res=\vU]{x} $
+$ \vg[inv,res=\vU]{\vx} $
$ \vh[inverseimage]{\sheafF}[spar,stalk=\vp]
= \sheafF[stalk=\vh{\vp}] $
@@ -335,7 +336,7 @@ with
\usepackage{semantex}
\end{lstlisting}
The \semantex system is object-oriented; all entities are objects of some class. When you load the package, there
-is only one class by default, which is simply called \lstinline!\SemantexVariable!.
+is only one class by default, which is simply called \lstinline!\SemantexBaseObject!.
You should think of this as a low-level class, the parent of all other classes. Therefore, I highly advice against using it directly or modifying it.
Instead, we create a new, more high-level variable class.
We choose to call it \lstinline!\MyVar!.
@@ -771,19 +772,19 @@ Adding support for free algebras, power series, and Laurent series is almost as
},
{freealg}{
par,
- leftpar=\noexpand\langle,
- rightpar=\noexpand\rangle,
+ leftpar=\langle,
+ rightpar=\rangle,
},
{powerseries}{
par,
- leftpar=\noexpand\llbracket,
- rightpar=\noexpand\rrbracket,
+ leftpar=\llbracket,
+ rightpar=\rrbracket,
},
{laurent}{
par,
leftpar=(, rightpar=),
- prearg={\!\!\noexpand\SemantexDelimiterSize(},
- postarg={\noexpand\SemantexDelimiterSize)\!\!},
+ prearg={\!\!\SemantexDelimiterSize(},
+ postarg={\SemantexDelimiterSize)\!\!},
% These are printed before and after the argument.
% The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
@@ -796,19 +797,19 @@ Adding support for free algebras, power series, and Laurent series is almost as
singlekeys={
{freealg}{
par,
- leftpar=\noexpand\langle,
- rightpar=\noexpand\rangle,
+ leftpar=\langle,
+ rightpar=\rangle,
},
{powerseries}{
par,
- leftpar=\noexpand\llbracket,
- rightpar=\noexpand\rrbracket,
+ leftpar=\llbracket,
+ rightpar=\rrbracket,
},
{laurent}{
par,
leftpar=(, rightpar=),
- prearg={\!\!\noexpand\SemantexDelimiterSize(},
- postarg={\noexpand\SemantexDelimiterSize)\!\!},
+ prearg={\!\!\SemantexDelimiterSize(},
+ postarg={\SemantexDelimiterSize)\!\!},
% These are printed before and after the argument.
% The command "\SemantexDelimiterSize" is substituted
% by \big, \Big, ..., or whatever size the
@@ -816,10 +817,7 @@ Adding support for free algebras, power series, and Laurent series is almost as
},
},
}
-For expansion reasons (which I am not completely sure of),
-we need \lstinline!\noexpand! before these commands.
-In general, whenever something fails, try throwing in \lstinline!\noexpand!'s in front of suspicious-looking commands,
-and things will usually work out just fine. See for yourself:
+See for yourself:
\begin{LTXexample}
$\vk[freealg]{\vx}$,
$\vk[powerseries]{\vy}$,
@@ -831,7 +829,7 @@ Let us look at some other algebraic operations that we can control via \semantex
\begin{lstlisting}
\SetupClass\MyVar{
singlekeys={
- {op}{upper={\noexpand\mathrm{op}}},
+ {op}{upper={\mathrm{op}}},
% opposite groups, rings, categories, etc.
{algclosure}{overline},
% algebraic closure
@@ -863,7 +861,7 @@ Let us look at some other algebraic operations that we can control via \semantex
\end{lstlisting}
\SetupClass\MyVar{
singlekeys={
- {op}{upper={\noexpand\mathrm{op}}},
+ {op}{upper={\mathrm{op}}},
% opposite groups, rings, categories, etc.
{algclosure}{overline},
% algebraic closure
@@ -1015,26 +1013,26 @@ In fact, you could have defined the \lstinline!overline! yourself as follows:
\begin{lstlisting}
\SetupClass\MyVar{
singlekeys={
- {overline}{command=\noexpand\overline},
+ {overline}{command=\overline},
},
}
\end{lstlisting}
\SetupClass\MyVar{
singlekeys={
- {overline}{command=\noexpand\overline},
+ {overline}{command=\overline},
},
}
-This is how the key \lstinline!overline! is defined internally, except it is defined on the level of the superclass \lstinline!\SemantexVariable! instead. We need the key \lstinline!\noexpand! in order for everything to expand properly. This is only necessary for some commands, and to tell the truth, I haven't quite figured out the system of which commands need it and which ones do not. However, as usual, if something does not work, try throwing in some \lstinline!\noexpand!'s and see if it solves the problem.
+This is how the key \lstinline!overline! is defined internally, except it is defined on the level of the superclass \lstinline!\SemantexBaseObject! instead.
Here are some more examples of predefined keys that use the command key:
\begin{lstlisting}
\SetupClass\MyVar{ % do not add these -- they are already predefined!
novalueskeys={
- {smash}{command=\noexpand\smash},
- {tilde}{command=\noexpand\tilde},
+ {smash}{command=\smash},
+ {tilde}{command=\tilde},
{widetilde}{command=\widetilde},
- {bar}{command=\noexpand\bar},
- {bold}{command=\noexpand\mathbf},
- {roman}{command=\noexpand\mathrm},
+ {bar}{command=\bar},
+ {bold}{command=\mathbf},
+ {roman}{command=\mathrm},
},
}
\end{lstlisting}
@@ -1339,16 +1337,16 @@ and hypercohomology. This is quite easy with the \lstinline!command! key:
\SetupClass\MyVar{
singlekeys={
{reduced}{command=\widetilde},
- {cech}{command=\noexpand\check},
- {hyper{command=\noexpand\mathbb},
+ {cech}{command=\check},
+ {hyper{command=\mathbb},
},
}
\end{lstlisting}
\SetupClass\MyVar{
singlekeys={
{reduced}{command=\widetilde},
- {cech}{command=\noexpand\check},
- {hyper}{command=\noexpand\mathbb},
+ {cech}{command=\check},
+ {hyper}{command=\mathbb},
},
}
@@ -1380,21 +1378,21 @@ This can be done the following way:
valuekeys={
{Lder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{L}^{#1},
+ symbolputleft=\mathbb{L}^{#1},
},
{Rder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{R}^{#1},
+ symbolputleft=\mathbb{R}^{#1},
},
},
singlekeys={
{Lder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{L},
+ symbolputleft=\mathbb{L},
},
{Rder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{R},
+ symbolputleft=\mathbb{R},
},
},
}
@@ -1403,21 +1401,21 @@ This can be done the following way:
valuekeys={
{Lder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{L}^{#1},
+ symbolputleft=\mathbb{L}^{#1},
},
{Rder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{R}^{#1},
+ symbolputleft=\mathbb{R}^{#1},
},
},
singlekeys={
{Lder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{L},
+ symbolputleft=\mathbb{L},
},
{Rder} {
innerreturn,leftreturn,
- symbolputleft=\noexpand\mathbb{R},
+ symbolputleft=\mathbb{R},
},
},
}
@@ -1470,27 +1468,19 @@ In order to customize this, there are two extra keys:
These work exactly like \lstinline!singlekeys! and~\lstinline!valuekeys!.
\begin{lstlisting}
\SetupClass\MyVar{
+ argkeyval=true, % this turns keyval syntax in arguments on
argvaluekeys={
{coef}{ othersep={;}{#1} },
},
}
\end{lstlisting}
-(But it will not quite work yet -- stay tuned for a moment!)
The key \lstinline!othersep! is a key that controls the separator
between the current argument and the previous argument (it will only be printed if there was a previous argument). By default, this separator is a comma. So in the syntax~\lstinline!\co{*}{\vX,coef=\vR}!,
there are two arguments, \lstinline!\vX! and~\lstinline!\vR!, and the separator is a semicolon.
-However, even with the above setup, the notation \lstinline!\co{*}{\vX,coef=\vR}! will not work
-just yet. For the keys you define using \lstinline!argvaluekeys!
-are turned off by default. To turn them on for the object~\lstinline!\co!, run the following code:
-\begin{lstlisting}
-\SetupObject\co{
- valuekeys={
- {arg}{argwithkeyval={#1}},
- },
-}
-\end{lstlisting}
-The reason the keys are turned off by default is that keys in arguments that support values are only used in very rare cases, like cohomology with coefficients. If such keys were turned on in general, it would mess up
+As you see above, we had to turn keyval syntax on in order for it to work.
+By default, only singlekeys are turned on in the argument, not valuekeys.
+The reason is that valuekeys in arguments are only useful in very rare cases, like cohomology with coefficients. If such keys were turned on in general, it would mess up
every occurrence of an equality sign in arguments, and the following
would not work:
\begin{LTXexample}
@@ -1500,9 +1490,12 @@ $\Hom[\sheafreg[\vU]]{
}$
\end{LTXexample}
+The key~\lstinline!argkeyval! can take four arguments: \lstinline!true! (as above),
+\lstinline!false! (no singlekeys or valuekeys allowed), \lstinline!singlekeys! (the default behaviour where only singlekeys are turned on), and \lstinline!onesinglekey! (only allows one singlekey).
+
It should be noted that there are several predefined
-keys (of type \mbox{\lstinline!singlekey!)} which are defined on the level
-of the class \lstinline!\SemantexVariable!. The full list is:\fxfatal{Finish this}
+singlekeys which are defined on the level
+of the class \lstinline!\SemantexBaseObject!. The full list is:\fxfatal{Finish this}
\begin{itemize}
\item slot, \ldots
@@ -1677,6 +1670,9 @@ class types:
Let me add that \semantex uses a very clear separation between the input syntax and the underlying machinery. Because of this, if the user needs a different kind of class type, it is not very hard to create one. You must simply open the source code of \semantex, find the class you want to modify, and then copy the definition of the command~\lstinline!\New⟨Class type⟩Class! and modify it in whatever way you want.
+There is another class type, called the \lstinline!plain! class type, which is the class
+type of the class~\lstinline!\SemantexBaseObject!. This class is pretty useless as all it does is print its symbol, without allowing any keyval syntax, so don't use it.
+
\chapter{The \texorpdfstring{\texttt{Delimiter}}{Delimiter} class type}
\NewDelimiterClass\MyDelim[parent=\MyVar]
@@ -1824,7 +1820,7 @@ $\int \vf \wedgeD{\vx[1],
\chapter{The \texttt{parse} routine}
-As you can see above, \semantex has a ``waterfall-like'' behaviour. It runs keys in the order it receives them. This works fine most of the time, but for some more complicated constructions, it is useful to be able to provide a data set in any order and have them printed in a fixed order. For this purpose, we have the \lstinline!parse! routine.
+As you can see above, \semantex has a \enquote{waterfall-like} behaviour. It runs keys in the order it receives them. This works fine most of the time, but for some more complicated constructions, it is useful to be able to provide a data set in any order and have them printed in a fixed order. For this purpose, we have the \lstinline!parse! routine.
@@ -1834,98 +1830,130 @@ Suppose we want to be able to write the set of \( \vn \times \vm \)-matrices wit
\operatorname{Mat}}
$ \Mat[\vn\times\vm]{\vk} $.
\end{LTXexample}\endgroup%
-\noindent However, this is not quite as systematic and semantic as we might have wanted. Indeed, what if later you would like to change the notation to~\( \MyVar{\operatorname{Mat}}[\vn,\vm]{\vk} \)?
-Therefore, we do something like the following instead (we explain the notation below):
-\begin{lstlisting}
\NewObject\MyVar\Mat{\operatorname{Mat}}[
- execute={
- \SemantexDataProvide{rows}
- \SemantexDataProvide{columns}
- % provides data sets for number of rows and columns
- % for this object
- },
+ % We provide data sets "rows" and "columns" to
+ % be set up by the user later
+ dataprovide={rows},
+ dataprovide={columns},
valuekeys={
- {rows}{
- execute={
- \SemantexDataSet{rows}{#1}
+ {rows}{ dataset={rows}{#1} }, % set the rows data set
+ {columns}{ dataset={columns}{#1} }, % set the columns data set
+ },
+ parseoptions={ % Here we add code to the parse routine
+ % We check whether columns = rows. If so, we only write
+ % the number once
+ ifeqTF={\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
+ {
+ % We use a very weird key called "setkeysx" -- this
+ % fully executes the content of the keys before
+ % setting them
+ setkeysx={
+ lower={\SemantexDataGetExpNot{columns}},
},
- },
- {columns}{
- execute={
- \SemantexDataSet{columns}{#1}
+ }
+ {
+ setkeysx={
+ lower={
+ \SemantexDataGetExpNot{rows}
+ \times
+ \SemantexDataGetExpNot{columns}
+ },
},
},
},
- parseoptions={
- execute={
- \SemantexStrIfEqTF{\SemantexDataGetExpNot{columns}}
- {\SemantexDataGetExpNot{rows}}
- % tests if rows = columns
- {
- \SemantexKeysSetx{
- lower={
- \SemantexDataGetExpNot{columns}
- }
- }
- }
- {
- \SemantexKeysSetx{
- lower={
- \SemantexDataGetExpNot{rows}
- \times
- \SemantexDataGetExpNot{columns}
- }
- }
- }
- },
- },
-]
-\end{lstlisting}%
+]%
+\noindent However, this is not quite as systematic and semantic as we might have wanted. Indeed, what if later you would like to change the notation to~\( \MyVar{\operatorname{Mat}}[\vn,\vm]{\vk} \)? (In this case, you could use multi-value keys, though.)
+In this chapter, we show how to eanble a syntax like the following instead:
+\begin{LTXexample}
+$ \Mat[rows=\vn,columns=\vm]{\vk} $, $ \Mat[rows=\vn,columns=\vn]{\vk} $
+\end{LTXexample}
+
+The important ingredient here is the \lstinline!parse! routine. This routine is executed right before the function is being rendered, and you can add code to it via the
+key~\lstinline!parseoptions!. However, we need a bit more programming keys to make it work. Let us see it in action and explain the syntax below:
+\begin{lstlisting}
\NewObject\MyVar\Mat{\operatorname{Mat}}[
- execute={
- \SemantexDataProvide{rows}
- \SemantexDataProvide{columns}
- },
+ % We provide data sets "rows" and "columns" to
+ % be set up by the user later
+ dataprovide={rows},
+ dataprovide={columns},
valuekeys={
- {rows}{
- execute={
- \SemantexDataSet{rows}{#1}
+ {rows}{ dataset={rows}{#1} }, % set the rows data set
+ {columns}{ dataset={columns}{#1} }, % set the columns data set
+ },
+ parseoptions={ % Here we add code to the parse routine
+ % We check whether columns = rows. If so, we only write
+ % the number once
+ ifeqTF={\SemantexDataGetExpNot{columns}}
+ {\SemantexDataGetExpNot{rows}}
+ {
+ % We use a very weird key called "setkeysx" -- this
+ % fully executes the content of the keys before
+ % setting them
+ setkeysx={
+ lower={\SemantexDataGetExpNot{columns}},
},
- },
- {columns}{
- execute={
- \SemantexDataSet{columns}{#1}
+ }
+ {
+ setkeysx={
+ lower={
+ \SemantexDataGetExpNot{rows}
+ \times
+ \SemantexDataGetExpNot{columns}
+ },
},
},
},
- parseoptions={
- execute={
- \SemantexStrIfEqTF{\SemantexDataGetExpNot{columns}}{\SemantexDataGetExpNot{rows}}
- {
- \SemantexKeysSetx{
- lower={
- \SemantexDataGetExpNot{columns}
- }
- }
- }
- {
- \SemantexKeysSetx{
- lower={
- \SemantexDataGetExpNot{rows}
- \times
- \SemantexDataGetExpNot{columns}
- }
- }
- }
- },
- },
-]%
-Now we can do the following:
-\begin{LTXexample}
-$ \Mat[rows=\vn,columns=\vm]{\vk} $, $ \Mat[rows=\vn,columns=\vn]{\vk} $
-\end{LTXexample}
+]
+\end{lstlisting}
+
+Here we used a lot of programmking keys. Let us see the full list of them.
+(An important notice: For some of these keys, such as \lstinline!boolifTF!, you currently cannot use spaces in the \lstinline!⟨bool⟩! argument, so e.g. \lstinline!boolifTF{ mybool } { ... } { ... }! will not work; you have to write \lstinline!boolifTF{mybool}!. I am trying to solve this problem, but have not yet been able to do so.)
+
+\begin{lstlisting}
+dataprovide={⟨data⟩}, % provides data
+dataset={⟨data⟩}{⟨value⟩}, % sets data
+datasetx={⟨data⟩}{⟨value⟩}, % sets data after expanding it
+dataputright={⟨data⟩}{⟨value⟩}, % adds to the right of data
+dataputrightx={⟨data⟩}{⟨value⟩}, % adds to the right of data after expanding it
+dataputleft={⟨data⟩}{⟨value⟩}, % adds to the left of data
+dataputleftx={⟨data⟩}{⟨value⟩}, % adds to the left of data after expanding it
+dataclear={⟨data⟩,} % clears a piece of data
+setkeys={⟨keys⟩}, % sets the keys in question, which is rather useless since you could have just written those keys directly instead
+keysset={⟨keys⟩}, % equivalent to setkeys
+setkeysx={⟨keys⟩}, % executes the keys in question after expanding them
+keysset={⟨keys⟩}, % equivalent to setkeysx
+ifeqTF={⟨str1⟩}{⟨str2⟩}{⟨if true⟩}{⟨if false⟩}, % checks if strings are equal
+ifeqT={⟨str1⟩}{⟨str2⟩}{⟨if true⟩},
+ifeqF={⟨str1⟩}{⟨str2⟩}{⟨if false⟩},
+ifblankTF={⟨str⟩}{⟨if true⟩}{⟨if false⟩}, % checks if string is blank
+ifblankT={⟨str⟩}{⟨if true⟩},
+ifblankF={⟨str⟩}{⟨if false⟩},
+boolprovide={⟨bool⟩}, % provides a boolean
+boolsettrue={⟨bool⟩}, % sets the boolean to true
+boolsetfalse={⟨bool⟩}, % sets the boolean to false
+boolifTF={⟨bool⟩}{⟨if true⟩}{⟨if false⟩}, % checks if boolean is true
+boolifT={⟨bool⟩}{⟨if true⟩},
+boolifF={⟨bool⟩}{⟨if false⟩,
+intprovide={⟨int⟩}, % provides an integer
+intclear={⟨int⟩}, % sets the integer to 0
+intincr={⟨int⟩}, % adds 1 to the integer
+intset={⟨int⟩}{⟨value⟩}, % sts the integer
+intifgreaterthanTF={⟨num1⟩}{num2⟩}{⟨if true⟩}{⟨if false⟩}, % checks which number of greater
+intifgreaterthanT={⟨num1⟩}⟨{num2⟩}{⟨if true⟩},
+intifgreaterthanF={⟨num1⟩}{⟨num2⟩}{⟨if false⟩},
+intifequalTF={⟨num1⟩}{num2⟩}{⟨if true⟩}{⟨if false⟩}, % checks if the numbers are equal
+intifequalT={⟨num1⟩}⟨{num2⟩}{⟨if true⟩},
+intifequalF={⟨num1⟩}{⟨num2⟩}{⟨if false⟩},
+intiflessthanTF={⟨num1⟩}{num2⟩}{⟨if true⟩}{⟨if false⟩}, % checks which number of less
+intiflessthanT={⟨num1⟩}⟨{num2⟩}{⟨if true⟩},
+intiflessthanF={⟨num1⟩}{⟨num2⟩}{⟨if false⟩},
+ERRORkeyvaluenotfound={⟨key⟩}{⟨value⟩}, % throws an error saying that the key has been set to an unkonwn value
+ERROR={⟨error text⟩}, % throws a general error with the provided error test
+execute={⟨error text⟩}, % executes the code in question
+\end{lstlisting}
+
+When using these keys (including inside the key~\lstinline!execute!), you can use a number of commands that provide and manipulate data. Most of them are just command versions of the keys above, and for now, I leave it to the reader to guess what they do based on the above picture:
-The key~\lstinline!execute! is a key that basically just executes code. You can in principle write any \TeX\ code there, and it will be applied right at the spot. However, inside the \lstinline!execute!~key, you can also use the following locally defined commands. These can be used to handle the data that is associated with the object in question. I don't have time to document them right now, so you'll have to guess what they do from the name for now, or you can find their definition in the source code of the package.
\begin{lstlisting}
\SemantexDataProvide
\SemantexDataSet
@@ -1956,88 +1984,110 @@ The key~\lstinline!execute! is a key that basically just executes code. You can
\SemantexIntClear
\SemantexIntIncr
\SemantexIntSet
-\SemantexIntIfPositiveTF
-\SemantexIntIfPositiveT
-\SemantexIntIfPositiveF
-\SemantexIntIfGreaterThanOneTF
-\SemantexIntIfGreaterThanOneT
-\SemantexIntIfGreaterThanOneF
-\SemantexExpNot
+\SemantexIntIfGreaterThanTF
+\SemantexIntIfGreaterThanT
+\SemantexIntIfGreaterThanF
+\SemantexIntIfEqualTF
+\SemantexIntIfEqualT
+\SemantexIntIfEqualF
+\SemantexIntIfLessThanTF
+\SemantexIntIfLessThanT
+\SemantexIntIfLessThanF
+\SemantexExpNot##1
+\SemantexERRORKeyValueNotFound
+\SemantexERROR
\end{lstlisting}
-The key~\lstinline!parseoptions! is a key that is executed right before rendering the object. This is where you write whatever the system is supposed to \emph{do} with the data sets you provide. You can also force it to be applied at any point by using the \lstinline!parse!~key.
-
Let us look at a more complicated example: Let us create a command for partial derivatives:
\NewObject\MyVar\partialdif[
nopar,
- execute={
- \SemantexBoolProvide{raisedfunction}
- \SemantexBoolSetTrue{raisedfunction}
- },
+ boolprovide={raisefunction},
+ boolsettrue={raisefunction},
setidots=\cdots,
setisep=\,,
valuekeys={
{default}{
si={\partial #1},
},
- },
- singlekeys={
- {raisedfunction}{
- execute={
- \SemantexBoolSetTrue{raisedfunction}
- },
- },
- {noraisedfunction}{
- execute={
- \SemantexBoolSetFalse{raisedfunction}
+ {raise}{
+ ifeqTF={#1}{true}
+ {
+ boolsettrue={raisefunction},
+ }
+ {
+ ifeqTF={#1}{false}
+ {
+ boolsetfalse={raisefunction},
+ }
+ {
+ ERRORkeyvaluenotfound={raise}{#1},
+ },
},
},
},
parseoptions={
- execute={
- \SemantexIfBlankTF{ \SemantexDataGet{upper} }
+ ifblankTF={ \SemantexDataGet{upper} }
+ {
+ intifgreaterthanTF={ \SemantexIntGet{numberoflowerindices} } { 1 }
{
- \SemantexKeysSetx{
+ setkeysx={
symbol={
\frac
{
\partial ^ { \SemantexIntGet{numberoflowerindices} }
- \SemantexBoolIfT{raisedfunction}
+ \SemantexBoolIfT{raisefunction}
{
- \SemantexDataGetExpNot{arg}
+ \SemantexDataGet{arg}
}
}
{
- \SemantexDataGetExpNot{lower}
+ \SemantexDataGet{lower}
}
},
- }
+ },
}
{
- \SemantexKeysSetx{
+ setkeysx={
symbol={
\frac
{
- \partial ^ { \SemantexDataGet{upper} }
- \SemantexBoolIfT{raisedfunction}
+ \partial
+ \SemantexBoolIfT{raisefunction}
{
- \SemantexDataGetExpNot{arg}
+ \SemantexDataGet{arg}
}
}
{
- \SemantexDataGetExpNot{lower}
+ \SemantexDataGet{lower}
}
},
}
- }
- \SemantexDataClear{lower}
- \SemantexDataClear{upper}
- \SemantexBoolIfT{raisedfunction}
- {
- \SemantexDataClear{arg}
- \SemantexIntClear{numberofarguments}
- }
+ },
+ }
+ {
+ setkeysx={
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexDataGet{upper} }
+ \SemantexBoolIfT{raisefunction}
+ {
+ \SemantexDataGet{arg}
+ }
+ }
+ {
+ \SemantexDataGet{lower}
+ }
+ },
+ },
+ },
+ dataclear={lower},
+ dataclear={upper},
+ boolifT={raisefunction}
+ {
+ dataclear={arg},
+ dataclear={numberofarguments},
},
},
]
@@ -2045,73 +2095,92 @@ Let us look at a more complicated example: Let us create a command for partial d
\begin{lstlisting}
\NewObject\MyVar\partialdif[
nopar,
- execute={
- \SemantexBoolProvide{raisedfunction}
- \SemantexBoolSetTrue{raisedfunction}
- },
+ boolprovide={raisefunction},
+ boolsettrue={raisefunction},
setidots=\cdots,
setisep=\,,
valuekeys={
{default}{
si={\partial #1},
},
- },
- singlekeys={
- {raisedfunction}{
- execute={
- \SemantexBoolSetTrue{raisedfunction}
- },
- },
- {noraisedfunction}{
- execute={
- \SemantexBoolSetFalse{raisedfunction}
+ {raise}{
+ ifeqTF={#1}{true}
+ {
+ boolsettrue={raisefunction},
+ }
+ {
+ ifeqTF={#1}{false}
+ {
+ boolsetfalse={raisefunction},
+ }
+ {
+ ERRORkeyvaluenotfound={raise}{#1},
+ },
},
},
},
parseoptions={
- execute={
- \SemantexIfBlankTF{ \SemantexDataGet{upper} }
+ ifblankTF={ \SemantexDataGet{upper} }
+ {
+ intifgreaterthanTF={ \SemantexIntGet{numberoflowerindices} } { 1 }
{
- \SemantexKeysSetx{
+ setkeysx={
symbol={
\frac
{
\partial ^ { \SemantexIntGet{numberoflowerindices} }
- \SemantexBoolIfT{raisedfunction}
+ \SemantexBoolIfT{raisefunction}
{
- \SemantexDataGetExpNot{arg}
+ \SemantexDataGet{arg}
}
}
{
- \SemantexDataGetExpNot{lower}
+ \SemantexDataGet{lower}
}
},
- }
+ },
}
{
- \SemantexKeysSetx{
+ setkeysx={
symbol={
\frac
{
- \partial ^ { \SemantexDataGet{upper} }
- \SemantexBoolIfT{raisedfunction}
+ \partial
+ \SemantexBoolIfT{raisefunction}
{
- \SemantexDataGetExpNot{arg}
+ \SemantexDataGet{arg}
}
}
{
- \SemantexDataGetExpNot{lower}
+ \SemantexDataGet{lower}
}
},
}
- }
- \SemantexDataClear{lower}
- \SemantexDataClear{upper}
- \SemantexBoolIfT{raisedfunction}
- {
- \SemantexDataClear{arg}
- \SemantexIntClear{numberofarguments}
- }
+ },
+ }
+ {
+ setkeysx={
+ symbol={
+ \frac
+ {
+ \partial ^ { \SemantexDataGet{upper} }
+ \SemantexBoolIfT{raisefunction}
+ {
+ \SemantexDataGet{arg}
+ }
+ }
+ {
+ \SemantexDataGet{lower}
+ }
+ },
+ },
+ },
+ dataclear={lower},
+ dataclear={upper},
+ boolifT={raisefunction}
+ {
+ dataclear={arg},
+ dataclear={numberofarguments},
},
},
]
@@ -2128,13 +2197,13 @@ Let us see it in action:
d=\vn]{ \vf }
\]
\[
- \partialdif[\vx,\vy,\vz,noraisedfunction]{ \vf } ,
+ \partialdif[\vx,\vy,\vz,raise=false]{ \vf } ,
\partialdif[\vu^2,\vv^2,
- d=4,noraisedfunction]{
+ d=4,raise=false]{
\vf },
\partialdif[\vx[1],
\vx[2],...,\vx[\vn],
- d=\vn,noraisedfunction]{
+ d=\vn,raise=false]{
\vf }
\]
\end{LTXexample}
@@ -2151,7 +2220,10 @@ As you see, we use the \lstinline!d!~key to tell the command what superscript it
\chapter{Bugs}
-Lots of things can be improved in the system, including the order in which things are being expanded internally. I am not going to explain this is detail for now, but hope to correct this in the future. For now, the system seems to work fine as long as you do \enquote{normal} things and insert~\lstinline!\noexpand!'s whenever something goes wrong. The only real bug that I currently know of occurs if you use the key~\lstinline!Otherspar! in a heading. Then it all dies painfully.
+The biggest unsolved problem I know of is how to correctly strip spaces in programming keys such as \lstinline!boolifTF!. Similarly, I would also like to allow keys to be defined using the
+syntax~\lstinline!{ inv } { upper=-1 }! rather than~\lstinline!{inv}{ upper=-1 }!. This will hopefully be solved soon.
+
+For now, the system seems to work fine as long as you do \enquote{normal} things. The only real bug that I currently know of occurs if you use the key~\lstinline!Otherspar! in a heading. Then it all dies painfully.
Then again, why the heck would you do that in the first place? Who scales parentheses in headings?
%\input{testground}
diff --git a/support/pkfix-helper/encoding-samples.pdf b/support/pkfix-helper/encoding-samples.pdf
index 36155d9aca..c288b562bd 100644
--- a/support/pkfix-helper/encoding-samples.pdf
+++ b/support/pkfix-helper/encoding-samples.pdf
Binary files differ
diff --git a/support/pkfix-helper/pkfix-helper b/support/pkfix-helper/pkfix-helper
index 6e70c44f25..73955ff8f0 100755
--- a/support/pkfix-helper/pkfix-helper
+++ b/support/pkfix-helper/pkfix-helper
@@ -17,14 +17,14 @@ use strict;
# Define some global variables.
my $progname = basename $0; # Name of this program
-our $VERSION = "1.5"; # Version number of this program
+our $VERSION = "1.6"; # Version number of this program
my %name2chars; # Map from a font name to a character list
my $GS = $ENV{"GS"} || "gs"; # Name of the Ghostscript interpreter
my $TFTOPL = $ENV{"TFTOPL"} || "tftopl"; # Name of the TFM to PL converter
my $dpi = 300; # Number of dots per inch used to generate bitmapped characters
my @tfmlist; # List of TFM files to use
my %fontmatch; # Map from a font name to its best match
-my $xinc = 36; # Width of font name in PostScript points
+my $xinc = 48; # Width of font name in PostScript points
my $yinc = 24; # Height of font in PostScript points
my $init_yinc = 36; # Space after title
my %tfmfontwidth; # Map from font name to character number to character width
@@ -46,6 +46,7 @@ my $sample_file_tex; # Name of a TeX file of font samples to write
my $single_font_use = 0; # 1=one use per font; 0=allow repetitions
my $samples_per_page = 25; # Number of font samples to print per page
my $tfm_cache_file; # Name of a file in which to cache font metrics
+my $no_match = 10**9; # Sentinel indicating no match was found
###########################################################################
@@ -206,7 +207,7 @@ sub compare_maps ($$;$)
# Compute the per-character squared difference.
while (my ($char, $docwidth) = each %docmap) {
my $tfmwidth = $tfmmap{$char};
- return 10**9 if !defined $tfmwidth; # Match is impossible.
+ return $no_match if !defined $tfmwidth; # Match is impossible.
push @sqdiffs, ($docwidth - $tfmwidth*$scale) ** 2;
}
@@ -360,9 +361,48 @@ sub join_string_list (@)
return join(", ", @items[0..$#items-1]) . ", and $items[$#items]";
}
+# Determine a PostScript file's page size. Return it as a pair of TeX
+# points, a description of a standard paper size, and its source in
+# the document.
+sub page_size ($)
+{
+ my $ps = $_[0]; # Entire PostScript file
+ my $bp2pt = 72.27/72; # Conversion factor from bp to pt
+ my @psize = (597.508, 845.047, "A4", "a fallback mechanism"); # Default to A4 paper
+
+ # Look for a bounding box. This should work in most cases.
+ if ($ps =~ /^\%\%BoundingBox: (\d+) (\d+) (\d+) (\d+)$/m) {
+ $psize[0] = ($3 - $1)*$bp2pt;
+ $psize[1] = ($4 - $2)*$bp2pt;
+ $psize[3] = "the PostScript bounding box";
+ }
+ # dvips-produced PostScript files that lack a bounding box may
+ # specify a page size when entering the TeXDict dictionary.
+ elsif ($ps =~ /\bTeXDict\s+begin\s+(\d+)\s+(\d+)\s+\d+\s+\d+\s+\d+/ms) {
+ $psize[0] = $1/65536.0;
+ $psize[1] = $2/65536.0;
+ $psize[3] = "the TeX dictionary";
+ }
+
+ # Look for standard paper sizes.
+ my $wd = int($psize[0] + 0.5);
+ my $ht = int($psize[1] + 0.5);
+ if ($wd == 598 && $ht == 845) {
+ $psize[2] = "A4";
+ }
+ elsif ($wd == 614 && $ht == 795) {
+ $psize[2] = "US Letter";
+ }
+ else {
+ $psize[2] = "unrecognized paper size";
+ }
+ return @psize;
+}
+
###########################################################################
# Parse the command line.
+my @cmdline = @ARGV;
Getopt::Long::Configure ("bundling");
GetOptions ("h|help" => \$wanthelp,
"v|verbose+" => \$verbose,
@@ -390,6 +430,7 @@ if ($wanthelp) {
my $infilename = $#ARGV>=0 ? $ARGV[0] : "-";
my $outfilename = $#ARGV>=1 ? $ARGV[1] : "-";
die "${progname}: Samples per page must be at least 1 ($samples_per_page was specified)\n" if $samples_per_page < 1;
+print STDERR "Command line: $0 @cmdline\n" if $verbose >= 2;
# Convert any user-specified TFMs to the appropriate internal format.
foreach my $tfm (@extra_tfms) {
@@ -398,6 +439,7 @@ foreach my $tfm (@extra_tfms) {
}
# Parse the list of forced font mappings.
+my %is_forced;
foreach my $mapstr (@forced_fonts) {
$mapstr =~ /^(\w+)\s*=\s*(.*)$/ || die "${progname}: Unable to parse font specification \"$mapstr\"\n";
my $parsed_font_spec = parse_font_spec $2;
@@ -409,6 +451,7 @@ foreach my $mapstr (@forced_fonts) {
# Define a new font match,
$fontmatch{$1} = $parsed_font_spec;
}
+ $is_forced{$1} = 1;
}
# Construct a list of (possibly nonexistent) TFM files to try. These
@@ -471,6 +514,22 @@ my $entirefile;
}
print STDERR "done.\n" if $verbose;
+# Warn if the file doesn't look like it was produced by dvips.
+if ($entirefile !~ /dvips/i) {
+ warn "${progname}: $infilename does not appear to have been produced by dvips; font conversion is unlikely to succeed\n";
+ warn "${progname}: $infilename does not even appear to be a PostScript file\n" if substr($entirefile, 0, 2) ne '%!';
+}
+
+# Compute the byte offset of each DVIPSBeginSection before we modify the input
+# file.
+my @begin_offsets;
+my $idx = 0;
+while (1) {
+ $idx = index($entirefile, '%DVIPSBeginSection', $idx);
+ last if $idx == -1;
+ push @begin_offsets, ++$idx;
+}
+
# Preprocess the input file to make it easier to parse.
print STDERR "Preprocessing ... " if $verbose >= 2;
$entirefile =~ s/[\n\r]+/\n/g; # Normalize line endings to Unix-style.
@@ -489,6 +548,15 @@ else {
warn "${progname}: Could not determine the target printer resolution; assuming $dpi DPI\n";
}
+# Determine the page size.
+my @psize = page_size $entirefile;
+if ($verbose >= 2) {
+ printf STDERR "Determined the page size to be %.0fpt by %.0fpt (%s) via %s.\n", $psize[0], $psize[1], $psize[2], $psize[3];
+}
+elsif ($verbose >= 1) {
+ printf STDERR "Determined the page size to be %.3fpt by %.3fpt (%s).\n", $psize[0], $psize[1], $psize[2];
+}
+
# Rename the fonts in each subdocument (figure).
my @fig_font_renames; # List of {old text, new text, TeX dictionary} triplets
my $fignum = 1;
@@ -542,7 +610,9 @@ if ($#sections > 0) {
printf STDERR "Renaming the fonts in %d dvips sections:\n", 1+$#sections if $verbose >= 2;
my $numrenamed = 0;
foreach my $secnum (0 .. $#sections) {
- printf STDERR " Section %d\n", 1+$secnum if $verbose >= 2;
+ if ($verbose >= 2) {
+ printf STDERR " Section %d, beginning at file position %d\n", 1+$secnum, $begin_offsets[$secnum];
+ }
my $oldsection = $sections[$secnum];
my $newsection = $oldsection;
while ($oldsection =~ m|/([^()<>\[\]{}\/\%]+)\s+\d+\s+\d+\s+df(.*?>[^<>]*?[DI])\s+E|gs) {
@@ -679,8 +749,14 @@ end
SHOWFONTNAME
;#'
if ($output_width_ps !~ s/\%\%BeginProcSet: tex\w*\.pro.*?\%\%EndProcSet/$&\n$showfontnamecode/s) {
- print STDERR "No tex.pro ProcSet was found. We have to guess where to inject PostScript code.\n" if $verbose >= 3;
- die "${progname}: Unable to inject prologue code\n" if $output_width_ps !~ s/TeXDict begin\s+\d+\s+\d+\s+bop/\n$showfontnamecode\n$&/s;
+ print STDERR "No tex.pro ProcSet was found. Looking for a suitable TeXDict begin.\n" if $verbose >= 3;
+ if ($output_width_ps =~ s/TeXDict begin\s+\d+\s+\d+\s+bop/\n$showfontnamecode\n$&/s) {
+ print STDERR "Found a suitable TeXDict begin!\n" if $verbose >= 3;
+ }
+ else {
+ print STDERR "Failed to find a suitable TeXDict begin.\n" if $verbose >= 3;
+ die "${progname}: Unable to inject prologue code\n";
+ }
}
# Define some code to display the width of every valid character in
@@ -711,8 +787,13 @@ ENDDISPLAYCODE
# Replace the bulk of the PostScript file with the display code.
if ($output_width_ps !~ s/(?:\%\%Page|\%DVIPSSectionPage):.*(\%\%Trailer|\%DVIPSSectionTrailer)/$displaycode$1/s) {
- print STDERR 'No %%Page and/or %%Trailer comments were found. We have to guess where to inject PostScript code.', "\n" if $verbose >= 3;
- die "${progname}: Unable to inject display code\n" if $output_width_ps !~ s/TeXDict begin\s+\d+\s+\d+\s+bop.*eop\s+end/\n$displaycode\n/s;
+ print STDERR 'No %%Page and/or %%Trailer comments were found. Looking for a suitable TeXDict begin.', "\n" if $verbose >= 3;
+ if ($output_width_ps =~ s/TeXDict begin\s+\d+\s+\d+\s+bop.*eop\s+end/\n$displaycode\n/s) {
+ print STDERR "Found a suitable TeXDict begin!\n" if $verbose >= 3;
+ } else {
+ print STDERR "Failed to find a suitable TeXDict begin.\n" if $verbose >= 3;
+ die "${progname}: Unable to inject display code\n";
+ }
}
# Output the modified PostScript code to a temporary file, run
@@ -828,7 +909,6 @@ write_tfm_cache_file() if defined $tfm_cache_file;
print STDERR "Matching fonts:\n" if $verbose;
my %already_used_tfms; # Set of TFM files already assigned to a document font, empty unless --no-repeats was specified
foreach my $fontname (@sortedfontnames) {
- my $no_match = 10**9; # Sentinel indicating no match was found
my @besttfms; # Best matching TFM file(s), sizes, and scales
my $bestmatch = $no_match; # Best matching value
my @besttfms_rep; # Best matching but repeated TFM file(s), sizes, and scales
@@ -899,7 +979,14 @@ foreach my $fontname (@sortedfontnames) {
push @besttfms, $tfminfo;
}
}
- printf STDERR "done (mismatch=%.5f).\n", $match if $verbose >= 2;
+ if ($verbose >= 2) {
+ if ($match == $no_match) {
+ print STDERR "done (disjoint character sets).\n";
+ }
+ else {
+ printf STDERR "done (mismatch=%.5f).\n", $match;
+ }
+ }
}
# Select the first of the best matches.
@@ -911,16 +998,21 @@ foreach my $fontname (@sortedfontnames) {
# Report how good or bad the match is and what other close matches the user
# might consider instead.
if ($verbose >= 2) {
- if ($#besttfms == 0 || $bestmatch == $no_match) {
- # There was either a single winner or no match was found.
- printf STDERR " Best match for %s is %s \@ %.5gX with mismatch=%.5f.\n",
- $fontname, $besttfm, $bestscale, $bestmatch;
+ my $forced_str = defined $is_forced{$fontname} ? ", forced by user," : "";
+ if ($bestmatch == $no_match) {
+ # No match was found.
+ printf STDERR " No match was found for %s%s.\n", $fontname, $forced_str;
+ }
+ elsif ($#besttfms == 0) {
+ # There was a single winner.
+ printf STDERR " Best match for %s%s is %s \@ %.5gX with mismatch=%.5f.\n",
+ $fontname, $forced_str, $besttfm, $bestscale, $bestmatch;
}
else {
# There was a tie for first place.
my $preposition = $#besttfms == 1 ? "between" : "among";
- printf STDERR " Best match for %s is %s \@ %.5gX (tied %s %s) with mismatch=%.5f.\n",
- $fontname, $besttfm, $bestscale, $preposition,
+ printf STDERR " Best match for %s%s is %s \@ %.5gX (tied %s %s) with mismatch=%.5f.\n",
+ $fontname, $forced_str, $besttfm, $bestscale, $preposition,
join_string_list(map {sprintf "%s \@ %.5gX", $_->{"tfm"}, $_->{"scale"}} @besttfms),
$bestmatch;
}
@@ -935,7 +1027,13 @@ foreach my $fontname (@sortedfontnames) {
}
}
elsif ($verbose == 1) {
- printf STDERR "done (%s \@ %.5gX with mismatch=%.5f", $besttfm, $bestscale, $bestmatch;
+ if ($bestmatch == $no_match) {
+ print STDERR "done (no match found";
+ }
+ else {
+ printf STDERR "done (%s \@ %.5gX with mismatch=%.5f", $besttfm, $bestscale, $bestmatch;
+ }
+ print STDERR ", forced by user" if defined $is_forced{$fontname};
if ($#besttfms > 0 && $bestmatch != $no_match) {
# There was a tie for first place.
printf STDERR ", tied with %s",
@@ -1033,12 +1131,12 @@ TeXDict begin
font-name-string show (:) show
grestore
gsave
- 42 0 rmoveto
+ $xinc 0 rmoveto
font-name cvx exec
currentfont bitmap-font-transform makefont setfont
sample-string show
grestore
- 0 -24 rmoveto
+ 0 -$yinc rmoveto
} def
\% Define a transformation matrix for dvips bitmapped fonts. We _could_
@@ -1053,8 +1151,14 @@ end
SHOWFONTNAME
;
if ($sample_ps !~ s/\%\%BeginProcSet: tex\w*\.pro.*?\%\%EndProcSet/$&\n$showfontnamecode/s) {
- print STDERR "No tex.pro ProcSet was found. We have to guess where to inject PostScript code.\n" if $verbose >= 3;
- die "${progname}: Unable to inject prologue code\n" if $sample_ps !~ s/TeXDict begin\s+\d+\s+\d+\s+bop/\n$showfontnamecode\n$&/s;
+ print STDERR "No tex.pro ProcSet was found. Looking for a suitable TeXDict begin.\n" if $verbose >= 3;
+ if ($sample_ps =~ s/TeXDict begin\s+\d+\s+\d+\s+bop/\n$showfontnamecode\n$&/s) {
+ print STDERR "Found a suitable TeXDict begin!\n" if $verbose >= 3;
+ }
+ else {
+ print STDERR "Failed to find a suitable TeXDict begin.\n" if $verbose >= 3;
+ die "${progname}: Unable to inject prologue code\n";
+ }
}
# Generate code to output a sample of each font in turn.
@@ -1066,10 +1170,12 @@ TeXDict begin
\% Display a page title.
0 0 moveto
initmatrix
+0 -9.962 rmoveto
gsave
/Helvetica 18 selectfont
(Fonts used by $infilename_ps) show
grestore
+0 -18 rmoveto
0 -$init_yinc rmoveto
\% Display samples of each document font in decreasing order of the number
@@ -1093,14 +1199,21 @@ TeXDict begin
$pageno @{[$pageno-1]} bop
0 0 moveto
initmatrix
+0 -9.962 rmoveto
PAGETRANSITION
;
}
}
$displaycode .= "eop\nend\n";
- if ($sample_ps !~ s/\%\%Page:.*(\%\%Trailer)/$displaycode$1/s) {
- print STDERR 'No %%Page and/or %%Trailer comments were found. We have to guess where to inject PostScript code.', "\n" if $verbose >= 3;
- die "${progname}: Unable to inject display code\n" if $sample_ps !~ s/TeXDict begin\s+\d+\s+\d+\s+bop.*eop\s+end/\n$displaycode\n/s;
+ if ($sample_ps !~ s/(?:\%\%Page|\%DVIPSSectionPage):.*(\%\%Trailer|\%DVIPSSectionTrailer)/$displaycode$1/s) {
+ print STDERR 'No %%Page and/or %%Trailer comments were found. Looking for a suitable TeXDict begin.', "\n" if $verbose >= 3;
+ if ($sample_ps =~ s/TeXDict begin\s+\d+\s+\d+\s+bop.*eop\s+end/\n$displaycode\n/s) {
+ print STDERR "Found a suitable TeXDict begin!\n" if $verbose >= 3;
+ }
+ else {
+ print STDERR "Failed to find a suitable TeXDict begin.\n" if $verbose >= 3;
+ die "${progname}: Unable to inject display code\n";
+ }
}
# Write the PostScript file.
@@ -1130,8 +1243,35 @@ latex.
TEX_HEADER
;
write SAMPLE_TEX;
- print SAMPLE_TEX <<'TEX_BOILERPLATE';
+ my $set_tex_paper_size = <<'SET_TEX_PAPER_SIZE';
+
+% Set the paper size to match that of the original PostScript file.
+% There is no standard mechanism for doing so we include a case for
+% each of the major TeX engines.
+\def\ifIhave#1#2#3{\expandafter\ifx\csname #1\endcsname\relax#3\else#2\fi}
+\ifIhave{pagewidth}{%
+ % LuaTeX
+ \pagewidth=<WIDTH>%
+ \pageheight=<HEIGHT>%
+}{%
+ \ifIhave{pdfpagewidth}{%
+ % pdfTeX and XeTeX
+ \pdfpagewidth=<WIDTH>%
+ \pdfpageheight=<HEIGHT>%
+ }{%
+ % TeX + dvips
+ \special{papersize=<WIDTH>,<HEIGHT>}%
+ }%
+}
+
+SET_TEX_PAPER_SIZE
+ ;
+ $set_tex_paper_size =~ s/<WIDTH>/$psize[0]pt/g;
+ $set_tex_paper_size =~ s/<HEIGHT>/$psize[1]pt/g;
+ print SAMPLE_TEX $set_tex_paper_size;
+
+ print SAMPLE_TEX <<'TEX_BOILERPLATE';
% Make printable all special characters between
% \makeprintable...\endmakeprintable except for "\", "{", and "}".
\def\makeprintable{%
@@ -1163,20 +1303,22 @@ TEX_HEADER
\endgroup
}
-% We use Times Bold at 12 point for font names.
+% We use Times Bold at 12 point for font names and Times Roman at 8 point
+% for tagging fonts controlled explicitly by the user.
\font\timesbXII=ptmb at 12bp
+\font\timesVIII=ptmr at 8bp
% Don't add extra space to paragraphs.
\parindent=0pt
\parskip=0pt
% Output the document's title.
-\font\somefont=phvr at 18bp
+\font\somefont=phvr at 18bp\somefont
TEX_BOILERPLATE
;
# Output the document's title.
my $infilename_tex = texify split "", $infilename;
- print SAMPLE_TEX '\put(0, 0){\somefont New fonts to use for ', "$infilename_tex}\n";
+ print SAMPLE_TEX '\put(0, 0){New fonts to use for ', "$infilename_tex}\n";
# Output samples of each font in turn.
print SAMPLE_TEX "\n\% Output font samples.\n";
@@ -1185,20 +1327,27 @@ TEX_BOILERPLATE
# Output a single font sample.
my $fontname = $sortedfontnames[$fontnum];
my $samplestring = texify @{$name2chars{$fontname}};
- my $yoffset = ($fontnum-$firstfontnum)*$yinc + $init_yinc;
- printf SAMPLE_TEX "\\put(0, %d){\\timesbXII %s:}%%\n", $yoffset, $fontname;
- next if !defined $fontmatch{$fontname};
- my $tfm = $fontmatch{$fontname}->{"tfm"};
- my $scale = $fontmatch{$fontname}->{"scale"};
- my $size = $tfm2size{$tfm};
- printf SAMPLE_TEX "\\font\\somefont=%s%s\\somefont\n",
- $tfm, $scale==1.0 ? "" : sprintf(" at %.5gpt", $scale*$size);
- printf SAMPLE_TEX "\\put(%d, %d){%s}%%\n", $xinc, $yoffset, $samplestring;
-
- if ($fontnum % $samples_per_page == $samples_per_page-1) {
+ my $yoffset = ($fontnum-$firstfontnum)*$yinc;
+ $yoffset += $init_yinc if $firstfontnum == 0;
+ if (defined $retained_t3s{$fontname}) {
+ printf SAMPLE_TEX "\\timesVIII\\put(-15, %d){(k)}%%\n", $yoffset-1;
+ }
+ elsif (defined $is_forced{$fontname}) {
+ printf SAMPLE_TEX "\\timesVIII\\put(-15, %d){(f)}%%\n", $yoffset-1;
+ }
+ printf SAMPLE_TEX "\\timesbXII\\put(0, %d){%s:}%%\n", $yoffset, $fontname;
+ if (defined $fontmatch{$fontname}) {
+ my $tfm = $fontmatch{$fontname}->{"tfm"};
+ my $scale = $fontmatch{$fontname}->{"scale"};
+ my $size = $tfm2size{$tfm};
+ printf SAMPLE_TEX "\\font\\somefont=%s%s\\somefont\n",
+ $tfm, $scale==1.0 ? "" : sprintf(" at %.5gpt", $scale*$size);
+ printf SAMPLE_TEX "\\put(%d, %d){%s}%%\n", $xinc, $yoffset, $samplestring;
+ }
+ if ($fontnum%$samples_per_page == $samples_per_page - 1) {
# Insert a page break after every $samples_per_page font samples.
print SAMPLE_TEX "\\vskip 0pt plus 1fill\\eject\n";
- $firstfontnum = $fontnum;
+ $firstfontnum = $fontnum + 1;
}
}
@@ -1447,6 +1596,14 @@ in font I<name>. The user should use the B<--force> option to inform
B<pkfix-helper> which font to use or the B<--keep> option to retain
the original, bitmapped font.
+=item C<Processing I<name> ... done (I<font> with mismatch=I<number>, tied with I<font>...)>
+
+The best match for I<name> is font I<font>. A perfect match has a
+I<number> of 0.00000. Worse matches observe larger values. If a tie
+is reported, this means one or more fonts matched I<name> equally well
+(i.e., they see the same I<number>). In this case, B<pkfix-helper>
+selects the qualitatively most likely font as the winner.
+
=back
@@ -1631,6 +1788,17 @@ Files produced using the B<--tex> option are Plain TeX files and
therefore must be compiled with B<tex> (or a variant such as
B<pdftex>, B<luatex>, B<xetex>, etc.), I<not> with B<latex>.
+B<dvips>-produced PostScript files can be structured in sections,
+demarcated by C<%DVIPSBeginSection> and C<%DVIPSEndSection>. Font
+names are local to a section. Hence, a font named C<Fa> may map to
+C<cmex10> in one section and to C<cmmi7> in another. B<pkfix-helper>
+assigns every font in a multi-section document a unique name by
+appending a section-number suffix: C<Fa_S01>, C<Fa_S02>, etc.
+
+Font names are processed in decreasing order of the number of
+characters they have represented in the document. That is, if the
+document includes 10 characters from C<Fa> and 23 characters from
+C<Fb>, B<pkfix-helper> will process C<Fb> before C<Fa>.
=head1 SEE ALSO
diff --git a/support/pkfix-helper/pkfix-helper.1 b/support/pkfix-helper/pkfix-helper.1
index 648be2b5b3..468c03024a 100644
--- a/support/pkfix-helper/pkfix-helper.1
+++ b/support/pkfix-helper/pkfix-helper.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35)
+.\" Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -133,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "PKFIX-HELPER 1"
-.TH PKFIX-HELPER 1 "2020-04-19" "v1.5" " "
+.TH PKFIX-HELPER 1 "2020-07-21" "v1.6" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -339,6 +339,14 @@ None of the fonts considered for a match include all of the characters
in font \fIname\fR. The user should use the \fB\-\-force\fR option to inform
\&\fBpkfix-helper\fR which font to use or the \fB\-\-keep\fR option to retain
the original, bitmapped font.
+.ie n .IP """Processing \fIname\fP ... done (\fIfont\fP with mismatch=\fInumber\fP, tied with \fIfont\fP...)""" 4
+.el .IP "\f(CWProcessing \f(CIname\f(CW ... done (\f(CIfont\f(CW with mismatch=\f(CInumber\f(CW, tied with \f(CIfont\f(CW...)\fR" 4
+.IX Item "Processing name ... done (font with mismatch=number, tied with font...)"
+The best match for \fIname\fR is font \fIfont\fR. A perfect match has a
+\&\fInumber\fR of 0.00000. Worse matches observe larger values. If a tie
+is reported, this means one or more fonts matched \fIname\fR equally well
+(i.e., they see the same \fInumber\fR). In this case, \fBpkfix-helper\fR
+selects the qualitatively most likely font as the winner.
.SH "EXAMPLES"
.IX Header "EXAMPLES"
For the purpose of the following examples, assume that \fIoldfile.ps\fR
@@ -517,6 +525,18 @@ below), who may be able to enhance \fBpkfix-helper\fR to handle them.
Files produced using the \fB\-\-tex\fR option are Plain TeX files and
therefore must be compiled with \fBtex\fR (or a variant such as
\&\fBpdftex\fR, \fBluatex\fR, \fBxetex\fR, etc.), \fInot\fR with \fBlatex\fR.
+.PP
+\&\fBdvips\fR\-produced PostScript files can be structured in sections,
+demarcated by \f(CW%DVIPSBeginSection\fR and \f(CW%DVIPSEndSection\fR. Font
+names are local to a section. Hence, a font named \f(CW\*(C`Fa\*(C'\fR may map to
+\&\f(CW\*(C`cmex10\*(C'\fR in one section and to \f(CW\*(C`cmmi7\*(C'\fR in another. \fBpkfix-helper\fR
+assigns every font in a multi-section document a unique name by
+appending a section-number suffix: \f(CW\*(C`Fa_S01\*(C'\fR, \f(CW\*(C`Fa_S02\*(C'\fR, etc.
+.PP
+Font names are processed in decreasing order of the number of
+characters they have represented in the document. That is, if the
+document includes 10 characters from \f(CW\*(C`Fa\*(C'\fR and 23 characters from
+\&\f(CW\*(C`Fb\*(C'\fR, \fBpkfix-helper\fR will process \f(CW\*(C`Fb\*(C'\fR before \f(CW\*(C`Fa\*(C'\fR.
.SH "SEE ALSO"
.IX Header "SEE ALSO"
\&\fBpkfix\fR\|(1), \fBdvips\fR\|(1), \fBtex\fR\|(1), \fBgs\fR\|(1)
diff --git a/support/pkfix-helper/pkfix-helper.pdf b/support/pkfix-helper/pkfix-helper.pdf
index 8c184410ee..6b301f7ed0 100644
--- a/support/pkfix-helper/pkfix-helper.pdf
+++ b/support/pkfix-helper/pkfix-helper.pdf
Binary files differ
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index a16a29fb70..98509e705e 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -77,6 +77,7 @@ $mirrors = {
'https://mirrors.dotsrc.org/ctan/' => 1,
},
'Finland' => {
+ 'https://ftp.funet.fi/pub/TeX/CTAN/' => 1,
'https://www.texlive.info/CTAN/' => 1,
},
'France' => {
@@ -96,6 +97,7 @@ $mirrors = {
'http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/ctan/' => 1,
'https://ctan.kako-dev.de/' => 1,
'https://ctan.mc1.root.project-creative.net/' => 1,
+ 'https://ctan.mirror.norbert-ruehl.de/' => 1,
'https://ctan.net/' => 1,
'https://ctan.space-pro.be/tex-archive/' => 1,
'https://ftp.agdsn.de/pub/mirrors/latex/dante/' => 1,
@@ -111,6 +113,9 @@ $mirrors = {
'http://ftp.ntua.gr/mirror/ctan/' => 1,
'https://ftp.cc.uoc.gr/mirrors/CTAN/' => 1,
},
+ 'Hungary' => {
+ 'https://mirror.szerverem.hu/ctan/' => 1,
+ },
'Italy' => {
'https://ctan.mirror.garr.it/mirrors/CTAN/' => 1,
},
@@ -146,6 +151,7 @@ $mirrors = {
},
'Spain' => {
'https://ctan.javinator9889.com/' => 1,
+ 'https://osl.ugr.es/CTAN/' => 1,
},
'Sweden' => {
'https://ftp.acc.umu.se/mirror/CTAN/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 67a7006534..444efe6b5a 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
@@ -26,11 +26,11 @@ depend container_split_src_files/1
depend frozen/0
depend minrelease/2016
depend release/2020
-depend revision/55892
+depend revision/55902
name 00texlive.image
category TLCore
-revision 55888
+revision 55897
shortdesc TeX Live files only in the source repository
longdesc The files here are not copied by the installer and containers
longdesc are not built for them; they exist only in the source
@@ -4232,7 +4232,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 55871
+revision 55894
shortdesc TeX Live standalone installer package
longdesc This package defines the files to go into the installer
longdesc archives (install-tl-unx.tar.gz, install-tl.zip) built by the
@@ -8426,7 +8426,7 @@ catalogue-version 0.6
name achemso
category Package
-revision 55300
+revision 55899
shortdesc Support for American Chemical Society journal submissions
relocated 1
longdesc The bundle provides the official macros (achemso.cls) and
@@ -8434,10 +8434,10 @@ longdesc BibTeX styles (achemso.bst and biochem.bst) for submission to
longdesc the journals of the American Chemical Society. The natmove
longdesc package, which moves citations relative to punctuation, is
longdesc distributed as part of the bundle.
-containersize 18608
-containerchecksum 7b6a6b87116cfa6e72dc85cb73173285c511c71b229170770b549a40fe81da718103f129eab7268b1889752e5069724135a6b91afc462d22895a49939a954ff1
-doccontainersize 864040
-doccontainerchecksum 86a162edd0f6cfbda8169fb0b5615698ba5c86fc0ab9c32f9c1df254ead1f051612ecebc73862f5f47ffd8c796c8791f0844b62ef76be1eafa616c3b18a88013
+containersize 18804
+containerchecksum 1854f11bc87bc382bb6b02c0f098997bb8e6f8874ba995c61499d0ce4093452020b1c793d2cd0cb26e9fea91349629a98bcf4c6c630e9be6dad8e9ac550b1d4d
+doccontainersize 865176
+doccontainerchecksum 5d5c9127cb44d2dae13514f9996b60a8731cad592edc2498851a98d0385bb9515db07c7f74c33b9cf1a7e616ce40e93496da161e2859dec2341c9db1c5122427
docfiles size=227
RELOC/doc/latex/achemso/CHANGELOG.md
RELOC/doc/latex/achemso/LICENSE.md
@@ -8446,12 +8446,12 @@ docfiles size=227
RELOC/doc/latex/achemso/achemso-demo.pdf details="Example of use"
RELOC/doc/latex/achemso/achemso-demo.tex
RELOC/doc/latex/achemso/achemso.pdf details="Package documentation"
-srccontainersize 31856
-srccontainerchecksum 11add5880620cc26b7ac7fc6df37c7e7f6fef5e5a412b9326dcee093eaa910fa078c41580eb47e56a31e24304d0d0f07fa8e3eb3fa359619911a5ef00b565b0b
+srccontainersize 31964
+srccontainerchecksum 6b7b7d8544713b7deb09f4fa50260620b3649eccc6bf4f10fbcdc31c8f116d989b5b3f5b614a32c1c10d79b17694925fbadd22985e6e0f386e7c25e8375053fc
srcfiles size=39
RELOC/source/latex/achemso/achemso.dtx
RELOC/source/latex/achemso/achemso.ins
-runfiles size=92
+runfiles size=95
RELOC/bibtex/bst/achemso/achemso.bst
RELOC/bibtex/bst/achemso/biochem.bst
RELOC/tex/latex/achemso/achemso-aaembp.cfg
@@ -8459,6 +8459,7 @@ runfiles size=92
RELOC/tex/latex/achemso/achemso-aamick.cfg
RELOC/tex/latex/achemso/achemso-aanmf6.cfg
RELOC/tex/latex/achemso/achemso-aapmcd.cfg
+ RELOC/tex/latex/achemso/achemso-aastgj.cfg
RELOC/tex/latex/achemso/achemso-abseba.cfg
RELOC/tex/latex/achemso/achemso-acbcct.cfg
RELOC/tex/latex/achemso/achemso-accacs.cfg
@@ -8471,10 +8472,12 @@ runfiles size=92
RELOC/tex/latex/achemso/achemso-aelccp.cfg
RELOC/tex/latex/achemso/achemso-aesccq.cfg
RELOC/tex/latex/achemso/achemso-aewcaa.cfg
+ RELOC/tex/latex/achemso/achemso-afsthl.cfg
RELOC/tex/latex/achemso/achemso-aidcbc.cfg
RELOC/tex/latex/achemso/achemso-amclct.cfg
RELOC/tex/latex/achemso/achemso-amlccd.cfg
RELOC/tex/latex/achemso/achemso-amlcef.cfg
+ RELOC/tex/latex/achemso/achemso-amrcda.cfg
RELOC/tex/latex/achemso/achemso-ancac3.cfg
RELOC/tex/latex/achemso/achemso-ancham.cfg
RELOC/tex/latex/achemso/achemso-apchd5.cfg
@@ -8520,7 +8523,7 @@ runfiles size=92
catalogue-ctan /macros/latex/contrib/achemso
catalogue-license lppl1.3c
catalogue-topics chemistry journalpub bibtex-sty class
-catalogue-version 3.13a
+catalogue-version 3.13b
name acmart
category Package
@@ -44539,7 +44542,7 @@ catalogue-topics caption
name caption
category Package
-revision 55878
+revision 55900
shortdesc Customising captions in floating environments
relocated 1
longdesc The caption package provides many ways to customise the
@@ -44551,10 +44554,10 @@ longdesc compatibility notes, for other packages, is provided in the
longdesc documentation. The package also provides the "caption outside
longdesc float" facility, in the same way that simpler packages like
longdesc capt-of do. The package supersedes caption2.
-containersize 29152
-containerchecksum 94b269dd0b30be20f1d1f557fb8855be958d9e98c264383d1be8c47d12563e20f6dc1ef6e7ec7cf8b7f2ecdcb4bdaaeb0824b66115661aac6106664eb2de81ab
-doccontainersize 1585212
-doccontainerchecksum 1f56557c7bf07800b11a58d6f11ba666b2069fbb343431b4a359328dc167679e89998eab4e414ebeb5d93aa4ecc4e8abb559ed89c629972732934841c807defb
+containersize 29188
+containerchecksum 1e4ad1a4a44956931069d2455ce5584484f1f7f4c6b033b3969480106b247b2fad1c620cd81d83b6ee870ea688a8e24f9f6f225a7a9a4908136e5de6a77de872
+doccontainersize 1585184
+doccontainerchecksum 2f20715ad036602613d5768c8e6648752e2c5f9d7277e015a8f10f23fd1a5d1abbbc1817409a236dc5058d75419961eac57b5daaaf1a05555f922dec4cc586e3
docfiles size=444
RELOC/doc/latex/caption/CHANGELOG
RELOC/doc/latex/caption/README details="Readme"
@@ -44566,8 +44569,8 @@ docfiles size=444
RELOC/doc/latex/caption/ltcaption.pdf
RELOC/doc/latex/caption/subcaption.pdf
RELOC/doc/latex/caption/totalcount.pdf
-srccontainersize 193172
-srccontainerchecksum 3f7237004401f1ef1f2a8e42d12baef08251c37d914cde485773af96d13d8b93ef84d7a07bc37896fdf67f18fdb8f8f14eda0847bfa287fd44cc0f3d58e3680f
+srccontainersize 193356
+srccontainerchecksum 5c649b310d49db3a64ae0a8ca575483d2db3700b196406ed79355c1705bbac7793e60236ff4fca106048b6a89284a151300e48e2d7dd8216b90d42d1aaa39f7d
srcfiles size=283
RELOC/source/latex/caption/bicaption.dtx
RELOC/source/latex/caption/caption-deu.tex
@@ -132430,7 +132433,7 @@ catalogue-version 1.1.2
name horoscop
category Package
-revision 30530
+revision 55901
shortdesc Generate astrological charts in LaTeX
relocated 1
longdesc The horoscop package provides a unified interface for
@@ -132439,24 +132442,24 @@ longdesc wheel charts and some variations, in PostScript- and
longdesc PDF-generating TeX engines; and access to external calculation
longdesc software (Astrolog and Swiss Ephemeris) for computing object
longdesc positions.
-containersize 10008
-containerchecksum 077b7bc742d0526daf7380a080e640de72d61d5e65cac441d3291e1dfee8c0240be8817328e7080fe410fca9ebc8b5d13e8719ed48bd7d412485d7c5d2f67ce0
-doccontainersize 682340
-doccontainerchecksum b7cfdfb772f5423fe4cdcd914a4b0934162ea33542a773b14d91d057efcd05b7febfff46decc3760512b0df95f52180a4de0dea2f0dcc4b504945ee572f832a7
-docfiles size=172
+containersize 10492
+containerchecksum 128291701ca0f856ae059c72b4a15256163c5e90e65642c77a06b16eaf8c3ea87dcfd9c7dd59239f178a23a5fd71b9b9ba14468d92a7a536b544562e8e5639a5
+doccontainersize 687764
+doccontainerchecksum 43fcb0489ee9623cf92190c0974ce9b506cec7b773833284ae4cbbf2b0af56d64b14e3402ffc57bc19417cf4b6cd598e47a17860d6a6cc9a1af177c56a2278bf
+docfiles size=174
RELOC/doc/latex/horoscop/README details="Readme"
RELOC/doc/latex/horoscop/horoscop.pdf details="Package documentation"
-srccontainersize 71588
-srccontainerchecksum 2e132bba43dce98d65a717f755062ed6f63ecc0775134562d1061fc28d7776fb02baf7502273d1e825306a8a19eecd4d4e94d4603687ebc0df1923b27a213cb1
-srcfiles size=76
+srccontainersize 74096
+srccontainerchecksum b85042c2b0b6daeb40634ca9fb3f1d62630c50b6976e9dc6f21432fb5181373fa54e550480e07ccbc2399cdd5300506d896ce458af3295c1580cba0ffdccf570
+srcfiles size=79
RELOC/source/latex/horoscop/horoscop.dtx
RELOC/source/latex/horoscop/horoscop.ins
-runfiles size=14
+runfiles size=15
RELOC/tex/latex/horoscop/horoscop.sty
catalogue-ctan /macros/latex/contrib/horoscop
catalogue-license pd
catalogue-topics astrology
-catalogue-version 0.92
+catalogue-version 1.0
name hpsdiss
category Package
@@ -156405,7 +156408,7 @@ catalogue-version 2020-10-01 pre-release 1
name latex-base-dev
category Package
-revision 55299
+revision 55898
shortdesc Development pre-release of the LaTeX kernel
relocated 1
longdesc This package provides a testing release for upcoming LaTeX2e
@@ -156415,11 +156418,11 @@ longdesc users is required by adding these changes to the release LaTeX
longdesc kernel. Typically, the code here will be used by a TeX system
longdesc to create dedicated formats, for example pdflatex-dev, which
longdesc can then be used explicitly for testing.
-containersize 176456
-containerchecksum 072e9431b28b0f860240a4e6bb6a5cc47e4dfaf9308d87c06ce0ec19d9c1ed917e7db791a3eed372cf50b641e594c3af42b964c8213bc8e0f0d647824e4be5f5
-doccontainersize 18234536
-doccontainerchecksum daa5fdbfcb94d576a6ee243e625a28aeafd5a84000a4f3286a3e170afdc9e189ee8f8399e1b98b0fa61ff1ac2ea0ebab37d4ee4419f2c8407d091350502e43b9
-docfiles size=5782
+containersize 187508
+containerchecksum 94bcab292cfdb9cbce363a7369797fa703315571fa4528c17c0152b424cc84c676ec23df2f9d8c78b68894dd52b05be4d052608b31dd026cc5fd8df5a6252c0e
+doccontainersize 21589084
+doccontainerchecksum a32a5833e1021a3fc20d1269f0d01fff956b00202a240cac7f7547f0b92dc1e442f3c40f526c0cf4ab73e28c80bf641cc061712c9c7c6d86bcd6fcc04e80f213
+docfiles size=6793
RELOC/doc/latex-dev/base/README.md details="Readme"
RELOC/doc/latex-dev/base/alltt.pdf
RELOC/doc/latex-dev/base/bugs.txt
@@ -156459,6 +156462,14 @@ docfiles size=5782
RELOC/doc/latex-dev/base/lppl-1-2.txt
RELOC/doc/latex-dev/base/lppl.pdf
RELOC/doc/latex-dev/base/lppl.txt
+ RELOC/doc/latex-dev/base/ltfilehook-code.pdf
+ RELOC/doc/latex-dev/base/ltfilehook-code.tex
+ RELOC/doc/latex-dev/base/ltfilehook-doc.pdf
+ RELOC/doc/latex-dev/base/ltfilehook-doc.tex
+ RELOC/doc/latex-dev/base/lthooks-code.pdf
+ RELOC/doc/latex-dev/base/lthooks-code.tex
+ RELOC/doc/latex-dev/base/lthooks-doc.pdf
+ RELOC/doc/latex-dev/base/lthooks-doc.tex
RELOC/doc/latex-dev/base/ltluatex.pdf
RELOC/doc/latex-dev/base/ltnews.pdf details="Complete LaTeX2e news"
RELOC/doc/latex-dev/base/ltnews.tex
@@ -156526,6 +156537,10 @@ docfiles size=5782
RELOC/doc/latex-dev/base/ltnews31.tex
RELOC/doc/latex-dev/base/ltnews32.pdf
RELOC/doc/latex-dev/base/ltnews32.tex
+ RELOC/doc/latex-dev/base/ltshipout-code.pdf
+ RELOC/doc/latex-dev/base/ltshipout-code.tex
+ RELOC/doc/latex-dev/base/ltshipout-doc.pdf
+ RELOC/doc/latex-dev/base/ltshipout-doc.tex
RELOC/doc/latex-dev/base/ltx3info.pdf
RELOC/doc/latex-dev/base/ltx3info.tex
RELOC/doc/latex-dev/base/ltxdoc.pdf
@@ -156552,9 +156567,9 @@ docfiles size=5782
RELOC/doc/latex-dev/base/utf8ienc.pdf
RELOC/doc/latex-dev/base/webcomp.err
RELOC/doc/latex-dev/base/webcomp.pdf
-srccontainersize 531916
-srccontainerchecksum 66f61198b9a8fcdf2f852cbcdd581bc7d6caaaf5ac22617e45de4ea30ca02295529bcf5ab7aaff31a748efa1f503c72ee2000495634a2bb4830a34430e6870a0
-srcfiles size=791
+srccontainersize 578624
+srccontainerchecksum 7e2347ecaac959a4cce8cae6b7a9a69b01df5c10f4e104072033798a0e0ecd41a6af7b1632737aff3dc72971331a903c6a8788e13f5e6e3c8a2d9568f17ca835
+srcfiles size=852
RELOC/source/latex-dev/base/alltt.dtx
RELOC/source/latex-dev/base/alltt.ins
RELOC/source/latex-dev/base/classes.dtx
@@ -156596,6 +156611,7 @@ srcfiles size=791
RELOC/source/latex-dev/base/ltdirchk.dtx
RELOC/source/latex-dev/base/lterror.dtx
RELOC/source/latex-dev/base/ltexpl.dtx
+ RELOC/source/latex-dev/base/ltfilehook.dtx
RELOC/source/latex-dev/base/ltfiles.dtx
RELOC/source/latex-dev/base/ltfinal.dtx
RELOC/source/latex-dev/base/ltfloat.dtx
@@ -156606,6 +156622,8 @@ srcfiles size=791
RELOC/source/latex-dev/base/ltfssdcl.dtx
RELOC/source/latex-dev/base/ltfssini.dtx
RELOC/source/latex-dev/base/ltfsstrc.dtx
+ RELOC/source/latex-dev/base/lthooks.dtx
+ RELOC/source/latex-dev/base/lthooks.ins
RELOC/source/latex-dev/base/lthyphen.dtx
RELOC/source/latex-dev/base/ltidxglo.dtx
RELOC/source/latex-dev/base/ltlength.dtx
@@ -156623,6 +156641,7 @@ srcfiles size=791
RELOC/source/latex-dev/base/ltpictur.dtx
RELOC/source/latex-dev/base/ltplain.dtx
RELOC/source/latex-dev/base/ltsect.dtx
+ RELOC/source/latex-dev/base/ltshipout.dtx
RELOC/source/latex-dev/base/ltspace.dtx
RELOC/source/latex-dev/base/lttab.dtx
RELOC/source/latex-dev/base/lttextcomp.dtx
@@ -156650,7 +156669,7 @@ srcfiles size=791
RELOC/source/latex-dev/base/tulm.ins
RELOC/source/latex-dev/base/unpack.ins
RELOC/source/latex-dev/base/utf8ienc.dtx
-runfiles size=472
+runfiles size=495
RELOC/tex/latex-dev/base/alltt.sty
RELOC/tex/latex-dev/base/ansinew.def
RELOC/tex/latex-dev/base/applemac.def
@@ -156676,6 +156695,7 @@ runfiles size=472
RELOC/tex/latex-dev/base/doc.sty
RELOC/tex/latex-dev/base/docstrip.tex
RELOC/tex/latex-dev/base/exscale.sty
+ RELOC/tex/latex-dev/base/filehook-ltx.sty
RELOC/tex/latex-dev/base/fix-cm.sty
RELOC/tex/latex-dev/base/fixltx2e.sty
RELOC/tex/latex-dev/base/flafter.sty
@@ -156711,9 +156731,13 @@ runfiles size=472
RELOC/tex/latex-dev/base/letter.sty
RELOC/tex/latex-dev/base/lppl.tex
RELOC/tex/latex-dev/base/ltexpl.ltx
+ RELOC/tex/latex-dev/base/ltfilehook.ltx
+ RELOC/tex/latex-dev/base/lthooks.ltx
+ RELOC/tex/latex-dev/base/lthooks.sty
RELOC/tex/latex-dev/base/ltluatex.lua
RELOC/tex/latex-dev/base/ltluatex.tex
RELOC/tex/latex-dev/base/ltnews.cls
+ RELOC/tex/latex-dev/base/ltshipout.ltx
RELOC/tex/latex-dev/base/ltxcheck.tex
RELOC/tex/latex-dev/base/ltxdoc.cls
RELOC/tex/latex-dev/base/ltxguide.cls
@@ -156767,6 +156791,8 @@ runfiles size=472
RELOC/tex/latex-dev/base/slides.def
RELOC/tex/latex-dev/base/slides.sty
RELOC/tex/latex-dev/base/small2e.tex
+ RELOC/tex/latex-dev/base/srclfile-ltx.sty
+ RELOC/tex/latex-dev/base/structuredlog.sty
RELOC/tex/latex-dev/base/syntonly.sty
RELOC/tex/latex-dev/base/t1cmdh.fd
RELOC/tex/latex-dev/base/t1cmfib.fd
@@ -156814,7 +156840,7 @@ catalogue-also latex-base
catalogue-ctan /macros/latex-dev/base
catalogue-license lppl1.3c
catalogue-topics format class
-catalogue-version 2020-10-01 pre-release 6
+catalogue-version 2020-10-01 pre-release 7
name latex-bin
category TLCore
@@ -158090,7 +158116,7 @@ catalogue-topics book-ex
name latex-graphics-dev
category Package
-revision 55299
+revision 55898
shortdesc Development pre-release of the LaTeX graphics bundle
relocated 1
longdesc This is a pre-release version of the standard LaTeX graphics
@@ -158098,10 +158124,10 @@ longdesc bundle. It accompanies the pre-testing kernel code
longdesc (latex-base-dev), and is intended for testing by knowledgeable
longdesc users.
depend graphics-cfg
-containersize 15040
-containerchecksum 30273fc4d8a6e5f981007e295c029e8f705fa41abbe0d8c0e3df465410323e326c945f798726225c2449a21ba91bcc318d23ea91754920743488cafb03b18e2b
-doccontainersize 1993716
-doccontainerchecksum fac809ab629d41a731dd13ed55355c69de02e26caeabc3e8e125e5606969af9e73aadf390f29bd22576062055288326d34231f00842b7bf52fc30800bb28da35
+containersize 15056
+containerchecksum 5b646c460092525e7b2f480bd86d6ad87b3503abf6050523b1c7eefd59a8a66e692e0f3345f1618f56a03bcce92c54df7fe0f09c7af8420e9aa683edb2c08624
+doccontainersize 1994256
+doccontainerchecksum 31c68dab9a160cc6f5804f53b21e2e431a921de012e7dea015c5e9b2bac172ac2677ceedd6c352867cc38ae1c0c5d7ab4db7479b3d6f248ece3dd69fafbbc558
docfiles size=623
RELOC/doc/latex-dev/graphics/README.md details="Readme"
RELOC/doc/latex-dev/graphics/cat.eps
@@ -158119,8 +158145,8 @@ docfiles size=623
RELOC/doc/latex-dev/graphics/rotex.pdf
RELOC/doc/latex-dev/graphics/rotex.tex
RELOC/doc/latex-dev/graphics/trig.pdf
-srccontainersize 51920
-srccontainerchecksum c936716c2a67252fd3491a453ff12e77ef7926df875d9b57f1eb05d692c85b4c5dc4aa4e1bc02a25a4ddb7427f7deabd57947951b5ce3e570134825a8e92d007
+srccontainersize 51952
+srccontainerchecksum cc2fd4fc67691f50fa7502a7705b70eb83374a2b9e90edcf11c6fbada563e90d66e597f592252f95c64cf0c99b97f354a661966ed47e36bb6ee5cd4f9d6579d7
srcfiles size=63
RELOC/source/latex-dev/graphics/color.dtx
RELOC/source/latex-dev/graphics/drivers.dtx
@@ -158158,7 +158184,7 @@ catalogue-also latex-graphics
catalogue-ctan /macros/latex-dev/required/graphics
catalogue-license lppl1.3c
catalogue-topics graphics collection
-catalogue-version 2020-10-01 pre-release 1
+catalogue-version 2020-10-01 pre-release 2
name latex-make
category Package
@@ -158593,18 +158619,18 @@ catalogue-topics obsolete
name latex-tools-dev
category Package
-revision 55299
+revision 55898
shortdesc Development pre-release of the LaTeX tools bundle
relocated 1
longdesc This is a pre-release version of the standard LaTeX tools
longdesc bundle. It accompanies the pre-testing kernel code
longdesc (latex-base-dev), and is intended for testing by knowledgeable
longdesc users.
-containersize 41292
-containerchecksum 48529312af92fa63af6f8f65f29b4a0eb33fc917af5ec1e24fcd9a5c9153701a0b48855ea8987745e0bfdd1e7b3cc9675a8d1038d20531c9e0149f8d7505fd90
-doccontainersize 5205812
-doccontainerchecksum 97be5d1536843acb67175385c17750c41d255c096df12539f56f4fe5bc9314a70d5600ea36b1f8f483122f53526b2e8fb48b66c67f43c7311999c6b74352c6ef
-docfiles size=1640
+containersize 41776
+containerchecksum 11db8011c04dfabf478efab4011e0a9bb5c8aebd2aa46d574c6ce6a055bad2d3a975bb597a3a84cf62d85bff0a4e1280f71550d62d75a247f4619c8c54776cb5
+doccontainersize 5220404
+doccontainerchecksum 6c2fb390ce5934fb0ff89cc463c984495bb961a3aad547400f31fd65b9f49399a97af43b14ab49540298cfed0a11b63b0b3a5efe2acd5bf6faa875c763a87385
+docfiles size=1641
RELOC/doc/latex-dev/tools/README.md details="Readme"
RELOC/doc/latex-dev/tools/afterpage.pdf
RELOC/doc/latex-dev/tools/array.pdf
@@ -158636,9 +158662,9 @@ docfiles size=1640
RELOC/doc/latex-dev/tools/verbatim.pdf
RELOC/doc/latex-dev/tools/xr.pdf
RELOC/doc/latex-dev/tools/xspace.pdf
-srccontainersize 224540
-srccontainerchecksum 4fe9284571213acbcbe3a9e1629bb73ad4518ba6570335308956e40bd1a74419086eba1b28f345d9f94af26b33ec7a9c321555238c8a25fc02a0144215052dd1
-srcfiles size=264
+srccontainersize 225476
+srccontainerchecksum 274350292351934e29278347487b97ed66caba211fa6a2330fd7439920305e95c2a27e9565fcc0dabe461e6869c2347165ee1dee9d9f709d127e4ac63384d321
+srcfiles size=265
RELOC/source/latex-dev/tools/afterpage.dtx
RELOC/source/latex-dev/tools/afterpage.ins
RELOC/source/latex-dev/tools/array.dtx
@@ -158672,7 +158698,7 @@ srcfiles size=264
RELOC/source/latex-dev/tools/verbatim.dtx
RELOC/source/latex-dev/tools/xr.dtx
RELOC/source/latex-dev/tools/xspace.dtx
-runfiles size=103
+runfiles size=104
RELOC/tex/latex-dev/tools/.tex
RELOC/tex/latex-dev/tools/afterpage.sty
RELOC/tex/latex-dev/tools/array-2016-10-06.sty
@@ -158720,7 +158746,7 @@ runfiles size=103
catalogue-ctan /macros/latex-dev/required/tools
catalogue-license lppl1.3c
catalogue-topics collection
-catalogue-version 2020-10-01 pre-release 3
+catalogue-version 2020-10-01 pre-release 4
name latex-uni8
category Package
@@ -261468,7 +261494,7 @@ catalogue-version 0.302
name semantex
category Package
-revision 55777
+revision 55902
shortdesc Semantic mathematics
relocated 1
longdesc The SemanTeX package for LaTeX delivers a more semantic,
@@ -261477,20 +261503,20 @@ longdesc ordinary math syntax. The system is object-oriented and uses
longdesc keyval syntax, and everything is highly customizable. At the
longdesc same time, care has been taken to make the syntax as intuitive,
longdesc natural, practical, and lightweight as possible.
-containersize 17336
-containerchecksum 8a0146a2ca78c2e43059662e20574bf288bd088ec34fb05012d3b843c1b5284c295ed53e725c6aa12486618625e1df400a97bc8d21e7eaa84553c86cfd4663d7
-doccontainersize 249764
-doccontainerchecksum 71330af27e729836975dbb03e230d4c139b363a694dd5714fc1da5be3fbecda971e6a647246ea5d5200815821556ae1d4614242fe80bef3094db1f5b6757a617
-docfiles size=77
+containersize 19376
+containerchecksum 32214793f06ad0f7ac819940ee8020678e19ed688ccdb10ac78789dcfb3ad8458307b1fe2e64116c9266873b84378d792e8e453cb7c0c822b3f50448be1653d9
+doccontainersize 254368
+doccontainerchecksum 8a51f84ef65f8fcf682a488d9a49f5d90666b29c4333ab944f5dd23f54c8867fce3ec71f753e16ee110c03d8daffafc298314628f15d91dde06e65504b054b90
+docfiles size=79
RELOC/doc/latex/semantex/README.md details="Readme"
RELOC/doc/latex/semantex/semantex.pdf details="Package documentation"
RELOC/doc/latex/semantex/semantex.tex
-runfiles size=40
+runfiles size=53
RELOC/tex/latex/semantex/semantex.sty
catalogue-ctan /macros/latex/contrib/semantex
catalogue-license lppl1.3c
catalogue-topics maths expl3
-catalogue-version 0.201alpha
+catalogue-version 0.3alpha
name semantic
category Package
@@ -286407,16 +286433,17 @@ catalogue-version 5.1
name texlive-common
category TLCore
-revision 54176
+revision 55897
shortdesc TeX Live documentation (common elements)
relocated 1
postaction shortcut type=menu name="TeX Live documentation" cmd=TEXDIR/texmf-dist/doc/texlive/index.html
containersize 348
-containerchecksum a2708c13d68014077310738fa410f2e7d4f15209ecaa74b9e6ed0e12b332fe1eb2caef4a48176e99d8ca5858161b009a8818ec4815d0b02ff9355f9208f8c222
-doccontainersize 481160
-doccontainerchecksum 311737957ea9befab3a16f2f47d1123307a4dba0bf2291acc2b55db8e4d9f4db72caf8779ab06ac913a7ceca20c2a15f88cb4f7185a27db4517ebf9e38db02c4
-docfiles size=141
+containerchecksum 5fa7d32ed5989bfcd59759014d84f50fbaf07641cf11ac2a11cbeff5af0aa1d581c8a7ad2e435be3d1b03c47cb6bef7b32c003e79b9cf7b25b41520d92d49fe0
+doccontainersize 488000
+doccontainerchecksum bf6021c01c032fe92c40492e67276418c6e886ed1364ffd54eeb94887a19d93a429c878e0751f210490f4ae3cb5e286ce4992a9942802ce1f1a9a5bb13e0db9c
+docfiles size=147
RELOC/doc/texlive/index.html
+ RELOC/doc/texlive/install-tl.html
RELOC/doc/texlive/texlive-common/advanced-lnx.png
RELOC/doc/texlive/texlive-common/basic-w32.png
RELOC/doc/texlive/texlive-common/examples/ex5.tex
@@ -286486,15 +286513,15 @@ docfiles size=592
name texlive-docindex
category TLCore
-revision 55884
+revision 55894
shortdesc top-level TeX Live doc.html, etc.
longdesc These files are regenerated as needed, which is often, so we
longdesc make them a separate package. See the tl-update-auto script for
longdesc the process.
-containersize 392
-containerchecksum 2dddb3cc4b70ecb8b3f8b78615e2eafdb706837c1c80b8a3ac9e0bcc1b5fe52096d68546c0c29e5a2847a763c9d4f62f7c3a51acad8f076e99abb48c61f92f81
-doccontainersize 167624
-doccontainerchecksum 7bb02e78c95d98ac6474237f1f0bc7c5c09ecc8b71d0e2266dd375af2581b8f093f77f377406e95af7fc03ba5fd6c4eb69608c6af2d2e8f504c5a3789def7584
+containersize 388
+containerchecksum 18f5a9b9d86de0b554d753e7609814849933ed1717439674d9665dba53cdd410e9aae0129a672086e8697094084ff04dfc9aeb04cd225c23ea8b4b94c08dd564
+doccontainersize 167636
+doccontainerchecksum 3284a3724559f32d7bab5bb4aa5d4ec67d24f4b1702eae69843e5db5590703a4215dd670b9398350d05b98726f37a2d330269b2269b0d3e02fd29c78ccc76fc7
docfiles size=332
doc.html
@@ -286716,7 +286743,7 @@ docfiles size=368
name texlive-scripts
category TLCore
-revision 55871
+revision 55895
shortdesc TeX Live infrastructure programs
longdesc Includes install-tl, tl-portable, rungs, etc.; not needed for
longdesc tlmgr to run but still ours. Not included in tlcritical.
@@ -286724,10 +286751,10 @@ depend texlive-scripts.ARCH
depend texlive.infra
execute addMap mathpple.map
postaction shortcut type=menu name="TeX Live command-line" cmd=TEXDIR/tlpkg/installer/tl-cmd.bat
-containersize 131968
-containerchecksum 0dd62d451921bcfff860f96568b64eb262729dbcf9ada439db86f2b0a34c8e3bad693ebb8298ab7601073003b4a58b08758d643522605bb14fdce721dbef2d89
+containersize 132028
+containerchecksum eab20b9f215af5b74b283ecae28d5fb01f11a00fd5b4cb13729e82e905db6e74ff65f4b5db04b114bf3b177d0c09f8cb90c8d77e512e1ed5fb110ee4c8ffcceb
doccontainersize 218656
-doccontainerchecksum 86aa9a587d194e83eeb452d2f0d4287bf0668c7ca1af3b5390f45b87d9761955b5f3266b7b603f95d5be5e4d61c3e82ab532551bf326c2617505a95ea0b36c75
+doccontainerchecksum 31aeeb856256cd51f15082ac63090f17768b47fbf4468ae247e0c3b784dc6f909e895d46bba0b49385af9b285c7ecb75d9c47ef4b649f9a6d8f757b8dc55d95d
docfiles size=141
texmf-dist/doc/man/man1/fmtutil-sys.1
texmf-dist/doc/man/man1/fmtutil-sys.man1.pdf
@@ -308963,15 +308990,15 @@ catalogue-topics barcode
name updmap-map
category Package
-revision 55824
+revision 55895
shortdesc auto-generated font map files
relocated 1
longdesc These map files are regenerated every time a new font is added.
longdesc There is no need to rebuild formats or update binaries because
longdesc of such updates, hence this separate package.
-containersize 306724
-containerchecksum 0f83d943b51160fae10e56d6b83cd5a6df4742d47e8a7d6c8a9bd0618163ea25cddedc8590b0d23c70ce3d5b8c4b57d92bee30dd5734f1a1dab0878eecd92bc3
-runfiles size=8310
+containersize 307320
+containerchecksum 076bd929b9a02fd4d096ed469170e3bf6a4424d3ef7b9d5239cf7ec6e24f6d21404c428d826a57da5f9cc652e9ed854d2dd9912d3027570a74d1952245699a37
+runfiles size=8306
RELOC/fonts/map/dvipdfmx/updmap/kanjix.map
RELOC/fonts/map/dvips/updmap/builtin35.map
RELOC/fonts/map/dvips/updmap/download35.map
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 3f6dbe85c0..790a017f4b 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-59d81c2d823866c409a0030eaef2e77a texlive.tlpdb
+a042a7274f4c913d3f169ca76d61aeac texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index a2f8fcd9fa..9da06a06ef 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-680fb64b85908553f5c62813eef7162845c7f8876b444315bddd00f16dd43bf4bc462c37f20da0b2e97970f23ae47a8da1d7f2c24b6d833521b5162fb2ed1c33 texlive.tlpdb
+0689b60d8ecd4de797c4c463e71a421272c60ccfbebe941f4f228c2ecabecbb9eafd5abe3ff743076dcd2a6c5788eb87428b5ce1c77064bade41b6aa4599b31a texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 6ab1c8f54f..ed9555faa9 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
@@ -1,10 +1,10 @@
-----BEGIN PGP SIGNATURE-----
-iQEcBAEBCgAGBQJfFi9gAAoJEEzhh34ZQ4xwQpUH/iolbsasetvghoaBABQzsJGr
-bJfWzJQJgRlkiCFAqc/rO40w9BZw/pWwkpmrFjS/9c8K4PCeR73YzrRB9NAMzPXI
-8lJYsWw21Chwe/GoxPBPc0uldNA/velLHB+UOu0IU2BCQMGx5a2PMrL40ujoKn27
-MoyLjZb5aIv840THbsajDPKYMXmAwrlRteiFzO7PbVtFGZs8vf6kzipIrUJgio5q
-bSDQqanrL55VKXUShrFewgAhm6XQYaAnp0tkGdqAhjhw4AXHEixA1MuCjocOmeWD
-5rCoEq5WwmesmZ8yuvjGYJjou10zrD/4zdxhtzjI4zhsZdRxP50qtKkVTQH5xYQ=
-=k6US
+iQEcBAEBCgAGBQJfF4DUAAoJEEzhh34ZQ4xwBzEIAJ8Hj4gnwRlRnfx1fFODqglG
+IYAxMnaxbN+EBSnyorennOaYB/Kg4UKDjP6ZbDVNp6Dx/GSfvMInQ3jLWMquBzhl
+8jshv6GYR4S5Ivjq2NLprRnNKSadY+ixHl/2X+WfzLm09wH0d8HEvJ9MZvjizwIA
+Q6z0peVYP/NB04qpN8Dud3n1PjdIE1C7DmQYHVKrgaoaFpxKzzEh9Msn1Ip3H+F+
+EQYacs2DvEyBR5521T/On2nBvCU0hvzbGO1XFAUe+XTZd0atZowNy755/4A4zur5
+teUkMyP0hlkSo8OabsVDzwAlqxdkc/VP5VIaD3RIVQtXkguiJIePl+ny0rZyay8=
+=nPDX
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 19c059cbc4..ee904ee0bf 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/systems/win32/miktex/tm/packages/next/pr.ini b/systems/win32/miktex/tm/packages/next/pr.ini
index 4fc77037a8..66010b6d77 100644
--- a/systems/win32/miktex/tm/packages/next/pr.ini
+++ b/systems/win32/miktex/tm/packages/next/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1595276156
+date=1595362541
lastupd=miktex-arctrl-bin-2.9 miktex-arctrl-bin-x64-2.9 miktex-asymptote-bin-2.9 miktex-asymptote-bin-x64-2.9 miktex-autosp-bin-2.9 miktex-autosp-bin-x64-2.9 miktex-axohelp-bin-2.9 miktex-axohelp-bin-x64-2.9 miktex-bibarts-bin-2.9 miktex-bibarts-bin-x64-2.9 miktex-bibtex-bin-2.9 miktex-bibtex-bin-x64-2.9 miktex-bibtex8bit-bin-2.9 miktex-bibtex8bit-bin-x64-2.9 miktex-bzip2-bin-2.9 miktex-bzip2-bin-x64-2.9 miktex-cairo-bin-2.9 miktex-cairo-bin-x64-2.9 miktex-chktex-bin-2.9 miktex-chktex-bin-x64-2.9
-lstdigest=9ce87259862f5fd009e1abdf6cb3f450
+lstdigest=d4c7380b39575b59ca6d43c8b685b47a
numpkg=3955
relstate=next
-version=7506
+version=7507
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: B9RWyXnurcF1ae23f0mdOGrgnwt6gtxG+2r3nrfsp2C+nZqMk8XgnoQGjwQ2rAXrJntPWRF5SkvK94qeciA9aygyaLdGk7lB+sczTAHLYn7ESoNjhv4DEYHCF9N/0FQTglHsomRlk12f0F9KsilCT8DUmmgXz7p10fKKkJE1pF+om+FtgXHUJtDxAmYowRFWBxPTR736IsuB6CpZymIcR6rQkkWi+6KPnH+2yYRi6LSLKkmf7JZXI6jOEZEWtILPVrbotOtJqmomH5pN5e00C5ejs3D109V8brIbqKd1bmSIUEtdLIRQ+Qjz+KGGz0UXULCb/905ETu95MwHdCkXxw==
+;;;; signature/miktex: l9UgvMcHhb1NrUAQ4tnjjrSDoKk/AZUZY9qdOOl8GMmCrLX3ZntABMvXAZjB+TgdWvdQ2w4UjLpcRrgEp2TzFa5t3F2kg/vW7yOG/ij9H8buJeof4l4mcKZ1ukIeNqtwteQ2Xgt+IH4GTBvp6GWgwc56T+Ie+6n/9jbFfBIaC02eiCShJPrnPvfFKHB0QsTd5MzhneMJ2RTETwHRgrXx1ebfd4h9Pg++6/6zVg2lIaAVlw7FME/41jcQyeyZyI+ejXTf7GPePDQ0mMl/Dz1Br2sgjvmXtnOjuD0NON/rY6LFJZS1cD2bPp9Jq1dRNFwbo67zU5rNwOkMftJ21LPJHQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index a2eefc58ee..1c58f1ef02 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1595275921
+date=1595362314
lastupd=aeb-mlink apa7 artthreads babel bib2gls biblatex-publist cabin chemfig circuitikz cryptocode edichokey elpres etoolbox expkv-def fitr ibarra isodoc l3experimental l3kernel langsci-avm
-lstdigest=e4badab70f384fdae3ebd7bd3fc73473
+lstdigest=0d53326c0064b06897a47f096e35dde1
numpkg=3950
relstate=stable
-version=7506
+version=7507
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: JT2G5y4Hdhuc9qUaYOGTVNcxG0OaKb8gvM0ME/fkJEQzQ+g9bhARDMT1CHdlIvkpL2lDhTEd5EVgki3iZE0f24wl7sjMIS8NCqnau+qWGfV2WUm8Fs3pNYaUC5Jian/sUNHkceXsovN1UhlcsuJ/3TW0Du3oE5ze1mKSir1J5MqOEhZ2C7k3fNrXuwr+ByeTm2rGLpaRx1o667ngLhjyqj0wqHwPDx7ZJ7yN3GhZ7AGOLbZMsR7F1EwIgRQsdEO1OYB2An0X90DjZd8LdRo1nP/WBHbtrc6ZsoW1t0P7QfZmTsbrHOC6qcxQglS0Fn8vMS98QzI8mdO3H7+1A/1nuw==
+;;;; signature/miktex: JsR2rxrN2UAkZNIf1ZxeRuZcd/mF+di9xQCDmiW3QdiTLwKHu81HYUOQyZT40d94/F7ZSCko9WKn1h5Dq/ojFcxLmI46x/DEY6eWdn47XhN6Ev9MrC6FEKL8FgBEHLVhTxseMi5RtDWCsk+ZgQ3BM0wlyuds8LuIrEBSxKUuyIUjvCKE8jMtDHgtNM4NG4Ycr2R/S7gphJ37nREm4EjhlOGwP2VoWUgT34nWYgFLwh5M7oLS68ZelD0ntBV71e289lV4Gti0dUyZoswBXqEJtO3sjbKKEOnK9LHXN6oKBpegMFxooJYWWcpPckCXKWA8fYzB5J09yX5sHGvhc1TrQQ==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/w32tex/ChangeLog b/systems/win32/w32tex/ChangeLog
index 814ad3fc99..cc22f51876 100644
--- a/systems/win32/w32tex/ChangeLog
+++ b/systems/win32/w32tex/ChangeLog
@@ -1,5 +1,27 @@
W32TeX (x86 & x64) ChangeLog
+[2020/07/21]
+(01) dvipdfm-w32.tar.xz
+ Update dvipdfmx.dll (20200721).
+(02) ltxpkgs.tar.xz
+ Update caption.
+(03) luatex-dev-w32.tar.xz
+ Update luaxml.
+(04) luatex-exp-w32.tar.xz
+ Update luaxml.
+(05) luatex-w32.tar.xz
+ Update luaxml.
+(06) ptex-ng-w32.tar.xz
+ Update libdpx.
+(07) xetex-w32.tar.xz
+ Update dvipdfmx.dll (20200721).
+(08) win64/dvipdfm-w64.tar.xz
+ Update dvipdfmx.dll (20200721).
+(09) win64/ptex-ng-w64.tar.xz
+ Update libdpx.
+(10) win64/xetex-w64.tar.xz
+ Update dvipdfmx.dll (20200721).
+
[2020/07/20]
(01) context.tar.xz
Update format files for pdftex, xetex, eptex, and euptex.
diff --git a/timestamp b/timestamp
index c3778643b7..238d8c81da 100644
--- a/timestamp
+++ b/timestamp
@@ -2,4 +2,4 @@
# The source CTAN of this site's material:
dante.ctan.org
# The year-month-day-hour-minute of this site's material:
-2020-07-21-02-02
+2020-07-22-02-02