summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
committerNorbert Preining <norbert@preining.info>2020-07-18 03:01:08 +0000
commit63c4f21a5716ebbed11926d0bfbb26d656a766ea (patch)
treec02159e6ceb2453208664129ccda8ff306147328
parent4ea983e3d411ade406c09b30ece9139457516b6f (diff)
CTAN sync 202007180301
-rw-r--r--FILES.byname856
-rw-r--r--FILES.byname.gzbin2227606 -> 2228161 bytes
-rw-r--r--FILES.last07days941
-rw-r--r--macros/latex/contrib/l3experimental/CHANGELOG.md13
-rw-r--r--macros/latex/contrib/l3experimental/README.md9
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3benchmark.pdfbin314598 -> 314158 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.dtx587
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.ins62
-rw-r--r--macros/latex/contrib/l3experimental/l3cctab.pdfbin358686 -> 0 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3color.dtx576
-rw-r--r--macros/latex/contrib/l3experimental/l3color.pdfbin350143 -> 356022 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-boxes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-code.pdfbin625280 -> 625002 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-layers.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-paths.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-points.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-scopes.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-softpath.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-state.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw-transforms.dtx2
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3draw.pdfbin491676 -> 491247 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3galley.pdfbin386087 -> 385667 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3graphics.pdfbin363448 -> 363017 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf-code.pdfbin278911 -> 278541 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3pdf.pdfbin351127 -> 350700 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3str-format.pdfbin345232 -> 344797 bytes
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/l3sys-shell.pdfbin312062 -> 311621 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xcoffins.pdfbin373229 -> 372787 bytes
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.dtx4
-rw-r--r--macros/latex/contrib/l3experimental/xgalley.pdfbin286017 -> 285577 bytes
-rw-r--r--macros/latex/contrib/l3kernel/CHANGELOG.md24
-rw-r--r--macros/latex/contrib/l3kernel/README.md2
-rw-r--r--macros/latex/contrib/l3kernel/expl3.dtx5
-rw-r--r--macros/latex/contrib/l3kernel/expl3.pdfbin585320 -> 584938 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.pdfbin1545894 -> 1555993 bytes
-rw-r--r--macros/latex/contrib/l3kernel/interface3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3.ins1
-rw-r--r--macros/latex/contrib/l3kernel/l3alloc.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3bootstrap.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3box.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3candidates.dtx43
-rw-r--r--macros/latex/contrib/l3kernel/l3cctab.dtx891
-rw-r--r--macros/latex/contrib/l3kernel/l3clist.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3coffins.dtx15
-rw-r--r--macros/latex/contrib/l3kernel/l3color-base.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3debug.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3deprecation.dtx417
-rw-r--r--macros/latex/contrib/l3kernel/l3doc.dtx4
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3docstrip.pdfbin263622 -> 263178 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3expan.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3file.dtx187
-rw-r--r--macros/latex/contrib/l3kernel/l3final.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3flag.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3format.ins1
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-assign.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-aux.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-basics.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-expo.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-extended.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-logic.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-parse.dtx17
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-random.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-round.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-traps.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp-trig.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fp.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3fparray.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3int.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3intarray.dtx19
-rw-r--r--macros/latex/contrib/l3kernel/l3kernel-functions.dtx29
-rw-r--r--macros/latex/contrib/l3kernel/l3keys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3legacy.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3luatex.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx48
-rw-r--r--macros/latex/contrib/l3kernel/l3names.dtx667
-rw-r--r--macros/latex/contrib/l3kernel/l3news.pdfbin379248 -> 379235 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news01.pdfbin113529 -> 113527 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news02.pdfbin140776 -> 140776 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news03.pdfbin144784 -> 144785 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news04.pdfbin107117 -> 107115 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news05.pdfbin105090 -> 105090 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news06.pdfbin140797 -> 140795 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news07.pdfbin119092 -> 119094 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news08.pdfbin152413 -> 152413 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news09.pdfbin235323 -> 235322 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news10.pdfbin147096 -> 147097 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news11.pdfbin165956 -> 165946 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3news12.pdfbin199153 -> 199139 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.csv5
-rw-r--r--macros/latex/contrib/l3kernel/l3prefixes.pdfbin75645 -> 75852 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3prg.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3prop.dtx48
-rw-r--r--macros/latex/contrib/l3kernel/l3quark.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3regex.dtx6
-rw-r--r--macros/latex/contrib/l3kernel/l3seq.dtx77
-rw-r--r--macros/latex/contrib/l3kernel/l3skip.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3sort.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str-convert.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3str.dtx8
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.pdfbin280369 -> 279956 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3styleguide.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.pdfbin228663 -> 228250 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3syntax-changes.tex2
-rw-r--r--macros/latex/contrib/l3kernel/l3sys.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.pdfbin186883 -> 217628 bytes
-rw-r--r--macros/latex/contrib/l3kernel/l3term-glossary.tex95
-rw-r--r--macros/latex/contrib/l3kernel/l3text-case.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text-purify.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3text.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl-analysis.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/l3tl.dtx58
-rw-r--r--macros/latex/contrib/l3kernel/l3token.dtx42
-rw-r--r--macros/latex/contrib/l3kernel/l3unicode.dtx2
-rw-r--r--macros/latex/contrib/l3kernel/source3.pdfbin5904224 -> 5865524 bytes
-rw-r--r--macros/latex/contrib/l3kernel/source3.tex2
-rw-r--r--macros/latex/contrib/l3kernel/source3body.tex1
-rw-r--r--macros/latex/contrib/thmtools/README22
-rw-r--r--macros/latex/contrib/thmtools/README.md17
-rw-r--r--macros/latex/contrib/thmtools/TODO3
-rw-r--r--macros/latex/contrib/thmtools/VERSION.tex2
-rw-r--r--macros/latex/contrib/thmtools/changes.txt6
-rw-r--r--macros/latex/contrib/thmtools/doc/COPYING (renamed from macros/latex/contrib/thmtools/COPYING)0
-rw-r--r--macros/latex/contrib/thmtools/doc/VERSION.tex1
-rw-r--r--macros/latex/contrib/thmtools/doc/changes.txt12
-rw-r--r--macros/latex/contrib/thmtools/doc/thmtools-manual.pdfbin0 -> 227619 bytes
-rw-r--r--macros/latex/contrib/thmtools/doc/thmtools-manual.tex (renamed from macros/latex/contrib/thmtools/thmtools-manual.tex)230
-rw-r--r--macros/latex/contrib/thmtools/source/aliasctr.dtx (renamed from macros/latex/contrib/thmtools/aliasctr.dtx)9
-rw-r--r--macros/latex/contrib/thmtools/source/parseargs.dtx (renamed from macros/latex/contrib/thmtools/parseargs.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-amsthm.dtx (renamed from macros/latex/contrib/thmtools/thm-amsthm.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-autoref.dtx (renamed from macros/latex/contrib/thmtools/thm-autoref.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-beamer.dtx (renamed from macros/latex/contrib/thmtools/thm-beamer.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-kv.dtx (renamed from macros/latex/contrib/thmtools/thm-kv.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-listof.dtx (renamed from macros/latex/contrib/thmtools/thm-listof.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-llncs.dtx (renamed from macros/latex/contrib/thmtools/thm-llncs.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-ntheorem.dtx (renamed from macros/latex/contrib/thmtools/thm-ntheorem.dtx)11
-rw-r--r--macros/latex/contrib/thmtools/source/thm-patch.dtx (renamed from macros/latex/contrib/thmtools/thm-patch.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thm-restate.dtx (renamed from macros/latex/contrib/thmtools/thm-restate.dtx)18
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx (renamed from macros/latex/contrib/thmtools/thmdef-mdframed.dtx)15
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-shaded.dtx (renamed from macros/latex/contrib/thmtools/thmdef-shaded.dtx)63
-rw-r--r--macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx43
-rw-r--r--macros/latex/contrib/thmtools/source/thmtools.dtx (renamed from macros/latex/contrib/thmtools/thmtools.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/source/thmtools.ins64
-rw-r--r--macros/latex/contrib/thmtools/source/unique.dtx (renamed from macros/latex/contrib/thmtools/unique.dtx)8
-rw-r--r--macros/latex/contrib/thmtools/thmdef-thmbox.dtx36
-rw-r--r--macros/latex/contrib/thmtools/thmtools.ins61
-rw-r--r--macros/latex/contrib/thmtools/thmtools.pdfbin225947 -> 0 bytes
-rw-r--r--macros/plain/contrib/zztex/README17
-rw-r--r--macros/plain/contrib/zztex/doc/zzbuiltin.dat325
-rw-r--r--macros/plain/contrib/zztex/doc/zzdetails.dat1597
-rw-r--r--macros/plain/contrib/zztex/doc/zzphrase.dat3085
-rw-r--r--macros/plain/contrib/zztex/doc/zzplain.dat1315
-rw-r--r--macros/plain/contrib/zztex/tex/zzart.tex611
-rw-r--r--macros/plain/contrib/zztex/tex/zzbiblio.tex427
-rw-r--r--macros/plain/contrib/zztex/tex/zzbibtex.tex290
-rw-r--r--macros/plain/contrib/zztex/tex/zzblock.tex327
-rw-r--r--macros/plain/contrib/zztex/tex/zzcmmath.tex15
-rw-r--r--macros/plain/contrib/zztex/tex/zzcomenc.tex153
-rw-r--r--macros/plain/contrib/zztex/tex/zzdiv.tex128
-rw-r--r--macros/plain/contrib/zztex/tex/zzdoc.tex500
-rw-r--r--macros/plain/contrib/zztex/tex/zzerror.tex123
-rw-r--r--macros/plain/contrib/zztex/tex/zzfloat.tex1164
-rw-r--r--macros/plain/contrib/zztex/tex/zzfont.tex453
-rw-r--r--macros/plain/contrib/zztex/tex/zzfront.tex247
-rw-r--r--macros/plain/contrib/zztex/tex/zzhelp.tex359
-rw-r--r--macros/plain/contrib/zztex/tex/zzhmode.tex924
-rw-r--r--macros/plain/contrib/zztex/tex/zzhmodeb.tex239
-rw-r--r--macros/plain/contrib/zztex/tex/zzhyper.tex185
-rw-r--r--macros/plain/contrib/zztex/tex/zzhyph.tex128
-rw-r--r--macros/plain/contrib/zztex/tex/zzindexv1.tex379
-rw-r--r--macros/plain/contrib/zztex/tex/zzindexv2.tex448
-rw-r--r--macros/plain/contrib/zztex/tex/zzio.tex84
-rw-r--r--macros/plain/contrib/zztex/tex/zzlist.tex163
-rw-r--r--macros/plain/contrib/zztex/tex/zzltrspc.tex111
-rw-r--r--macros/plain/contrib/zztex/tex/zzlucida.tex140
-rw-r--r--macros/plain/contrib/zztex/tex/zzmath.tex1919
-rw-r--r--macros/plain/contrib/zztex/tex/zzmathv3.tex123
-rw-r--r--macros/plain/contrib/zztex/tex/zzmathv4.tex129
-rw-r--r--macros/plain/contrib/zztex/tex/zzmathv5.tex129
-rw-r--r--macros/plain/contrib/zztex/tex/zzmathv6.tex180
-rw-r--r--macros/plain/contrib/zztex/tex/zzmerge.tex70
-rw-r--r--macros/plain/contrib/zztex/tex/zzmisc.tex292
-rw-r--r--macros/plain/contrib/zztex/tex/zzmtime.tex89
-rw-r--r--macros/plain/contrib/zztex/tex/zznewmath.tex93
-rw-r--r--macros/plain/contrib/zztex/tex/zznote.tex522
-rw-r--r--macros/plain/contrib/zztex/tex/zzoverlay.tex100
-rw-r--r--macros/plain/contrib/zztex/tex/zzpage.tex908
-rw-r--r--macros/plain/contrib/zztex/tex/zzplain.tex71
-rw-r--r--macros/plain/contrib/zztex/tex/zzprog.tex228
-rw-r--r--macros/plain/contrib/zztex/tex/zzps.tex251
-rw-r--r--macros/plain/contrib/zztex/tex/zzreg.tex437
-rw-r--r--macros/plain/contrib/zztex/tex/zzrunner.tex98
-rw-r--r--macros/plain/contrib/zztex/tex/zzsect.tex806
-rw-r--r--macros/plain/contrib/zztex/tex/zztabbing.tex266
-rw-r--r--macros/plain/contrib/zztex/tex/zztabularv1.tex465
-rw-r--r--macros/plain/contrib/zztex/tex/zztabularv2.tex512
-rw-r--r--macros/plain/contrib/zztex/tex/zztabularv3.tex771
-rw-r--r--macros/plain/contrib/zztex/tex/zztag.tex269
-rw-r--r--macros/plain/contrib/zztex/tex/zztex.tex196
-rw-r--r--macros/plain/contrib/zztex/tex/zztext.tex935
-rw-r--r--macros/plain/contrib/zztex/tex/zzttladj.tex78
-rw-r--r--macros/plain/contrib/zztex/tex/zztures.tex24
-rw-r--r--macros/plain/contrib/zztex/tex/zzver.tex1
-rw-r--r--macros/plain/contrib/zztex/tex/zzvmode.tex380
-rw-r--r--macros/plain/contrib/zztex/tex/zzxref.tex245
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl4
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb249
-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.xzbin2206332 -> 2207740 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/ChangeLog7
-rw-r--r--timestamp2
225 files changed, 28099 insertions, 3323 deletions
diff --git a/FILES.byname b/FILES.byname
index 3821122a73..08cda22a22 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/16 | 128083 | FILES.last07days
+2020/07/17 | 124359 | 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
@@ -163462,8 +163462,8 @@
2019/12/15 | 385518 | install/macros/latex/contrib/kvsetkeys.tds.zip
2020/06/29 | 63388 | install/macros/latex/contrib/l3backend.tds.zip
2020/06/04 | 790724 | install/macros/latex/contrib/l3build.tds.zip
-2020/06/18 | 4972833 | install/macros/latex/contrib/l3experimental.tds.zip
-2020/06/18 | 11898921 | install/macros/latex/contrib/l3kernel.tds.zip
+2020/07/17 | 4612615 | install/macros/latex/contrib/l3experimental.tds.zip
+2020/07/17 | 11907339 | install/macros/latex/contrib/l3kernel.tds.zip
2020/05/15 | 2170827 | install/macros/latex/contrib/l3packages.tds.zip
2015/03/29 | 573323 | install/macros/latex/contrib/lastpage.tds.zip
2009/09/02 | 556672 | install/macros/latex/contrib/layouts.tds.zip
@@ -193383,156 +193383,154 @@
2020/06/04 | 7246 | macros/latex/contrib/l3build/l3build-variables.lua
2020/06/04 | 1024 | macros/latex/contrib/l3build/README.md
2020/06/05 | 786681 | macros/latex/contrib/l3build.zip
-2020/06/18 | 4205 | macros/latex/contrib/l3experimental/CHANGELOG.md
-2020/06/18 | 17815 | macros/latex/contrib/l3experimental/l3benchmark.dtx
-2020/06/18 | 1564 | macros/latex/contrib/l3experimental/l3benchmark.ins
-2020/06/18 | 314598 | macros/latex/contrib/l3experimental/l3benchmark.pdf
-2020/06/18 | 18757 | macros/latex/contrib/l3experimental/l3cctab.dtx
-2020/06/18 | 1559 | macros/latex/contrib/l3experimental/l3cctab.ins
-2020/06/18 | 358686 | macros/latex/contrib/l3experimental/l3cctab.pdf
-2020/06/18 | 33207 | macros/latex/contrib/l3experimental/l3color.dtx
-2020/06/18 | 1547 | macros/latex/contrib/l3experimental/l3color.ins
-2020/06/18 | 350143 | macros/latex/contrib/l3experimental/l3color.pdf
-2020/06/18 | 4328 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
-2020/06/18 | 625280 | macros/latex/contrib/l3experimental/l3draw-code.pdf
-2020/06/18 | 1356 | macros/latex/contrib/l3experimental/l3draw-code.tex
-2020/06/18 | 41372 | macros/latex/contrib/l3experimental/l3draw.dtx
-2020/06/18 | 1912 | macros/latex/contrib/l3experimental/l3draw.ins
-2020/06/18 | 5667 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
-2020/06/18 | 32522 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
-2020/06/18 | 491676 | macros/latex/contrib/l3experimental/l3draw.pdf
-2020/06/18 | 31359 | macros/latex/contrib/l3experimental/l3draw-points.dtx
-2020/06/18 | 7488 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
-2020/06/18 | 20465 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
-2020/06/18 | 5374 | macros/latex/contrib/l3experimental/l3draw-state.dtx
-2020/06/18 | 9888 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
-2020/06/18 | 96863 | macros/latex/contrib/l3experimental/l3galley.dtx
-2020/06/18 | 386087 | macros/latex/contrib/l3experimental/l3galley.pdf
-2020/06/18 | 24896 | macros/latex/contrib/l3experimental/l3graphics.dtx
-2020/06/18 | 1559 | macros/latex/contrib/l3experimental/l3graphics.ins
-2020/06/18 | 363448 | macros/latex/contrib/l3experimental/l3graphics.pdf
-2020/06/18 | 278911 | macros/latex/contrib/l3experimental/l3pdf-code.pdf
-2020/06/18 | 1116 | macros/latex/contrib/l3experimental/l3pdf-code.tex
-2020/06/18 | 10574 | macros/latex/contrib/l3experimental/l3pdf.dtx
-2020/06/18 | 1536 | macros/latex/contrib/l3experimental/l3pdf.ins
-2020/06/18 | 351127 | macros/latex/contrib/l3experimental/l3pdf.pdf
-2020/06/18 | 31865 | macros/latex/contrib/l3experimental/l3str-format.dtx
-2020/06/18 | 345232 | macros/latex/contrib/l3experimental/l3str-format.pdf
-2020/06/18 | 1570 | macros/latex/contrib/l3experimental/l3str.ins
-2020/06/18 | 11409 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
-2020/06/18 | 1571 | macros/latex/contrib/l3experimental/l3sys-shell.ins
-2020/06/18 | 312062 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
-2020/06/18 | 4559 | macros/latex/contrib/l3experimental/README.md
-2020/06/18 | 35177 | macros/latex/contrib/l3experimental/xcoffins.dtx
-2020/06/18 | 1575 | macros/latex/contrib/l3experimental/xcoffins.ins
-2020/06/18 | 373229 | macros/latex/contrib/l3experimental/xcoffins.pdf
-2020/06/18 | 58435 | macros/latex/contrib/l3experimental/xgalley.dtx
-2020/06/18 | 1630 | macros/latex/contrib/l3experimental/xgalley.ins
-2020/06/18 | 286017 | macros/latex/contrib/l3experimental/xgalley.pdf
-2020/06/18 | 4929855 | macros/latex/contrib/l3experimental.zip
-2020/06/18 | 22995 | macros/latex/contrib/l3kernel/CHANGELOG.md
-2020/06/18 | 66624 | macros/latex/contrib/l3kernel/expl3.dtx
-2020/06/18 | 585320 | macros/latex/contrib/l3kernel/expl3.pdf
-2020/06/18 | 1545894 | macros/latex/contrib/l3kernel/interface3.pdf
-2020/06/18 | 1909 | macros/latex/contrib/l3kernel/interface3.tex
-2020/06/18 | 6236 | macros/latex/contrib/l3kernel/l3alloc.dtx
-2020/06/18 | 127491 | macros/latex/contrib/l3kernel/l3basics.dtx
-2020/06/18 | 19309 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
-2020/06/18 | 77128 | macros/latex/contrib/l3kernel/l3box.dtx
-2020/06/18 | 63152 | macros/latex/contrib/l3kernel/l3candidates.dtx
-2020/06/18 | 75550 | macros/latex/contrib/l3kernel/l3clist.dtx
-2020/06/18 | 85507 | macros/latex/contrib/l3kernel/l3coffins.dtx
-2020/06/18 | 5621 | macros/latex/contrib/l3kernel/l3color-base.dtx
-2020/06/18 | 43039 | macros/latex/contrib/l3kernel/l3debug.dtx
-2020/06/18 | 39596 | macros/latex/contrib/l3kernel/l3deprecation.dtx
-2020/06/18 | 149136 | macros/latex/contrib/l3kernel/l3doc.dtx
-2020/06/18 | 9772 | macros/latex/contrib/l3kernel/l3docstrip.dtx
-2020/06/18 | 263622 | macros/latex/contrib/l3kernel/l3docstrip.pdf
-2020/06/18 | 107730 | macros/latex/contrib/l3kernel/l3expan.dtx
-2020/06/18 | 128590 | macros/latex/contrib/l3kernel/l3file.dtx
-2020/06/18 | 15708 | macros/latex/contrib/l3kernel/l3final.dtx
-2020/06/18 | 9450 | macros/latex/contrib/l3kernel/l3flag.dtx
-2020/06/18 | 5742 | macros/latex/contrib/l3kernel/l3format.ins
-2020/06/18 | 11826 | macros/latex/contrib/l3kernel/l3fparray.dtx
-2020/06/18 | 6970 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
-2020/06/18 | 47688 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
-2020/06/18 | 84830 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
-2020/06/18 | 19667 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
-2020/06/18 | 70325 | macros/latex/contrib/l3kernel/l3fp.dtx
-2020/06/18 | 49400 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
-2020/06/18 | 51073 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
-2020/06/18 | 23121 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
-2020/06/18 | 105768 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
-2020/06/18 | 25753 | macros/latex/contrib/l3kernel/l3fp-random.dtx
-2020/06/18 | 18605 | macros/latex/contrib/l3kernel/l3fp-round.dtx
-2020/06/18 | 12979 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
-2020/06/18 | 73859 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
-2020/06/18 | 6116 | macros/latex/contrib/l3kernel/l3.ins
-2020/06/18 | 19693 | macros/latex/contrib/l3kernel/l3intarray.dtx
-2020/06/18 | 89264 | macros/latex/contrib/l3kernel/l3int.dtx
-2020/06/18 | 24761 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
-2020/06/18 | 110613 | macros/latex/contrib/l3kernel/l3keys.dtx
-2020/06/18 | 2484 | macros/latex/contrib/l3kernel/l3legacy.dtx
-2020/06/18 | 17998 | macros/latex/contrib/l3kernel/l3luatex.dtx
-2020/06/18 | 76289 | macros/latex/contrib/l3kernel/l3msg.dtx
-2020/06/18 | 113189 | macros/latex/contrib/l3kernel/l3names.dtx
-2020/06/18 | 113529 | macros/latex/contrib/l3kernel/l3news01.pdf
-2020/06/18 | 4935 | macros/latex/contrib/l3kernel/l3news01.tex
-2020/06/18 | 140776 | macros/latex/contrib/l3kernel/l3news02.pdf
-2020/06/18 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
-2020/06/18 | 144784 | macros/latex/contrib/l3kernel/l3news03.pdf
-2020/06/18 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
-2020/06/18 | 107117 | macros/latex/contrib/l3kernel/l3news04.pdf
-2020/06/18 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
-2020/06/18 | 105090 | macros/latex/contrib/l3kernel/l3news05.pdf
-2020/06/18 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
-2020/06/18 | 140797 | macros/latex/contrib/l3kernel/l3news06.pdf
-2020/06/18 | 6431 | macros/latex/contrib/l3kernel/l3news06.tex
-2020/06/18 | 119092 | macros/latex/contrib/l3kernel/l3news07.pdf
-2020/06/18 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
-2020/06/18 | 152413 | macros/latex/contrib/l3kernel/l3news08.pdf
-2020/06/18 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
-2020/06/18 | 235323 | macros/latex/contrib/l3kernel/l3news09.pdf
-2020/06/18 | 107379 | macros/latex/contrib/l3kernel/l3news09.tex
-2020/06/18 | 147096 | macros/latex/contrib/l3kernel/l3news10.pdf
-2020/06/18 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
-2020/06/18 | 165956 | macros/latex/contrib/l3kernel/l3news11.pdf
-2020/06/18 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
-2020/06/18 | 199153 | macros/latex/contrib/l3kernel/l3news12.pdf
-2020/06/18 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
-2020/06/18 | 379248 | macros/latex/contrib/l3kernel/l3news.pdf
-2020/06/18 | 4891 | macros/latex/contrib/l3kernel/l3news.tex
-2020/06/18 | 34235 | macros/latex/contrib/l3kernel/l3prefixes.csv
-2020/06/18 | 75645 | macros/latex/contrib/l3kernel/l3prefixes.pdf
-2020/06/18 | 2817 | macros/latex/contrib/l3kernel/l3prefixes.tex
-2020/06/18 | 65012 | macros/latex/contrib/l3kernel/l3prg.dtx
-2020/06/18 | 50460 | macros/latex/contrib/l3kernel/l3prop.dtx
-2020/06/18 | 35845 | macros/latex/contrib/l3kernel/l3quark.dtx
-2020/06/18 | 251933 | macros/latex/contrib/l3kernel/l3regex.dtx
-2020/06/18 | 85028 | macros/latex/contrib/l3kernel/l3seq.dtx
-2020/06/18 | 76514 | macros/latex/contrib/l3kernel/l3skip.dtx
-2020/06/18 | 41238 | macros/latex/contrib/l3kernel/l3sort.dtx
-2020/06/18 | 112771 | macros/latex/contrib/l3kernel/l3str-convert.dtx
-2020/06/18 | 74118 | macros/latex/contrib/l3kernel/l3str.dtx
-2020/06/18 | 280369 | macros/latex/contrib/l3kernel/l3styleguide.pdf
-2020/06/18 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
-2020/06/18 | 228663 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
-2020/06/18 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
-2020/06/18 | 26601 | macros/latex/contrib/l3kernel/l3sys.dtx
-2020/06/18 | 186883 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
-2020/06/18 | 1642 | macros/latex/contrib/l3kernel/l3term-glossary.tex
-2020/06/18 | 51980 | macros/latex/contrib/l3kernel/l3text-case.dtx
-2020/06/18 | 34930 | macros/latex/contrib/l3kernel/l3text.dtx
-2020/06/18 | 20928 | macros/latex/contrib/l3kernel/l3text-purify.dtx
-2020/06/18 | 40709 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
-2020/06/18 | 133680 | macros/latex/contrib/l3kernel/l3tl.dtx
-2020/06/18 | 109988 | macros/latex/contrib/l3kernel/l3token.dtx
-2020/06/18 | 9656 | macros/latex/contrib/l3kernel/l3unicode.dtx
-2020/06/18 | 2997 | macros/latex/contrib/l3kernel/README.md
-2020/06/18 | 21189 | macros/latex/contrib/l3kernel/source3body.tex
-2020/06/18 | 5904224 | macros/latex/contrib/l3kernel/source3.pdf
-2020/06/18 | 2153 | macros/latex/contrib/l3kernel/source3.tex
-2020/06/18 | 11675462 | macros/latex/contrib/l3kernel.zip
+2020/07/17 | 4442 | macros/latex/contrib/l3experimental/CHANGELOG.md
+2020/07/17 | 17815 | macros/latex/contrib/l3experimental/l3benchmark.dtx
+2020/07/17 | 1564 | macros/latex/contrib/l3experimental/l3benchmark.ins
+2020/07/17 | 314158 | macros/latex/contrib/l3experimental/l3benchmark.pdf
+2020/07/17 | 45383 | macros/latex/contrib/l3experimental/l3color.dtx
+2020/07/17 | 1547 | macros/latex/contrib/l3experimental/l3color.ins
+2020/07/17 | 356022 | macros/latex/contrib/l3experimental/l3color.pdf
+2020/07/17 | 4328 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+2020/07/17 | 625002 | macros/latex/contrib/l3experimental/l3draw-code.pdf
+2020/07/17 | 1356 | macros/latex/contrib/l3experimental/l3draw-code.tex
+2020/07/17 | 41372 | macros/latex/contrib/l3experimental/l3draw.dtx
+2020/07/17 | 1912 | macros/latex/contrib/l3experimental/l3draw.ins
+2020/07/17 | 5667 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
+2020/07/17 | 32522 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
+2020/07/17 | 491247 | macros/latex/contrib/l3experimental/l3draw.pdf
+2020/07/17 | 31359 | macros/latex/contrib/l3experimental/l3draw-points.dtx
+2020/07/17 | 7488 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+2020/07/17 | 20465 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+2020/07/17 | 5388 | macros/latex/contrib/l3experimental/l3draw-state.dtx
+2020/07/17 | 9888 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+2020/07/17 | 96863 | macros/latex/contrib/l3experimental/l3galley.dtx
+2020/07/17 | 385667 | macros/latex/contrib/l3experimental/l3galley.pdf
+2020/07/17 | 24896 | macros/latex/contrib/l3experimental/l3graphics.dtx
+2020/07/17 | 1559 | macros/latex/contrib/l3experimental/l3graphics.ins
+2020/07/17 | 363017 | macros/latex/contrib/l3experimental/l3graphics.pdf
+2020/07/17 | 278541 | macros/latex/contrib/l3experimental/l3pdf-code.pdf
+2020/07/17 | 1116 | macros/latex/contrib/l3experimental/l3pdf-code.tex
+2020/07/17 | 10574 | macros/latex/contrib/l3experimental/l3pdf.dtx
+2020/07/17 | 1536 | macros/latex/contrib/l3experimental/l3pdf.ins
+2020/07/17 | 350700 | macros/latex/contrib/l3experimental/l3pdf.pdf
+2020/07/17 | 31865 | macros/latex/contrib/l3experimental/l3str-format.dtx
+2020/07/17 | 344797 | macros/latex/contrib/l3experimental/l3str-format.pdf
+2020/07/17 | 1570 | macros/latex/contrib/l3experimental/l3str.ins
+2020/07/17 | 11409 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
+2020/07/17 | 1571 | macros/latex/contrib/l3experimental/l3sys-shell.ins
+2020/07/17 | 311621 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
+2020/07/17 | 4333 | macros/latex/contrib/l3experimental/README.md
+2020/07/17 | 35177 | macros/latex/contrib/l3experimental/xcoffins.dtx
+2020/07/17 | 1575 | macros/latex/contrib/l3experimental/xcoffins.ins
+2020/07/17 | 372787 | macros/latex/contrib/l3experimental/xcoffins.pdf
+2020/07/17 | 58435 | macros/latex/contrib/l3experimental/xgalley.dtx
+2020/07/17 | 1630 | macros/latex/contrib/l3experimental/xgalley.ins
+2020/07/17 | 285577 | macros/latex/contrib/l3experimental/xgalley.pdf
+2020/07/17 | 4571152 | macros/latex/contrib/l3experimental.zip
+2020/07/17 | 23632 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2020/07/17 | 66663 | macros/latex/contrib/l3kernel/expl3.dtx
+2020/07/17 | 584938 | macros/latex/contrib/l3kernel/expl3.pdf
+2020/07/17 | 1555993 | macros/latex/contrib/l3kernel/interface3.pdf
+2020/07/17 | 1909 | macros/latex/contrib/l3kernel/interface3.tex
+2020/07/17 | 6236 | macros/latex/contrib/l3kernel/l3alloc.dtx
+2020/07/17 | 127491 | macros/latex/contrib/l3kernel/l3basics.dtx
+2020/07/17 | 19309 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
+2020/07/17 | 77128 | macros/latex/contrib/l3kernel/l3box.dtx
+2020/07/17 | 61752 | macros/latex/contrib/l3kernel/l3candidates.dtx
+2020/07/17 | 31232 | macros/latex/contrib/l3kernel/l3cctab.dtx
+2020/07/17 | 75550 | macros/latex/contrib/l3kernel/l3clist.dtx
+2020/07/17 | 85345 | macros/latex/contrib/l3kernel/l3coffins.dtx
+2020/07/17 | 5621 | macros/latex/contrib/l3kernel/l3color-base.dtx
+2020/07/17 | 43173 | macros/latex/contrib/l3kernel/l3debug.dtx
+2020/07/17 | 29768 | macros/latex/contrib/l3kernel/l3deprecation.dtx
+2020/07/17 | 149121 | macros/latex/contrib/l3kernel/l3doc.dtx
+2020/07/17 | 9772 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2020/07/17 | 263178 | macros/latex/contrib/l3kernel/l3docstrip.pdf
+2020/07/17 | 107730 | macros/latex/contrib/l3kernel/l3expan.dtx
+2020/07/17 | 131161 | macros/latex/contrib/l3kernel/l3file.dtx
+2020/07/17 | 15708 | macros/latex/contrib/l3kernel/l3final.dtx
+2020/07/17 | 9450 | macros/latex/contrib/l3kernel/l3flag.dtx
+2020/07/17 | 5783 | macros/latex/contrib/l3kernel/l3format.ins
+2020/07/17 | 11826 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2020/07/17 | 6970 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2020/07/17 | 47688 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2020/07/17 | 84830 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2020/07/17 | 19667 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2020/07/17 | 70325 | macros/latex/contrib/l3kernel/l3fp.dtx
+2020/07/17 | 49400 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2020/07/17 | 51073 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
+2020/07/17 | 23121 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2020/07/17 | 105797 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
+2020/07/17 | 25753 | macros/latex/contrib/l3kernel/l3fp-random.dtx
+2020/07/17 | 18605 | macros/latex/contrib/l3kernel/l3fp-round.dtx
+2020/07/17 | 12979 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
+2020/07/17 | 73859 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2020/07/17 | 6158 | macros/latex/contrib/l3kernel/l3.ins
+2020/07/17 | 19694 | macros/latex/contrib/l3kernel/l3intarray.dtx
+2020/07/17 | 89264 | macros/latex/contrib/l3kernel/l3int.dtx
+2020/07/17 | 26131 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+2020/07/17 | 110613 | macros/latex/contrib/l3kernel/l3keys.dtx
+2020/07/17 | 2484 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2020/07/17 | 17998 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2020/07/17 | 77671 | macros/latex/contrib/l3kernel/l3msg.dtx
+2020/07/17 | 76342 | macros/latex/contrib/l3kernel/l3names.dtx
+2020/07/17 | 113527 | macros/latex/contrib/l3kernel/l3news01.pdf
+2020/07/17 | 4935 | macros/latex/contrib/l3kernel/l3news01.tex
+2020/07/17 | 140776 | macros/latex/contrib/l3kernel/l3news02.pdf
+2020/07/17 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
+2020/07/17 | 144785 | macros/latex/contrib/l3kernel/l3news03.pdf
+2020/07/17 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
+2020/07/17 | 107115 | macros/latex/contrib/l3kernel/l3news04.pdf
+2020/07/17 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
+2020/07/17 | 105090 | macros/latex/contrib/l3kernel/l3news05.pdf
+2020/07/17 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
+2020/07/17 | 140795 | macros/latex/contrib/l3kernel/l3news06.pdf
+2020/07/17 | 6431 | macros/latex/contrib/l3kernel/l3news06.tex
+2020/07/17 | 119094 | macros/latex/contrib/l3kernel/l3news07.pdf
+2020/07/17 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2020/07/17 | 152413 | macros/latex/contrib/l3kernel/l3news08.pdf
+2020/07/17 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2020/07/17 | 235322 | macros/latex/contrib/l3kernel/l3news09.pdf
+2020/07/17 | 107379 | macros/latex/contrib/l3kernel/l3news09.tex
+2020/07/17 | 147097 | macros/latex/contrib/l3kernel/l3news10.pdf
+2020/07/17 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
+2020/07/17 | 165946 | macros/latex/contrib/l3kernel/l3news11.pdf
+2020/07/17 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2020/07/17 | 199139 | macros/latex/contrib/l3kernel/l3news12.pdf
+2020/07/17 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2020/07/17 | 379235 | macros/latex/contrib/l3kernel/l3news.pdf
+2020/07/17 | 4891 | macros/latex/contrib/l3kernel/l3news.tex
+2020/07/17 | 35018 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2020/07/17 | 75852 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2020/07/17 | 2817 | macros/latex/contrib/l3kernel/l3prefixes.tex
+2020/07/17 | 65012 | macros/latex/contrib/l3kernel/l3prg.dtx
+2020/07/17 | 51039 | macros/latex/contrib/l3kernel/l3prop.dtx
+2020/07/17 | 35845 | macros/latex/contrib/l3kernel/l3quark.dtx
+2020/07/17 | 251937 | macros/latex/contrib/l3kernel/l3regex.dtx
+2020/07/17 | 87765 | macros/latex/contrib/l3kernel/l3seq.dtx
+2020/07/17 | 76514 | macros/latex/contrib/l3kernel/l3skip.dtx
+2020/07/17 | 41238 | macros/latex/contrib/l3kernel/l3sort.dtx
+2020/07/17 | 112771 | macros/latex/contrib/l3kernel/l3str-convert.dtx
+2020/07/17 | 74324 | macros/latex/contrib/l3kernel/l3str.dtx
+2020/07/17 | 279956 | macros/latex/contrib/l3kernel/l3styleguide.pdf
+2020/07/17 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2020/07/17 | 228250 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+2020/07/17 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
+2020/07/17 | 26601 | macros/latex/contrib/l3kernel/l3sys.dtx
+2020/07/17 | 217628 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
+2020/07/17 | 6450 | macros/latex/contrib/l3kernel/l3term-glossary.tex
+2020/07/17 | 51980 | macros/latex/contrib/l3kernel/l3text-case.dtx
+2020/07/17 | 34930 | macros/latex/contrib/l3kernel/l3text.dtx
+2020/07/17 | 20928 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2020/07/17 | 40709 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+2020/07/17 | 135191 | macros/latex/contrib/l3kernel/l3tl.dtx
+2020/07/17 | 110804 | macros/latex/contrib/l3kernel/l3token.dtx
+2020/07/17 | 9656 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2020/07/17 | 2997 | macros/latex/contrib/l3kernel/README.md
+2020/07/17 | 21212 | macros/latex/contrib/l3kernel/source3body.tex
+2020/07/17 | 5865524 | macros/latex/contrib/l3kernel/source3.pdf
+2020/07/17 | 2153 | macros/latex/contrib/l3kernel/source3.tex
+2020/07/17 | 11687761 | macros/latex/contrib/l3kernel.zip
2020/05/15 | 3423 | macros/latex/contrib/l3packages/CHANGELOG.md
2019/11/15 | 1444 | macros/latex/contrib/l3packages/l3keys2e-demo.tex
2020/05/15 | 11613 | macros/latex/contrib/l3packages/l3keys2e.dtx
@@ -205061,31 +205059,30 @@
2005/04/24 | 228 | macros/latex/contrib/thmbox/thmbox.ins
2005/04/25 | 117069 | macros/latex/contrib/thmbox/thmbox.pdf
2005/04/25 | 103692 | macros/latex/contrib/thmbox.zip
-2019/07/31 | 3748 | macros/latex/contrib/thmtools/aliasctr.dtx
-2019/12/22 | 126 | macros/latex/contrib/thmtools/changes.txt
-2010/05/28 | 19106 | macros/latex/contrib/thmtools/COPYING
-2010/05/01 | 1955 | macros/latex/contrib/thmtools/parseargs.dtx
-2019/12/22 | 746 | macros/latex/contrib/thmtools/README
-2011/03/21 | 4415 | macros/latex/contrib/thmtools/thm-amsthm.dtx
-2012/07/22 | 3138 | macros/latex/contrib/thmtools/thm-autoref.dtx
-2010/06/07 | 1267 | macros/latex/contrib/thmtools/thm-beamer.dtx
-2011/11/27 | 694 | macros/latex/contrib/thmtools/thmdef-mdframed.dtx
-2010/10/08 | 4326 | macros/latex/contrib/thmtools/thmdef-shaded.dtx
-2010/05/23 | 1122 | macros/latex/contrib/thmtools/thmdef-thmbox.dtx
-2019/12/22 | 13386 | macros/latex/contrib/thmtools/thm-kv.dtx
-2019/07/31 | 6899 | macros/latex/contrib/thmtools/thm-listof.dtx
-2010/06/26 | 2514 | macros/latex/contrib/thmtools/thm-llncs.dtx
-2011/03/21 | 3262 | macros/latex/contrib/thmtools/thm-ntheorem.dtx
-2019/07/31 | 8489 | macros/latex/contrib/thmtools/thm-patch.dtx
-2011/01/17 | 11774 | macros/latex/contrib/thmtools/thm-restate.dtx
-2014/04/21 | 2026 | macros/latex/contrib/thmtools/thmtools.dtx
-2019/07/31 | 2378 | macros/latex/contrib/thmtools/thmtools.ins
-2011/11/27 | 41283 | macros/latex/contrib/thmtools/thmtools-manual.tex
-2014/04/21 | 225947 | macros/latex/contrib/thmtools/thmtools.pdf
-2010/05/13 | 70 | macros/latex/contrib/thmtools/TODO
-2010/05/01 | 5490 | macros/latex/contrib/thmtools/unique.dtx
-2019/12/22 | 120 | macros/latex/contrib/thmtools/VERSION.tex
-2019/12/23 | 269914 | macros/latex/contrib/thmtools.zip
+2020/07/16 | 320 | macros/latex/contrib/thmtools/doc/changes.txt
+2020/07/16 | 19106 | macros/latex/contrib/thmtools/doc/COPYING
+2020/07/16 | 227619 | macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
+2020/07/16 | 41341 | macros/latex/contrib/thmtools/doc/thmtools-manual.tex
+2020/07/16 | 29 | macros/latex/contrib/thmtools/doc/VERSION.tex
+2020/07/16 | 799 | macros/latex/contrib/thmtools/README.md
+2020/07/16 | 3849 | macros/latex/contrib/thmtools/source/aliasctr.dtx
+2020/07/16 | 2046 | macros/latex/contrib/thmtools/source/parseargs.dtx
+2020/07/16 | 4679 | macros/latex/contrib/thmtools/source/thm-amsthm.dtx
+2020/07/16 | 3229 | macros/latex/contrib/thmtools/source/thm-autoref.dtx
+2020/07/16 | 1531 | macros/latex/contrib/thmtools/source/thm-beamer.dtx
+2020/07/16 | 958 | macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
+2020/07/16 | 4534 | macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
+2020/07/16 | 1382 | macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
+2020/07/16 | 13477 | macros/latex/contrib/thmtools/source/thm-kv.dtx
+2020/07/16 | 6990 | macros/latex/contrib/thmtools/source/thm-listof.dtx
+2020/07/16 | 2778 | macros/latex/contrib/thmtools/source/thm-llncs.dtx
+2020/07/16 | 3526 | macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
+2020/07/16 | 8580 | macros/latex/contrib/thmtools/source/thm-patch.dtx
+2020/07/16 | 12064 | macros/latex/contrib/thmtools/source/thm-restate.dtx
+2020/07/16 | 2117 | macros/latex/contrib/thmtools/source/thmtools.dtx
+2020/07/16 | 2500 | macros/latex/contrib/thmtools/source/thmtools.ins
+2020/07/16 | 5579 | macros/latex/contrib/thmtools/source/unique.dtx
+2020/07/17 | 273835 | macros/latex/contrib/thmtools.zip
2020/01/17 | 8120 | macros/latex/contrib/thorshammer/action-sequences.zip
2020/01/13 | 49921 | macros/latex/contrib/thorshammer/container.pdf
2020/01/16 | 345357 | macros/latex/contrib/thorshammer/docs/install-action-seq.pdf
@@ -212608,6 +212605,65 @@
2017/11/13 | 451 | macros/plain/contrib/xii/README.txt
1998/12/11 | 767 | macros/plain/contrib/xii/xii.tex
2017/11/14 | 1183 | macros/plain/contrib/xii.zip
+2016/05/12 | 9522 | macros/plain/contrib/zztex/doc/zzbuiltin.dat
+2018/08/05 | 56207 | macros/plain/contrib/zztex/doc/zzdetails.dat
+2018/02/16 | 78474 | macros/plain/contrib/zztex/doc/zzphrase.dat
+2016/05/10 | 45026 | macros/plain/contrib/zztex/doc/zzplain.dat
+2020/07/16 | 820 | macros/plain/contrib/zztex/README
+2020/07/15 | 20747 | macros/plain/contrib/zztex/tex/zzart.tex
+2020/07/15 | 14090 | macros/plain/contrib/zztex/tex/zzbiblio.tex
+2020/07/15 | 8085 | macros/plain/contrib/zztex/tex/zzbibtex.tex
+2020/07/15 | 11637 | macros/plain/contrib/zztex/tex/zzblock.tex
+2020/07/15 | 404 | macros/plain/contrib/zztex/tex/zzcmmath.tex
+2020/07/15 | 5061 | macros/plain/contrib/zztex/tex/zzcomenc.tex
+2020/07/15 | 3853 | macros/plain/contrib/zztex/tex/zzdiv.tex
+2020/07/15 | 19372 | macros/plain/contrib/zztex/tex/zzdoc.tex
+2020/07/15 | 3685 | macros/plain/contrib/zztex/tex/zzerror.tex
+2020/07/15 | 41253 | macros/plain/contrib/zztex/tex/zzfloat.tex
+2020/07/15 | 14105 | macros/plain/contrib/zztex/tex/zzfont.tex
+2020/07/15 | 8240 | macros/plain/contrib/zztex/tex/zzfront.tex
+2020/07/15 | 14187 | macros/plain/contrib/zztex/tex/zzhelp.tex
+2020/07/15 | 7275 | macros/plain/contrib/zztex/tex/zzhmodeb.tex
+2020/07/15 | 26242 | macros/plain/contrib/zztex/tex/zzhmode.tex
+2020/07/15 | 5108 | macros/plain/contrib/zztex/tex/zzhyper.tex
+2020/07/15 | 4623 | macros/plain/contrib/zztex/tex/zzhyph.tex
+2020/07/15 | 12839 | macros/plain/contrib/zztex/tex/zzindexv1.tex
+2020/07/15 | 14465 | macros/plain/contrib/zztex/tex/zzindexv2.tex
+2020/07/15 | 2239 | macros/plain/contrib/zztex/tex/zzio.tex
+2020/07/15 | 5269 | macros/plain/contrib/zztex/tex/zzlist.tex
+2020/07/15 | 3312 | macros/plain/contrib/zztex/tex/zzltrspc.tex
+2020/07/15 | 5788 | macros/plain/contrib/zztex/tex/zzlucida.tex
+2020/07/15 | 68836 | macros/plain/contrib/zztex/tex/zzmath.tex
+2020/07/15 | 3399 | macros/plain/contrib/zztex/tex/zzmathv3.tex
+2020/07/15 | 3495 | macros/plain/contrib/zztex/tex/zzmathv4.tex
+2020/07/15 | 3484 | macros/plain/contrib/zztex/tex/zzmathv5.tex
+2020/07/15 | 5516 | macros/plain/contrib/zztex/tex/zzmathv6.tex
+2020/07/15 | 1548 | macros/plain/contrib/zztex/tex/zzmerge.tex
+2020/07/15 | 7776 | macros/plain/contrib/zztex/tex/zzmisc.tex
+2020/07/15 | 3570 | macros/plain/contrib/zztex/tex/zzmtime.tex
+2020/07/15 | 2415 | macros/plain/contrib/zztex/tex/zznewmath.tex
+2020/07/15 | 17800 | macros/plain/contrib/zztex/tex/zznote.tex
+2020/07/15 | 2755 | macros/plain/contrib/zztex/tex/zzoverlay.tex
+2020/07/15 | 27998 | macros/plain/contrib/zztex/tex/zzpage.tex
+2020/07/15 | 1628 | macros/plain/contrib/zztex/tex/zzplain.tex
+2020/07/15 | 7543 | macros/plain/contrib/zztex/tex/zzprog.tex
+2020/07/15 | 6795 | macros/plain/contrib/zztex/tex/zzps.tex
+2020/07/15 | 13074 | macros/plain/contrib/zztex/tex/zzreg.tex
+2020/07/15 | 3201 | macros/plain/contrib/zztex/tex/zzrunner.tex
+2020/07/15 | 29604 | macros/plain/contrib/zztex/tex/zzsect.tex
+2020/07/15 | 8072 | macros/plain/contrib/zztex/tex/zztabbing.tex
+2020/07/15 | 13289 | macros/plain/contrib/zztex/tex/zztabularv1.tex
+2020/07/15 | 14925 | macros/plain/contrib/zztex/tex/zztabularv2.tex
+2020/07/15 | 27054 | macros/plain/contrib/zztex/tex/zztabularv3.tex
+2020/07/15 | 8033 | macros/plain/contrib/zztex/tex/zztag.tex
+2020/07/15 | 5993 | macros/plain/contrib/zztex/tex/zztex.tex
+2020/07/15 | 31549 | macros/plain/contrib/zztex/tex/zztext.tex
+2020/07/15 | 2788 | macros/plain/contrib/zztex/tex/zzttladj.tex
+2020/07/15 | 771 | macros/plain/contrib/zztex/tex/zztures.tex
+2017/10/24 | 26 | macros/plain/contrib/zztex/tex/zzver.tex
+2020/07/15 | 11801 | macros/plain/contrib/zztex/tex/zzvmode.tex
+2020/07/15 | 7724 | macros/plain/contrib/zztex/tex/zzxref.tex
+2020/07/17 | 214002 | macros/plain/contrib/zztex.zip
2020/03/03 | 13798 | macros/plain/graphics/autopict.sty
2020/03/03 | 530 | macros/plain/graphics/color.tex
2020/03/03 | 71 | macros/plain/graphics/exmplcol.tex
@@ -256395,7 +256451,7 @@
2020/07/13 | 524 | systems/texlive/tlnet/archive/collection-games.r55821.tar.xz
2020/03/04 | 584 | systems/texlive/tlnet/archive/collection-humanities.r54074.tar.xz
2020/06/10 | 436 | systems/texlive/tlnet/archive/collection-langarabic.r55495.tar.xz
-2020/03/04 | 508 | systems/texlive/tlnet/archive/collection-langchinese.r54074.tar.xz
+2020/07/17 | 520 | systems/texlive/tlnet/archive/collection-langchinese.r55849.tar.xz
2020/03/09 | 568 | systems/texlive/tlnet/archive/collection-langcjk.r54191.tar.xz
2020/03/04 | 608 | systems/texlive/tlnet/archive/collection-langcyrillic.r54074.tar.xz
2020/03/04 | 372 | systems/texlive/tlnet/archive/collection-langczechslovak.r54074.tar.xz
@@ -259650,6 +259706,8 @@
2019/02/28 | 348 | systems/texlive/tlnet/archive/installfont.x86_64-linuxmusl.r46840.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/installfont.x86_64-linux.r19743.tar.xz
2019/02/28 | 344 | systems/texlive/tlnet/archive/installfont.x86_64-solaris.r19743.tar.xz
+2020/07/17 | 723568 | systems/texlive/tlnet/archive/install-latex-guide-zh-cn.doc.r55849.tar.xz
+2020/07/17 | 568 | systems/texlive/tlnet/archive/install-latex-guide-zh-cn.r55849.tar.xz
2019/12/18 | 423196 | systems/texlive/tlnet/archive/intcalc.doc.r53168.tar.xz
2019/12/18 | 5436 | systems/texlive/tlnet/archive/intcalc.r53168.tar.xz
2019/12/18 | 12576 | systems/texlive/tlnet/archive/intcalc.source.r53168.tar.xz
@@ -259700,10 +259758,10 @@
2019/02/28 | 422664 | systems/texlive/tlnet/archive/isodate.doc.r16613.tar.xz
2019/02/28 | 7208 | systems/texlive/tlnet/archive/isodate.r16613.tar.xz
2019/02/28 | 21048 | systems/texlive/tlnet/archive/isodate.source.r16613.tar.xz
-2019/02/28 | 1499548 | systems/texlive/tlnet/archive/isodoc.doc.r47868.tar.xz
+2020/07/17 | 837972 | systems/texlive/tlnet/archive/isodoc.doc.r55850.tar.xz
2019/02/28 | 812136 | systems/texlive/tlnet/archive/iso.doc.r15878.tar.xz
-2019/02/28 | 9572 | systems/texlive/tlnet/archive/isodoc.r47868.tar.xz
-2019/02/28 | 1102132 | systems/texlive/tlnet/archive/isodoc.source.r47868.tar.xz
+2020/07/17 | 9300 | systems/texlive/tlnet/archive/isodoc.r55850.tar.xz
+2020/07/17 | 472000 | systems/texlive/tlnet/archive/isodoc.source.r55850.tar.xz
2019/02/28 | 643076 | systems/texlive/tlnet/archive/isomath.doc.r27654.tar.xz
2019/02/28 | 4648 | systems/texlive/tlnet/archive/isomath.r27654.tar.xz
2019/02/28 | 202564 | systems/texlive/tlnet/archive/isonums.doc.r17362.tar.xz
@@ -262014,9 +262072,9 @@
2019/02/28 | 7064 | systems/texlive/tlnet/archive/niceframe.source.r36086.tar.xz
2019/02/28 | 604 | systems/texlive/tlnet/archive/niceframe-type1.doc.r44671.tar.xz
2019/02/28 | 276328 | systems/texlive/tlnet/archive/niceframe-type1.r44671.tar.xz
-2020/07/01 | 1237204 | systems/texlive/tlnet/archive/nicematrix.doc.r55710.tar.xz
-2020/07/01 | 19040 | systems/texlive/tlnet/archive/nicematrix.r55710.tar.xz
-2020/07/01 | 67212 | systems/texlive/tlnet/archive/nicematrix.source.r55710.tar.xz
+2020/07/17 | 1323696 | systems/texlive/tlnet/archive/nicematrix.doc.r55851.tar.xz
+2020/07/17 | 20612 | systems/texlive/tlnet/archive/nicematrix.r55851.tar.xz
+2020/07/17 | 73748 | systems/texlive/tlnet/archive/nicematrix.source.r55851.tar.xz
2019/02/28 | 2473836 | systems/texlive/tlnet/archive/nicetext.doc.r38914.tar.xz
2019/02/28 | 54740 | systems/texlive/tlnet/archive/nicetext.r38914.tar.xz
2019/02/28 | 28908 | systems/texlive/tlnet/archive/nicetext.source.r38914.tar.xz
@@ -264800,13 +264858,13 @@
2020/03/02 | 109508 | systems/texlive/tlnet/archive/tex4ht.amd64-freebsd.r53999.tar.xz
2020/03/02 | 87376 | systems/texlive/tlnet/archive/tex4ht.amd64-netbsd.r53995.tar.xz
2020/03/04 | 72564 | systems/texlive/tlnet/archive/tex4ht.armhf-linux.r54033.tar.xz
-2020/07/14 | 135724 | systems/texlive/tlnet/archive/tex4ht.doc.r55825.tar.xz
+2020/07/17 | 135724 | systems/texlive/tlnet/archive/tex4ht.doc.r55848.tar.xz
2020/06/02 | 51092 | systems/texlive/tlnet/archive/tex4ht.i386-cygwin.r55384.tar.xz
2020/03/02 | 90676 | systems/texlive/tlnet/archive/tex4ht.i386-freebsd.r53999.tar.xz
2020/03/02 | 89232 | systems/texlive/tlnet/archive/tex4ht.i386-linux.r53999.tar.xz
2020/03/06 | 76276 | systems/texlive/tlnet/archive/tex4ht.i386-netbsd.r54104.tar.xz
2020/03/02 | 83968 | systems/texlive/tlnet/archive/tex4ht.i386-solaris.r53999.tar.xz
-2020/07/14 | 864564 | systems/texlive/tlnet/archive/tex4ht.r55825.tar.xz
+2020/07/17 | 864740 | systems/texlive/tlnet/archive/tex4ht.r55848.tar.xz
2020/03/02 | 57708 | systems/texlive/tlnet/archive/tex4ht.win32.r53994.tar.xz
2020/06/02 | 57936 | systems/texlive/tlnet/archive/tex4ht.x86_64-cygwin.r55384.tar.xz
2020/03/02 | 85024 | systems/texlive/tlnet/archive/tex4ht.x86_64-darwinlegacy.r53999.tar.xz
@@ -265544,9 +265602,9 @@
2019/02/28 | 311568 | systems/texlive/tlnet/archive/tocbibind.doc.r20085.tar.xz
2019/02/28 | 2916 | systems/texlive/tlnet/archive/tocbibind.r20085.tar.xz
2019/02/28 | 12776 | systems/texlive/tlnet/archive/tocbibind.source.r20085.tar.xz
-2019/07/17 | 912000 | systems/texlive/tlnet/archive/tocdata.doc.r51654.tar.xz
-2019/07/17 | 4008 | systems/texlive/tlnet/archive/tocdata.r51654.tar.xz
-2019/07/17 | 12876 | systems/texlive/tlnet/archive/tocdata.source.r51654.tar.xz
+2020/07/17 | 915648 | systems/texlive/tlnet/archive/tocdata.doc.r55852.tar.xz
+2020/07/17 | 3352 | systems/texlive/tlnet/archive/tocdata.r55852.tar.xz
+2020/07/17 | 12280 | systems/texlive/tlnet/archive/tocdata.source.r55852.tar.xz
2020/01/11 | 496680 | systems/texlive/tlnet/archive/tocloft.doc.r53364.tar.xz
2020/01/11 | 6148 | systems/texlive/tlnet/archive/tocloft.r53364.tar.xz
2020/01/11 | 29068 | systems/texlive/tlnet/archive/tocloft.source.r53364.tar.xz
@@ -266705,16 +266763,16 @@
2020/01/24 | 138180 | systems/texlive/tlnet/archive/zxjatype.doc.r53500.tar.xz
2020/01/24 | 8760 | systems/texlive/tlnet/archive/zxjatype.r53500.tar.xz
2020/06/13 | 105829 | systems/texlive/tlnet/install-tl
-2020/07/16 | 5500744 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/16 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/17 | 5500776 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2020/05/31 | 4770 | systems/texlive/tlnet/install-tl-windows.bat
-2020/07/16 | 19383197 | systems/texlive/tlnet/install-tl-windows.exe
-2020/07/16 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/16 | 24269263 | systems/texlive/tlnet/install-tl.zip
-2020/07/16 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/17 | 19383196 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/17 | 24269263 | systems/texlive/tlnet/install-tl.zip
+2020/07/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/17 | 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
@@ -266770,12 +266828,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/16 | 16329134 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/16 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/17 | 16331392 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2020/05/13 | 86417 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2020/07/16 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/07/16 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/16 | 2204380 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/17 | 2206332 | 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
@@ -271253,7 +271311,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/16 | 540439 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/17 | 540439 | 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
@@ -272412,9 +272470,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/16 | 201650 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/07/16 | 1206860 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/16 | 1126498 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/17 | 201624 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/17 | 1206555 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/17 | 1126226 | 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
@@ -272568,192 +272626,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/16 | 541774 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/07/16 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/16 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/16 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/16 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/07/16 | 28619 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/07/16 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/16 | 29321 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/07/16 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
-2020/07/16 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
-2020/07/16 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/16 | 84389 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/07/16 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
-2020/07/16 | 65603 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/16 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/16 | 27038 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/16 | 30877 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/07/16 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/16 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/07/16 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
-2020/07/16 | 36308 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
-2020/07/16 | 72072 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/07/16 | 79198 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/16 | 203504 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/16 | 223961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/07/16 | 169762 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
-2020/07/16 | 184501 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
-2020/07/16 | 51921 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
-2020/07/16 | 58609 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/16 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/16 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/07/16 | 460275 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/16 | 460364 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/16 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/16 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/16 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/07/16 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/16 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
-2020/07/16 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/07/16 | 115821 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/07/16 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
-2020/07/16 | 1266024 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
-2020/07/16 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/07/16 | 95311 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/07/16 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/16 | 43305 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/16 | 48050 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
-2020/07/16 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/16 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/16 | 57185 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/16 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/16 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
-2020/07/16 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/07/16 | 73103 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/16 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/16 | 68819 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/07/16 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/07/16 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
-2020/07/16 | 281692 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/16 | 25475 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/16 | 28977 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
-2020/07/16 | 100973 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
-2020/07/16 | 117133 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/16 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/16 | 72603 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/16 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/16 | 113699 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/07/16 | 58972 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/16 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/07/16 | 462362 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/16 | 550401 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/16 | 141817 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/07/16 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/07/16 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/16 | 109017 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/07/16 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/07/16 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/16 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/16 | 29632 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
-2020/07/16 | 623383 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/16 | 676981 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/16 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/07/16 | 562947 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/16 | 544667 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/16 | 586875 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/16 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/16 | 102565 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/16 | 1751873 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2020/07/16 | 2028474 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/07/16 | 67273 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/07/16 | 73670 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/16 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/16 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
-2020/07/16 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
-2020/07/16 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
-2020/07/16 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/07/16 | 187111 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/07/16 | 269062 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/16 | 305169 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/07/16 | 96907 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/16 | 101910 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/07/16 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/07/16 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/07/16 | 170233 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/07/16 | 189217 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/07/16 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/16 | 179905 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/07/16 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/07/16 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/16 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/16 | 96516 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/16 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/16 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/07/16 | 57249 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/16 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/16 | 63352 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/07/16 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/16 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/16 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/16 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
-2020/07/16 | 210648 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/07/16 | 35337 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/16 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/16 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/16 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/16 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/07/16 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/07/16 | 187767 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/16 | 194052 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/07/16 | 207506 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/07/16 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/16 | 78146 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/07/16 | 87408 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
-2020/07/16 | 922568 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/07/16 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/16 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/07/16 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/16 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/16 | 36861 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/07/16 | 63503 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/16 | 71534 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
-2020/07/16 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/07/16 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
-2020/07/16 | 1193674 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/16 | 1327712 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
-2020/07/16 | 42065 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/07/16 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/16 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/16 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
-2020/07/16 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/16 | 82761 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/07/16 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
-2020/07/16 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/07/16 | 16018 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/16 | 17730 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/16 | 63496 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/07/16 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/07/16 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/07/16 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
-2020/07/16 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/16 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/16 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/07/16 | 104591 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/16 | 2534427 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/16 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/07/16 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/16 | 61819 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
-2020/07/16 | 33137 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/07/16 | 36964 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/16 | 26631 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/16 | 32402 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2020/07/16 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/16 | 70304 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
-2020/07/16 | 249727 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/16 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/16 | 597671 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
-2020/07/16 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/16 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
-2020/07/16 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/16 | 201804 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/16 | 1206559 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
-2020/07/16 | 1125913 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
-2020/07/16 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/07/16 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/17 | 541774 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/17 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/17 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/17 | 957365 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/17 | 1060542 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/17 | 28617 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/17 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/17 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/17 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/17 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/17 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/17 | 84389 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/17 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/17 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/17 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/17 | 27036 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/17 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/17 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/17 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/17 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/17 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/17 | 72069 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/17 | 79200 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/17 | 203501 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/17 | 223960 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/17 | 169760 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/17 | 184499 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/17 | 51923 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/17 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/17 | 20768 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/17 | 22967 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/17 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/17 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/17 | 45497 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/17 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/17 | 273612 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/17 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/17 | 40786 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/17 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/17 | 115820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/17 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/17 | 1266024 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/17 | 1409380 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/17 | 95311 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/17 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/17 | 43306 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/17 | 48051 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/17 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/17 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/17 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/17 | 62930 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/17 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/17 | 151908 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/17 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/17 | 77567 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/17 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/17 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/17 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/17 | 281690 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/17 | 25473 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/17 | 28975 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/17 | 100970 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/17 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/17 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/17 | 72602 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/17 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/17 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/17 | 58974 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/17 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/17 | 462359 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/17 | 550400 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/17 | 141817 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/17 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/17 | 94529 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/17 | 109017 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/17 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/17 | 17622 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/17 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/17 | 29631 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/17 | 623383 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/17 | 676982 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/17 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/17 | 562948 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/17 | 544671 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/17 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/17 | 93646 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/17 | 102562 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/17 | 1751870 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/17 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/17 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/17 | 73668 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/17 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/17 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/17 | 7556 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/17 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/17 | 171137 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/17 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/17 | 269064 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/17 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/17 | 96908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/17 | 101908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/17 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/17 | 88779 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/17 | 170231 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/17 | 189214 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/17 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/17 | 179903 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/17 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/17 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/17 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/17 | 96514 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/17 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/17 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/17 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/17 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/17 | 63350 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/17 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/17 | 45736 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/17 | 52207 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/17 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/17 | 210649 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/17 | 35337 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/17 | 35314 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/17 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/17 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/17 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/17 | 360664 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/17 | 187769 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/17 | 194052 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/17 | 207509 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/17 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/17 | 78146 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/17 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/17 | 922566 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/17 | 1021924 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/17 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/17 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/17 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/17 | 36858 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/17 | 63501 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/17 | 71533 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/17 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/17 | 50902 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/17 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/17 | 1327710 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/17 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/17 | 51415 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/17 | 76755 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/17 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/17 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/17 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/17 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/17 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/17 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/17 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/17 | 63496 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/17 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/17 | 151033 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/17 | 164958 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/17 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/17 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/17 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/17 | 104587 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/17 | 2534429 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/17 | 2659108 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/17 | 55577 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/17 | 61815 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/17 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/17 | 36965 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/17 | 26629 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/17 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/17 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/17 | 70302 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/17 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/17 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/17 | 597670 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/17 | 638878 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/17 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/17 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/17 | 201778 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/17 | 1206400 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/17 | 1125223 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/17 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/17 | 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/16 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/17 | 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
@@ -273069,7 +273127,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/16 | 860 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/17 | 860 | 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
@@ -274215,7 +274273,7 @@
2020/07/14 | 4912592 | 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/15 | 685114 | systems/win32/w32tex/ChangeLog
+2020/07/15 | 685260 | 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
@@ -274239,7 +274297,7 @@
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/14 | 34936380 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/07/15 | 34934660 | 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
@@ -274257,12 +274315,12 @@
2020/06/13 | 1235252 | systems/win32/w32tex/omegaj-w32.tar.xz
2020/03/01 | 355876 | systems/win32/w32tex/otfbeta.tar.xz
2020/07/14 | 20843428 | systems/win32/w32tex/pdftex-w32.tar.xz
-2020/07/14 | 81483384 | systems/win32/w32tex/pgfcontrib.tar.xz
+2020/07/15 | 81485156 | 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/06/18 | 274417320 | systems/win32/w32tex/pstricks.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/14 | 6472600 | systems/win32/w32tex/ptex-ng-w32.tar.xz
2020/07/14 | 10503372 | systems/win32/w32tex/ptex-w32.tar.xz
@@ -274431,7 +274489,7 @@
2004/06/04 | 404 | tds/tds.sed
2004/06/23 | 65418 | tds/tds.tex
2019/05/29 | 304264 | tds.zip
-2020/07/17 | 186 | timestamp
+2020/07/18 | 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 ca53fb2c73..dc7318daec 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index 35d8ade240..63fa99ca73 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,252 +1,442 @@
-2020/07/16 | 98015 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
-2020/07/16 | 96907 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
-2020/07/16 | 96516 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
-2020/07/16 | 957366 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
-2020/07/16 | 95311 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
-2020/07/16 | 94530 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
-2020/07/16 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
-2020/07/16 | 93647 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
-2020/07/16 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/17 | 9999 | macros/latex/contrib/l3kernel/l3news10.tex
+2020/07/17 | 9888 | macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+2020/07/17 | 98014 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-2.9.tar.lzma
+2020/07/17 | 9772 | macros/latex/contrib/l3kernel/l3docstrip.dtx
+2020/07/17 | 96908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-2.9.tar.lzma
+2020/07/17 | 96863 | macros/latex/contrib/l3experimental/l3galley.dtx
+2020/07/17 | 9656 | macros/latex/contrib/l3kernel/l3unicode.dtx
+2020/07/17 | 96514 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-x64-2.9.tar.lzma
+2020/07/17 | 957365 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-2.9.tar.lzma
+2020/07/17 | 95311 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-2.9.tar.lzma
+2020/07/17 | 9465 | macros/latex/contrib/l3kernel/l3news08.tex
+2020/07/17 | 94529 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-2.9.tar.lzma
+2020/07/17 | 9450 | macros/latex/contrib/l3kernel/l3flag.dtx
+2020/07/17 | 94264 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-2.9.tar.lzma
+2020/07/17 | 93647 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-x64-2.9.tar.lzma
+2020/07/17 | 93646 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-2.9.tar.lzma
+2020/07/17 | 9300 | systems/texlive/tlnet/archive/isodoc.r55850.tar.xz
+2020/07/17 | 922566 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
+2020/07/17 | 915648 | systems/texlive/tlnet/archive/tocdata.doc.r55852.tar.xz
+2020/07/17 | 89264 | macros/latex/contrib/l3kernel/l3int.dtx
+2020/07/17 | 88779 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
+2020/07/17 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
+2020/07/17 | 87765 | macros/latex/contrib/l3kernel/l3seq.dtx
+2020/07/17 | 87407 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
+2020/07/17 | 864740 | systems/texlive/tlnet/archive/tex4ht.r55848.tar.xz
+2020/07/17 | 860 | systems/win32/miktex/tm/packages/pr.ini
+2020/07/17 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/17 | 85345 | macros/latex/contrib/l3kernel/l3coffins.dtx
+2020/07/17 | 84830 | macros/latex/contrib/l3kernel/l3fp-basics.dtx
+2020/07/17 | 8481 | macros/latex/contrib/l3kernel/l3news11.tex
+2020/07/17 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
+2020/07/17 | 84389 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
+2020/07/17 | 837972 | systems/texlive/tlnet/archive/isodoc.doc.r55850.tar.xz
+2020/07/17 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
+2020/07/17 | 82762 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
+2020/07/17 | 79744 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
+2020/07/17 | 79200 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
+2020/07/17 | 78146 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
+2020/07/17 | 77671 | macros/latex/contrib/l3kernel/l3msg.dtx
+2020/07/17 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
+2020/07/17 | 77567 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
+2020/07/17 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
+2020/07/17 | 77128 | macros/latex/contrib/l3kernel/l3box.dtx
+2020/07/17 | 76755 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
+2020/07/17 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/17 | 76514 | macros/latex/contrib/l3kernel/l3skip.dtx
+2020/07/17 | 76342 | macros/latex/contrib/l3kernel/l3names.dtx
+2020/07/17 | 75852 | macros/latex/contrib/l3kernel/l3prefixes.pdf
+2020/07/17 | 7556 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
+2020/07/17 | 75550 | macros/latex/contrib/l3kernel/l3clist.dtx
+2020/07/17 | 7488 | macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+2020/07/17 | 74324 | macros/latex/contrib/l3kernel/l3str.dtx
+2020/07/17 | 73859 | macros/latex/contrib/l3kernel/l3fp-trig.dtx
+2020/07/17 | 73748 | systems/texlive/tlnet/archive/nicematrix.source.r55851.tar.xz
+2020/07/17 | 73668 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
+2020/07/17 | 73408 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
+2020/07/17 | 73100 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
+2020/07/17 | 72602 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
+2020/07/17 | 723568 | systems/texlive/tlnet/archive/install-latex-guide-zh-cn.doc.r55849.tar.xz
+2020/07/17 | 72069 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
+2020/07/17 | 71533 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
+2020/07/17 | 70325 | macros/latex/contrib/l3kernel/l3fp.dtx
+2020/07/17 | 70302 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
+2020/07/17 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
+2020/07/17 | 6970 | macros/latex/contrib/l3kernel/l3fp-assign.dtx
+2020/07/17 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
+2020/07/17 | 68820 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
+2020/07/17 | 676982 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
+2020/07/17 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
+2020/07/17 | 67272 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
+2020/07/17 | 6677 | macros/latex/contrib/l3kernel/l3news02.tex
+2020/07/17 | 66663 | macros/latex/contrib/l3kernel/expl3.dtx
+2020/07/17 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
+2020/07/17 | 65602 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
+2020/07/17 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
+2020/07/17 | 65012 | macros/latex/contrib/l3kernel/l3prg.dtx
+2020/07/17 | 6482 | macros/latex/contrib/l3kernel/l3news03.tex
+2020/07/17 | 6450 | macros/latex/contrib/l3kernel/l3term-glossary.tex
+2020/07/17 | 6431 | macros/latex/contrib/l3kernel/l3news06.tex
+2020/07/17 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
+2020/07/17 | 638878 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
+2020/07/17 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
+2020/07/17 | 63501 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
+2020/07/17 | 63496 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
+2020/07/17 | 63350 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
+2020/07/17 | 62930 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
+2020/07/17 | 6267 | macros/latex/contrib/l3kernel/l3syntax-changes.tex
+2020/07/17 | 625002 | macros/latex/contrib/l3experimental/l3draw-code.pdf
+2020/07/17 | 6236 | macros/latex/contrib/l3kernel/l3alloc.dtx
+2020/07/17 | 623383 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
+2020/07/17 | 61815 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/17 | 61752 | macros/latex/contrib/l3kernel/l3candidates.dtx
+2020/07/17 | 6158 | macros/latex/contrib/l3kernel/l3.ins
+2020/07/17 | 597670 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
+2020/07/17 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
+2020/07/17 | 58974 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
+2020/07/17 | 586876 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
+2020/07/17 | 5865524 | macros/latex/contrib/l3kernel/source3.pdf
+2020/07/17 | 58608 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
+2020/07/17 | 584938 | macros/latex/contrib/l3kernel/expl3.pdf
+2020/07/17 | 58435 | macros/latex/contrib/l3experimental/xgalley.dtx
+2020/07/17 | 5783 | macros/latex/contrib/l3kernel/l3format.ins
+2020/07/17 | 57248 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
+2020/07/17 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
+2020/07/17 | 57184 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
+2020/07/17 | 568 | systems/texlive/tlnet/archive/install-latex-guide-zh-cn.r55849.tar.xz
+2020/07/17 | 5667 | macros/latex/contrib/l3experimental/l3draw-layers.dtx
+2020/07/17 | 562948 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
+2020/07/17 | 5621 | macros/latex/contrib/l3kernel/l3color-base.dtx
+2020/07/17 | 55577 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
+2020/07/17 | 550400 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
+2020/07/17 | 5500776 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2020/07/17 | 544671 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
+2020/07/17 | 5429 | macros/latex/contrib/l3kernel/l3news04.tex
+2020/07/17 | 541774 | systems/win32/miktex/tm/packages/next/files.csv.lzma
+2020/07/17 | 540439 | systems/win32/miktex/tm/packages/files.csv.lzma
+2020/07/17 | 5388 | macros/latex/contrib/l3experimental/l3draw-state.dtx
+2020/07/17 | 52207 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
+2020/07/17 | 520 | systems/texlive/tlnet/archive/collection-langchinese.r55849.tar.xz
+2020/07/17 | 51980 | macros/latex/contrib/l3kernel/l3text-case.dtx
+2020/07/17 | 51923 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/17 | 51415 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
+2020/07/17 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
+2020/07/17 | 51073 | macros/latex/contrib/l3kernel/l3fp-extended.dtx
+2020/07/17 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
+2020/07/17 | 51039 | macros/latex/contrib/l3kernel/l3prop.dtx
+2020/07/17 | 50902 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
+2020/07/17 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
+2020/07/17 | 4977 | macros/latex/contrib/l3kernel/l3news07.tex
+2020/07/17 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
+2020/07/17 | 49400 | macros/latex/contrib/l3kernel/l3fp-expo.dtx
+2020/07/17 | 4935 | macros/latex/contrib/l3kernel/l3news01.tex
+2020/07/17 | 491247 | macros/latex/contrib/l3experimental/l3draw.pdf
+2020/07/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2020/07/17 | 4891 | macros/latex/contrib/l3kernel/l3news.tex
+2020/07/17 | 48051 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/17 | 47688 | macros/latex/contrib/l3kernel/l3fp-aux.dtx
+2020/07/17 | 472000 | systems/texlive/tlnet/archive/isodoc.source.r55850.tar.xz
+2020/07/17 | 4716 | macros/latex/contrib/l3kernel/l3news05.tex
+2020/07/17 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
+2020/07/17 | 462359 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
+2020/07/17 | 4612615 | install/macros/latex/contrib/l3experimental.tds.zip
+2020/07/17 | 460366 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
+2020/07/17 | 460276 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
+2020/07/17 | 45736 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
+2020/07/17 | 4571152 | macros/latex/contrib/l3experimental.zip
+2020/07/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2020/07/17 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2020/07/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2020/07/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2020/07/17 | 45497 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
+2020/07/17 | 45383 | macros/latex/contrib/l3experimental/l3color.dtx
+2020/07/17 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
+2020/07/17 | 4442 | macros/latex/contrib/l3experimental/CHANGELOG.md
+2020/07/17 | 4333 | macros/latex/contrib/l3experimental/README.md
+2020/07/17 | 43306 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
+2020/07/17 | 4328 | macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+2020/07/17 | 43173 | macros/latex/contrib/l3kernel/l3debug.dtx
+2020/07/17 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
+2020/07/17 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
+2020/07/17 | 42064 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
+2020/07/17 | 41372 | macros/latex/contrib/l3experimental/l3draw.dtx
+2020/07/17 | 41238 | macros/latex/contrib/l3kernel/l3sort.dtx
+2020/07/17 | 40786 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/17 | 40709 | macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+2020/07/17 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
+2020/07/17 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
+2020/07/17 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
+2020/07/17 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
+2020/07/17 | 385667 | macros/latex/contrib/l3experimental/l3galley.pdf
+2020/07/17 | 379235 | macros/latex/contrib/l3kernel/l3news.pdf
+2020/07/17 | 372787 | macros/latex/contrib/l3experimental/xcoffins.pdf
+2020/07/17 | 36965 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
+2020/07/17 | 36858 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
+2020/07/17 | 36307 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/17 | 363017 | macros/latex/contrib/l3experimental/l3graphics.pdf
+2020/07/17 | 360664 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
+2020/07/17 | 35845 | macros/latex/contrib/l3kernel/l3quark.dtx
+2020/07/17 | 356022 | macros/latex/contrib/l3experimental/l3color.pdf
+2020/07/17 | 35337 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
+2020/07/17 | 35314 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
+2020/07/17 | 35177 | macros/latex/contrib/l3experimental/xcoffins.dtx
+2020/07/17 | 350700 | macros/latex/contrib/l3experimental/l3pdf.pdf
+2020/07/17 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
+2020/07/17 | 35018 | macros/latex/contrib/l3kernel/l3prefixes.csv
+2020/07/17 | 34930 | macros/latex/contrib/l3kernel/l3text.dtx
+2020/07/17 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/17 | 344797 | macros/latex/contrib/l3experimental/l3str-format.pdf
+2020/07/17 | 3352 | systems/texlive/tlnet/archive/tocdata.r55852.tar.xz
+2020/07/17 | 33136 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
+2020/07/17 | 329721 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
+2020/07/17 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
+2020/07/17 | 32522 | macros/latex/contrib/l3experimental/l3draw-paths.dtx
+2020/07/17 | 32401 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
+2020/07/17 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/17 | 31865 | macros/latex/contrib/l3experimental/l3str-format.dtx
+2020/07/17 | 314158 | macros/latex/contrib/l3experimental/l3benchmark.pdf
+2020/07/17 | 31359 | macros/latex/contrib/l3experimental/l3draw-points.dtx
+2020/07/17 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
+2020/07/17 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
+2020/07/17 | 31232 | macros/latex/contrib/l3kernel/l3cctab.dtx
+2020/07/17 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
+2020/07/17 | 311621 | macros/latex/contrib/l3experimental/l3sys-shell.pdf
+2020/07/17 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
+2020/07/17 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
+2020/07/17 | 30875 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
+2020/07/17 | 305168 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
+2020/07/17 | 2997 | macros/latex/contrib/l3kernel/README.md
+2020/07/17 | 29768 | macros/latex/contrib/l3kernel/l3deprecation.dtx
+2020/07/17 | 29631 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/17 | 29320 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
+2020/07/17 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
+2020/07/17 | 28975 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
+2020/07/17 | 28617 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
+2020/07/17 | 285577 | macros/latex/contrib/l3experimental/xgalley.pdf
+2020/07/17 | 2817 | macros/latex/contrib/l3kernel/l3prefixes.tex
+2020/07/17 | 281690 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
+2020/07/17 | 279956 | macros/latex/contrib/l3kernel/l3styleguide.pdf
+2020/07/17 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
+2020/07/17 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
+2020/07/17 | 278541 | macros/latex/contrib/l3experimental/l3pdf-code.pdf
+2020/07/17 | 273835 | macros/latex/contrib/thmtools.zip
+2020/07/17 | 273612 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
+2020/07/17 | 27036 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
+2020/07/17 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
+2020/07/17 | 269064 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
+2020/07/17 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/17 | 26629 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
+2020/07/17 | 26601 | macros/latex/contrib/l3kernel/l3sys.dtx
+2020/07/17 | 2659108 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
+2020/07/17 | 263178 | macros/latex/contrib/l3kernel/l3docstrip.pdf
+2020/07/17 | 26131 | macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+2020/07/17 | 25753 | macros/latex/contrib/l3kernel/l3fp-random.dtx
+2020/07/17 | 25473 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
+2020/07/17 | 2534429 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
+2020/07/17 | 251937 | macros/latex/contrib/l3kernel/l3regex.dtx
+2020/07/17 | 249728 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
+2020/07/17 | 24896 | macros/latex/contrib/l3experimental/l3graphics.dtx
+2020/07/17 | 2484 | macros/latex/contrib/l3kernel/l3legacy.dtx
+2020/07/17 | 246796 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/17 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
+2020/07/17 | 24269263 | systems/texlive/tlnet/install-tl.zip
+2020/07/17 | 23632 | macros/latex/contrib/l3kernel/CHANGELOG.md
+2020/07/17 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
+2020/07/17 | 235322 | macros/latex/contrib/l3kernel/l3news09.pdf
+2020/07/17 | 23121 | macros/latex/contrib/l3kernel/l3fp-logic.dtx
+2020/07/17 | 22967 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
+2020/07/17 | 228250 | macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+2020/07/17 | 223960 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
+2020/07/17 | 2206332 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/17 | 217628 | macros/latex/contrib/l3kernel/l3term-glossary.pdf
+2020/07/17 | 2153 | macros/latex/contrib/l3kernel/source3.tex
+2020/07/17 | 214002 | macros/plain/contrib/zztex.zip
+2020/07/17 | 21212 | macros/latex/contrib/l3kernel/source3body.tex
+2020/07/17 | 210649 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
+2020/07/17 | 20928 | macros/latex/contrib/l3kernel/l3text-purify.dtx
+2020/07/17 | 20768 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
+2020/07/17 | 207509 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
+2020/07/17 | 20612 | systems/texlive/tlnet/archive/nicematrix.r55851.tar.xz
+2020/07/17 | 20465 | macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+2020/07/17 | 203501 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
+2020/07/17 | 2028475 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
+2020/07/17 | 201778 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
+2020/07/17 | 201624 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
+2020/07/17 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
+2020/07/17 | 199139 | macros/latex/contrib/l3kernel/l3news12.pdf
+2020/07/17 | 19694 | macros/latex/contrib/l3kernel/l3intarray.dtx
+2020/07/17 | 19667 | macros/latex/contrib/l3kernel/l3fp-convert.dtx
+2020/07/17 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
+2020/07/17 | 194052 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
+2020/07/17 | 19383196 | systems/texlive/tlnet/install-tl-windows.exe
+2020/07/17 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/17 | 19309 | macros/latex/contrib/l3kernel/l3bootstrap.dtx
+2020/07/17 | 1912 | macros/latex/contrib/l3experimental/l3draw.ins
+2020/07/17 | 1909 | macros/latex/contrib/l3kernel/interface3.tex
+2020/07/17 | 189214 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
+2020/07/17 | 187769 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
+2020/07/17 | 187109 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
+2020/07/17 | 18605 | macros/latex/contrib/l3kernel/l3fp-round.dtx
+2020/07/17 | 184499 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
+2020/07/17 | 17998 | macros/latex/contrib/l3kernel/l3luatex.dtx
+2020/07/17 | 179903 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
+2020/07/17 | 17815 | macros/latex/contrib/l3experimental/l3benchmark.dtx
+2020/07/17 | 17729 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
+2020/07/17 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
+2020/07/17 | 17622 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
+2020/07/17 | 1751870 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
+2020/07/17 | 171137 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
+2020/07/17 | 170231 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
+2020/07/17 | 169760 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
+2020/07/17 | 165946 | macros/latex/contrib/l3kernel/l3news11.pdf
+2020/07/17 | 164958 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
+2020/07/17 | 16331392 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2020/07/17 | 1630 | macros/latex/contrib/l3experimental/xgalley.ins
+2020/07/17 | 16017 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
+2020/07/17 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
+2020/07/17 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
+2020/07/17 | 1575 | macros/latex/contrib/l3experimental/xcoffins.ins
+2020/07/17 | 1571 | macros/latex/contrib/l3experimental/l3sys-shell.ins
+2020/07/17 | 1570 | macros/latex/contrib/l3experimental/l3str.ins
+2020/07/17 | 15708 | macros/latex/contrib/l3kernel/l3final.dtx
+2020/07/17 | 1564 | macros/latex/contrib/l3experimental/l3benchmark.ins
+2020/07/17 | 1559 | macros/latex/contrib/l3experimental/l3graphics.ins
+2020/07/17 | 1555993 | macros/latex/contrib/l3kernel/interface3.pdf
+2020/07/17 | 1547 | macros/latex/contrib/l3experimental/l3color.ins
+2020/07/17 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
+2020/07/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2020/07/17 | 1536 | macros/latex/contrib/l3experimental/l3pdf.ins
+2020/07/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2020/07/17 | 152413 | macros/latex/contrib/l3kernel/l3news08.pdf
+2020/07/17 | 151908 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
+2020/07/17 | 151033 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
+2020/07/17 | 14913 | macros/latex/contrib/l3kernel/l3news12.tex
+2020/07/17 | 149121 | macros/latex/contrib/l3kernel/l3doc.dtx
+2020/07/17 | 147097 | macros/latex/contrib/l3kernel/l3news10.pdf
+2020/07/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2020/07/17 | 144785 | macros/latex/contrib/l3kernel/l3news03.pdf
+2020/07/17 | 141817 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
+2020/07/17 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
+2020/07/17 | 1409380 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
+2020/07/17 | 140795 | macros/latex/contrib/l3kernel/l3news06.pdf
+2020/07/17 | 140776 | macros/latex/contrib/l3kernel/l3news02.pdf
+2020/07/17 | 135724 | systems/texlive/tlnet/archive/tex4ht.doc.r55848.tar.xz
+2020/07/17 | 1356 | macros/latex/contrib/l3experimental/l3draw-code.tex
+2020/07/17 | 135191 | macros/latex/contrib/l3kernel/l3tl.dtx
+2020/07/17 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/17 | 1327710 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
+2020/07/17 | 1323696 | systems/texlive/tlnet/archive/nicematrix.doc.r55851.tar.xz
+2020/07/17 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
+2020/07/17 | 131161 | macros/latex/contrib/l3kernel/l3file.dtx
+2020/07/17 | 130330 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
+2020/07/17 | 12979 | macros/latex/contrib/l3kernel/l3fp-traps.dtx
+2020/07/17 | 127491 | macros/latex/contrib/l3kernel/l3basics.dtx
+2020/07/17 | 1266024 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
+2020/07/17 | 12280 | systems/texlive/tlnet/archive/tocdata.source.r55852.tar.xz
+2020/07/17 | 1206555 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
+2020/07/17 | 1206400 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/17 | 1193673 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
+2020/07/17 | 119094 | macros/latex/contrib/l3kernel/l3news07.pdf
+2020/07/17 | 11907339 | install/macros/latex/contrib/l3kernel.tds.zip
+2020/07/17 | 11884 | macros/latex/contrib/l3kernel/l3styleguide.tex
+2020/07/17 | 11826 | macros/latex/contrib/l3kernel/l3fparray.dtx
+2020/07/17 | 117131 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
+2020/07/17 | 11687761 | macros/latex/contrib/l3kernel.zip
+2020/07/17 | 115820 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
+2020/07/17 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
+2020/07/17 | 11409 | macros/latex/contrib/l3experimental/l3sys-shell.dtx
+2020/07/17 | 113698 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
+2020/07/17 | 113527 | macros/latex/contrib/l3kernel/l3news01.pdf
+2020/07/17 | 112771 | macros/latex/contrib/l3kernel/l3str-convert.dtx
+2020/07/17 | 1126226 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
+2020/07/17 | 1125223 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
+2020/07/17 | 1116 | macros/latex/contrib/l3experimental/l3pdf-code.tex
+2020/07/17 | 110804 | macros/latex/contrib/l3kernel/l3token.dtx
+2020/07/17 | 110613 | macros/latex/contrib/l3kernel/l3keys.dtx
+2020/07/17 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
+2020/07/17 | 109017 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
+2020/07/17 | 107730 | macros/latex/contrib/l3kernel/l3expan.dtx
+2020/07/17 | 107379 | macros/latex/contrib/l3kernel/l3news09.tex
+2020/07/17 | 107115 | macros/latex/contrib/l3kernel/l3news04.pdf
+2020/07/17 | 1060542 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
+2020/07/17 | 105797 | macros/latex/contrib/l3kernel/l3fp-parse.dtx
+2020/07/17 | 10574 | macros/latex/contrib/l3experimental/l3pdf.dtx
+2020/07/17 | 105090 | macros/latex/contrib/l3kernel/l3news05.pdf
+2020/07/17 | 104587 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
+2020/07/17 | 102562 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
+2020/07/17 | 1021924 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
+2020/07/17 | 101908 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
+2020/07/17 | 100970 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
+2020/07/16 | 958 | macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
2020/07/16 | 926420 | macros/latex/contrib/tocdata.zip
2020/07/16 | 922715 | macros/latex/contrib/tocdata/tocdata.pdf
-2020/07/16 | 922568 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-2.9.tar.lzma
-2020/07/16 | 88780 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-x64-2.9.tar.lzma
-2020/07/16 | 88015 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-x64-2.9.tar.lzma
-2020/07/16 | 87408 | systems/win32/miktex/tm/packages/next/miktex-png-bin-x64-2.9.tar.lzma
2020/07/16 | 866329 | macros/latex/contrib/isodoc/isodoc.pdf
-2020/07/16 | 860 | systems/win32/miktex/tm/packages/pr.ini
-2020/07/16 | 8582 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-x64-2.9.tar.lzma
+2020/07/16 | 8580 | macros/latex/contrib/thmtools/source/thm-patch.dtx
2020/07/16 | 8508 | systems/texlive/tlnet/archive/etoolbox.r55845.tar.xz
-2020/07/16 | 84819 | systems/win32/miktex/tm/packages/next/miktex-mpmcli-bin-2.9.tar.lzma
-2020/07/16 | 84389 | systems/win32/miktex/tm/packages/next/miktex-bibtex8bit-bin-2.9.tar.lzma
-2020/07/16 | 82832 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64-2.9.tar.lzma
-2020/07/16 | 82761 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-x64.tar.lzma
-2020/07/16 | 79745 | systems/win32/miktex/tm/packages/next/miktex-mkfntmap-bin-2.9.tar.lzma
-2020/07/16 | 79198 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-x64-2.9.tar.lzma
-2020/07/16 | 78146 | systems/win32/miktex/tm/packages/next/miktex-png-bin-2.9.tar.lzma
-2020/07/16 | 77603 | systems/win32/miktex/tm/packages/next/miktex-texify-bin-2.9.tar.lzma
-2020/07/16 | 77568 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-x64-2.9.tar.lzma
-2020/07/16 | 77428 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-x64-2.9.tar.lzma
-2020/07/16 | 76756 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin-2.9.tar.lzma
-2020/07/16 | 76738 | systems/win32/miktex/tm/packages/next/miktex-tdsutil-bin.tar.lzma
+2020/07/16 | 820 | macros/plain/contrib/zztex/README
+2020/07/16 | 799 | macros/latex/contrib/thmtools/README.md
2020/07/16 | 760556 | macros/latex/contrib/pas-cours.zip
-2020/07/16 | 7557 | systems/win32/miktex/tm/packages/next/miktex-md5-bin-2.9.tar.lzma
2020/07/16 | 737380 | info/install-latex-guide-zh-cn.zip
-2020/07/16 | 73670 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-x64-2.9.tar.lzma
-2020/07/16 | 73407 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-x64-2.9.tar.lzma
-2020/07/16 | 73103 | systems/win32/miktex/tm/packages/next/miktex-fonts-bin-2.9.tar.lzma
-2020/07/16 | 72603 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-x64-2.9.tar.lzma
-2020/07/16 | 72072 | systems/win32/miktex/tm/packages/next/miktex-cjkutils-bin-2.9.tar.lzma
-2020/07/16 | 71534 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-x64-2.9.tar.lzma
2020/07/16 | 709093 | macros/latex/contrib/isodoc/isodoc.dtx
-2020/07/16 | 70304 | systems/win32/miktex/tm/packages/next/miktex-web-bin-x64-2.9.tar.lzma
2020/07/16 | 699375 | info/install-latex-guide-zh-cn/install-latex-guide-zh-cn.pdf
-2020/07/16 | 69875 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-x64-2.9.tar.lzma
-2020/07/16 | 69136 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-x64-2.9.tar.lzma
-2020/07/16 | 68819 | systems/win32/miktex/tm/packages/next/miktex-freeglut-bin-2.9.tar.lzma
-2020/07/16 | 676981 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-x64-2.9.tar.lzma
-2020/07/16 | 67327 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-x64-2.9.tar.lzma
-2020/07/16 | 67273 | systems/win32/miktex/tm/packages/next/miktex-lzma-bin-2.9.tar.lzma
-2020/07/16 | 66118 | systems/win32/miktex/tm/packages/next/miktex-web-bin-2.9.tar.lzma
-2020/07/16 | 65603 | systems/win32/miktex/tm/packages/next/miktex-bibtex-bin-2.9.tar.lzma
-2020/07/16 | 65575 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-x64-2.9.tar.lzma
-2020/07/16 | 64201 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-x64-2.9.tar.lzma
-2020/07/16 | 638875 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-x64-2.9.tar.lzma
-2020/07/16 | 63530 | systems/win32/miktex/tm/packages/next/miktex-graphite2-bin-2.9.tar.lzma
-2020/07/16 | 63503 | systems/win32/miktex/tm/packages/next/miktex-ps2pk-bin-2.9.tar.lzma
-2020/07/16 | 63496 | systems/win32/miktex/tm/packages/next/miktex-tex4ht-bin-2.9.tar.lzma
-2020/07/16 | 63352 | systems/win32/miktex/tm/packages/next/miktex-mtprint-bin-2.9.tar.lzma
-2020/07/16 | 62929 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-x64-2.9.tar.lzma
-2020/07/16 | 623383 | systems/win32/miktex/tm/packages/next/miktex-lcdf-typetools-bin-2.9.tar.lzma
-2020/07/16 | 61819 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-x64-2.9.tar.lzma
+2020/07/16 | 6990 | macros/latex/contrib/thmtools/source/thm-listof.dtx
2020/07/16 | 6134 | macros/latex/contrib/pas-cours/latex/macro-calculs.tex
-2020/07/16 | 597671 | systems/win32/miktex/tm/packages/next/miktex-yap-bin-2.9.tar.lzma
2020/07/16 | 596 | info/install-latex-guide-zh-cn/makefile
-2020/07/16 | 59173 | systems/win32/miktex/tm/packages/next/miktex-arctrl-bin-2.9.tar.lzma
-2020/07/16 | 58972 | systems/win32/miktex/tm/packages/next/miktex-gsf2pk-bin-2.9.tar.lzma
-2020/07/16 | 586875 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-x64-2.9.tar.lzma
-2020/07/16 | 58609 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-x64-2.9.tar.lzma
-2020/07/16 | 57249 | systems/win32/miktex/tm/packages/next/miktex-mthelp-bin-2.9.tar.lzma
-2020/07/16 | 57199 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-x64-2.9.tar.lzma
-2020/07/16 | 57185 | systems/win32/miktex/tm/packages/next/miktex-fmt-bin-2.9.tar.lzma
-2020/07/16 | 562947 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-x64-2.9.tar.lzma
-2020/07/16 | 55579 | systems/win32/miktex/tm/packages/next/miktex-ttf2pk2-bin-2.9.tar.lzma
-2020/07/16 | 550401 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-x64-2.9.tar.lzma
-2020/07/16 | 5500744 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2020/07/16 | 544667 | systems/win32/miktex/tm/packages/next/miktex-log4cxx-bin-2.9.tar.lzma
-2020/07/16 | 541774 | systems/win32/miktex/tm/packages/next/files.csv.lzma
-2020/07/16 | 540439 | systems/win32/miktex/tm/packages/files.csv.lzma
-2020/07/16 | 52206 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-x64-2.9.tar.lzma
-2020/07/16 | 51921 | systems/win32/miktex/tm/packages/next/miktex-cweb-bin-2.9.tar.lzma
+2020/07/16 | 5579 | macros/latex/contrib/thmtools/source/unique.dtx
2020/07/16 | 51522 | macros/latex/contrib/tocdata/tocdata.dtx
-2020/07/16 | 51417 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-x64-2.9.tar.lzma
-2020/07/16 | 51239 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-x64-2.9.tar.lzma
-2020/07/16 | 51044 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-x64-2.9.tar.lzma
-2020/07/16 | 50904 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-x64-2.9.tar.lzma
2020/07/16 | 5071 | info/install-latex-guide-zh-cn/chapter/macos.tex
-2020/07/16 | 500484 | systems/win32/miktex/tm/packages/next/miktex-libressl-bin-2.9.tar.lzma
-2020/07/16 | 49696 | systems/win32/miktex/tm/packages/next/miktex-bibarts-bin-2.9.tar.lzma
2020/07/16 | 491 | info/install-latex-guide-zh-cn/make.bat
-2020/07/16 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
-2020/07/16 | 48050 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-x64-2.9.tar.lzma
+2020/07/16 | 4679 | macros/latex/contrib/thmtools/source/thm-amsthm.dtx
2020/07/16 | 46720 | systems/texlive/tlnet/archive/cabin.doc.r55842.tar.xz
2020/07/16 | 46608 | systems/texlive/tlnet/archive/pst-eucl.r55844.tar.xz
-2020/07/16 | 46285 | systems/win32/miktex/tm/packages/next/miktex-findtexmf-bin-2.9.tar.lzma
-2020/07/16 | 462362 | systems/win32/miktex/tm/packages/next/miktex-harfbuzz-bin-2.9.tar.lzma
-2020/07/16 | 460364 | systems/win32/miktex/tm/packages/next/miktex-doc.tar.lzma
-2020/07/16 | 460275 | systems/win32/miktex/tm/packages/next/miktex-doc-2.9.tar.lzma
-2020/07/16 | 45737 | systems/win32/miktex/tm/packages/next/miktex-m-tx-bin-2.9.tar.lzma
-2020/07/16 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2020/07/16 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
-2020/07/16 | 45498 | systems/win32/miktex/tm/packages/next/miktex-dvicopy-bin-2.9.tar.lzma
-2020/07/16 | 44984 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-x64-2.9.tar.lzma
-2020/07/16 | 43305 | systems/win32/miktex/tm/packages/next/miktex-expat-bin-2.9.tar.lzma
-2020/07/16 | 43024 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-x64-2.9.tar.lzma
-2020/07/16 | 42504 | systems/win32/miktex/tm/packages/next/miktex-psutils-bin-2.9.tar.lzma
-2020/07/16 | 42065 | systems/win32/miktex/tm/packages/next/miktex-synctex-bin-2.9.tar.lzma
-2020/07/16 | 40787 | systems/win32/miktex/tm/packages/next/miktex-dvipng-bin-2.9.tar.lzma
+2020/07/16 | 4534 | macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
+2020/07/16 | 41341 | macros/latex/contrib/thmtools/doc/thmtools-manual.tex
2020/07/16 | 3955 | info/install-latex-guide-zh-cn/chapter/overleaf.tex
-2020/07/16 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64.tar.lzma
-2020/07/16 | 39507 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-x64-2.9.tar.lzma
-2020/07/16 | 392543 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-x64-2.9.tar.lzma
-2020/07/16 | 38947 | systems/win32/miktex/tm/packages/next/miktex-zlib-bin-2.9.tar.lzma
2020/07/16 | 388 | systems/texlive/tlnet/archive/texlive-docindex.r55840.tar.xz
-2020/07/16 | 36964 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin-x64.tar.lzma
-2020/07/16 | 36861 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-x64-2.9.tar.lzma
-2020/07/16 | 36308 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-x64-2.9.tar.lzma
+2020/07/16 | 3849 | macros/latex/contrib/thmtools/source/aliasctr.dtx
2020/07/16 | 3610 | info/install-latex-guide-zh-cn/appendix/wsladdition.tex
-2020/07/16 | 360665 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-x64-2.9.tar.lzma
-2020/07/16 | 35337 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin-2.9.tar.lzma
-2020/07/16 | 35313 | systems/win32/miktex/tm/packages/next/miktex-patgen-bin.tar.lzma
-2020/07/16 | 35051 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-x64-2.9.tar.lzma
-2020/07/16 | 34704 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-x64-2.9.tar.lzma
+2020/07/16 | 3526 | macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
2020/07/16 | 3360 | systems/texlive/tlnet/archive/langsci-avm.r55846.tar.xz
-2020/07/16 | 33137 | systems/win32/miktex/tm/packages/next/miktex-upmendex-bin.tar.lzma
-2020/07/16 | 329722 | systems/win32/miktex/tm/packages/next/miktex-cairo-bin-2.9.tar.lzma
-2020/07/16 | 327003 | systems/win32/miktex/tm/packages/next/miktex-pdftex-bin-2.9.tar.lzma
-2020/07/16 | 32402 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-x64-2.9.tar.lzma
-2020/07/16 | 32134 | systems/win32/miktex/tm/packages/next/miktex-chktex-bin-2.9.tar.lzma
+2020/07/16 | 3229 | macros/latex/contrib/thmtools/source/thm-autoref.dtx
+2020/07/16 | 320 | macros/latex/contrib/thmtools/doc/changes.txt
2020/07/16 | 3189 | info/install-latex-guide-zh-cn/install-latex-guide-zh-cn.tex
-2020/07/16 | 31243 | systems/win32/miktex/tm/packages/next/miktex-mspack-bin-2.9.tar.lzma
-2020/07/16 | 31241 | systems/win32/miktex/tm/packages/next/miktex-posix-bin-2.9.tar.lzma
-2020/07/16 | 31223 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-x64-2.9.tar.lzma
2020/07/16 | 3120 | info/install-latex-guide-zh-cn/appendix/mirror.tex
-2020/07/16 | 310932 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-x64-2.9.tar.lzma
-2020/07/16 | 30891 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-x64-2.9.tar.lzma
-2020/07/16 | 30877 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-x64-2.9.tar.lzma
-2020/07/16 | 305169 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-x64-2.9.tar.lzma
-2020/07/16 | 29632 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-x64-2.9.tar.lzma
+2020/07/16 | 29 | macros/latex/contrib/thmtools/doc/VERSION.tex
2020/07/16 | 2958 | info/install-latex-guide-zh-cn/appendix/updateinfo.tex
-2020/07/16 | 29321 | systems/win32/miktex/tm/packages/next/miktex-axohelp-bin-2.9.tar.lzma
-2020/07/16 | 29182 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-x64-2.9.tar.lzma
-2020/07/16 | 28977 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-x64-2.9.tar.lzma
2020/07/16 | 2896424 | systems/texlive/tlnet/archive/cabin.r55842.tar.xz
-2020/07/16 | 28619 | systems/win32/miktex/tm/packages/next/miktex-autosp-bin-2.9.tar.lzma
-2020/07/16 | 281692 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-x64-2.9.tar.lzma
-2020/07/16 | 27943 | systems/win32/miktex/tm/packages/next/miktex-lacheck-bin-2.9.tar.lzma
-2020/07/16 | 279308 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-x64-2.9.tar.lzma
-2020/07/16 | 273614 | systems/win32/miktex/tm/packages/next/miktex-dvipdfmx-bin-2.9.tar.lzma
-2020/07/16 | 27038 | systems/win32/miktex/tm/packages/next/miktex-bzip2-bin-2.9.tar.lzma
-2020/07/16 | 26956 | systems/win32/miktex/tm/packages/next/miktex-makeindex-bin-2.9.tar.lzma
-2020/07/16 | 269062 | systems/win32/miktex/tm/packages/next/miktex-metapost-bin-2.9.tar.lzma
-2020/07/16 | 26878 | systems/win32/miktex/tm/packages/next/miktex-teckit-bin-2.9.tar.lzma
+2020/07/16 | 2778 | macros/latex/contrib/thmtools/source/thm-llncs.dtx
2020/07/16 | 2668 | info/install-latex-guide-zh-cn/README.md
-2020/07/16 | 26631 | systems/win32/miktex/tm/packages/next/miktex-uriparser-bin-2.9.tar.lzma
-2020/07/16 | 2659107 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-x64-2.9.tar.lzma
-2020/07/16 | 25475 | systems/win32/miktex/tm/packages/next/miktex-fribidixetex-bin-2.9.tar.lzma
-2020/07/16 | 2534427 | systems/win32/miktex/tm/packages/next/miktex-texworks-bin-2.9.tar.lzma
-2020/07/16 | 249727 | systems/win32/miktex/tm/packages/next/miktex-xetex-bin-2.9.tar.lzma
-2020/07/16 | 246797 | systems/win32/miktex/tm/packages/next/miktex-freetype2-bin-2.9.tar.lzma
+2020/07/16 | 2500 | macros/latex/contrib/thmtools/source/thmtools.ins
2020/07/16 | 2463 | info/install-latex-guide-zh-cn/appendix/offline.tex
-2020/07/16 | 243027 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-x64-2.9.tar.lzma
-2020/07/16 | 24269263 | systems/texlive/tlnet/install-tl.zip
2020/07/16 | 237616 | systems/texlive/tlnet/archive/etoolbox.doc.r55845.tar.xz
2020/07/16 | 2367 | info/install-latex-guide-zh-cn/chapter/preface.tex
-2020/07/16 | 23597 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-x64-2.9.tar.lzma
-2020/07/16 | 22969 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-x64-2.9.tar.lzma
-2020/07/16 | 223961 | systems/win32/miktex/tm/packages/next/miktex-console-bin-x64-2.9.tar.lzma
-2020/07/16 | 2204380 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2020/07/16 | 227619 | macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
2020/07/16 | 218656 | systems/texlive/tlnet/archive/texlive-scripts.doc.r55840.tar.xz
2020/07/16 | 21659 | info/install-latex-guide-zh-cn/chapter/editor.tex
-2020/07/16 | 210648 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-x64-2.9.tar.lzma
-2020/07/16 | 20770 | systems/win32/miktex/tm/packages/next/miktex-devnag-bin-2.9.tar.lzma
-2020/07/16 | 207506 | systems/win32/miktex/tm/packages/next/miktex-pmx-bin-2.9.tar.lzma
-2020/07/16 | 203504 | systems/win32/miktex/tm/packages/next/miktex-console-bin-2.9.tar.lzma
-2020/07/16 | 2028474 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-x64-2.9.tar.lzma
-2020/07/16 | 201804 | systems/win32/miktex/tm/packages/next/miktex-zzdb1-2.9.tar.lzma
-2020/07/16 | 201650 | systems/win32/miktex/tm/packages/miktex-zzdb1-2.9.tar.lzma
-2020/07/16 | 20013 | systems/win32/miktex/tm/packages/next/miktex-popt-bin-2.9.tar.lzma
-2020/07/16 | 196476 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-2.9.tar.lzma
-2020/07/16 | 194052 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-x64-2.9.tar.lzma
-2020/07/16 | 19383197 | systems/texlive/tlnet/install-tl-windows.exe
-2020/07/16 | 193351 | systems/win32/miktex/tm/packages/next/miktex-omegaware-bin-2.9.tar.lzma
+2020/07/16 | 2117 | macros/latex/contrib/thmtools/source/thmtools.dtx
+2020/07/16 | 2046 | macros/latex/contrib/thmtools/source/parseargs.dtx
+2020/07/16 | 19106 | macros/latex/contrib/thmtools/doc/COPYING
2020/07/16 | 19039 | info/install-latex-guide-zh-cn/LICENSE
-2020/07/16 | 189217 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-x64-2.9.tar.lzma
-2020/07/16 | 187767 | systems/win32/miktex/tm/packages/next/miktex-pixman-bin-2.9.tar.lzma
-2020/07/16 | 187111 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-x64-2.9.tar.lzma
-2020/07/16 | 184501 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-x64-2.9.tar.lzma
2020/07/16 | 18339 | info/install-latex-guide-zh-cn/chapter/windows.tex
-2020/07/16 | 179905 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-x64-2.9.tar.lzma
-2020/07/16 | 17730 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-x64-2.9.tar.lzma
-2020/07/16 | 177270 | systems/win32/miktex/tm/packages/next/miktex-mpfr-bin-x64-2.9.tar.lzma
-2020/07/16 | 17621 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-x64-2.9.tar.lzma
-2020/07/16 | 1751873 | systems/win32/miktex/tm/packages/next/miktex-luatex-bin-2.9.tar.lzma
-2020/07/16 | 171139 | systems/win32/miktex/tm/packages/next/miktex-metafont-bin-2.9.tar.lzma
-2020/07/16 | 170233 | systems/win32/miktex/tm/packages/next/miktex-mktex-bin-2.9.tar.lzma
-2020/07/16 | 169762 | systems/win32/miktex/tm/packages/next/miktex-curl-bin-2.9.tar.lzma
2020/07/16 | 1692 | macros/latex/contrib/isodoc/README
2020/07/16 | 167608 | systems/texlive/tlnet/archive/texlive-docindex.doc.r55840.tar.xz
-2020/07/16 | 164959 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-x64-2.9.tar.lzma
2020/07/16 | 1636 | macros/latex/contrib/tocdata/tocdata.ins
-2020/07/16 | 16329134 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2020/07/16 | 16018 | systems/win32/miktex/tm/packages/next/miktex-tex2xindy-bin-2.9.tar.lzma
-2020/07/16 | 159287 | systems/win32/miktex/tm/packages/next/miktex-mo-bin-2.9.tar.lzma
-2020/07/16 | 15923 | systems/win32/miktex/tm/packages/next/miktex-kpathsea-bin-2.9.tar.lzma
-2020/07/16 | 154454 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-x64-2.9.tar.lzma
-2020/07/16 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2020/07/16 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2020/07/16 | 151909 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-x64-2.9.tar.lzma
-2020/07/16 | 151031 | systems/win32/miktex/tm/packages/next/miktex-tex-bin-2.9.tar.lzma
-2020/07/16 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2020/07/16 | 1531 | macros/latex/contrib/thmtools/source/thm-beamer.dtx
2020/07/16 | 1450 | macros/latex/contrib/tocdata/README.txt
-2020/07/16 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2020/07/16 | 141817 | systems/win32/miktex/tm/packages/next/miktex-hunspell-bin-2.9.tar.lzma
-2020/07/16 | 14115 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-x64-2.9.tar.lzma
-2020/07/16 | 1409381 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-x64-2.9.tar.lzma
-2020/07/16 | 133620 | systems/win32/miktex/tm/packages/next/miktex-fontconfig-bin-2.9.tar.lzma
+2020/07/16 | 1382 | macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
+2020/07/16 | 13477 | macros/latex/contrib/thmtools/source/thm-kv.dtx
2020/07/16 | 1328116 | macros/latex/contrib/isodoc.zip
-2020/07/16 | 1327712 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-x64-2.9.tar.lzma
2020/07/16 | 132012 | systems/texlive/tlnet/archive/circuitikz.r55843.tar.xz
2020/07/16 | 131984 | systems/texlive/tlnet/archive/texlive-scripts.r55840.tar.xz
-2020/07/16 | 13134 | systems/win32/miktex/tm/packages/next/miktex-zzip-bin-2.9.tar.lzma
-2020/07/16 | 130331 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-x64-2.9.tar.lzma
2020/07/16 | 1298 | macros/latex/contrib/pas-cours/README.txt
-2020/07/16 | 1266024 | systems/win32/miktex/tm/packages/next/miktex-dvisvgm-bin-2.9.tar.lzma
2020/07/16 | 12504 | info/install-latex-guide-zh-cn/chapter/ubuntu.tex
-2020/07/16 | 1206860 | systems/win32/miktex/tm/packages/miktex-zzdb2-2.9.tar.lzma
-2020/07/16 | 1206559 | systems/win32/miktex/tm/packages/next/miktex-zzdb2-2.9.tar.lzma
+2020/07/16 | 12064 | macros/latex/contrib/thmtools/source/thm-restate.dtx
2020/07/16 | 1204140 | systems/texlive/tlnet/archive/pst-eucl.doc.r55844.tar.xz
-2020/07/16 | 1193674 | systems/win32/miktex/tm/packages/next/miktex-runtime-bin-2.9.tar.lzma
-2020/07/16 | 117133 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-x64-2.9.tar.lzma
-2020/07/16 | 115821 | systems/win32/miktex/tm/packages/next/miktex-dvips-bin-2.9.tar.lzma
-2020/07/16 | 1153 | systems/win32/miktex/tm/packages/next/pr.ini
2020/07/16 | 11436 | systems/texlive/tlnet/archive/langsci-avm.source.r55846.tar.xz
-2020/07/16 | 113699 | systems/win32/miktex/tm/packages/next/miktex-gregorio-bin-x64-2.9.tar.lzma
-2020/07/16 | 1126498 | systems/win32/miktex/tm/packages/miktex-zzdb3-2.9.tar.lzma
-2020/07/16 | 1125913 | systems/win32/miktex/tm/packages/next/miktex-zzdb3-2.9.tar.lzma
2020/07/16 | 112560 | systems/texlive/tlnet/archive/langsci-avm.doc.r55846.tar.xz
2020/07/16 | 11153 | info/install-latex-guide-zh-cn/chapter/wsl.tex
2020/07/16 | 1106972 | systems/texlive/tlnet/archive/circuitikz.doc.r55843.tar.xz
-2020/07/16 | 109774 | systems/win32/miktex/tm/packages/next/miktex-epstopdf-bin-x64-2.9.tar.lzma
-2020/07/16 | 109017 | systems/win32/miktex/tm/packages/next/miktex-jpeg-bin-x64-2.9.tar.lzma
-2020/07/16 | 1060544 | systems/win32/miktex/tm/packages/next/miktex-asymptote-bin-x64-2.9.tar.lzma
-2020/07/16 | 104591 | systems/win32/miktex/tm/packages/next/miktex-texware-bin-x64-2.9.tar.lzma
-2020/07/16 | 102565 | systems/win32/miktex/tm/packages/next/miktex-lua53-bin-x64-2.9.tar.lzma
-2020/07/16 | 1021925 | systems/win32/miktex/tm/packages/next/miktex-poppler-bin-x64-2.9.tar.lzma
-2020/07/16 | 101910 | systems/win32/miktex/tm/packages/next/miktex-mfware-bin-x64-2.9.tar.lzma
-2020/07/16 | 100973 | systems/win32/miktex/tm/packages/next/miktex-gd-bin-2.9.tar.lzma
2020/07/15 | 9995 | graphics/pstricks/contrib/pst-eucl/Changes
2020/07/15 | 99296 | fonts/cabin/opentype/Cabin-BoldItalic.otf
2020/07/15 | 99124 | fonts/cabin/opentype/Cabin-Italic.otf
@@ -269,7 +459,15 @@
2020/07/15 | 841461 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
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
+2020/07/15 | 7776 | macros/plain/contrib/zztex/tex/zzmisc.tex
+2020/07/15 | 7724 | macros/plain/contrib/zztex/tex/zzxref.tex
2020/07/15 | 7720 | fonts/cabin/tfm/Cabin-SemiBold-tlf-sc-ot1.tfm
+2020/07/15 | 771 | macros/plain/contrib/zztex/tex/zztures.tex
2020/07/15 | 7716 | fonts/cabin/tfm/Cabin-Medium-tlf-sc-ot1.tfm
2020/07/15 | 7712 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-sc-ot1.tfm
2020/07/15 | 7700 | fonts/cabin/tfm/Cabin-MediumItalic-tlf-sc-ot1.tfm
@@ -285,20 +483,26 @@
2020/07/15 | 756 | fonts/cabin/vf/Cabin-Medium-tlf-sc-ot1.vf
2020/07/15 | 756 | fonts/cabin/vf/Cabin-Italic-tlf-sc-ot1.vf
2020/07/15 | 756 | fonts/cabin/vf/Cabin-Bold-tlf-sc-ot1.vf
+2020/07/15 | 7543 | macros/plain/contrib/zztex/tex/zzprog.tex
2020/07/15 | 751663 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.6.tex
2020/07/15 | 74264 | macros/latex/contrib/etoolbox/etoolbox.tex
+2020/07/15 | 7275 | macros/plain/contrib/zztex/tex/zzhmodeb.tex
2020/07/15 | 7224 | fonts/cabin/tfm/Cabin-Regular-tlf-sc-ot1.tfm
2020/07/15 | 6960 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-sc-ot1.tfm
2020/07/15 | 6952 | fonts/cabin/tfm/Cabin-Italic-tlf-sc-ot1.tfm
2020/07/15 | 690730 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
+2020/07/15 | 68836 | macros/plain/contrib/zztex/tex/zzmath.tex
2020/07/15 | 6864 | fonts/cabin/tfm/Cabin-Bold-tlf-sc-ot1.tfm
-2020/07/15 | 685114 | systems/win32/w32tex/ChangeLog
+2020/07/15 | 685260 | systems/win32/w32tex/ChangeLog
2020/07/15 | 683433 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.3.tex
+2020/07/15 | 6795 | macros/plain/contrib/zztex/tex/zzps.tex
2020/07/15 | 6408 | systems/texlive/tlnet/archive/polytable.r55837.tar.xz
2020/07/15 | 6327 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2020/07/15 | 62102 | graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
2020/07/15 | 6144 | systems/texlive/tlnet/archive/collection-latexextra.r55838.tar.xz
2020/07/15 | 6106 | graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
+2020/07/15 | 5993 | macros/plain/contrib/zztex/tex/zztex.tex
+2020/07/15 | 5788 | macros/plain/contrib/zztex/tex/zzlucida.tex
2020/07/15 | 568 | fonts/cabin/vf/CabinCondensed-SemiboldItalicCondensed-tlf-ts1.vf
2020/07/15 | 564 | fonts/cabin/vf/CabinCondensed-MediumItalicCondensed-tlf-ts1.vf
2020/07/15 | 564 | fonts/cabin/vf/CabinCondensed-BoldItalicCondensed-tlf-ts1.vf
@@ -307,6 +511,7 @@
2020/07/15 | 560 | fonts/cabin/vf/CabinCondensed-MediumCondensed-tlf-ts1.vf
2020/07/15 | 560 | fonts/cabin/vf/CabinCondensed-ItalicCondensed-tlf-ts1.vf
2020/07/15 | 556 | fonts/cabin/vf/CabinCondensed-BoldCondensed-tlf-ts1.vf
+2020/07/15 | 5516 | macros/plain/contrib/zztex/tex/zzmathv6.tex
2020/07/15 | 548 | fonts/cabin/vf/Cabin-SemiBoldItalic-tlf-ts1.vf
2020/07/15 | 548 | fonts/cabin/vf/Cabin-MediumItalic-tlf-ts1.vf
2020/07/15 | 544 | fonts/cabin/vf/Cabin-SemiBold-tlf-ts1.vf
@@ -321,12 +526,15 @@
2020/07/15 | 540 | fonts/cabin/vf/Cabin-Italic-tlf-ts1.vf
2020/07/15 | 540 | fonts/cabin/vf/Cabin-Bold-tlf-ts1.vf
2020/07/15 | 5375 | fonts/cabin/latex/T1Cabin-Sup.fd
+2020/07/15 | 5269 | macros/plain/contrib/zztex/tex/zzlist.tex
2020/07/15 | 52652 | fonts/cabin/tfm/Cabin-Regular-tlf-ly1.tfm
2020/07/15 | 51656 | fonts/cabin/tfm/CabinCondensed-MediumItalicCondensed-tlf-ly1.tfm
2020/07/15 | 51644 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-ly1.tfm
2020/07/15 | 51644 | fonts/cabin/tfm/CabinCondensed-SemiboldItalicCondensed-tlf-ly1.tfm
2020/07/15 | 51600 | fonts/cabin/tfm/Cabin-MediumItalic-tlf-ly1.tfm
+2020/07/15 | 5108 | macros/plain/contrib/zztex/tex/zzhyper.tex
2020/07/15 | 50888 | fonts/cabin/tfm/Cabin-Bold-tlf-ly1.tfm
+2020/07/15 | 5061 | macros/plain/contrib/zztex/tex/zzcomenc.tex
2020/07/15 | 49600 | fonts/cabin/tfm/CabinCondensed-ItalicCondensed-tlf-ly1.tfm
2020/07/15 | 49304 | fonts/cabin/tfm/Cabin-Italic-tlf-ly1.tfm
2020/07/15 | 48932 | systems/texlive/tlnet/tlpkg/installer/config.guess
@@ -340,6 +548,7 @@
2020/07/15 | 46728 | fonts/cabin/tfm/CabinCondensed-MediumCondensed-tlf-ly1.tfm
2020/07/15 | 46684 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-tlf-ly1.tfm
2020/07/15 | 46672 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-tlf-ly1.tfm
+2020/07/15 | 4623 | macros/plain/contrib/zztex/tex/zzhyph.tex
2020/07/15 | 46195 | graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
2020/07/15 | 458820 | systems/texlive/tlnet/archive/xindex.doc.r55835.tar.xz
2020/07/15 | 45644 | fonts/cabin/tfm/Cabin-Bold-tlf-t1.tfm
@@ -365,36 +574,48 @@
2020/07/15 | 422268 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
2020/07/15 | 418 | graphics/pgf/contrib/circuitikz/doc/compatibility.tex
2020/07/15 | 416850 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.8.3.tex
+2020/07/15 | 41253 | macros/plain/contrib/zztex/tex/zzfloat.tex
2020/07/15 | 4076127 | install/fonts/cabin.tds.zip
+2020/07/15 | 404 | macros/plain/contrib/zztex/tex/zzcmmath.tex
2020/07/15 | 4039751 | fonts/cabin.zip
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
+2020/07/15 | 3853 | macros/plain/contrib/zztex/tex/zzdiv.tex
2020/07/15 | 37712 | fonts/cabin/tfm/Cabin-Medium-tlf-sc-ly1.tfm
2020/07/15 | 37688 | fonts/cabin/tfm/Cabin-SemiBold-tlf-sc-ly1.tfm
+2020/07/15 | 3685 | macros/plain/contrib/zztex/tex/zzerror.tex
2020/07/15 | 36624 | fonts/cabin/tfm/Cabin-Regular-tlf-sc-ly1.tfm
2020/07/15 | 364086 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
2020/07/15 | 36268 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-sc-ly1.tfm
2020/07/15 | 36220 | fonts/cabin/tfm/Cabin-MediumItalic-tlf-sc-ly1.tfm
2020/07/15 | 3590 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
2020/07/15 | 3586 | macros/latex/contrib/isodoc/isodoc.ins
+2020/07/15 | 3570 | macros/plain/contrib/zztex/tex/zzmtime.tex
2020/07/15 | 351216 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
2020/07/15 | 35000 | fonts/cabin/tfm/Cabin-Bold-tlf-sc-ly1.tfm
+2020/07/15 | 3495 | macros/plain/contrib/zztex/tex/zzmathv4.tex
+2020/07/15 | 34934660 | systems/win32/w32tex/ltxpkgs.tar.xz
+2020/07/15 | 3484 | macros/plain/contrib/zztex/tex/zzmathv5.tex
2020/07/15 | 34644 | fonts/cabin/tfm/Cabin-Italic-tlf-sc-ly1.tfm
2020/07/15 | 34232 | fonts/cabin/tfm/Cabin-Medium-tlf-sc-t1.tfm
2020/07/15 | 34208 | fonts/cabin/tfm/Cabin-SemiBold-tlf-sc-t1.tfm
+2020/07/15 | 3399 | macros/plain/contrib/zztex/tex/zzmathv3.tex
2020/07/15 | 33772 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-sc-ly1.tfm
2020/07/15 | 33168 | fonts/cabin/tfm/Cabin-Regular-tlf-sc-t1.tfm
+2020/07/15 | 3312 | macros/plain/contrib/zztex/tex/zzltrspc.tex
2020/07/15 | 3277 | graphics/pgf/contrib/circuitikz/README.md
2020/07/15 | 32024 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-sc-t1.tfm
+2020/07/15 | 3201 | macros/plain/contrib/zztex/tex/zzrunner.tex
2020/07/15 | 31976 | fonts/cabin/tfm/Cabin-MediumItalic-tlf-sc-t1.tfm
2020/07/15 | 31952 | fonts/cabin/tfm/Cabin-Bold-tlf-sc-t1.tfm
2020/07/15 | 31819 | graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
2020/07/15 | 3159 | fonts/cabin/enc/cbn_yhzmyq.enc
2020/07/15 | 31588 | systems/texlive/tlnet/archive/xindex.r55835.tar.xz
2020/07/15 | 315848 | systems/texlive/tlnet/archive/elpres.doc.r55834.tar.xz
+2020/07/15 | 31549 | macros/plain/contrib/zztex/tex/zztext.tex
2020/07/15 | 3135 | fonts/cabin/enc/cbn_taosrr.enc
2020/07/15 | 3098 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-legacy.tex
2020/07/15 | 30827 | graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
@@ -402,6 +623,7 @@
2020/07/15 | 3028 | systems/texlive/tlnet/archive/schooldocs.r55838.tar.xz
2020/07/15 | 2988 | fonts/cabin/enc/cbn_yhiurv.enc
2020/07/15 | 29836 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-sc-t1.tfm
+2020/07/15 | 29604 | macros/plain/contrib/zztex/tex/zzsect.tex
2020/07/15 | 2944 | fonts/cabin/enc/cbn_meva6t.enc
2020/07/15 | 2899 | fonts/cabin/enc/cbn_hau3x5.enc
2020/07/15 | 2872 | fonts/cabin/enc/cbn_vqopxp.enc
@@ -409,19 +631,27 @@
2020/07/15 | 2850 | fonts/cabin/enc/cbn_fp7bit.enc
2020/07/15 | 280 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-example.tex
2020/07/15 | 2809 | fonts/cabin/enc/cbn_i3ioen.enc
+2020/07/15 | 27998 | macros/plain/contrib/zztex/tex/zzpage.tex
+2020/07/15 | 2788 | macros/plain/contrib/zztex/tex/zzttladj.tex
2020/07/15 | 2786 | fonts/cabin/enc/cbn_5xld5w.enc
+2020/07/15 | 2755 | macros/plain/contrib/zztex/tex/zzoverlay.tex
+2020/07/15 | 274409012 | systems/win32/w32tex/pstricks.tar.xz
2020/07/15 | 2737 | fonts/cabin/enc/cbn_jjp77t.enc
+2020/07/15 | 27054 | macros/plain/contrib/zztex/tex/zztabularv3.tex
2020/07/15 | 2678 | graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
2020/07/15 | 26368 | graphics/pgf/contrib/circuitikz/doc/changelog.tex
+2020/07/15 | 26242 | macros/plain/contrib/zztex/tex/zzhmode.tex
2020/07/15 | 2590 | graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.bib
2020/07/15 | 247433 | install/macros/latex/contrib/etoolbox.tds.zip
2020/07/15 | 246562 | macros/latex/contrib/etoolbox.zip
2020/07/15 | 244223 | graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.tex
+2020/07/15 | 2415 | macros/plain/contrib/zztex/tex/zznewmath.tex
2020/07/15 | 240141 | graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
2020/07/15 | 2379 | macros/latex/contrib/etoolbox/etoolbox.def
2020/07/15 | 2314 | fonts/cabin/README
2020/07/15 | 227357 | macros/latex/contrib/etoolbox/etoolbox.pdf
2020/07/15 | 225681 | graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
+2020/07/15 | 2239 | macros/plain/contrib/zztex/tex/zzio.tex
2020/07/15 | 21528 | systems/texlive/tlnet/archive/polytable.source.r55837.tar.xz
2020/07/15 | 2132 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-sc-ly1--base.tfm
2020/07/15 | 2132 | fonts/cabin/tfm/CabinCondensed-MediumItalicCondensed-tlf-ly1--base.tfm
@@ -443,6 +673,7 @@
2020/07/15 | 2084 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-sc-t1--base.tfm
2020/07/15 | 2082167 | graphics/pgf/contrib/circuitikz.zip
2020/07/15 | 2076 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-ly1--base.tfm
+2020/07/15 | 20747 | macros/plain/contrib/zztex/tex/zzart.tex
2020/07/15 | 2072 | fonts/cabin/tfm/Cabin-SemiBoldItalic-sup-ly1.tfm
2020/07/15 | 2072 | fonts/cabin/tfm/CabinCondensed-MediumItalicCondensed-sup-t1.tfm
2020/07/15 | 2068 | fonts/cabin/tfm/Cabin-SemiBoldItalic-sup-ly1--base.tfm
@@ -481,6 +712,7 @@
2020/07/15 | 1968 | fonts/cabin/tfm/Cabin-BoldItalic-sup-t1.tfm
2020/07/15 | 1960 | fonts/cabin/tfm/Cabin-BoldItalic-sup-t1--base.tfm
2020/07/15 | 1944 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-t1--base.tfm
+2020/07/15 | 19372 | macros/plain/contrib/zztex/tex/zzdoc.tex
2020/07/15 | 1932 | fonts/cabin/tfm/Cabin-Italic-sup-t1.tfm
2020/07/15 | 1924 | fonts/cabin/tfm/Cabin-Italic-sup-t1--base.tfm
2020/07/15 | 1912 | fonts/cabin/tfm/Cabin-Italic-tlf-t1--base.tfm
@@ -535,6 +767,7 @@
2020/07/15 | 1780 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-tlf-t1--base.tfm
2020/07/15 | 1780 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-sup-t1.tfm
2020/07/15 | 1780 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-sup-t1.tfm
+2020/07/15 | 17800 | macros/plain/contrib/zztex/tex/zznote.tex
2020/07/15 | 1772 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-sup-t1--base.tfm
2020/07/15 | 1772 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-sup-t1--base.tfm
2020/07/15 | 1772 | fonts/cabin/tfm/Cabin-Bold-sup-t1.tfm
@@ -626,7 +859,9 @@
2020/07/15 | 1668 | fonts/cabin/vf/Cabin-Bold-tlf-sc-ly1.vf
2020/07/15 | 1664 | fonts/cabin/vf/Cabin-Bold-tlf-ly1.vf
2020/07/15 | 1664 | fonts/cabin/vf/Cabin-Bold-sup-ly1.vf
+2020/07/15 | 1628 | macros/plain/contrib/zztex/tex/zzplain.tex
2020/07/15 | 1568670 | graphics/pstricks/contrib/pst-eucl/doc/pst-eucl-doc.pdf
+2020/07/15 | 1548 | macros/plain/contrib/zztex/tex/zzmerge.tex
2020/07/15 | 1544 | fonts/cabin/tfm/CabinCondensed-BoldItalicCondensed-sup-ot1.tfm
2020/07/15 | 1540 | fonts/cabin/tfm/CabinCondensed-SemiboldItalicCondensed-sup-ot1.tfm
2020/07/15 | 1536 | fonts/cabin/tfm/CabinCondensed-MediumItalicCondensed-sup-ot1.tfm
@@ -636,6 +871,7 @@
2020/07/15 | 1496 | fonts/cabin/tfm/CabinCondensed-ItalicCondensed-tlf-ts1--base.tfm
2020/07/15 | 1492 | fonts/cabin/tfm/CabinCondensed-ItalicCondensed-tlf-ts1.tfm
2020/07/15 | 1492 | fonts/cabin/tfm/CabinCondensed-BoldItalicCondensed-tlf-ts1.tfm
+2020/07/15 | 14925 | macros/plain/contrib/zztex/tex/zztabularv2.tex
2020/07/15 | 1488 | fonts/cabin/tfm/CabinCondensed-SemiboldItalicCondensed-tlf-ts1--base.tfm
2020/07/15 | 1488 | fonts/cabin/tfm/CabinCondensed-BoldItalicCondensed-tlf-ts1--base.tfm
2020/07/15 | 1484 | fonts/cabin/tfm/Cabin-SemiBoldItalic-tlf-ts1.tfm
@@ -655,6 +891,7 @@
2020/07/15 | 1464 | fonts/cabin/tfm/Cabin-BoldItalic-sup-ot1.tfm
2020/07/15 | 1460 | fonts/cabin/tfm/Cabin-Italic-tlf-ts1.tfm
2020/07/15 | 1452 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-ts1--base.tfm
+2020/07/15 | 14465 | macros/plain/contrib/zztex/tex/zzindexv2.tex
2020/07/15 | 1444 | fonts/cabin/tfm/Cabin-Italic-sup-ot1.tfm
2020/07/15 | 1436 | fonts/cabin/tfm/Cabin-Medium-tlf-ts1.tfm
2020/07/15 | 1436 | fonts/cabin/tfm/Cabin-Italic-tlf-sc-ot1--base.tfm
@@ -677,12 +914,15 @@
2020/07/15 | 14220 | fonts/cabin/tfm/Cabin-MediumItalic-tlf-ot1.tfm
2020/07/15 | 1420 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-tlf-ts1--base.tfm
2020/07/15 | 1419745 | macros/latex/contrib/nicematrix.zip
+2020/07/15 | 14187 | macros/plain/contrib/zztex/tex/zzhelp.tex
2020/07/15 | 141866 | fonts/cabin/type1/CabinCondensed-RegularCondensed.pfb
2020/07/15 | 1416 | fonts/cabin/tfm/Cabin-SemiBold-tlf-ts1--base.tfm
2020/07/15 | 1416 | fonts/cabin/tfm/Cabin-Regular-tlf-ts1--base.tfm
2020/07/15 | 1416 | fonts/cabin/tfm/Cabin-Bold-tlf-ts1--base.tfm
2020/07/15 | 14133 | graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
2020/07/15 | 1412 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-tlf-ts1--base.tfm
+2020/07/15 | 14105 | macros/plain/contrib/zztex/tex/zzfont.tex
+2020/07/15 | 14090 | macros/plain/contrib/zztex/tex/zzbiblio.tex
2020/07/15 | 140188 | graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
2020/07/15 | 13980 | fonts/cabin/tfm/Cabin-Regular-tlf-ot1.tfm
2020/07/15 | 1360 | fonts/cabin/tfm/CabinCondensed-SemiBoldCondensed-sup-ot1.tfm
@@ -694,6 +934,7 @@
2020/07/15 | 1332 | fonts/cabin/tfm/Cabin-SemiBold-tlf-sc-ot1--base.tfm
2020/07/15 | 1332 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-sup-ot1.tfm
2020/07/15 | 1328 | fonts/cabin/tfm/CabinCondensed-RegularCondensed-sup-ot1.tfm
+2020/07/15 | 13289 | macros/plain/contrib/zztex/tex/zztabularv1.tex
2020/07/15 | 13268 | fonts/cabin/tfm/CabinCondensed-BoldItalicCondensed-tlf-ot1.tfm
2020/07/15 | 13256 | fonts/cabin/tfm/Cabin-Italic-tlf-ot1.tfm
2020/07/15 | 1324 | fonts/cabin/tfm/Cabin-SemiBold-sup-ot1.tfm
@@ -702,10 +943,12 @@
2020/07/15 | 1312 | fonts/cabin/tfm/Cabin-Regular-sup-ot1.tfm
2020/07/15 | 1312 | fonts/cabin/tfm/Cabin-Bold-sup-ot1.tfm
2020/07/15 | 1310583 | graphics/pstricks/contrib/pst-eucl.zip
+2020/07/15 | 13074 | macros/plain/contrib/zztex/tex/zzreg.tex
2020/07/15 | 13072 | fonts/cabin/tfm/Cabin-BoldItalic-tlf-ot1.tfm
2020/07/15 | 129460 | fonts/cabin/type1/Cabin-SemiBold.pfb
2020/07/15 | 129450 | fonts/cabin/type1/CabinCondensed-BoldItalicCondensed.pfb
2020/07/15 | 128715 | fonts/cabin/type1/CabinCondensed-MediumItalicCondensed.pfb
+2020/07/15 | 12839 | macros/plain/contrib/zztex/tex/zzindexv1.tex
2020/07/15 | 128230 | macros/latex/contrib/nicematrix/nicematrix-french.tex
2020/07/15 | 128058 | fonts/cabin/type1/Cabin-Bold.pfb
2020/07/15 | 127415 | fonts/cabin/type1/CabinCondensed-SemiboldItalicCondensed.pfb
@@ -718,7 +961,9 @@
2020/07/15 | 123698 | fonts/cabin/type1/Cabin-Medium.pfb
2020/07/15 | 12368 | fonts/cabin/tfm/CabinCondensed-BoldCondensed-tlf-ot1.tfm
2020/07/15 | 122677 | fonts/cabin/type1/Cabin-Regular.pfb
+2020/07/15 | 11801 | macros/plain/contrib/zztex/tex/zzvmode.tex
2020/07/15 | 116402 | fonts/cabin/type1/Cabin-SemiBoldItalic.pfb
+2020/07/15 | 11637 | macros/plain/contrib/zztex/tex/zzblock.tex
2020/07/15 | 114720 | fonts/cabin/type1/Cabin-MediumItalic.pfb
2020/07/15 | 114476 | fonts/cabin/type1/Cabin-BoldItalic.pfb
2020/07/15 | 114198 | macros/latex/contrib/langsci-avm/langsci-avm.pdf
@@ -739,13 +984,11 @@
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 | 864564 | systems/texlive/tlnet/archive/tex4ht.r55825.tar.xz
2020/07/14 | 8499500 | systems/win32/w32tex/uptex-w32.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 | 81483384 | systems/win32/w32tex/pgfcontrib.tar.xz
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 | 77188 | systems/texlive/tlnet/archive/nimsticks.doc.r55826.tar.xz
@@ -777,7 +1020,6 @@
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 | 34936380 | systems/win32/w32tex/ltxpkgs.tar.xz
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
@@ -806,7 +1048,6 @@
2020/07/14 | 14680 | systems/texlive/tlnet/archive/expkv-def.source.r55829.tar.xz
2020/07/14 | 140449132 | systems/win32/w32tex/context.tar.xz
2020/07/14 | 1376 | systems/texlive/tlnet/archive/collection-pictures.r55827.tar.xz
-2020/07/14 | 135724 | systems/texlive/tlnet/archive/tex4ht.doc.r55825.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
@@ -1316,285 +1557,3 @@
2020/07/11 | 1029036 | systems/texlive/tlnet/archive/cryptocode.doc.r55800.tar.xz
2020/07/11 | 10024 | fonts/ibarra/tfm/IbarraRealNova-SemiBold-lf-ot1.tfm
2020/07/11 | 10008 | fonts/ibarra/tfm/IbarraRealNova-Regular-lf-ot1.tfm
-2020/07/10 | 978875 | install/fonts/overlock.tds.zip
-2020/07/10 | 955233 | fonts/overlock.zip
-2020/07/10 | 941 | macros/latex/contrib/cryptocode/cryptocode.ins
-2020/07/10 | 887428 | systems/texlive/tlnet/archive/mcf2graph.doc.r55793.tar.xz
-2020/07/10 | 852 | fonts/overlock/vf/Overlock-BlackItalic-osf-ot1.vf
-2020/07/10 | 848 | fonts/overlock/vf/Overlock-BoldItalic-osf-ot1.vf
-2020/07/10 | 848 | fonts/overlock/vf/Overlock-BoldItalic-lf-ot1.vf
-2020/07/10 | 848 | fonts/overlock/vf/Overlock-BlackItalic-lf-ot1.vf
-2020/07/10 | 844 | fonts/overlock/vf/Overlock-Regular-osf-sc-ot1.vf
-2020/07/10 | 844 | fonts/overlock/vf/Overlock-Regular-lf-sc-ot1.vf
-2020/07/10 | 840 | fonts/overlock/vf/Overlock-Italic-osf-ot1.vf
-2020/07/10 | 840 | fonts/overlock/vf/Overlock-Italic-lf-ot1.vf
-2020/07/10 | 836 | fonts/overlock/vf/Overlock-Regular-osf-ot1.vf
-2020/07/10 | 832 | fonts/overlock/vf/Overlock-Regular-lf-ot1.vf
-2020/07/10 | 832 | fonts/overlock/vf/Overlock-Black-osf-ot1.vf
-2020/07/10 | 828 | fonts/overlock/vf/Overlock-Bold-osf-ot1.vf
-2020/07/10 | 828 | fonts/overlock/vf/Overlock-Bold-lf-ot1.vf
-2020/07/10 | 828 | fonts/overlock/vf/Overlock-Black-lf-ot1.vf
-2020/07/10 | 77437 | macros/latex/contrib/cryptocode/cryptocode-2020-04-24.sty
-2020/07/10 | 75696 | macros/latex/contrib/cryptocode/cryptocode-2018-11-11.sty
-2020/07/10 | 7092 | fonts/overlock/type1/Overlock-BlackLCDFJ.pfb
-2020/07/10 | 7089 | fonts/overlock/type1/Overlock-BlackItalicLCDFJ.pfb
-2020/07/10 | 7085 | fonts/overlock/type1/Overlock-BoldItalicLCDFJ.pfb
-2020/07/10 | 7078 | fonts/overlock/type1/Overlock-BoldLCDFJ.pfb
-2020/07/10 | 7077 | fonts/overlock/type1/Overlock-RegularLCDFJ.pfb
-2020/07/10 | 7076 | fonts/overlock/type1/Overlock-ItalicLCDFJ.pfb
-2020/07/10 | 69707 | fonts/overlock/type1/Overlock-Regular.pfb
-2020/07/10 | 693 | fonts/overlock/doc/overlock-samples.tex
-2020/07/10 | 6177 | macros/latex/contrib/biblatex-contrib/biblatex-publist/README
-2020/07/10 | 60944 | fonts/overlock/type1/Overlock-BlackItalic.pfb
-2020/07/10 | 60920 | fonts/overlock/type1/Overlock-Italic.pfb
-2020/07/10 | 60224 | fonts/overlock/type1/Overlock-BoldItalic.pfb
-2020/07/10 | 60209 | fonts/overlock/type1/Overlock-Bold.pfb
-2020/07/10 | 58561 | fonts/overlock/type1/Overlock-Black.pfb
-2020/07/10 | 576 | fonts/overlock/vf/Overlock-BlackItalic-osf-ts1.vf
-2020/07/10 | 572 | fonts/overlock/vf/Overlock-Regular-osf-ts1.vf
-2020/07/10 | 572 | fonts/overlock/vf/Overlock-BoldItalic-osf-ts1.vf
-2020/07/10 | 572 | fonts/overlock/vf/Overlock-BoldItalic-lf-ts1.vf
-2020/07/10 | 572 | fonts/overlock/vf/Overlock-BlackItalic-lf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Regular-lf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Italic-osf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Italic-lf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Bold-osf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Bold-lf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Black-osf-ts1.vf
-2020/07/10 | 568 | fonts/overlock/vf/Overlock-Black-lf-ts1.vf
-2020/07/10 | 4712 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ly1.tfm
-2020/07/10 | 4604 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ly1.tfm
-2020/07/10 | 46012 | fonts/overlock/opentype/Overlock-Regular.otf
-2020/07/10 | 4421 | fonts/overlock/doc/License.txt
-2020/07/10 | 4340 | fonts/overlock/tfm/Overlock-BoldItalic-osf-t1.tfm
-2020/07/10 | 42716 | fonts/overlock/opentype/Overlock-BoldItalic.otf
-2020/07/10 | 4216 | fonts/overlock/tfm/Overlock-BoldItalic-lf-t1.tfm
-2020/07/10 | 41108 | fonts/overlock/opentype/Overlock-Italic.otf
-2020/07/10 | 40148 | fonts/overlock/opentype/Overlock-Bold.otf
-2020/07/10 | 396852 | fonts/newcomputermodern/NewCM10-Regular.otf
-2020/07/10 | 39512 | fonts/overlock/opentype/Overlock-Black.otf
-2020/07/10 | 38980 | fonts/overlock/opentype/Overlock-BlackItalic.otf
-2020/07/10 | 38808 | systems/texlive/tlnet/archive/thuthesis.source.r55792.tar.xz
-2020/07/10 | 375796 | macros/latex/contrib/biblatex-contrib/biblatex-publist.zip
-2020/07/10 | 374992 | fonts/newcomputermodern/NewCM10-Bold.otf
-2020/07/10 | 368300 | fonts/newcomputermodern/NewCM10-Italic.otf
-2020/07/10 | 355590 | macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.pdf
-2020/07/10 | 35508 | systems/texlive/tlnet/archive/thuthesis.r55792.tar.xz
-2020/07/10 | 3544 | fonts/overlock/enc/ovlk_e3j4ia.enc
-2020/07/10 | 35217 | macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.bbx
-2020/07/10 | 35195 | macros/latex/contrib/biblatex-contrib/biblatex-publist/biblatex-publist.tex
-2020/07/10 | 349556 | fonts/newcomputermodern/NewCM10-BoldItalic.otf
-2020/07/10 | 3456 | fonts/overlock/enc/ovlk_lhx5go.enc
-2020/07/10 | 3399 | fonts/overlock/enc/ovlk_cr35rj.enc
-2020/07/10 | 3351 | fonts/overlock/enc/ovlk_a4aghc.enc
-2020/07/10 | 3315 | fonts/overlock/latex/overlock.sty
-2020/07/10 | 3294 | fonts/overlock/enc/ovlk_j3mq5n.enc
-2020/07/10 | 3197 | fonts/overlock/enc/ovlk_lqqrub.enc
-2020/07/10 | 3135 | fonts/overlock/enc/ovlk_2sdgnb.enc
-2020/07/10 | 3128 | fonts/overlock/enc/ovlk_7l4e47.enc
-2020/07/10 | 3100 | fonts/overlock/enc/ovlk_cj365g.enc
-2020/07/10 | 3064 | fonts/overlock/enc/ovlk_fqfhhf.enc
-2020/07/10 | 3057 | fonts/overlock/enc/ovlk_325tkf.enc
-2020/07/10 | 3036 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ly1.tfm
-2020/07/10 | 3008 | fonts/overlock/latex/OT1Overlock-OsF.fd
-2020/07/10 | 3008 | fonts/overlock/latex/LY1Overlock-OsF.fd
-2020/07/10 | 2996 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ly1.tfm
-2020/07/10 | 2990 | fonts/overlock/enc/ovlk_vvi6px.enc
-2020/07/10 | 2983 | fonts/overlock/enc/ovlk_irzqhk.enc
-2020/07/10 | 2980 | fonts/overlock/tfm/Overlock-Regular-osf-ly1.tfm
-2020/07/10 | 2976 | fonts/overlock/tfm/Overlock-Black-osf-ly1.tfm
-2020/07/10 | 2975 | fonts/overlock/latex/T1Overlock-OsF.fd
-2020/07/10 | 2962 | fonts/overlock/enc/ovlk_tmoia5.enc
-2020/07/10 | 2959 | fonts/overlock/latex/OT1Overlock-LF.fd
-2020/07/10 | 2959 | fonts/overlock/latex/LY1Overlock-LF.fd
-2020/07/10 | 2959 | fonts/overlock/enc/ovlk_k2npiy.enc
-2020/07/10 | 2953 | fonts/overlock/enc/ovlk_gmmlzo.enc
-2020/07/10 | 2952 | fonts/overlock/enc/ovlk_bhbhyo.enc
-2020/07/10 | 2926 | fonts/overlock/latex/T1Overlock-LF.fd
-2020/07/10 | 2924 | fonts/overlock/tfm/Overlock-BlackItalic-osf-t1.tfm
-2020/07/10 | 2912 | fonts/overlock/tfm/Overlock-Italic-osf-ly1.tfm
-2020/07/10 | 289954 | macros/latex/contrib/cryptocode/cryptocode.dtx
-2020/07/10 | 2865 | fonts/overlock/enc/ovlk_woxjio.enc
-2020/07/10 | 2864 | fonts/overlock/tfm/Overlock-Regular-lf-ly1.tfm
-2020/07/10 | 2864 | fonts/overlock/tfm/Overlock-Italic-lf-ly1.tfm
-2020/07/10 | 2860 | fonts/overlock/tfm/Overlock-Black-lf-ly1.tfm
-2020/07/10 | 2856 | fonts/overlock/enc/ovlk_siy5zo.enc
-2020/07/10 | 2840 | fonts/overlock/tfm/Overlock-BlackItalic-lf-t1.tfm
-2020/07/10 | 2836 | fonts/overlock/tfm/Overlock-Bold-osf-ly1.tfm
-2020/07/10 | 2816 | fonts/overlock/tfm/Overlock-Italic-osf-t1.tfm
-2020/07/10 | 2805 | fonts/overlock/latex/TS1Overlock-OsF.fd
-2020/07/10 | 2804 | fonts/overlock/tfm/Overlock-Black-osf-t1.tfm
-2020/07/10 | 2792 | fonts/overlock/tfm/Overlock-Regular-osf-t1.tfm
-2020/07/10 | 2760 | fonts/overlock/latex/TS1Overlock-LF.fd
-2020/07/10 | 2756 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ly1.tfm
-2020/07/10 | 2732 | fonts/overlock/tfm/Overlock-Italic-lf-t1.tfm
-2020/07/10 | 2712 | fonts/overlock/tfm/Overlock-Black-lf-t1.tfm
-2020/07/10 | 2708 | fonts/overlock/tfm/Overlock-Regular-lf-t1.tfm
-2020/07/10 | 2708 | fonts/overlock/tfm/Overlock-Bold-lf-ly1.tfm
-2020/07/10 | 2672 | fonts/overlock/tfm/Overlock-Bold-osf-t1.tfm
-2020/07/10 | 2636 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ly1.tfm
-2020/07/10 | 2596 | fonts/overlock/tfm/Overlock-Regular-osf-sc-t1.tfm
-2020/07/10 | 2576 | fonts/overlock/tfm/Overlock-Bold-lf-t1.tfm
-2020/07/10 | 2512 | fonts/overlock/tfm/Overlock-Regular-lf-sc-t1.tfm
-2020/07/10 | 2468 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ot1.tfm
-2020/07/10 | 2380 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ot1.tfm
-2020/07/10 | 2308216 | systems/texlive/tlnet/archive/thuthesis.doc.r55792.tar.xz
-2020/07/10 | 2100 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ot1.tfm
-2020/07/10 | 2056 | fonts/overlock/tfm/Overlock-Italic-osf-ot1.tfm
-2020/07/10 | 2046 | systems/win32/w32tex/TLW64/00README.TLW64
-2020/07/10 | 2032 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ot1.tfm
-2020/07/10 | 2016 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ot1.tfm
-2020/07/10 | 2012 | fonts/overlock/tfm/Overlock-Black-osf-ot1.tfm
-2020/07/10 | 2008 | fonts/overlock/tfm/Overlock-Regular-osf-ot1.tfm
-2020/07/10 | 20060 | systems/texlive/tlnet/archive/mcf2graph.r55793.tar.xz
-2020/07/10 | 2005 | fonts/overlock/README
-2020/07/10 | 1992 | fonts/overlock/tfm/Overlock-Italic-lf-ot1.tfm
-2020/07/10 | 1988 | fonts/overlock/tfm/Overlock-Bold-osf-ot1.tfm
-2020/07/10 | 1980 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ly1--base.tfm
-2020/07/10 | 1964 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ly1--base.tfm
-2020/07/10 | 1948 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ot1.tfm
-2020/07/10 | 1940 | fonts/overlock/tfm/Overlock-Regular-lf-ot1.tfm
-2020/07/10 | 1940 | fonts/overlock/tfm/Overlock-Black-lf-ot1.tfm
-2020/07/10 | 1908 | fonts/overlock/tfm/Overlock-Bold-lf-ot1.tfm
-2020/07/10 | 1900 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ly1--base.tfm
-2020/07/10 | 1892 | fonts/overlock/tfm/Overlock-Italic-osf-ly1--base.tfm
-2020/07/10 | 1892 | fonts/overlock/tfm/Overlock-BlackItalic-osf-t1--base.tfm
-2020/07/10 | 1876 | fonts/overlock/tfm/Overlock-Italic-lf-ly1--base.tfm
-2020/07/10 | 1876 | fonts/overlock/tfm/Overlock-Bold-osf-ly1--base.tfm
-2020/07/10 | 1872 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ly1--base.tfm
-2020/07/10 | 1872 | fonts/overlock/tfm/Overlock-BlackItalic-lf-t1--base.tfm
-2020/07/10 | 1844 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ly1--base.tfm
-2020/07/10 | 1844 | fonts/overlock/tfm/Overlock-Bold-lf-ly1--base.tfm
-2020/07/10 | 1832 | fonts/overlock/tfm/Overlock-Black-osf-ly1--base.tfm
-2020/07/10 | 1828 | fonts/overlock/tfm/Overlock-BoldItalic-osf-t1--base.tfm
-2020/07/10 | 1824 | fonts/overlock/tfm/Overlock-Regular-osf-ly1--base.tfm
-2020/07/10 | 1824 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ly1--base.tfm
-2020/07/10 | 1820 | fonts/overlock/tfm/Overlock-Italic-osf-t1--base.tfm
-2020/07/10 | 1812 | fonts/overlock/tfm/Overlock-Bold-osf-t1--base.tfm
-2020/07/10 | 1812 | fonts/overlock/tfm/Overlock-Black-lf-ly1--base.tfm
-2020/07/10 | 1804 | fonts/overlock/tfm/Overlock-Regular-lf-ly1--base.tfm
-2020/07/10 | 1800 | fonts/overlock/tfm/Overlock-Italic-lf-t1--base.tfm
-2020/07/10 | 1800 | fonts/overlock/tfm/Overlock-BoldItalic-lf-t1--base.tfm
-2020/07/10 | 1780 | fonts/overlock/tfm/Overlock-Bold-lf-t1--base.tfm
-2020/07/10 | 1772 | fonts/overlock/tfm/Overlock-Regular-osf-sc-t1--base.tfm
-2020/07/10 | 1772 | fonts/overlock/tfm/Overlock-Black-osf-t1--base.tfm
-2020/07/10 | 1756 | fonts/overlock/tfm/Overlock-Regular-osf-t1--base.tfm
-2020/07/10 | 1752 | fonts/overlock/tfm/Overlock-Regular-lf-sc-t1--base.tfm
-2020/07/10 | 1744 | fonts/overlock/vf/Overlock-BlackItalic-osf-ly1.vf
-2020/07/10 | 1744 | fonts/overlock/tfm/Overlock-Black-lf-t1--base.tfm
-2020/07/10 | 1740 | fonts/overlock/vf/Overlock-BoldItalic-osf-ly1.vf
-2020/07/10 | 1740 | fonts/overlock/vf/Overlock-BoldItalic-lf-ly1.vf
-2020/07/10 | 1740 | fonts/overlock/vf/Overlock-BlackItalic-lf-ly1.vf
-2020/07/10 | 1736 | fonts/overlock/vf/Overlock-Regular-osf-sc-ly1.vf
-2020/07/10 | 1736 | fonts/overlock/tfm/Overlock-Regular-lf-t1--base.tfm
-2020/07/10 | 1732 | fonts/overlock/vf/Overlock-Regular-lf-sc-ly1.vf
-2020/07/10 | 1732 | fonts/overlock/vf/Overlock-Italic-osf-ly1.vf
-2020/07/10 | 1732 | fonts/overlock/vf/Overlock-Italic-lf-ly1.vf
-2020/07/10 | 1728 | fonts/overlock/vf/Overlock-Regular-osf-ly1.vf
-2020/07/10 | 1728 | fonts/overlock/vf/Overlock-Regular-lf-ly1.vf
-2020/07/10 | 1724 | fonts/overlock/vf/Overlock-Bold-osf-ly1.vf
-2020/07/10 | 1724 | fonts/overlock/vf/Overlock-Black-osf-ly1.vf
-2020/07/10 | 1724 | fonts/overlock/vf/Overlock-Black-lf-ly1.vf
-2020/07/10 | 1720 | fonts/overlock/vf/Overlock-Bold-lf-ly1.vf
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-sc-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-sc-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Regular-lf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Italic-lf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Bold-lf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-Black-lf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-osf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ly1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-lf-t1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ot1--lcdfj.tfm
-2020/07/10 | 156 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ly1--lcdfj.tfm
-2020/07/10 | 1436 | fonts/overlock/vf/Overlock-BlackItalic-osf-t1.vf
-2020/07/10 | 1432 | fonts/overlock/vf/Overlock-BoldItalic-osf-t1.vf
-2020/07/10 | 1432 | fonts/overlock/vf/Overlock-BoldItalic-lf-t1.vf
-2020/07/10 | 1432 | fonts/overlock/vf/Overlock-BlackItalic-lf-t1.vf
-2020/07/10 | 1432 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ot1--base.tfm
-2020/07/10 | 1428 | fonts/overlock/vf/Overlock-Regular-osf-sc-t1.vf
-2020/07/10 | 1424 | fonts/overlock/vf/Overlock-Regular-lf-sc-t1.vf
-2020/07/10 | 1424 | fonts/overlock/vf/Overlock-Italic-osf-t1.vf
-2020/07/10 | 1424 | fonts/overlock/vf/Overlock-Italic-lf-t1.vf
-2020/07/10 | 1424 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ts1.tfm
-2020/07/10 | 1424 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ts1.tfm
-2020/07/10 | 1420 | fonts/overlock/vf/Overlock-Regular-osf-t1.vf
-2020/07/10 | 1420 | fonts/overlock/vf/Overlock-Regular-lf-t1.vf
-2020/07/10 | 1416 | fonts/overlock/vf/Overlock-Bold-osf-t1.vf
-2020/07/10 | 1416 | fonts/overlock/vf/Overlock-Black-osf-t1.vf
-2020/07/10 | 1416 | fonts/overlock/vf/Overlock-Black-lf-t1.vf
-2020/07/10 | 1412 | fonts/overlock/vf/Overlock-Bold-lf-t1.vf
-2020/07/10 | 1412 | fonts/overlock/tfm/Overlock-BlackItalic-osf-ts1--base.tfm
-2020/07/10 | 1412 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ts1--base.tfm
-2020/07/10 | 1408 | fonts/overlock/tfm/Overlock-BlackItalic-lf-ot1--base.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Regular-osf-ts1.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Regular-lf-ts1.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Italic-osf-ts1.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Italic-lf-ts1.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Bold-osf-ts1.tfm
-2020/07/10 | 1404 | fonts/overlock/tfm/Overlock-Bold-lf-ts1.tfm
-2020/07/10 | 1400 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ts1.tfm
-2020/07/10 | 1400 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ot1--base.tfm
-2020/07/10 | 1400 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ts1.tfm
-2020/07/10 | 1400 | fonts/overlock/tfm/Overlock-Black-osf-ts1.tfm
-2020/07/10 | 1400 | fonts/overlock/tfm/Overlock-Black-lf-ts1.tfm
-2020/07/10 | 1396 | fonts/overlock/tfm/Overlock-BoldItalic-osf-ts1--base.tfm
-2020/07/10 | 1396 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ts1--base.tfm
-2020/07/10 | 1393 | macros/latex/contrib/cryptocode/README.md
-2020/07/10 | 1392 | fonts/overlock/tfm/Overlock-Regular-osf-ts1--base.tfm
-2020/07/10 | 1392 | fonts/overlock/tfm/Overlock-Regular-lf-ts1--base.tfm
-2020/07/10 | 1392 | fonts/overlock/tfm/Overlock-Bold-osf-ot1--base.tfm
-2020/07/10 | 1392 | fonts/overlock/tfm/Overlock-Black-osf-ts1--base.tfm
-2020/07/10 | 1392 | fonts/overlock/tfm/Overlock-Black-lf-ts1--base.tfm
-2020/07/10 | 1388 | fonts/overlock/tfm/Overlock-Italic-osf-ts1--base.tfm
-2020/07/10 | 1388 | fonts/overlock/tfm/Overlock-Italic-osf-ot1--base.tfm
-2020/07/10 | 1388 | fonts/overlock/tfm/Overlock-Italic-lf-ts1--base.tfm
-2020/07/10 | 1388 | fonts/overlock/tfm/Overlock-Bold-osf-ts1--base.tfm
-2020/07/10 | 1388 | fonts/overlock/tfm/Overlock-Bold-lf-ts1--base.tfm
-2020/07/10 | 1372 | fonts/overlock/tfm/Overlock-BoldItalic-lf-ot1--base.tfm
-2020/07/10 | 1368 | fonts/overlock/tfm/Overlock-Italic-lf-ot1--base.tfm
-2020/07/10 | 1364 | fonts/overlock/tfm/Overlock-Regular-osf-sc-ot1--base.tfm
-2020/07/10 | 1360 | fonts/overlock/tfm/Overlock-Black-osf-ot1--base.tfm
-2020/07/10 | 1356 | fonts/overlock/tfm/Overlock-Bold-lf-ot1--base.tfm
-2020/07/10 | 1352 | fonts/overlock/tfm/Overlock-Regular-osf-ot1--base.tfm
-2020/07/10 | 1340 | fonts/overlock/tfm/Overlock-Regular-lf-sc-ot1--base.tfm
-2020/07/10 | 1332 | fonts/overlock/tfm/Overlock-Black-lf-ot1--base.tfm
-2020/07/10 | 1328 | fonts/overlock/tfm/Overlock-Regular-lf-ot1--base.tfm
-2020/07/10 | 1251 | macros/latex/contrib/biblatex-contrib/biblatex-publist/publist.cbx
-2020/07/10 | 117840 | fonts/overlock/doc/overlock-samples.pdf
-2020/07/10 | 1144256 | fonts/newcomputermodern/NewCM10-BookItalic.otf
-2020/07/10 | 1113972 | macros/latex/contrib/cryptocode.zip
-2020/07/10 | 11054 | fonts/overlock/map/overlock.map
-2020/07/10 | 1097728 | fonts/newcomputermodern/NewCM10-Book.otf
-2020/07/10 | 1043865 | macros/latex/contrib/cryptocode/cryptocode.pdf
diff --git a/macros/latex/contrib/l3experimental/CHANGELOG.md b/macros/latex/contrib/l3experimental/CHANGELOG.md
index 51a104cc70..b66593198b 100644
--- a/macros/latex/contrib/l3experimental/CHANGELOG.md
+++ b/macros/latex/contrib/l3experimental/CHANGELOG.md
@@ -7,6 +7,16 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-07-17]
+
+### Added
+- `\color_export:nn(n)N` (see #742)
+- Support for multiple color models (see #739)
+
+### Removed
+
+- `l3cctab`: moved to `l3kernel`
+
## [2020-06-18]
### Changed
@@ -139,7 +149,8 @@ this project uses date-based 'snapshot' version identifiers.
- New `l3color` module using `xcolor`-like expression syntax
- New `l3draw` module, based on `pgf` layer of the TikZ system
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD
+[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17
[2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18
[2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-18...2020-06-03
[2020-05-18]: https://github.com/latex3/latex3/compare/2020-01-12...2020-05-18
diff --git a/macros/latex/contrib/l3experimental/README.md b/macros/latex/contrib/l3experimental/README.md
index 0a3e72316a..413d946314 100644
--- a/macros/latex/contrib/l3experimental/README.md
+++ b/macros/latex/contrib/l3experimental/README.md
@@ -1,7 +1,7 @@
Experimental LaTeX3 Concepts
============================
-Release 2020-06-18
+Release 2020-07-17
Overview
--------
@@ -22,7 +22,6 @@ updated at the same time.
Currently included in the CTAN release of l3experimental are the following
bundles:
* `l3benchmark`
-* `l3cctab`
* `l3color`
* `l3draw`
* `l3graphics`
@@ -37,12 +36,6 @@ bundles:
This module provides support for benchmarking the performance of code.
-`l3cctab`
----------
-
-This module provides support for saving and restoring category codes
-_en masse_ in a table. This is supported for the 8-bit range for all engines,
-and for the entire Unicode range with LuaTeX.
`l3color`
---------
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.dtx b/macros/latex/contrib/l3experimental/l3benchmark.dtx
index a5654f97cd..bd5fa245a9 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.dtx
+++ b/macros/latex/contrib/l3experimental/l3benchmark.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -130,7 +130,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3benchmark}{2020-06-18}{}
+\ProvidesExplPackage{l3benchmark}{2020-07-17}{}
{L3 Experimental benchmarking}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3benchmark.pdf b/macros/latex/contrib/l3experimental/l3benchmark.pdf
index 6bfd2b5bec..7b2598f0d5 100644
--- a/macros/latex/contrib/l3experimental/l3benchmark.pdf
+++ b/macros/latex/contrib/l3experimental/l3benchmark.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3cctab.dtx b/macros/latex/contrib/l3experimental/l3cctab.dtx
deleted file mode 100644
index 4bda61148d..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.dtx
+++ /dev/null
@@ -1,587 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3cctab.dtx
-%
-% Copyright (C) 2018-2020 The LaTeX3 Project
-%
-% It may be distributed and/or modified under the conditions of the
-% LaTeX Project Public License (LPPL), either version 1.3c of this
-% license or (at your option) any later version. The latest version
-% of this license is in the file
-%
-% http://www.latex-project.org/lppl.txt
-%
-% This file is part of the "l3experimental bundle" (The Work in LPPL)
-% and all files in that bundle must be distributed together.
-%
-% -----------------------------------------------------------------------
-%
-% The development version of the bundle can be found at
-%
-% https://github.com/latex3/latex3
-%
-% for those people who are interested.
-%
-%<*driver|package>
-\RequirePackage{expl3}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3cctab} package\\ Experimental category code tables^^A
-% }
-%
-% \author{^^A
-% The \LaTeX3 Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2020-06-18}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \section{\pkg{l3cctab} documentation}
-%
-% A category code table enables rapid switching of all category codes in
-% one operation. For \LuaTeX{}, this is possible over the entire Unicode
-% range. For other engines, only the $8$-bit range ($0$-$255$) is covered by
-% such tables.
-%
-% \subsection{Creating and initialising category code tables}
-%
-% \begin{function}{\cctab_new:N,\cctab_new:c}
-% \begin{syntax}
-% \cs{cctab_new:N} \meta{category code table}
-% \end{syntax}
-% Creates a new \meta{category code table} variable or raises an error if
-% the name is already taken. The declaration is global. The
-% \meta{category code table} is initialised with the codes
-% as used by \IniTeX{}.
-% \end{function}
-%
-% \begin{function}{\cctab_const:Nn,\cctab_const:cn}
-% \begin{syntax}
-% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
-% \end{syntax}
-% Creates a new \meta{category code table} with the category code settings in
-% force at the time the function is called, and applies the
-% \meta{category code set up} on top of prevailing settings, then saves
-% as a constant table.
-% \end{function}
-%
-% \begin{function}{\cctab_gset:Nn,\cctab_gset:cn}
-% \begin{syntax}
-% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
-% \end{syntax}
-% Sets the \meta{category code table} to apply the category codes
-% which apply when the prevailing régime is modified by the
-% \meta{category code set up}. Thus within a standard code block
-% the starting point will be the code applied by \cs{c_code_cctab}.
-% The assignment of the table is global: the underlying primitive does
-% not respect grouping.
-% \end{function}
-%
-% \subsection{Using category code tables}
-%
-% \begin{function}{\cctab_begin:N,\cctab_begin:c}
-% \begin{syntax}
-% \cs{cctab_begin:N} \meta{category code table}
-% \end{syntax}
-% Switches the category codes in force to those stored in the
-% \meta{category code table}. The prevailing codes before the
-% function is called are added to a stack, for use with
-% \cs{cctab_end:}. This function does not start a \TeX{} group.
-% \end{function}
-%
-% \begin{function}{\cctab_end:}
-% \begin{syntax}
-% \cs{cctab_end:}
-% \end{syntax}
-% Ends the scope of a \meta{category code table} started using
-% \cs{cctab_begin:N}, retuning the codes to those in force before
-% the matching \cs{cctab_begin:N} was used.
-% \end{function}
-%
-% \begin{function}[added = 2020-05-19]{\cctab_select:N}
-% \begin{syntax}
-% \cs{cctab_select:N}\meta{category code table}
-% \end{syntax}
-% Selects the \meta{category code table} for the scope of the current
-% group.
-% \end{function}
-%
-% \subsection{Category code table conditionals}
-%
-% \begin{function}[pTF]{\cctab_if_exist:N,\cctab_if_exist:c}
-% \begin{syntax}
-% \cs{cctab_if_exist_p:N} \meta{category code table}
-% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests whether the \meta{category code table} is currently defined.
-% This does not check that the \meta{category code table} really is a
-% category code table.
-% \end{function}
-%
-% \subsection{Constant category code tables}
-%
-% \begin{variable}{\c_code_cctab}
-% Category code table for the code environment. This does not include
-% setting the behaviour of the line-end character, which is only
-% altered by \cs{ExplSyntaxOn}.
-% \end{variable}
-%
-% \begin{variable}{\c_document_cctab}
-% Category code table for a standard \LaTeX{} document. This does not
-% include setting the behaviour of the line-end character, which is
-% only altered by \cs{ExplSyntaxOff}.
-% \end{variable}
-%
-% \begin{variable}{\c_initex_cctab}
-% Category code table as set up by \IniTeX{}.
-% \end{variable}
-%
-% \begin{variable}{\c_other_cctab}
-% Category code table where all characters have category code $12$
-% (other).
-% \end{variable}
-%
-% \begin{variable}{\c_str_cctab}
-% Category code table where all characters have category code $12$
-% (other) with the exception of spaces, which have category code
-% $10$ (space).
-% \end{variable}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3cctab} implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=cctab>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage{l3cctab}{2020-06-18}{}
- {L3 Experimental category code tables}
-%</package>
-% \end{macrocode}
-%
-% \begin{variable}{\g_@@_allocate_int}
-% \begin{variable}{\g_@@_stack_int}
-% \begin{variable}{\g_@@_stack_seq}
-% To allocate category code tables, both the read-only and stack
-% tables need to be followed. There is also a sequence stack for the
-% dynamic tables themselves.
-% \begin{macrocode}
-\int_new:N \g_@@_allocate_int
-\int_gset:Nn \g_@@_allocate_int { -1 }
-\int_new:N \g_@@_stack_int
-\seq_new:N \g_@@_stack_seq
-% \end{macrocode}
-% \end{variable}
-% \end{variable}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_tmp_tl}
-% Scratch space.
-% \begin{macrocode}
-\tl_new:N \l_@@_tmp_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\cctab_new:N,\cctab_new:c}
-% \begin{macro}{\@@_begin:N,\@@_begin:c}
-% \begin{macro}{\@@_end:}
-% \begin{macro}{\cctab_gset:Nn,\cctab_gset:cn}
-% As \LuaTeX{} offers engine support for category code tables, and this is
-% entirely lacking from the other engines, we need two complementary
-% approaches here. Rather than intermix them, we split the set up based on
-% engine. (Some future \XeTeX{} may add support, at which point the
-% conditional here would be subtly different.)
-%
-% First, the \LuaTeX{} case.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
-% \end{macrocode}
-% Creating a new category code table is done slightly differently
-% from other registers. Low-numbered tables are more efficiently-stored
-% than high-numbered ones. There is also a need to have a stack of
-% flexible tables as well as the set of read-only ones. To satisfy both
-% of these requirements, odd numbered tables are used for read-only
-% tables, and even ones for the stack. Here, therefore, the odd numbers
-% are allocated.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \__kernel_chk_if_free_cs:N #1
-%<*initex>
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_compare:nNnTF
- \g_@@_allocate_int < { \c_max_register_int + 1 }
- {
- \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
- \tex_initcatcodetable:D #1
- }
- {
- \__kernel_msg_fatal:nnx
- { kernel } { out-of-registers } { cctab }
- }
-%</initex>
-%<*package>
- \newcatcodetable #1
-%</package>
- }
-% \end{macrocode}
-% The aim here is to ensure that the saved tables are read-only. This is
-% done by using a stack of tables which are not read only, and actually
-% having them as \enquote{in use} copies.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_begin:N #1
- {
- \seq_gpush:Nx \g_@@_stack_seq { \tex_the:D \tex_catcodetable:D }
- \tex_catcodetable:D #1
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \tex_savecatcodetable:D \g_@@_stack_int
- \tex_catcodetable:D \g_@@_stack_int
- }
- \cs_new_protected:Npn \@@_end:
- {
- \int_gsub:Nn \g_@@_stack_int { 2 }
- \seq_if_empty:NTF \g_@@_stack_seq
- { \tl_set:Nn \l_@@_tmp_tl { 0 } }
- { \seq_gpop:NN \g_@@_stack_seq \l_@@_tmp_tl }
- \tex_catcodetable:D \l_@@_tmp_tl \scan_stop:
- }
-% \end{macrocode}
-% Category code tables are always global, so only one version is needed.
-% The set up here is simple, and means that at the point of use there is
-% no need to worry about escaping category codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \tex_savecatcodetable:D #1
- \group_end:
- }
- }
-% \end{macrocode}
-% Now the case for other engines. Here, we use an integer array for each
-% table. The index base is out-by-one, so we have an internal function to
-% handle that. The rest of the approach here is pretty simple: use a stack
-% of tables, and save to them at each |begin|. Unlike the \LuaTeX{} case,
-% we can't accidentally alter a saved table, which makes life a little
-% easier.
-% \begin{macrocode}
- {
- \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } { #2 + 1 } {#3}
- }
-% \end{macrocode}
-% Following the \LuaTeX{} pattern, a new table starts with \IniTeX{} codes.
-% \begin{macrocode}
- \cs_new_protected:Npn \cctab_new:N #1
- {
- \int_gadd:Nn \g_@@_allocate_int { 2 }
- \int_const:Nn #1 { \g_@@_allocate_int }
- \intarray_new:cn { g_@@_ \int_use:N #1 _cctab } { 256 }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N #1 _cctab } {##1} { 12 }
- }
- \@@_gstore:Nnn #1 { 0 } { 9 }
- \@@_gstore:Nnn #1 { 13 } { 5 }
- \@@_gstore:Nnn #1 { 32 } { 10 }
- \@@_gstore:Nnn #1 { 37 } { 14 }
- \int_step_inline:nnn { 65 } { 90 }
- { \@@_gstore:Nnn #1 {##1} { 11 } }
- \@@_gstore:Nnn #1 { 92 } { 0 }
- \int_step_inline:nnn { 97 } { 122 }
- { \@@_gstore:Nnn #1 {##1} { 11 } }
- \@@_gstore:Nnn #1 { 127 } { 15 }
- }
- \cs_new_protected:Npn \@@_begin:N #1
- {
- \int_gadd:Nn \g_@@_stack_int { 2 }
- \int_compare:nNnT \g_@@_stack_int > \c_max_register_int
- { \__kernel_msg_fatal:nn { kernel } { cctab-stack-full } }
- \cs_if_exist:cF { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {
- \intarray_new:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- { 256 }
- }
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N #1 _cctab } {##1}
- }
- }
- }
- \cs_generate_variant:Nn \intarray_new:Nn { c }
- \cs_generate_variant:Nn \intarray_gset:Nnn { c }
- \cs_new_protected:Npn \@@_end:
- {
- \int_step_inline:nn { 256 }
- {
- \char_set_catcode:nn { ##1 - 1 }
- {
- \intarray_item:cn
- { g_@@_ \int_use:N \g_@@_stack_int _cctab }
- {##1}
- }
- }
- \int_gsub:Nn \g_@@_stack_int { 2 }
- }
- \cs_generate_variant:Nn \intarray_item:Nn { c }
- \cs_new_protected:Npn \cctab_gset:Nn #1#2
- {
- \group_begin:
- #2 \scan_stop:
- \int_step_inline:nn { 256 }
- {
- \intarray_gset:cnn { g_@@_ \int_use:N #1 _cctab } {##1}
- { \char_value_catcode:n { ##1 - 1 } }
- }
- \group_end:
- }
- }
-\cs_generate_variant:Nn \cctab_new:N { c }
-\cs_generate_variant:Nn \cctab_gset:Nn { c }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\cctab_begin:N,\cctab_end:}
-% These functions perform a few sanity checks before calling the
-% functions which will do the heavy-lifting.
-% \cs{cctab_begin:N} checks if a \meta{cctab~var} exists before trying
-% to use it. \cs{cctab_end:} checks if a \cs{cctab_begin:N} was used
-% some time earlier.
-%
-% Skipping these checks would result in an \enquote{Undefined control
-% sequence} error for \cs{cctab_begin:N} with an undefined
-% \meta{cctab~var}, and a \enquote{Missing font identifier} for an extra
-% \cs{cctab_end:}.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_begin:N #1
- { \@@_chk_if_valid:NT #1 { \@@_begin:N #1 } }
-\cs_generate_variant:Nn \cctab_begin:N { c }
-\cs_new_protected:Npn \cctab_end:
- {
- \int_compare:nNnTF { \g_@@_stack_int } = { \c_zero_int }
- { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
- { \@@_end: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cctab_select:N}
-% \begin{macro}{\@@_end_fast:}
-% Select a catcode table within a group.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_select:N #1
- {
- \@@_chk_if_valid:NT #1
- {
- \@@_begin:N #1
- \group_insert_after:N \@@_end_fast:
- }
- }
-\cs_generate_variant:Nn \cctab_select:N { c }
-\cs_new_protected:Npx \@@_end_fast:
- {
- \int_gsub:Nn \exp_not:N \g_@@_stack_int { 2 }
- \sys_if_engine_luatex:T
- { \seq_gpop:NN \exp_not:N \g_@@_stack_seq \exp_not:N \l_@@_tmp_tl }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
-% Checks whether a \meta{cctab~var} is defined.
-% \begin{macrocode}
-\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
- { TF , T , F , p }
-\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
- { TF , T , F , p }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_chk_if_valid:N}
-% Checks whether the argument is defined and whether it is a valid
-% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
-% is checked by the engine, which complains if the argument is not
-% a \cs{chardef}'ed constant. In other engines, check if the
-% underlying \cs[no-index]{g_@@_\meta{integer}_cctab}
-% \meta{intarray~var} exists.
-% \begin{macrocode}
-\sys_if_engine_luatex:TF
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist:NTF #1
- {
-%<*initex>
- \bool_lazy_and:nnTF
- { \int_if_odd_p:n {#1} }
- { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } }
-%</initex>
-%<*package>
- \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count }
-%</package>
- { \prg_return_true: }
- {
- \__kernel_msg_error:nnx { kernel } { invalid-cctab }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- {
- \__kernel_msg_error:nnx { kernel } { command-not-defined }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- }
- {
- \prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
- { TF , T , F }
- {
- \cctab_if_exist:NTF #1
- {
- \cs_if_exist:cTF { g_@@_ \int_use:N #1 _cctab }
- { \prg_return_true: }
- {
- \__kernel_msg_error:nnx { kernel } { invalid-cctab }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- {
- \__kernel_msg_error:nnx { kernel } { command-not-defined }
- { \token_to_str:N #1 }
- \prg_return_false:
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
-% Creates a new \meta{cctab~var} then sets it with the current and
-% user-supplied codes.
-% \begin{macrocode}
-\cs_new_protected:Npn \cctab_const:Nn #1#2
- {
- \cctab_new:N #1
- \cctab_gset:Nn #1 {#2}
- }
-\cs_generate_variant:Nn \cctab_const:Nn { c }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}
-% {
-% \c_initex_cctab ,
-% \c_code_cctab ,
-% \c_document_cctab ,
-% \c_other_cctab ,
-% \c_str_cctab
-% }
-% Creating category code tables is easy using the function above.
-% The \texttt{other} and \texttt{string} ones are done by completely
-% ignoring the existing codes as this makes life a lot less complex.
-% \begin{macrocode}
-\cctab_new:N \c_initex_cctab
-\cctab_const:Nn \c_code_cctab { }
-\cctab_const:Nn \c_document_cctab
- {
- \char_set_catcode_space:n { 9 }
- \char_set_catcode_space:n { 32 }
- \char_set_catcode_other:n { 58 }
- \char_set_catcode_math_subscript:n { 95 }
- \char_set_catcode_active:n { 126 }
- }
-\cctab_const:Nn \c_other_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- }
-\cctab_const:Nn \c_str_cctab
- {
- \int_step_inline:nnn { 0 } { 127 }
- { \char_set_catcode_other:n {#1} }
- \char_set_catcode_space:n { 32 }
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Messages}
-%
-% \begin{macrocode}
-\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
- { The~category~code~table~stack~is~exhausted. }
- {
- LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
- but~there~is~no~more~space~to~do~this!
- }
-\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
- { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
- {
- LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
- \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
- }
-\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
- { Invalid~\iow_char:N\\catcode~table. }
- {
- You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
- initialized~using~\iow_char:N\\cctab_new:N~or~
- \iow_char:N\\cctab_const:Nn.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-%\end{implementation}
-%
-%\PrintIndex
diff --git a/macros/latex/contrib/l3experimental/l3cctab.ins b/macros/latex/contrib/l3experimental/l3cctab.ins
deleted file mode 100644
index e968f1bf83..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.ins
+++ /dev/null
@@ -1,62 +0,0 @@
-\iffalse meta-comment
-
-File: l3cctab.ins
-
-Copyright (C) 2018-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of the
-LaTeX Project Public License (LPPL), either version 1.3c of this
-license or (at your option) any later version. The latest version
-of this license is in the file
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
------------------------------------------------------------------------
-
-The development version of the bundle can be found at
-
- https://github.com/latex3/latex3
-
-for those people who are interested.
-
------------------------------------------------------------------------
-
-Any modification of this file should ensure that the copyright and
-license information is placed in the derived files.
-
-\fi
-
-\input l3docstrip.tex
-\askforoverwritefalse
-
-\preamble
-
-Copyright (C) 2018-2020 The LaTeX3 Project
-
-It may be distributed and/or modified under the conditions of
-the LaTeX Project Public License (LPPL), either version 1.3c of
-this license or (at your option) any later version. The latest
-version of this license is in the file:
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3experimental bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{l3cctab.sty}
- {
- \from{l3cctab.dtx}{package}
- }
-}
-
-\endbatchfile
diff --git a/macros/latex/contrib/l3experimental/l3cctab.pdf b/macros/latex/contrib/l3experimental/l3cctab.pdf
deleted file mode 100644
index bd691d11c2..0000000000
--- a/macros/latex/contrib/l3experimental/l3cctab.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3color.dtx b/macros/latex/contrib/l3experimental/l3color.dtx
index 8a87d390b4..91cb13e0b4 100644
--- a/macros/latex/contrib/l3experimental/l3color.dtx
+++ b/macros/latex/contrib/l3experimental/l3color.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -190,9 +190,9 @@
%
% \begin{function}{\color_set:nnn}
% \begin{syntax}
-% \cs{color_set:nnn} \Arg{name} \Arg{model} \Arg{value(s)}
+% \cs{color_set:nnn} \Arg{name} \Arg{model(s)} \Arg{value(s)}
% \end{syntax}
-% Stores the color specification equivalent to the \meta{model} and
+% Stores the color specification equivalent to the \meta{model(s)} and
% \meta{values} as the \meta{name}.
% \end{function}
%
@@ -225,9 +225,9 @@
%
% \begin{function}{\color_select:nn}
% \begin{syntax}
-% \cs{color_select:nn} \Arg{model} \Arg{value(s)}
+% \cs{color_select:nn} \Arg{model(s)} \Arg{value(s)}
% \end{syntax}
-% Activates the color specification equivalent to the \meta{model} and
+% Activates the color specification equivalent to the \meta{model(s)} and
% \meta{value(s)} for typeset material.
% \end{function}
%
@@ -237,23 +237,69 @@
% and similar are not influenced by this setting.
% \end{variable}
%
-% \section{Core color representation}
+% \section{Multiple color models}
%
-% To allow data to be handled internally, \pkg{l3color} uses a simple
-% representation of color, comprising two \meta{balanced text} entries, the first
-% the \meta{model} and the second the \meta{values} given
-% \emph{separated by spaces}.
-%
-% This core representation is produced when parsing color expressions.
+% When selecting or setting a color with an explicit model, it is possible
+% to give values for more than one model at one time. This is particularly
+% useful where automated conversion between models does not give the desired
+% outcome. To do this, the list of models and list of values are both subdivided
+% using |/| characters (as for the similar function in \pkg{xcolor}). For
+% example, to save a color with explicit |cmyk| and |rgb| values, one could
+% use
+% \begin{verbatim}
+% \color_set:nnn { foo } { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% The manually-specified conversion will be used in preference to automated
+% calculation whenever the model(s) listed are used: both in expressions and
+% when a fixed model is active.
%
-% \begin{function}{\color_parse:nN}
+% Similarly, the same syntax can be applied to directly selecting a color.
+% \begin{verbatim}
+% \color_select:nn { cmyk / rgb }
+% { 0.1 , 0.2 , 0.3 , 0.4 / 0.1, 0.2 , 0.3 }
+% \end{verbatim}
+% Again, this list is used when a fixed model is active: the first entry is used
+% unless there is a fixed model matching one of the other entries.
+%
+% \section{Exporting color specifications}
+%
+% The major use of color expressions is in setting typesetting output, but there
+% are other places in which some form of color information is required. These
+% may need data in a different format or using a different model to the internal
+% representation. Thus a set of functions are available to export colors in
+% different formats.
+%
+% Valid export targets are
+% \begin{itemize}
+% \item \texttt{backend} Two brace groups: the first containing the
+% model, the second containing space-separated values appropriate
+% for the model; this is the format required by backend functions
+% of \pkg{expl3}
+% \item \texttt{HTML} Uppercase two-digit hexadecimal values, expressing
+% a red-green-blue color; the digits are \emph{not} separated
+% \item \texttt{space-sep-cmyk} Space-separated cyan-magenta-yellow-black
+% values
+% \item \texttt{space-sep-rgb} Space-separated red-green-blue values
+% suitable for use as a PDF annotation color
+% \end{itemize}
+%
+% \begin{function}{\color_export:nnN}
% \begin{syntax}
-% \cs{color_parse:nN} \Arg{color expression} \Arg{tl}
+% \cs{color_export:nnN} \Arg{color expression} \Arg{format} \Arg{tl}
% \end{syntax}
-% Parses the \meta{color expression} as described above, and sets the
-% \meta{tl} to the equivalent \meta{core color representation}
-% (used at the backend level and based on \texttt{dvips} color
-% representation).
+% Parses the \meta{color expression} as described earlier,
+% then converts to the \meta{format} specified and assigns the data to the
+% \meta{tl}.
+% \end{function}
+%
+% \begin{function}{\color_export:nnN}
+% \begin{syntax}
+% \cs{color_export:nnnN} \Arg{model} \Arg{value(s)} \Arg{format} \Arg{tl}
+% \end{syntax}
+% Expresses the combination of \meta{model} and \meta{value(s)} in an
+% internal representation, then converts to the \meta{format} specified and
+% assigns the data to the \meta{tl}.
% \end{function}
%
% \section{Spot colors}
@@ -275,7 +321,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3color}{2020-06-18}{}
+\ProvidesExplPackage{l3color}{2020-07-17}{}
{L3 Experimental color support}
%</package>
% \end{macrocode}
@@ -297,8 +343,8 @@
% functions).
%
% Since there is no need to manipulate colors \emph{en masse}, each is stored
-% in a separate token list variable, rather than the alternative of using a
-% single property list for all names.
+% in a two-part structure: a \texttt{prop} for the colors themselves, and a
+% \texttt{tl} for the default model for each color.
%
% \subsection{Setup}
%
@@ -323,42 +369,37 @@
% \begin{macrocode}
\prg_new_conditional:Npnn \@@_if_defined:n #1 { T, F, TF }
{
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
+ \prop_if_exist:cTF { l_@@_named_ #1 _prop }
\prg_return_true:
\prg_return_false:
}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}[EXP]{\@@_model:N, \@@_values:N}
+% Simple abstractions.
+% \begin{macrocode}
+\cs_new:Npn \@@_model:N #1 { \exp_after:wN \use_i:nn #1 }
+\cs_new:Npn \@@_values:N #1 { \exp_after:wN \use_ii:nn #1 }
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macro}{\@@_extract:nNN, \@@_extract:VNN}
-% \begin{macro}{\@@_extract:NNnn}
-% Split the model and color from a named color, and store the two. No test
-% for the existence of the color: that is assumed to be the case (this
-% is internal only). Somewhat \enquote{old-fashioned} but should be quite
-% fast.
+% Recover the values for the standard model for a color.
% \begin{macrocode}
\cs_new_protected:Npn \@@_extract:nNN #1#2#3
{
- \exp_after:wN \exp_after:wN \exp_after:wN
- \@@_extract:NNnn
- \exp_after:wN \exp_after:wN \exp_after:wN #2
- \exp_after:wN \exp_after:wN \exp_after:wN #3
- \cs:w l_@@_named_ #1 _tl \cs_end:
+ \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl }
+ \prop_get:cVN { l_@@_named_ #1 _prop } #2 #3
}
\cs_generate_variant:Nn \@@_extract:nNN { V }
-\cs_new_protected:Npn \@@_extract:NNnn #1#2#3#4
- {
- \tl_set:Nn #1 {#3}
- \tl_set:Nn #2 {#4}
- }
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \subsection{Model conversion}
%
% \begin{macro}{\@@_convert:nnN, \@@_convert:VVN}
-% \begin{macro}{\@@_convert:nnnN}
+% \begin{macro}{\@@_convert:nnnN, \@@_convert:nVnN, \@@_convert:nnVN}
% \begin{macro}[aux, EXP]
% {
% \@@_convert_gray_rgb:w
@@ -383,7 +424,7 @@
\tl_set:Nx #4
{ \use:c { @@_convert_ #1 _ #2 :w } #3 ~ 0 ~ 0 ~ 0 \s_@@_stop }
}
-\cs_generate_variant:Nn \@@_convert:nnnN { nnV }
+\cs_generate_variant:Nn \@@_convert:nnnN { nV , nnV }
\cs_new:Npn \@@_convert_gray_rgb:w #1 ~ #2 \s_@@_stop
{ #1 ~ #1 ~ #1 }
\cs_new:Npn \@@_convert_gray_cmyk:w #1 ~ #2 \s_@@_stop
@@ -442,12 +483,15 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\color_parse:nN}
% \begin{macro}{\@@_parse:nN}
+% \begin{macro}{\@@_parse_aux:nN}
+% \begin{macro}{\@@_parse_eq:Nn}
+% \begin{macro}{\@@_parse_eq:nNn}
% \begin{macro}{\@@_parse:Nw}
% \begin{macro}{\@@_parse_loop_init:Nnn}
% \begin{macro}{\@@_parse_loop:w}
% \begin{macro}{\@@_parse_loop:nn}
+% \begin{macro}{\@@_parse_gray:n, \@@_parse_std:n}
% \begin{macro}{\@@_parse_break:w}
% \begin{macro}{\@@_parse_end:}
% \begin{macro}[aux, EXP]{\@@_parse_mix:Nnnn, \@@_parse_mix:NVVn}
@@ -462,37 +506,73 @@
% otherwise expands, then starts working through the expression itself.
% At the end, we apply the payload.
% \begin{macrocode}
-\cs_new_protected:Npn \color_parse:nN #1#2
+\cs_new_protected:Npx \@@_parse:nN #1#2
{
%<*package>
- \@@_backend_pickup:N \l_@@_current_tl
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
+ \exp_not:N \@@_backend_pickup:N \exp_not:N \l_@@_current_tl
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
%</package>
- \exp_args:Ne \@@_parse:nN { \tl_to_str:n {#1} } #2
+ \exp_not:N \exp_args:Ne \exp_not:N \@@_parse_aux:nN
+ { \exp_not:N \tl_to_str:n {#1} } #2
}
% \end{macrocode}
% Before going to all of the effort of parsing an expression, these two
% precursor functions look for a pre-defined name, either on its own or
% with a trailing |!| (which is the same thing).
% \begin{macrocode}
-\cs_new_protected:Npn \@@_parse:nN #1#2
+\cs_new_protected:Npn \@@_parse_aux:nN #1#2
{
- \tl_if_exist:cTF { l_@@_named_ #1 _tl }
- { \tl_set_eq:Nc #2 { l_@@_named_ #1 _tl } }
+ \tl_if_exist:cTF { l_@@_named_ #1 _prop }
+ { \@@_parse_set_eq:Nn #2 {#1} }
{ \@@_parse:Nw #2#1 ! \s_@@_stop }
\@@_check_model:N #2
}
+\cs_new_protected:Npn \@@_parse_set_eq:Nn #1#2
+ {
+ \tl_if_empty:NTF \l_color_fixed_model_tl
+ { \exp_args:Nv \@@_parse_set_eq:nNn { l_@@_named_ #2 _tl } }
+ { \exp_args:NV \@@_parse_set_eq:nNn \l_color_fixed_model_tl }
+ #1 {#2}
+ }
+% \end{macrocode}
+% Here, we have to allow for the case where there is a fixed model:
+% that can't be swept up by generic conversion as we are dealing with a
+% named color.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_set_eq:nNn #1#2#3
+ {
+ \prop_get:cnNTF
+ { l_@@_named_ #3 _prop } {#1}
+ \l_@@_value_tl
+ { \tl_set:Nx #2 { {#1} { \l_@@_value_tl } } }
+ {
+ \tl_set_eq:Nc \l_@@_model_tl { l_@@_named_ #3 _tl }
+ \prop_get:cVN { l_@@_named_ #3 _prop } \l_@@_model_tl
+ \l_@@_value_tl
+ \@@_convert:nnN
+ \l_@@_model_tl {#1} \l_@@_value_tl
+ \tl_set:Nx #2
+ {
+ {#1}
+ { \l_@@_value_tl }
+ }
+ }
+ }
\cs_new_protected:Npn \@@_parse:Nw #1#2 ! #3 \s_@@_stop
{
\@@_if_defined:nTF {#2}
{
\tl_if_blank:nTF {#3}
- { \tl_set_eq:Nc #1 { l_@@_named_ #2 _tl } }
+ { \@@_parse_set_eq:Nn #1 {#2} }
{ \@@_parse_loop_init:Nnn #1 {#2} {#3} }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
- \tl_set_eq:NN \l_@@_current_tl \l_@@_named_black_tl
+ \tl_set:Nn \l_@@_current_tl { { gray } { 0 } }
}
}
% \end{macrocode}
@@ -562,24 +642,9 @@
\@@_extract:nNN {#2} \l_@@_next_model_tl \l_@@_next_value_tl
\tl_if_eq:NNF \l_@@_model_tl \l_@@_next_model_tl
{
- \str_if_eq:VnT \l_@@_model_tl { gray }
- {
- \use:x
- {
- \tl_set:Nn \exp_not:N \l_@@_model_tl
- { \l_@@_next_model_tl }
- \tl_set:Nn \exp_not:N \l_@@_value_tl
- { \l_@@_next_value_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_model_tl
- { \l_@@_model_tl }
- \tl_set:Nn \exp_not:N \l_next_@@_value_tl
- { \l_@@_value_tl }
- }
- }
- \@@_convert:VVN
- \l_@@_next_model_tl
- \l_@@_model_tl
- \l_@@_next_value_tl
+ \str_if_eq:VnTF \l_@@_model_tl { gray }
+ { \@@_parse_gray:n {#2} }
+ { \@@_parse_std:n {#2} }
}
\tl_set:Nx \l_@@_value_tl
{
@@ -593,6 +658,31 @@
\@@_parse_break:w
}
}
+% \end{macrocode}
+% The \texttt{gray} model needs special handling: the models need to be
+% swapped: we do that using a dedicated function.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_parse_gray:n #1
+ {
+ \tl_set_eq:NN \l_@@_model_tl \l_@@_next_model_tl
+ \tl_set:Nn \l_@@_next_model_tl { gray }
+ \exp_args:NnV \@@_convert:nnN { gray } \l_@@_model_tl
+ \l_@@_value_tl
+ \prop_get:cVN { l_@@_named_ #1 _prop } \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+\cs_new_protected:Npn \@@_parse_std:n #1
+ {
+ \prop_get:cVNF { l_@@_named_ #1 _prop }
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ {
+ \@@_convert:VVN
+ \l_@@_next_model_tl
+ \l_@@_model_tl
+ \l_@@_next_value_tl
+ }
+ }
\cs_new_protected:Npn \@@_parse_break:w #1 \@@_parse_end: { }
\cs_new_protected:Npn \@@_parse_end: { }
% \end{macrocode}
@@ -640,6 +730,9 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \begin{macro}[EXP]
% {
@@ -814,52 +907,91 @@
% will therefore always be available. The finalisation is separate from the
% main function so it can also be applied to \emph{e.g.}~page color.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_select:
+\cs_new_protected:Npx \@@_select:
{
- \tl_set_eq:cN { l_@@_named_ . _tl } \l_@@_current_tl
- \@@_select:N \l_@@_current_tl
+ \tl_set:Nx \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_model:N \exp_not:N \l_@@_current_tl }
+ \prop_clear:N \exp_not:c { l_@@_named_ . _prop }
+ \prop_put:NVx \exp_not:c { l_@@_named_ . _prop }
+ \exp_not:c { l_@@_named_ . _tl }
+ { \exp_not:N \@@_values:N \exp_not:N \l_@@_current_tl }
+ \@@_select:N \exp_not:N \l_@@_current_tl
}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\color_select:n}
% \begin{macro}{\color_select:nn}
+% \begin{macro}{\@@_select_main:Nw, \@@_select_loop:Nw}
+% \begin{macro}{\@@_select:nnN}
+% \begin{macro}{\@@_select_swap:Nnn}
% Parse the input expressions then get the backend to actually activate
-% them.
+% them. The main complexity here is the need to check through multiple models.
+% That is done \enquote{locally} here as the approach is subtly different to
+% when different models are being stored.
% \begin{macrocode}
\cs_new_protected:Npn \color_select:n #1
{
- \color_parse:nN {#1} \l_@@_current_tl
+ \@@_parse:nN {#1} \l_@@_current_tl
\@@_select:
}
\cs_new_protected:Npn \color_select:nn #1#2
{
- \@@_direct:nnN {#1} {#2} \l_@@_current_tl
+ \@@_select_main:Nw \l_@@_current_tl
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
\@@_select:
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Direct model use}
-%
-% \begin{macro}{\@@_direct:nnN}
-% Directly set a color based on a model/value combination.
+% If the first color model is the fixed one, or if there is no fixed
+% model, we don't need most of the data: just set up and apply the backend
+% function.
% \begin{macrocode}
-\cs_new_protected:Npn \@@_direct:nnN #1#2#3
+\cs_new_protected:Npn \@@_select_main:Nw
+ #1 #2 / #3 / #4 \s_@@_mark #5 / #6 / #7 \s_@@_stop
+ {
+ \@@_select:nnN {#2} {#5} #1
+ \bool_lazy_or:nnF
+ { \tl_if_empty_p:N \l_color_fixed_model_tl }
+ { \str_if_eq_p:nV {#2} \l_color_fixed_model_tl }
+ { \@@_select_loop:Nw #1 #3 / #4 \s_@@_mark #6 / #7 \s_@@_stop }
+ }
+% \end{macrocode}
+% If a fixed model applies, we need to check each possible value in order.
+% If there is no hit at all, fall back on the generic formula-based
+% interchange.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_select_loop:Nw
+ #1 #2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \str_if_eq:nVTF {#2} \l_color_fixed_model_tl
+ { \@@_select:nnN {#2} {#4} #1 }
+ {
+ \tl_if_blank:nTF {#2}
+ { \exp_after:wN \@@_select_swap:Nnn \exp_after:wN #1 #1 }
+ { \@@_select_loop:Nw #1 #3 \s_@@_mark #5 \s_@@_stop }
+ }
+ }
+\cs_new_protected:Npn \@@_select:nnN #1#2#3
{
\cs_if_exist:cTF { @@_parse_model_ #1 :w }
{
\tl_set:Nx #3
{ \use:c { @@_parse_model_ #1 :w } #2 , 0 , 0 , 0 , 0 \s_@@_stop }
- \@@_check_model:N #3
- }
- {
- \__kernel_msg_error:nnn { color } { unknown-model } {#1}
}
+ { \__kernel_msg_error:nnn { color } { unknown-model } {#1} }
+ }
+\cs_new_protected:Npn \@@_select_swap:Nnn #1#2#3
+ {
+ \@@_convert:nVnN {#2} \l_color_fixed_model_tl {#3} \l_@@_value_tl
+ \tl_set:Nx #1
+ { { \l_color_fixed_model_tl } { \l_@@_value_tl } }
}
% \end{macrocode}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
%
% \subsection{Defining named colors}
%
@@ -870,44 +1002,113 @@
% \end{macrocode}
% \end{variable}
%
-% \begin{macro}{\@@_store:Nn}
-% Store the named color unless it has an invalid name.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_store:Nn #1#2
+% \begin{macro}{\color_set:nn}
+% \begin{macro}{\@@_set:nnn}
+% \begin{macro}{\@@_set:nn}
+% \begin{macro}{\@@_set:nnw}
+% \begin{macro}{\color_set:nnn}
+% \begin{macro}{\@@_set_loop:nw}
+% \begin{macro}{\color_set_eq:nn}
+% Defining named colors means working through the model list and saving
+% both the \enquote{main} color and any equivalents in other models. Even
+% if there is only one model, we store a |prop| as well as a |tl|, as there
+% could be grouping weirdness, etc. When setting using an expression,
+% we need to avoid any fixed model issues, which is done without a group as
+% in \pkg{l3keys}.
+% \begin{macrocode}
+\cs_new_protected:Npn \color_set:nn #1#2
+ {
+ \exp_args:NV \@@_set:nnn
+ \l_color_fixed_model_tl {#1} {#2}
+ }
+\cs_new_protected:Npn \@@_set:nnn #1#2#3
+ {
+ \tl_clear:N \l_color_fixed_model_tl
+ \@@_set:nn {#2} {#3}
+ \tl_set:Nn \l_color_fixed_model_tl {#1}
+ }
+\cs_new_protected:Npn \@@_set:nn #1#2
{
- \str_if_eq:nnF {#2} { . }
+ \str_if_eq:nnF {#1} { . }
{
- \tl_clear_new:c { l_@@_named_ #2 _tl }
- \tl_set_eq:cN { l_@@_named_ #2 _tl } #1
+ \@@_parse:nN {#2} \l_@@_named_tl
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_named_tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set:nnw {#1} {#2} #2 ! \s_@@_stop
}
}
% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\color_set:nn}
-% \begin{macro}{\color_set:nnn}
-% \begin{macro}{\color_set_eq:nn}
-% Defining named colors has to include a step to force creation of the
-% underlying token list to avoid errors when checking is enabled.
+% When setting an expression-based color, there could be multiple model
+% data available for one or more of the input colors. Where that is true for
+% the \emph{first} named color in an expression, we re-parse the expression
+% when they are also parameter-based: only |cmyk|, |gray| and |rgb| make
+% any sense here. There is a bit of a performance hit but this should be
+% rare and taking place during set-up.
% \begin{macrocode}
-\cs_new_protected:Npn \color_set:nn #1#2
+\cs_new_protected:Npn \@@_set:nnw #1#2#3 ! #4 \s_@@_stop
{
- \color_parse:nN {#2} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
+ \clist_map_inline:nn { cmyk , gray , rgb }
+ {
+ \prop_get:cnNT { l_@@_named_ #3 _prop } {##1} \l_@@_internal_tl
+ {
+ \prop_if_in:cnF { l_@@_named_ #1 _prop } {##1}
+ {
+ \group_begin:
+ \tl_set:cn { l_@@_named_ #3 _tl } {##1}
+ \@@_parse:nN {#2} \l_@@_internal_tl
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn \l_@@_internal_tl \l_@@_internal_tl
+ \prop_put:cxx { l_@@_named_ #1 _prop }
+ { \@@_model:N \l_@@_internal_tl }
+ { \@@_values:N \l_@@_internal_tl }
+ }
+ }
+ }
}
\cs_new_protected:Npn \color_set:nnn #1#2#3
{
- \@@_direct:nnN {#2} {#3} \l_@@_named_tl
- \@@_store:Nn \l_@@_named_tl {#1}
+ \str_if_eq:nnF {#1} { . }
+ {
+ \tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
+ \@@_set_loop:nw {#1} #2 / / \s_@@_mark #3 / / \s_@@_stop
+ }
+ }
+\cs_new_protected:Npn \@@_set_loop:nw
+ #1#2 / #3 \s_@@_mark #4 / #5 \s_@@_stop
+ {
+ \tl_if_blank:nF {#2}
+ {
+ \@@_select:nnN {#2} {#4} \l_@@_named_tl
+ \tl_set:Nx \l_@@_internal_tl { \@@_model:N \l_@@_named_tl }
+ \tl_if_empty:cT { l_@@_named_ #1 _tl }
+ { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_internal_tl }
+ \prop_put:cVx { l_@@_named_ #1 _prop } \l_@@_internal_tl
+ { \@@_values:N \l_@@_named_tl }
+ \@@_set_loop:nw {#1} #3 \s_@@_mark #5 \s_@@_stop
+ }
}
\cs_new_protected:Npn \color_set_eq:nn #1#2
{
\@@_if_defined:nTF {#2}
{
\tl_clear_new:c { l_@@_named_ #1 _tl }
+ \prop_clear_new:c { l_@@_named_ #1 _prop }
\str_if_eq:nnTF {#2} { . }
- { \tl_set_eq:cN { l_@@_named_ #1 _tl } \l_@@_current_tl }
- { \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl } }
+ {
+ \tl_set:cx { l_@@_named_ #1 _tl }
+ { \@@_model:N \l_@@_current_tl }
+ \prop_put:cvx { l_@@_named_ #1 _prop } { l_@@_named_ #1 _tl }
+ { \@@_values:N \l_@@_current_tl }
+ }
+ {
+ \tl_set_eq:cc { l_@@_named_ #1 _tl } { l_@@_named_ #2 _tl }
+ \prop_set_eq:cc { l_@@_named_ #1 _prop } { l_@@_named_ #2 _prop }
+ }
}
{
\__kernel_msg_error:nnn { color } { unknown-color } {#2}
@@ -920,6 +1121,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
%
% A small set of colors are always defined.
% \begin{macrocode}
@@ -933,19 +1135,154 @@
\color_set:nnn { blue } { rgb } { 0 , 0 , 1 }
% \end{macrocode}
%
-% \begin{variable}{\l_@@_named_._tl}
+% \begin{variable}{\l_@@_named_._prop, \l_@@_named_._tl}
% A special named color: this is always defined though not fixed in
% definition.
% \begin{macrocode}
+\prop_new:c { l_@@_named_._prop }
\tl_new:c { l_@@_named_._tl }
-\tl_set_eq:cN { l_@@_named_._tl } \l_@@_current_tl
+\tl_set:cx { l_@@_named_._tl } { \@@_model:N \l_@@_current_tl }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Exporting colors}
+%
+% \begin{macro}{\color_export:nnN}
+% \begin{macro}{\color_export:nnnN}
+% \begin{macro}{\@@_export:nN}
+% \begin{macro}{\@@_export:nnnN}
+% \begin{macrocode}
+\cs_new_protected:Npn \color_export:nnN #1#2#3
+ {
+ \group_begin:
+ \tl_if_exist:cT { c_@@_export_ #2 _tl }
+ { \tl_set_eq:Nc \l_color_fixed_model_tl { c_@@_export_ #2 _tl } }
+ \@@_parse:nN {#1} #3
+ \@@_export:nN {#2} #3
+ \exp_args:NNNV \group_end:
+ \tl_set:Nn #3 #3
+ }
+\cs_new_protected:Npn \color_export:nnnN #1#2#3#4
+ {
+ \@@_select_main:Nw #4
+ #1 / / \s_@@_mark #2 / / \s_@@_stop
+ \@@_export:nN {#3} #4
+ }
+\cs_new_protected:Npn \@@_export:nN #1#2
+ { \exp_after:wN \@@_export:nnnN #2 {#1} #2 }
+\cs_new:Npn \@@_export:nnnN #1#2#3#4
+ {
+ \cs_if_exist_use:cF { @@_export_format_ #3 :nnN }
+ {
+ \__kernel_msg_error:nnn { color } { unknown-export-format } {#3}
+ \use_none:nnn
+ }
+ {#1} {#2} #4
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@@_export_format_backend:nnN}
+% Simple.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_backend:nnN #1#2#3
+ { \tl_set:Nn #3 { {#1} {#2} } }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_export:nnnNN}
+% A generic auxiliary for cases where only one model is appropriate.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export:nnnNN #1#2#3#4#5
+ {
+ \str_if_eq:nnTF {#2} {#1}
+ { #5 #4 #3 \s_@@_stop }
+ {
+ \@@_convert:nnnN {#2} {#1} {#3} #4
+ \exp_after:wN #5 \exp_after:wN #4
+ #4 \s_@@_stop
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_@@_export_HTML_tl ,
+% \c_@@_export_space-sep-cmyk_tl ,
+% \c_@@_export_space-sep-rgb_tl
+% }
+% \begin{macrocode}
+\tl_const:Nn \c_@@_export_HTML_tl { rgb }
+\tl_const:cn { c_@@_export_space-sep-cmyk_tl } { cmyk }
+\tl_const:cn { c_@@_export_space-sep-rgb_tl } { rgb }
% \end{macrocode}
% \end{variable}
%
+% \begin{macro}{\@@_export_format_space-sep-cmyk:nnN}
+% \begin{macro}{\@@_export_space-sep-cmyk:Nw}
+% \begin{macrocode}
+\cs_new_protected:cpx { @@_export_format_space-sep-cmyk:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { cmyk } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-cmyk:Nw }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-cmyk:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}
+% {
+% \@@_export_format_HTML:nnN ,
+% \@@_export_format_space-sep-rgb:nnN
+% }
+% \begin{macro}
+% {
+% \@@_export_HTML:Nw ,
+% \@@_export_space-sep-rgb:Nw
+% }
+% \begin{macro}[EXP]{\@@_export_HTML:n}
+% \textsc{html} values must be given in |rgb|: we force conversion if
+% required, then do some simple maths.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_export_format_HTML:nnN #1#2#3
+ { \@@_export:nnnNN { rgb } {#1} {#2}#3 \@@_export_HTML:Nw }
+\cs_new_protected:cpx { @@_export_format_space-sep-rgb:nnN } #1#2#3
+ {
+ \exp_not:N \@@_export:nnnNN { rgb } {#1} {#2} #3
+ \exp_not:c { @@_export_space-sep-rgb:Nw }
+ }
+\cs_new_protected:Npn \@@_export_HTML:Nw #1#2 ~ #3 ~ #4 \s_@@_stop
+ {
+ \tl_set:Nx #1
+ {
+ \@@_export_HTML:n {#2}
+ \@@_export_HTML:n {#3}
+ \@@_export_HTML:n {#4}
+ }
+ }
+\cs_new:Npn \@@_export_HTML:n #1
+ {
+ \fp_compare:nNnTF {#1} = { 0 }
+ { 00 }
+ { \int_to_Hex:n { \fp_to_int:n { #1 * 255 } } }
+ }
+\cs_new_protected:cpn { @@_export_space-sep-rgb:Nw } #1#2 \s_@@_stop
+ { \tl_set:Nx #1 {#2} }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
% \subsection{Diagnostics}
%
% \begin{macro}{\color_show:n}
-% \begin{macro}{\@@_show:nn}
+% \begin{macro}{\@@_show:n}
% Extract the information about a color and format for the user: the approach
% is similar to the keys module here.
% \begin{macrocode}
@@ -954,17 +1291,20 @@
\msg_show:nnxxxx { LaTeX / color } { show }
{#1}
{
- \@@_if_defined:nTF {#1}
- { \exp_last_unbraced:Nv \@@_show:nn { l_@@_named_ #1 _tl } }
- { }
+ \@@_if_defined:nT {#1}
+ {
+ \exp_args:Nv \@@_show:n { l_@@_named_ #1 _tl }
+ \prop_map_function:cN
+ { l_@@_named_ #1 _prop }
+ \msg_show_item_unbraced:nn
+ }
}
{ }
{ }
}
-\cs_new:Npn \@@_show:nn #1#2
+\cs_new:Npn \@@_show:n #1
{
\msg_show_item_unbraced:nn { model } {#1}
- \msg_show_item_unbraced:nn { value } {#2}
}
% \end{macrocode}
% \end{macro}
@@ -979,6 +1319,12 @@
LaTeX~has~been~asked~to~use~a~color~named~'#1',~
but~this~has~never~been~defined.
}
+\__kernel_msg_new:nnnn { color } { unknown-export-format }
+ { Unknown~export~format~'#1'. }
+ {
+ LaTeX~has~been~asked~to~export~a~color~in~format~'#1',~
+ but~this~has~never~been~defined.
+ }
\__kernel_msg_new:nnnn { color } { unknown-model }
{ Unknown~color~model~'#1'. }
{
diff --git a/macros/latex/contrib/l3experimental/l3color.pdf b/macros/latex/contrib/l3experimental/l3color.pdf
index 26f43e0e1f..80ecd21fe5 100644
--- a/macros/latex/contrib/l3experimental/l3color.pdf
+++ b/macros/latex/contrib/l3experimental/l3color.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
index 8a20c1a348..a39bd99f30 100644
--- a/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-boxes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-code.pdf b/macros/latex/contrib/l3experimental/l3draw-code.pdf
index 33c81c0e60..9536595edc 100644
--- a/macros/latex/contrib/l3experimental/l3draw-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3draw-layers.dtx b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
index 1f1debc79e..43d699b64b 100644
--- a/macros/latex/contrib/l3experimental/l3draw-layers.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-layers.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-paths.dtx b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
index bf44643680..847ade5f44 100644
--- a/macros/latex/contrib/l3experimental/l3draw-paths.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-paths.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-points.dtx b/macros/latex/contrib/l3experimental/l3draw-points.dtx
index 6e578a694a..15ad9e1f17 100644
--- a/macros/latex/contrib/l3experimental/l3draw-points.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-points.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
index b2cd3db445..038c93dbf6 100644
--- a/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-scopes.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
index 943484d811..75af8516ae 100644
--- a/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-softpath.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw-state.dtx b/macros/latex/contrib/l3experimental/l3draw-state.dtx
index 4f434d924b..cfced7e0d5 100644
--- a/macros/latex/contrib/l3experimental/l3draw-state.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-state.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -167,7 +167,7 @@
{ \@@_color:nn { stroke } {#1} }
\cs_new_protected:Npn \@@_color:nn #1#2
{
- \color_parse:nN {#2} \l_@@_color_tmp_tl
+ \color_export:nnN {#2} { backend } \l_@@_color_tmp_tl
\exp_after:wN \@@_color:nnn \l_@@_color_tmp_tl {#1}
}
\cs_new_protected:Npn \@@_color:nnn #1#2#3
diff --git a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
index b995cf6fc9..dcdfc783b7 100644
--- a/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw-transforms.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3experimental/l3draw.dtx b/macros/latex/contrib/l3experimental/l3draw.dtx
index 4ba0e2cb74..081d42e7f3 100644
--- a/macros/latex/contrib/l3experimental/l3draw.dtx
+++ b/macros/latex/contrib/l3experimental/l3draw.dtx
@@ -110,7 +110,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -1146,7 +1146,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3draw}{2020-06-18}{}
+\ProvidesExplPackage{l3draw}{2020-07-17}{}
{L3 Experimental core drawing support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3draw.pdf b/macros/latex/contrib/l3experimental/l3draw.pdf
index a6cc55f4a1..a8cb1a14dc 100644
--- a/macros/latex/contrib/l3experimental/l3draw.pdf
+++ b/macros/latex/contrib/l3experimental/l3draw.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3galley.dtx b/macros/latex/contrib/l3experimental/l3galley.dtx
index 639e7ade99..7865c39b7f 100644
--- a/macros/latex/contrib/l3experimental/l3galley.dtx
+++ b/macros/latex/contrib/l3experimental/l3galley.dtx
@@ -61,7 +61,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -687,7 +687,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3galley}{2020-06-18}{}
+\ProvidesExplPackage{l3galley}{2020-07-17}{}
{L3 Experimental galley code}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3galley.pdf b/macros/latex/contrib/l3experimental/l3galley.pdf
index 2070aa9727..568e913fd2 100644
--- a/macros/latex/contrib/l3experimental/l3galley.pdf
+++ b/macros/latex/contrib/l3experimental/l3galley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3graphics.dtx b/macros/latex/contrib/l3experimental/l3graphics.dtx
index 73517bfe80..9908f59c34 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.dtx
+++ b/macros/latex/contrib/l3experimental/l3graphics.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -241,7 +241,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3graphics}{2020-06-18}{}
+\ProvidesExplPackage{l3graphics}{2020-07-17}{}
{L3 Experimental graphics inclusion support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3graphics.pdf b/macros/latex/contrib/l3experimental/l3graphics.pdf
index 976b88a418..80f61fa228 100644
--- a/macros/latex/contrib/l3experimental/l3graphics.pdf
+++ b/macros/latex/contrib/l3experimental/l3graphics.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3pdf-code.pdf b/macros/latex/contrib/l3experimental/l3pdf-code.pdf
index 82a5328fd3..d74c199483 100644
--- a/macros/latex/contrib/l3experimental/l3pdf-code.pdf
+++ b/macros/latex/contrib/l3experimental/l3pdf-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3pdf.dtx b/macros/latex/contrib/l3experimental/l3pdf.dtx
index 1a21347ef3..984336443e 100644
--- a/macros/latex/contrib/l3experimental/l3pdf.dtx
+++ b/macros/latex/contrib/l3experimental/l3pdf.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -191,7 +191,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3pdf}{2020-06-18}{}
+\ProvidesExplPackage{l3pdf}{2020-07-17}{}
{L3 Experimental core PDF support}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3pdf.pdf b/macros/latex/contrib/l3experimental/l3pdf.pdf
index aa887d20cc..c51a2055be 100644
--- a/macros/latex/contrib/l3experimental/l3pdf.pdf
+++ b/macros/latex/contrib/l3experimental/l3pdf.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3str-format.dtx b/macros/latex/contrib/l3experimental/l3str-format.dtx
index 52902e21a8..3c4fbc6336 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.dtx
+++ b/macros/latex/contrib/l3experimental/l3str-format.dtx
@@ -48,7 +48,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -167,7 +167,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3str-format}{2020-06-18}{}
+\ProvidesExplPackage{l3str-format}{2020-07-17}{}
{L3 Experimental string formatting}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3str-format.pdf b/macros/latex/contrib/l3experimental/l3str-format.pdf
index df3c4c985a..fe0b1e71cb 100644
--- a/macros/latex/contrib/l3experimental/l3str-format.pdf
+++ b/macros/latex/contrib/l3experimental/l3str-format.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.dtx b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
index 7da0422159..466a4d4107 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.dtx
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.dtx
@@ -46,7 +46,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -136,7 +136,7 @@
%
% \begin{macrocode}
%<*package>
-\ProvidesExplPackage{l3sys-shell}{2020-06-18}{}
+\ProvidesExplPackage{l3sys-shell}{2020-07-17}{}
{L3 Experimental system shell functions}
%</package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/l3sys-shell.pdf b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
index 7a311ee701..a455433a5c 100644
--- a/macros/latex/contrib/l3experimental/l3sys-shell.pdf
+++ b/macros/latex/contrib/l3experimental/l3sys-shell.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xcoffins.dtx b/macros/latex/contrib/l3experimental/xcoffins.dtx
index 68776e0572..65c1872645 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.dtx
+++ b/macros/latex/contrib/l3experimental/xcoffins.dtx
@@ -56,7 +56,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -675,7 +675,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xcoffins}{2020-06-18}{}
+\ProvidesExplPackage{xcoffins}{2020-07-17}{}
{L3 Experimental design level coffins}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/l3experimental/xcoffins.pdf b/macros/latex/contrib/l3experimental/xcoffins.pdf
index d7a782681c..ff560afb71 100644
--- a/macros/latex/contrib/l3experimental/xcoffins.pdf
+++ b/macros/latex/contrib/l3experimental/xcoffins.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3experimental/xgalley.dtx b/macros/latex/contrib/l3experimental/xgalley.dtx
index 59be5e01ea..d917bdecff 100644
--- a/macros/latex/contrib/l3experimental/xgalley.dtx
+++ b/macros/latex/contrib/l3experimental/xgalley.dtx
@@ -47,7 +47,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -734,7 +734,7 @@
% \end{macrocode}
%
% \begin{macrocode}
-\ProvidesExplPackage{xgalley}{2020-06-18}{}
+\ProvidesExplPackage{xgalley}{2020-07-17}{}
{L3 Experimental galley}
\RequirePackage{xparse,xtemplate,l3galley}
% \end{macrocode}
diff --git a/macros/latex/contrib/l3experimental/xgalley.pdf b/macros/latex/contrib/l3experimental/xgalley.pdf
index dfd4200570..e5c6e5ee48 100644
--- a/macros/latex/contrib/l3experimental/xgalley.pdf
+++ b/macros/latex/contrib/l3experimental/xgalley.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/CHANGELOG.md b/macros/latex/contrib/l3kernel/CHANGELOG.md
index d487068859..1386856157 100644
--- a/macros/latex/contrib/l3kernel/CHANGELOG.md
+++ b/macros/latex/contrib/l3kernel/CHANGELOG.md
@@ -7,6 +7,27 @@ this project uses date-based 'snapshot' version identifiers.
## [Unreleased]
+## [2020-07-17]
+
+### Added
+- `l3cctab` module for using category code tables
+- `\file_parse_full_name:n` and `\file_parse_full_name_apply:nN`
+- Additional `\prop_put:Nnn` variants
+- `\seq_set_map_x:NNn`
+- `\msg_term:nn(nnnn)`
+
+### Fixed
+- File lookup with `\input@path`
+
+### Changed
+- Implementation of `\file_parse_full_name:nNNN` now uses
+ `\file_parse_full_name:n` internally
+- `\seq_set_map:NNn` no longer `x`-expands `<inline function>`
+ (`\seq_set_map_x:NNn` now does that). Both moved to stable.
+
+### Removed
+- Functions deprecated at end of 2019
+
## [2020-06-18]
### Changed
@@ -704,7 +725,8 @@ this project uses date-based 'snapshot' version identifiers.
- Step func­tions have been added for dim vari­ables,
e.g. `\dim_step_in­line:nnnn`
-[Unreleased]: https://github.com/latex3/latex3/compare/2020-06-18...HEAD
+[Unreleased]: https://github.com/latex3/latex3/compare/2020-07-17...HEAD
+[2020-07-17]: https://github.com/latex3/latex3/compare/2020-06-18...2020-07-17
[2020-06-18]: https://github.com/latex3/latex3/compare/2020-06-03...2020-06-18
[2020-06-03]: https://github.com/latex3/latex3/compare/2020-05-15...2020-06-03
[2020-05-15]: https://github.com/latex3/latex3/compare/2020-05-14...2020-05-15
diff --git a/macros/latex/contrib/l3kernel/README.md b/macros/latex/contrib/l3kernel/README.md
index 8ff01699d7..bfd238bcce 100644
--- a/macros/latex/contrib/l3kernel/README.md
+++ b/macros/latex/contrib/l3kernel/README.md
@@ -1,7 +1,7 @@
LaTeX3 Programming Conventions
==============================
-Release 2020-06-18
+Release 2020-07-17
Overview
--------
diff --git a/macros/latex/contrib/l3kernel/expl3.dtx b/macros/latex/contrib/l3kernel/expl3.dtx
index 0710d88c5d..e1a36c6db5 100644
--- a/macros/latex/contrib/l3kernel/expl3.dtx
+++ b/macros/latex/contrib/l3kernel/expl3.dtx
@@ -24,7 +24,7 @@
%
%<*driver|generic|package|2ekernel>
%</driver|generic|package|2ekernel>
-\def\ExplFileDate{2020-06-18}%
+\def\ExplFileDate{2020-07-17}%
%<*driver>
\documentclass[full]{l3doc}
\usepackage{graphicx}
@@ -51,7 +51,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -423,6 +423,7 @@
% \item[bool] either true or false (the \LaTeX3 implementation does
% not use \tn{iftrue} or \tn{iffalse});
% \item[box] box register;
+% \item[cctab] category code table;
% \item[clist] comma separated list;
% \item[coffin] a \enquote{box with handles} --- a higher-level data
% type for carrying out |box| alignment operations;
diff --git a/macros/latex/contrib/l3kernel/expl3.pdf b/macros/latex/contrib/l3kernel/expl3.pdf
index 18721992ab..d76040d2bd 100644
--- a/macros/latex/contrib/l3kernel/expl3.pdf
+++ b/macros/latex/contrib/l3kernel/expl3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.pdf b/macros/latex/contrib/l3kernel/interface3.pdf
index 8f3d8ec787..3c44cfaf5e 100644
--- a/macros/latex/contrib/l3kernel/interface3.pdf
+++ b/macros/latex/contrib/l3kernel/interface3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/interface3.tex b/macros/latex/contrib/l3kernel/interface3.tex
index 2c600d4696..467d04cf86 100644
--- a/macros/latex/contrib/l3kernel/interface3.tex
+++ b/macros/latex/contrib/l3kernel/interface3.tex
@@ -54,7 +54,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/l3.ins b/macros/latex/contrib/l3kernel/l3.ins
index 04d1e18a34..e54fe0cb51 100644
--- a/macros/latex/contrib/l3kernel/l3.ins
+++ b/macros/latex/contrib/l3kernel/l3.ins
@@ -95,6 +95,7 @@ and all files in that bundle must be distributed together.
\from{l3fp-convert.dtx} {package}
\from{l3fp-random.dtx} {package}
\from{l3fparray.dtx} {package}
+ \from{l3cctab.dtx} {package}
\from{l3sort.dtx} {package}
\from{l3str-convert.dtx}{package}
\from{l3tl-analysis.dtx}{package}
diff --git a/macros/latex/contrib/l3kernel/l3alloc.dtx b/macros/latex/contrib/l3kernel/l3alloc.dtx
index 4fdce60bdc..8f60b563f7 100644
--- a/macros/latex/contrib/l3kernel/l3alloc.dtx
+++ b/macros/latex/contrib/l3kernel/l3alloc.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3basics.dtx b/macros/latex/contrib/l3kernel/l3basics.dtx
index c871aeb759..3cee7e2e9e 100644
--- a/macros/latex/contrib/l3kernel/l3basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3basics.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3bootstrap.dtx b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
index 8ff412298c..5043d39d56 100644
--- a/macros/latex/contrib/l3kernel/l3bootstrap.dtx
+++ b/macros/latex/contrib/l3kernel/l3bootstrap.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3box.dtx b/macros/latex/contrib/l3kernel/l3box.dtx
index a30bed22c7..e604fe5e4f 100644
--- a/macros/latex/contrib/l3kernel/l3box.dtx
+++ b/macros/latex/contrib/l3kernel/l3box.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3candidates.dtx b/macros/latex/contrib/l3kernel/l3candidates.dtx
index a307cb02df..d8d6bf6808 100644
--- a/macros/latex/contrib/l3kernel/l3candidates.dtx
+++ b/macros/latex/contrib/l3kernel/l3candidates.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -426,24 +426,6 @@
% \end{texnote}
% \end{function}
%
-% \begin{function}[added = 2011-12-22]
-% {\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{syntax}
-% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
-% \end{syntax}
-% Applies \meta{inline function} to every \meta{item} stored
-% within the \meta{sequence_2}. The \meta{inline function} should
-% consist of code which will receive the \meta{item} as |#1|.
-% The sequence resulting from \texttt{x}-expanding
-% \meta{inline function} applied to each \meta{item}
-% is assigned to \meta{sequence_1}. As such, the code
-% in \meta{inline function} should be expandable.
-% \begin{texnote}
-% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
-% be used in this function, and would lead to low-level \TeX{} errors.
-% \end{texnote}
-% \end{function}
-%
% \begin{function}[added = 2018-04-06]
% {\seq_set_from_function:NnN, \seq_gset_from_function:NnN}
% \begin{syntax}
@@ -622,7 +604,8 @@
% \cs{tl_build_end:N} \meta{tl~var}
% \end{syntax}
% Gets the contents of \meta{tl~var} and stores that into the
-% \meta{tl~var} using \cs{tl_set:Nn}. The \meta{tl~var} must have
+% \meta{tl~var} using \cs{tl_set:Nn} or \cs{tl_gset:Nn}.
+% The \meta{tl~var} must have
% been set up with \cs{tl_build_begin:N} or \cs{tl_build_gbegin:N}.
% The |end| and |gend| functions must be used for local and global
% \meta{tl~var} respectively. These functions completely remove the
@@ -1145,26 +1128,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
-% \begin{macro}{\@@_set_map:NNNn}
-% Very similar to \cs{seq_set_filter:NNn}. We could actually
-% merge the two within a single function, but it would have weird
-% semantics.
-% \begin{macrocode}
-\cs_new_protected:Npn \seq_set_map:NNn
- { \@@_set_map:NNNn \tl_set:Nx }
-\cs_new_protected:Npn \seq_gset_map:NNn
- { \@@_set_map:NNNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
- {
- \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
- #1 #2 { #3 }
- \@@_pop_item_def:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \begin{macro}{\seq_set_from_inline_x:Nnn, \seq_gset_from_inline_x:Nnn}
% \begin{macro}{\@@_set_from_inline_x:NNnn}
% Set \cs{@@_item:n} then map it using the loop code.
diff --git a/macros/latex/contrib/l3kernel/l3cctab.dtx b/macros/latex/contrib/l3kernel/l3cctab.dtx
new file mode 100644
index 0000000000..25becd59fd
--- /dev/null
+++ b/macros/latex/contrib/l3kernel/l3cctab.dtx
@@ -0,0 +1,891 @@
+% \iffalse meta-comment
+%
+%% File: l3cctab.dtx
+%
+% Copyright (C) 2018-2020 The LaTeX3 Project
+%
+% It may be distributed and/or modified under the conditions of the
+% LaTeX Project Public License (LPPL), either version 1.3c of this
+% license or (at your option) any later version. The latest version
+% of this license is in the file
+%
+% http://www.latex-project.org/lppl.txt
+%
+% This file is part of the "l3kernel bundle" (The Work in LPPL)
+% and all files in that bundle must be distributed together.
+%
+% -----------------------------------------------------------------------
+%
+% The development version of the bundle can be found at
+%
+% https://github.com/latex3/latex3
+%
+% for those people who are interested.
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\begin{document}
+ \DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{^^A
+% The \pkg{l3cctab} package\\ Category code tables^^A
+% }
+%
+% \author{^^A
+% The \LaTeX3 Project\thanks
+% {^^A
+% E-mail:
+% \href{mailto:latex-team@latex-project.org}
+% {latex-team@latex-project.org}^^A
+% }^^A
+% }
+%
+% \date{Released 2020-07-17}
+%
+% \maketitle
+%
+% \begin{documentation}
+%
+% A category code table enables rapid switching of all category codes in
+% one operation. For \LuaTeX{}, this is possible over the entire Unicode
+% range. For other engines, only the $8$-bit range ($0$--$255$) is covered by
+% such tables.
+%
+% \section{Creating and initialising category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_new:N,\cctab_new:c}
+% \begin{syntax}
+% \cs{cctab_new:N} \meta{category code table}
+% \end{syntax}
+% Creates a new \meta{category code table} variable or raises an error if
+% the name is already taken. The declaration is global. The
+% \meta{category code table} is initialised with the codes
+% as used by \IniTeX{}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_const:Nn,\cctab_const:cn}
+% \begin{syntax}
+% \cs{cctab_const:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Creates a new \meta{category code table}, applies (in a group) the
+% \meta{category code set up} on top of \IniTeX{} settings,
+% then saves them globally as a constant
+% table. The \meta{category code set up} can include a call to
+% \cs{cctab_select:N}.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-07]{\cctab_gset:Nn,\cctab_gset:cn}
+% \begin{syntax}
+% \cs{cctab_gset:Nn} \meta{category code table} \Arg{category code set up}
+% \end{syntax}
+% Starting from the \IniTeX{} category codes,
+% applies (in a group) the \meta{category code set up}, then saves them
+% globally in the \meta{category code table}. The \meta{category code set up}
+% can include a call to \cs{cctab_select:N}.
+% \end{function}
+%
+% \section{Using category code tables}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_begin:N,\cctab_begin:c}
+% \begin{syntax}
+% \cs{cctab_begin:N} \meta{category code table}
+% \end{syntax}
+% Switches locally the category codes in force to those stored in the
+% \meta{category code table}. The prevailing codes before the
+% function is called are added to a stack, for use with
+% \cs{cctab_end:}. This function does not start a \TeX{} group.
+% \end{function}
+%
+% \begin{function}[updated = 2020-07-02]{\cctab_end:}
+% \begin{syntax}
+% \cs{cctab_end:}
+% \end{syntax}
+% Ends the scope of a \meta{category code table} started using
+% \cs{cctab_begin:N}, returning the codes to those in force before the
+% matching \cs{cctab_begin:N} was used. This must be used within the
+% same \TeX{} group (and at the same \TeX{} group level) as the
+% matching \cs{cctab_begin:N}.
+% \end{function}
+%
+% \begin{function}[added = 2020-05-19, updated = 2020-07-02]{\cctab_select:N}
+% \begin{syntax}
+% \cs{cctab_select:N} \meta{category code table}
+% \end{syntax}
+% Selects the \meta{category code table} for the scope of the current
+% group. This is in particular useful in the \meta{setup} arguments
+% of \cs{tl_set_rescan:Nnn}, \cs{tl_rescan:nn}, \cs{cctab_const:Nn},
+% and \cs{cctab_gset:Nn}.
+% \end{function}
+%
+% \section{Category code table conditionals}
+%
+% \begin{function}[pTF]{\cctab_if_exist:N, \cctab_if_exist:c}
+% \begin{syntax}
+% \cs{cctab_if_exist_p:N} \meta{category code table}
+% \cs{cctab_if_exist:NTF} \meta{category code table} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests whether the \meta{category code table} is currently defined.
+% This does not check that the \meta{category code table} really is a
+% category code table.
+% \end{function}
+%
+% \section{Constant category code tables}
+%
+% \begin{variable}[updated = 2020-07-10]{\c_code_cctab}
+% Category code table for the \pkg{expl3} code environment; this does
+% \emph{not} include \texttt{@}, which is retained as an \enquote{other}
+% character.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-08]{\c_document_cctab}
+% Category code table for a standard \LaTeX{} document, as set by the \LaTeX{}
+% kernel. In particular, the upper-half of the $8$-bit range will be set to
+% \enquote{active} with \pdfTeX{} \emph{only}. No \pkg{babel} shorthands
+% will be activated.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_initex_cctab}
+% Category code table as set up by \IniTeX{}.
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_other_cctab}
+% Category code table where all characters have category code $12$
+% (other).
+% \end{variable}
+%
+% \begin{variable}[updated = 2020-07-02]{\c_str_cctab}
+% Category code table where all characters have category code $12$
+% (other) with the exception of spaces, which have category code
+% $10$ (space).
+% \end{variable}
+%
+% \end{documentation}
+%
+% \begin{implementation}
+%
+% \section{\pkg{l3cctab} implementation}
+%
+% \begin{macrocode}
+%<*initex|package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<@@=cctab>
+% \end{macrocode}
+%
+% As \LuaTeX{} offers engine support for category code tables, and this
+% is entirely lacking from the other engines, we need two complementary
+% approaches. (Some future \XeTeX{} may add support, at which point the
+% conditionals below would be different.)
+%
+% \subsection{Variables}
+%
+% \begin{variable}{\g_@@_stack_seq, \g_@@_unused_seq}
+% List of catcode tables saved by nested \cs{cctab_begin:N}, to
+% restore catcodes at the matching \cs{cctab_end:}. When popped from
+% the \cs{g_@@_stack_seq} the table numbers are stored in
+% \cs{g_@@_unused_seq} for later reuse.
+% \begin{macrocode}
+\seq_new:N \g_@@_stack_seq
+\seq_new:N \g_@@_unused_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_group_seq}
+% A stack to store the group level when a catcode table started.
+% \begin{macrocode}
+\seq_new:N \g_@@_group_seq
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_allocate_int}
+% Integer to keep track of what category code table to allocate. In
+% \LuaTeX{} it is only used in format mode to implement
+% \cs{cctab_new:N}. In other engines it is used to make csnames for
+% dynamic tables.
+% \begin{macrocode}
+\int_new:N \g_@@_allocate_int
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\l_@@_internal_a_tl,\l_@@_internal_b_tl}
+% Scratch space. For instance, when popping
+% \cs{g_@@_stack_seq}/\cs{g_@@_unused_seq}, consists of the
+% catcodetable number (integer denotation) in \LuaTeX{}, or of an
+% intarray variable (as a single token) in other engines.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\g_@@_endlinechar_prop}
+% In \LuaTeX{} we store the \tn{endlinechar} associated to each
+% \tn{catcodetable} in a property list, unless it is the default
+% value~$13$.
+% \begin{macrocode}
+\prop_new:N \g_@@_endlinechar_prop
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Allocating category code tables}
+%
+% \begin{macro}{\cctab_new:N, \cctab_new:c, \@@_new:N, \@@_gstore:Nnn}
+% The \cs{@@_new:N} auxiliary allocates a new catcode table but does
+% not attempt to set its value consistently across engines. It is
+% used both in \cs{cctab_new:N}, which sets catcodes to \IniTeX{}
+% values, and in \cs{cctab_begin:N}/\cs{cctab_end:} for dynamically
+% allocated tables.
+%
+% First, the \LuaTeX{} case.
+% Creating a new category code table is done like other registers.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ }
+%<*initex>
+ \cs_new_protected:Npn \@@_new:N #1
+ {
+ \int_gincr:N \g_@@_allocate_int
+ \int_compare:nNnTF
+ \g_@@_allocate_int > \c_max_register_int
+ {
+ \__kernel_msg_fatal:nnx
+ { kernel } { out-of-registers } { cctab }
+ }
+ {
+ \tex_global:D \tex_chardef:D #1 \g_@@_allocate_int
+ \tex_initcatcodetable:D #1
+ }
+ }
+%</initex>
+%<*package>
+ \cs_new_eq:NN \@@_new:N \newcatcodetable
+%</package>
+ }
+% \end{macrocode}
+% Now the case for other engines. Here, each table is an integer
+% array. Following the \LuaTeX{} pattern, a new table starts with
+% \IniTeX{} codes. The index base is out-by-one, so we have an
+% internal function to handle that. The \IniTeX{} \tn{endlinechar} is
+% $13$.
+% \begin{macrocode}
+ {
+ \cs_new_protected:Npn \@@_new:N #1
+ { \intarray_new:Nn #1 { 257 } }
+ \cs_new_protected:Npn \@@_gstore:Nnn #1#2#3
+ { \intarray_gset:Nnn #1 { \int_eval:n { #2 + 1 } } {#3} }
+ \cs_new_protected:Npn \cctab_new:N #1
+ {
+ \__kernel_chk_if_free_cs:N #1
+ \@@_new:N #1
+ \int_step_inline:nn { 256 }
+ { \__kernel_intarray_gset:Nnn #1 {##1} { 12 } }
+ \__kernel_intarray_gset:Nnn #1 { 257 } { 13 }
+ \@@_gstore:Nnn #1 { 0 } { 9 }
+ \@@_gstore:Nnn #1 { 13 } { 5 }
+ \@@_gstore:Nnn #1 { 32 } { 10 }
+ \@@_gstore:Nnn #1 { 37 } { 14 }
+ \int_step_inline:nnn { 65 } { 90 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 92 } { 0 }
+ \int_step_inline:nnn { 97 } { 122 }
+ { \@@_gstore:Nnn #1 {##1} { 11 } }
+ \@@_gstore:Nnn #1 { 127 } { 15 }
+ }
+ }
+\cs_generate_variant:Nn \cctab_new:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Saving category code tables}
+%
+% \begin{macro}{\@@_gset:n, \@@_gset_aux:n}
+% In various functions we need to save the current catcodes (globally)
+% in a table. In \LuaTeX{}, saving the catcodes is a primitives, but
+% the \tn{endlinechar} needs more work: to avoid filling
+% \cs{g_@@_endlinechar_prop} with many entries we special-case the
+% default value $13$. In other engines we store $256$ current
+% catcodes and the \tn{endlinechar} in an intarray variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ { \exp_args:Nf \@@_gset_aux:n { \int_eval:n {#1} } }
+ \cs_new_protected:Npn \@@_gset_aux:n #1
+ {
+ \tex_savecatcodetable:D #1 \scan_stop:
+ \int_compare:nNnTF { \tex_endlinechar:D } = { 13 }
+ { \prop_gremove:Nn \g_@@_endlinechar_prop {#1} }
+ {
+ \prop_gput:NnV \g_@@_endlinechar_prop {#1}
+ \tex_endlinechar:D
+ }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_gset:n #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \__kernel_intarray_gset:Nnn #1 {##1}
+ { \char_value_catcode:n { ##1 - 1 } }
+ }
+ \__kernel_intarray_gset:Nnn #1 { 257 }
+ { \tex_endlinechar:D }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_gset:Nn, \cctab_gset:cn}
+% Category code tables are always global, so only one version of
+% assignments is needed. Simply run the setup in a group and save the
+% result in a category code table~|#1|, provided it is valid. The
+% internal function is defined above depending on the engine.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_gset:Nn #1#2
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \group_begin:
+ \cctab_select:N \c_initex_cctab
+ #2 \scan_stop:
+ \@@_gset:n {#1}
+ \group_end:
+ }
+ }
+\cs_generate_variant:Nn \cctab_gset:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Using category code tables}
+%
+% \begin{variable}{\g_@@_internal_cctab}
+% \begin{macro}[EXP]{\@@_internal_cctab_name:}
+% In \LuaTeX{}, we must ensure that the saved tables are read-only.
+% This is done by applying the saved table, then switching immediately
+% to a scratch table. Any later catcode assignment will affect that
+% scratch table rather than the saved one. If we simply switched to
+% the saved tables, then \cs{char_set_catcode_other:N} in the example
+% below would change \cs{c_document_cctab} and a later use of that
+% table would give the wrong category code to |_|.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \char_set_catcode_other:N \_
+% \cctab_end:
+% \cctab_begin:N \c_document_cctab
+% \int_compare:nTF { \char_value_catcode:n { `_ } = 8 }
+% { \TRUE } { \ERROR }
+% \cctab_end:
+% }
+% \end{verbatim}
+% We must also make sure that a scratch table is never reused in a
+% nested group: in the following example, the scratch table used by
+% the first \cs{cctab_begin:N} would be changed globally by the second
+% one issuing \tn{savecatcodetable}, and after \cs{group_end:} the
+% wrong category codes (those of \cs{c_str_cctab}) would be imposed.
+% Note that the inner \cs{cctab_end:} restores the correct catcodes
+% only locally, so the problem really comes up because of the
+% different grouping level. The simplest is to use a scratch table
+% labeled by the \tn{currentgrouplevel}. We initialize one of them as
+% an example.
+% \begin{verbatim}
+% \use:n
+% {
+% \cctab_begin:N \c_document_cctab
+% \group_begin:
+% \cctab_begin:N \c_str_cctab
+% \cctab_end:
+% \group_end:
+% \cctab_end:
+% }
+% \end{verbatim}
+% \begin{macrocode}
+\sys_if_engine_luatex:T
+ {
+ \@@_new:N \g_@@_internal_cctab
+ \cs_new:Npn \@@_internal_cctab_name:
+ {
+ g_@@_internal
+ \tex_romannumeral:D \tex_currentgrouplevel:D
+ _cctab
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_select:N, \cctab_select:c}
+% \begin{macro}{\@@_select:N}
+% The public function simply checks the \meta{cctab~var} exists before
+% using the engine-dependent \cs{@@_select:N}. Skipping these checks
+% would result in low-level engine-dependent errors. First, the
+% \LuaTeX{} case. In other engines, selecting a catcode table is a matter
+% of doing $256$ catcode assignments and setting the \tn{endlinechar}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_select:N #1
+ { \@@_chk_if_valid:NT #1 { \@@_select:N #1 } }
+\cs_generate_variant:Nn \cctab_select:N { c }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \tex_catcodetable:D #1
+ \prop_get:NVNTF \g_@@_endlinechar_prop #1 \l_@@_internal_a_tl
+ { \int_set:Nn \tex_endlinechar:D { \l_@@_internal_a_tl } }
+ { \int_set:Nn \tex_endlinechar:D { 13 } }
+ \cs_if_exist:cF { \@@_internal_cctab_name: }
+ { \exp_args:Nc \@@_new:N { \@@_internal_cctab_name: } }
+ \exp_args:Nc \tex_savecatcodetable:D { \@@_internal_cctab_name: }
+ \exp_args:Nc \tex_catcodetable:D { \@@_internal_cctab_name: }
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_select:N #1
+ {
+ \int_step_inline:nn { 256 }
+ {
+ \char_set_catcode:nn { ##1 - 1 }
+ { \__kernel_intarray_item:Nn #1 {##1} }
+ }
+ \int_set:Nn \tex_endlinechar:D
+ { \__kernel_intarray_item:Nn #1 { 257 } }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{variable}{\g_@@_next_cctab}
+% \begin{macro}{\@@_begin_aux:}
+% For \cs{cctab_begin:N}/\cs{cctab_end:} we will need to allocate
+% dynamic tables. This is done here by \cs{@@_begin_aux:}, which puts
+% a table number (in \LuaTeX{}) or name (in other engines) into
+% \cs{l_@@_internal_a_tl}. In \LuaTeX{} this simply calls \cs{@@_new:N}
+% and uses the resulting catcodetable number; in other engines we need
+% to give a name to the intarray variable and use that. In \LuaTeX{},
+% to restore catcodes at \cs{cctab_end:} we cannot just set
+% \tn{catcodetable} to its value before \cs{cctab_begin:N}, because
+% that table may have been altered by other code in the mean time. So
+% we must make sure to save the catcodes in a table we control and
+% restore them at \cs{cctab_end:}.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \@@_new:N \g_@@_next_cctab
+ \tl_set:NV \l_@@_internal_a_tl \g_@@_next_cctab
+ \cs_undefine:N \g_@@_next_cctab
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_begin_aux:
+ {
+ \int_gincr:N \g_@@_allocate_int
+ \exp_args:Nc \@@_new:N
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ \exp_args:NNc \tl_set:Nn \l_@@_internal_a_tl
+ { g_@@_ \int_use:N \g_@@_allocate_int _cctab }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{variable}
+%
+% \begin{macro}{\cctab_begin:N, \cctab_begin:c}
+% Check the \meta{cctab~var} exists, to avoid low-level errors. Get
+% in \cs{l_@@_internal_a_tl} the number/name of a dynamic table, either
+% from \cs{g_@@_unused_seq} where we save tables that are not
+% currently in use, or from \cs{@@_begin_aux:} if none are available.
+% Then save the current catcodes into the table (pointed to by)
+% \cs{l_@@_internal_a_tl} and save that table number in a stack before
+% selecting the desired catcodes.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_begin:N #1
+ {
+ \@@_chk_if_valid:NT #1
+ {
+ \seq_gpop:NNF \g_@@_unused_seq \l_@@_internal_a_tl
+ { \@@_begin_aux: }
+ \exp_args:Nx \@@_chk_group_begin:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \seq_gpush:NV \g_@@_stack_seq \l_@@_internal_a_tl
+ \exp_args:NV \@@_gset:n \l_@@_internal_a_tl
+ \@@_select:N #1
+ }
+ }
+\cs_generate_variant:Nn \cctab_begin:N { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cctab_end:}
+% Make sure a \cs{cctab_begin:N} was used some time earlier, get in
+% \cs{l_@@_internal_a_tl} the catcode table number/name in which the
+% prevailing catcodes were stored, then restore these catcodes. The
+% dynamic table is now unused hence stored in \cs{g_@@_unused_seq} for
+% recycling by later \cs{cctab_begin:N}.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_end:
+ {
+ \seq_gpop:NNTF \g_@@_stack_seq \l_@@_internal_a_tl
+ {
+ \seq_gpush:NV \g_@@_unused_seq \l_@@_internal_a_tl
+ \exp_args:Nx \@@_chk_group_end:n
+ { \@@_nesting_number:N \l_@@_internal_a_tl }
+ \@@_select:N \l_@@_internal_a_tl
+ }
+ { \__kernel_msg_error:nn { kernel } { cctab-extra-end } }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_chk_group_begin:n,\@@_chk_group_end:n}
+% Catcode tables are not allowed to be intermixed with groups, so here
+% we check that they are properly nested regarding \TeX{} groups.
+% \cs{@@_chk_group_begin:n} stores the current group level in a stack,
+% and locally defines a dummy control sequence
+% \cs[no-index]{@@_group_\meta{cctab-level}_chk:}.
+%
+% \cs{@@_chk_group_end:n} pops the stack, and compares the returned
+% value with \cs{tex_currentgrouplevel:D}. If they differ,
+% \cs{cctab_end:} is in a different grouping level than the matching
+% \cs{cctab_begin:N}. If they are the same, both happened at the same
+% level, however a group might have ended and another started between
+% \cs{cctab_begin:N} and \cs{cctab_end:}:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_document_cctab
+% \group_end:
+% \group_begin:
+% \cctab_end:
+% \group_end:
+% \end{verbatim}
+% In this case checking \cs{tex_currentgrouplevel:D} is not enough, so
+% we locally define \cs[no-index]{@@_group_\meta{cctab-level}_chk:},
+% and then check if it exist in \cs{cctab_end:}. If it doesn't,
+% we know there was a group end where it shouldn't.
+%
+% The \meta{cctab-level} in the sentinel macro above cannot be
+% replaced by the more convenient \cs{tex_currentgrouplevel:D} because
+% with the latter we might be tricked. Suppose:
+% \begin{verbatim}
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % A
+% \group_end:
+% \group_begin:
+% \cctab_begin:N \c_code_cctab % B
+% \cctab_end: % C
+% \cctab_end: % D
+% \group_end:
+% \end{verbatim}
+% The line marked with |A| would start a |cctab| with a sentinel token
+% named \cs[no-index]{@@_group_1_chk:}, which would disappear at the
+% \cs{group_end:} that follows. But |B| would create the same
+% sentinel token, since both are at the same group level. Line |C|
+% would end the |cctab| from line |B| correctly, but so would line |D|
+% because line |B| created the same sentinel token. Using
+% \meta{cctab-level} works correctly because it signals that certain
+% |cctab| level was activated somewhere, but if it doesn't exist when
+% the \cs{cctab_end:} is reached, we had a problem.
+%
+% Unfortunately these tests only flag the wrong usage at the
+% \cs{cctab_end:}, which might be far from the \cs{cctab_begin:N}.
+% However it isn't possible to signal the wrong usage at the
+% \cs{group_end:} without using \cs{tex_aftergroup:D}, which is
+% unsafe in certain types of groups.
+%
+% The three cases checked here just raise an error, and no recovery is
+% attempted: usually interleaving groups and catcode tables will work
+% predictably.
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_chk_group_begin:n #1
+ {
+ \seq_gpush:Nx \g_@@_group_seq
+ { \int_use:N \tex_currentgrouplevel:D }
+ \cs_set_eq:cN { @@_group_ #1 _chk: } \prg_do_nothing:
+ }
+\cs_new_protected:Npn \@@_chk_group_end:n #1
+ {
+ \seq_gpop:NN \g_@@_group_seq \l_@@_internal_b_tl
+ \bool_lazy_and:nnF
+ {
+ \int_compare_p:nNn
+ { \tex_currentgrouplevel:D } = { \l_@@_internal_b_tl }
+ }
+ { \cs_if_exist_p:c { @@_group_ #1 _chk: } }
+ {
+ \__kernel_msg_error:nnx { kernel } { cctab-group-mismatch }
+ {
+ \int_sign:n
+ { \tex_currentgrouplevel:D - \l_@@_internal_b_tl }
+ }
+ }
+ \cs_undefine:c { @@_group_ #1 _chk: }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@_nesting_number:N,\@@_nesting_number:w}
+% This macro returns the numeric index of the current catcode table.
+% In \LuaTeX{} this is just the argument, which is a count reference
+% to a \tn{catcodetable} register. In other engines, the number is
+% extracted from the |cctab| variable.
+% \begin{macrocode}
+\sys_if_engine_luatex:TF
+ { \cs_new:Npn \@@_nesting_number:N #1 {#1} }
+ {
+ \cs_new:Npn \@@_nesting_number:N #1
+ {
+ \exp_after:wN \exp_after:wN \exp_after:wN \@@_nesting_number:w
+ \exp_after:wN \token_to_str:N #1
+ }
+ \use:x
+ {
+ \cs_new:Npn \exp_not:N \@@_nesting_number:w
+ ##1 \tl_to_str:n { g_@@_ } ##2 \tl_to_str:n { _cctab } {##2}
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% Finally, install some code at the end of the \TeX{} run to check that
+% all \cs{cctab_begin:N} were ended by some \cs{cctab_end:}.
+% \begin{macrocode}
+\cs_if_exist:NT \hook_gput_code:nnn
+ {
+ \hook_gput_code:nnn { enddocument/end } { kernel }
+ {
+ \seq_if_empty:NF \g_@@_stack_seq
+ { \__kernel_msg_error:nn { kernel } { cctab-missing-end } }
+ }
+ }
+% \end{macrocode}
+%
+% \subsection{Category code table conditionals}
+%
+% \begin{macro}{\cctab_if_exist:N,\cctab_if_exist:c}
+% Checks whether a \meta{cctab~var} is defined.
+% \begin{macrocode}
+\prg_new_eq_conditional:NNn \cctab_if_exist:N \cs_if_exist:N
+ { TF , T , F , p }
+\prg_new_eq_conditional:NNn \cctab_if_exist:c \cs_if_exist:c
+ { TF , T , F , p }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\@@_chk_if_valid:N}
+% \begin{macro}{\@@_chk_if_valid_aux:NTF}
+% Checks whether the argument is defined and whether it is a valid
+% \meta{cctab~var}. In \LuaTeX{} the validity of the \meta{cctab~var}
+% is checked by the engine, which complains if the argument is not a
+% \cs{chardef}'ed constant. In other engines, check if the given
+% command is an intarray variable (the underlying definition is a copy
+% of the \texttt{cmr10} font).
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \@@_chk_if_valid:N #1
+ { TF , T , F }
+ {
+ \cctab_if_exist:NTF #1
+ {
+ \@@_chk_if_valid_aux:NTF #1
+ { \prg_return_true: }
+ {
+ \__kernel_msg_error:nnx { kernel } { invalid-cctab }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+ {
+ \__kernel_msg_error:nnx { kernel } { command-not-defined }
+ { \token_to_str:N #1 }
+ \prg_return_false:
+ }
+ }
+\sys_if_engine_luatex:TF
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+%<*initex>
+ \bool_lazy_and:nnTF
+ { \int_if_odd_p:n {#1} }
+ { \int_compare_p:nNn {#1-1} < { \g_@@_allocate_int } }
+%</initex>
+%<*package>
+ \int_compare:nNnTF {#1-1} < { \e@alloc@ccodetable@count }
+%</package>
+ }
+ }
+ {
+ \cs_new_protected:Npn \@@_chk_if_valid_aux:NTF #1
+ {
+ \exp_args:Nf \str_if_in:nnTF
+ { \cs_meaning:N #1 }
+ { select~font~cmr10~at~ }
+ }
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Constant category code tables}
+%
+% \begin{macro}{\cctab_const:Nn,\cctab_const:cn}
+% Creates a new \meta{cctab~var} then sets it with the current and
+% user-supplied codes.
+% \begin{macrocode}
+\cs_new_protected:Npn \cctab_const:Nn #1#2
+ {
+ \cctab_new:N #1
+ \cctab_gset:Nn #1 {#2}
+ }
+\cs_generate_variant:Nn \cctab_const:Nn { c }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{variable}
+% {
+% \c_initex_cctab ,
+% \c_other_cctab ,
+% \c_str_cctab
+% }
+% Creating category code tables means thinking starting from \IniTeX{}.
+% For all-other and the standard \enquote{string} tables that's easy.
+% \begin{macrocode}
+\cctab_new:N \c_initex_cctab
+\cctab_const:Nn \c_other_cctab
+ {
+ \cctab_select:N \c_initex_cctab
+ \int_set:Nn \tex_endlinechar:D { -1 }
+ \int_step_inline:nnn { 0 } { 127 }
+ { \char_set_catcode_other:n {#1} }
+ }
+\cctab_const:Nn \c_str_cctab
+ {
+ \cctab_select:N \c_other_cctab
+ \char_set_catcode_space:n { 32 }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{variable}{\c_document_cctab, \c_other_cctab}
+% To pick up document-level category codes, we need to delay set up to the
+% end of the format, where that's possible. Also, as there are a \emph{lot}
+% of category codes to set, we avoid using the official interface and store the
+% document codes using internal code. Depending on whether we are in the hook
+% or not, the catcodes may be code or document, so we explicitly set up both
+% correctly.
+% \begin{macrocode}
+\cs_if_exist:NTF \@expl@finalise@setup@@@@
+ { \tl_gput_right:Nn \@expl@finalise@setup@@@@ }
+ { \use:n }
+ {
+ \@@_new:N \c_code_cctab
+ \group_begin:
+ \int_set:Nn \tex_endlinechar:D { 32 }
+ \char_set_catcode_invalid:n { 0 }
+ \bool_lazy_or:nnTF
+ { \sys_if_engine_xetex_p: } { \sys_if_engine_luatex_p: }
+ { \int_step_function:nN { 31 } \char_set_catcode_invalid:n }
+ { \int_step_function:nN { 31 } \char_set_catcode_active:n }
+ \int_step_function:nnN { 33 } { 64 } \char_set_catcode_other:n
+ \int_step_function:nnN { 65 } { 90 } \char_set_catcode_letter:n
+ \int_step_function:nnN { 91 } { 96 } \char_set_catcode_other:n
+ \int_step_function:nnN { 97 } { 122 } \char_set_catcode_letter:n
+ \char_set_catcode_ignore:n { 9 } % tab
+ \char_set_catcode_other:n { 10 } % lf
+ \char_set_catcode_active:n { 12 } % ff
+ \char_set_catcode_end_line:n { 13 } % cr
+ \char_set_catcode_ignore:n { 32 } % space
+ \char_set_catcode_parameter:n { 35 } % hash
+ \char_set_catcode_math_toggle:n { 36 } % dollar
+ \char_set_catcode_comment:n { 37 } % percent
+ \char_set_catcode_alignment:n { 38 } % ampersand
+ \char_set_catcode_letter:n { 58 } % colon
+ \char_set_catcode_escape:n { 92 } % backslash
+ \char_set_catcode_math_superscript:n { 94 } % circumflex
+ \char_set_catcode_letter:n { 95 } % underscore
+ \char_set_catcode_group_begin:n { 123 } % left brace
+ \char_set_catcode_other:n { 124 } % pipe
+ \char_set_catcode_group_end:n { 125 } % right brace
+ \char_set_catcode_space:n { 126 } % tilde
+ \char_set_catcode_invalid:n { 127 } % ^^?
+ \@@_gset:n { \c_code_cctab }
+ \group_end:
+ \cctab_const:Nn \c_document_cctab
+ {
+ \cctab_select:N \c_code_cctab
+ \int_set:Nn \tex_endlinechar:D { 13 }
+ \char_set_catcode_space:n { 9 }
+ \char_set_catcode_space:n { 32 }
+ \char_set_catcode_other:n { 58 }
+ \char_set_catcode_math_subscript:n { 95 }
+ \char_set_catcode_active:n { 126 }
+ }
+ }
+% \end{macrocode}
+% \end{variable}
+%
+% \subsection{Messages}
+%
+% \begin{macrocode}
+\__kernel_msg_new:nnnn { kernel } { cctab-stack-full }
+ { The~category~code~table~stack~is~exhausted. }
+ {
+ LaTeX~has~been~asked~to~switch~to~a~new~category~code~table,~
+ but~there~is~no~more~space~to~do~this!
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-extra-end }
+ { Extra~\iow_char:N\\cctab_end:~ignored~\msg_line_context:. }
+ {
+ LaTeX~came~across~a~\iow_char:N\\cctab_end:~without~a~matching~
+ \iow_char:N\\cctab_begin:N.~This~command~will~be~ignored.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-missing-end }
+ { Missing~\iow_char:N\\cctab_end:~before~end~of~TeX~run. }
+ {
+ LaTeX~came~across~more~\iow_char:N\\cctab_begin:N~than~
+ \iow_char:N\\cctab_end:.
+ }
+\__kernel_msg_new:nnnn { kernel } { invalid-cctab }
+ { Invalid~\iow_char:N\\catcode~table. }
+ {
+ You~can~only~switch~to~a~\iow_char:N\\catcode~table~that~is~
+ initialized~using~\iow_char:N\\cctab_new:N~or~
+ \iow_char:N\\cctab_const:Nn.
+ }
+\__kernel_msg_new:nnnn { kernel } { cctab-group-mismatch }
+ {
+ \iow_char:N\\cctab_end:~occurred~in~a~
+ \int_case:nn {#1}
+ {
+ { 0 } { different~group }
+ { 1 } { higher~group~level }
+ { -1 } { lower~group~level }
+ } ~than~
+ the~matching~\iow_char:N\\cctab_begin:N.
+ }
+ {
+ Catcode~tables~and~groups~must~be~properly~nested,~but~
+ you~tried~to~interleave~them.~LaTeX~will~try~to~proceed,~
+ but~results~may~be~unexpected.
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</initex|package>
+% \end{macrocode}
+%
+% \end{implementation}
+%
+%\PrintIndex
diff --git a/macros/latex/contrib/l3kernel/l3clist.dtx b/macros/latex/contrib/l3kernel/l3clist.dtx
index a05860e286..da18711b6e 100644
--- a/macros/latex/contrib/l3kernel/l3clist.dtx
+++ b/macros/latex/contrib/l3kernel/l3clist.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3coffins.dtx b/macros/latex/contrib/l3kernel/l3coffins.dtx
index b19b71f3f9..8c9f29e93b 100644
--- a/macros/latex/contrib/l3kernel/l3coffins.dtx
+++ b/macros/latex/contrib/l3kernel/l3coffins.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -2233,9 +2233,6 @@
% flexible.
% \begin{macrocode}
\tl_new:N \l_@@_display_font_tl
-%<*initex>
-\tl_set:Nn \l_@@_display_font_tl { } % TODO
-%</initex>
%<*package>
\tl_set:Nn \l_@@_display_font_tl { \sffamily \tiny }
%</package>
@@ -2263,7 +2260,7 @@
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+ \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
%</initex>
%<*package>
\@@_color:n {#4}
@@ -2274,9 +2271,6 @@
\l_@@_display_pole_coffin { hc } { vc } { 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
%<*package>
\@@_color:n {#4}
%</package>
@@ -2332,7 +2326,7 @@
\hcoffin_set:Nn \l_@@_display_pole_coffin
{
%<*initex>
- \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: } % TODO
+ \hbox:n { \tex_vrule:D width 1pt height 1pt \scan_stop: }
%</initex>
%<*package>
\@@_color:n {#2}
@@ -2377,9 +2371,6 @@
{ 0pt } { 0pt }
\hcoffin_set:Nn \l_@@_display_coord_coffin
{
-%<*initex>
- % TODO
-%</initex>
%<*package>
\@@_color:n {#6}
%</package>
diff --git a/macros/latex/contrib/l3kernel/l3color-base.dtx b/macros/latex/contrib/l3kernel/l3color-base.dtx
index 178cd98b19..a01acb8fa1 100644
--- a/macros/latex/contrib/l3kernel/l3color-base.dtx
+++ b/macros/latex/contrib/l3kernel/l3color-base.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3debug.dtx b/macros/latex/contrib/l3kernel/l3debug.dtx
index 3aa7eb3998..632e62e58b 100644
--- a/macros/latex/contrib/l3kernel/l3debug.dtx
+++ b/macros/latex/contrib/l3kernel/l3debug.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -865,6 +865,7 @@
\box_gset_eq:NN
\box_gset_eq_drop:NN
\box_gset_to_last:N
+ \cctab_gset:Nn
\clist_gset_eq:NN
\dim_gset_eq:NN
\dim_gzero:N
@@ -926,6 +927,7 @@
{ }
{
\bool_const:Nn
+ \cctab_const:Nn
\dim_const:Nn
\int_const:Nn
\intarray_const_from_clist:Nn
@@ -961,6 +963,10 @@
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN g #1 }
{ }
+ { \cctab_new:N }
+ \__kernel_patch:nnn
+ { \__kernel_chk_var_scope:NN g #1 }
+ { }
{ \intarray_new:Nn }
\__kernel_patch:nnn
{ \__kernel_chk_var_scope:NN q #1 }
diff --git a/macros/latex/contrib/l3kernel/l3deprecation.dtx b/macros/latex/contrib/l3kernel/l3deprecation.dtx
index 012e0d3208..8faf863504 100644
--- a/macros/latex/contrib/l3kernel/l3deprecation.dtx
+++ b/macros/latex/contrib/l3kernel/l3deprecation.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -402,6 +402,52 @@
{ \c_sys_jobname_str } { 2017-01-01 }
\@@_old:Nnn \c_minus_one
{ -1 } { 2019-01-01 }
+\@@_old:Nnn \c_zero
+ { 0 } { 2020-01-01 }
+\@@_old:Nnn \c_one
+ { 1 } { 2020-01-01 }
+\@@_old:Nnn \c_two
+ { 2 } { 2020-01-01 }
+\@@_old:Nnn \c_three
+ { 3 } { 2020-01-01 }
+\@@_old:Nnn \c_four
+ { 4 } { 2020-01-01 }
+\@@_old:Nnn \c_five
+ { 5 } { 2020-01-01 }
+\@@_old:Nnn \c_six
+ { 6 } { 2020-01-01 }
+\@@_old:Nnn \c_seven
+ { 7 } { 2020-01-01 }
+\@@_old:Nnn \c_eight
+ { 8 } { 2020-01-01 }
+\@@_old:Nnn \c_nine
+ { 9 } { 2020-01-01 }
+\@@_old:Nnn \c_ten
+ { 10 } { 2020-01-01 }
+\@@_old:Nnn \c_eleven
+ { 11 } { 2020-01-01 }
+\@@_old:Nnn \c_twelve
+ { 12 } { 2020-01-01 }
+\@@_old:Nnn \c_thirteen
+ { 13 } { 2020-01-01 }
+\@@_old:Nnn \c_fourteen
+ { 14 } { 2020-01-01 }
+\@@_old:Nnn \c_fifteen
+ { 15 } { 2020-01-01 }
+\@@_old:Nnn \c_sixteen
+ { 16 } { 2020-01-01 }
+\@@_old:Nnn \c_thirty_two
+ { 32 } { 2020-01-01 }
+\@@_old:Nnn \c_one_hundred
+ { 100 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_five
+ { 255 } { 2020-01-01 }
+\@@_old:Nnn \c_two_hundred_fifty_six
+ { 256 } { 2020-01-01 }
+\@@_old:Nnn \c_one_thousand
+ { 1000 } { 2020-01-01 }
+\@@_old:Nnn \c_ten_thousand
+ { 10000 } { 2020-01-01 }
\@@_old:Nnn \dim_case:nnn
{ \dim_case:nnF } { 2015-07-14 }
\@@_old:Nnn \file_add_path:nN
@@ -442,6 +488,12 @@
{ \iow_show_list: } { 2019-01-01 }
\@@_old:Nnn \iow_log_streams:
{ \iow_log_list: } { 2019-01-01 }
+\@@_old:Nnn \lua_escape_x:n
+ { \lua_escape:e } { 2020-01-01 }
+\@@_old:Nnn \lua_now_x:n
+ { \lua_now:e } { 2020-01-01 }
+\@@_old_protected:Nnn \lua_shipout_x:n
+ { \lua_shipout_e:n } { 2020-01-01 }
\@@_old:Nnn \luatex_if_engine_p:
{ \sys_if_engine_luatex_p: } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:F
@@ -450,6 +502,12 @@
{ \sys_if_engine_luatex:T } { 2017-01-01 }
\@@_old:Nnn \luatex_if_engine:TF
{ \sys_if_engine_luatex:TF } { 2017-01-01 }
+\@@_old_protected:Nnn \msg_interrupt:nnn
+ { [Defined~error~message] } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_log:n
+ { \iow_log:n } { 2020-01-01 }
+\@@_old_protected:Nnn \msg_term:n
+ { \iow_term:n } { 2020-01-01 }
\@@_old:Nnn \pdftex_if_engine_p:
{ \sys_if_engine_pdftex_p: } { 2017-01-01 }
\@@_old:Nnn \pdftex_if_engine:F
@@ -476,8 +534,28 @@
{ \str_case:nnF } { 2015-07-14 }
\@@_old:Nnn \str_case:onn
{ \str_case:onF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nn
+ { \str_case_e:nn } { 2020-01-01 }
\@@_old:Nnn \str_case_x:nnn
{ \str_case_e:nnF } { 2015-07-14 }
+\@@_old:Nnn \str_case_x:nnT
+ { \str_case_e:nnT } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnTF
+ { \str_case_e:nnTF } { 2020-01-01 }
+\@@_old:Nnn \str_case_x:nnF
+ { \str_case_e:nnF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x_p:nn
+ { \str_if_eq_p:ee } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnT
+ { \str_if_eq:eeT } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnF
+ { \str_if_eq:eeF } { 2020-01-01 }
+\@@_old:Nnn \str_if_eq_x:nnTF
+ { \str_if_eq:eeTF } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:N
+ { \tl_analysis_show:N } { 2020-01-01 }
+\@@_old_protected:Nnn \tl_show_analysis:n
+ { \tl_analysis_show:n } { 2020-01-01 }
\@@_old:Nnn \tl_case:cnn
{ \tl_case:cnF } { 2015-07-14 }
\@@_old:Nnn \tl_case:Nnn
@@ -499,70 +577,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated primitives}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\etex_beginL:D}
-% \begin{macro}{\@@_primitive:NN, \@@_primitive:w}
-% We renamed all primitives to \cs[no-index]{tex_\ldots{}:D} so all
-% others are deprecated. In \pkg{l3names}, \cs{__kernel_primitives:}
-% is defined to contain \cs{__kernel_primitive:NN} \cs{beginL}
-% \cs{etex_beginL:D} and so on, one for each deprecated primitive. We
-% apply \cs{exp_not:N} to the second argument of
-% \cs{__kernel_primitive:NN} because it may be outer (both when doing
-% and undoing deprecation actually), then \cs{@@_primitive:NN} uses
-% \cs{tex_let:D} to change the meaning of this potentially outer
-% token. Then, either turn it into an error or make it equal to the
-% primitive~|#1|. To be more precise, |#1| may not be defined, so try
-% a \cs[no-index]{tex_\ldots{}:D} command as well.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_primitive:NN #1#2 { }
-\exp_last_unbraced:NNNNo
- \cs_new:Npn \@@_primitive:w #1 { \token_to_str:N _ } { }
-\__kernel_deprecation_code:nn
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 \scan_stop:
- \exp_args:NNx \__kernel_deprecation_error:Nnn #2
- {
- \iow_char:N \\
- \cs_if_exist:NTF #1
- { \cs_to_str:N #1 }
- {
- tex_
- \exp_last_unbraced:Nf
- \@@_primitive:w { \cs_to_str:N #2 }
- }
- }
- { 2020-01-01 }
- }
- \__kernel_primitives:
- }
- {
- \cs_set_protected:Npn \__kernel_primitive:NN #1
- {
- \exp_after:wN \@@_primitive:NN
- \exp_after:wN #1
- \exp_not:N
- }
- \cs_set_protected:Npn \@@_primitive:NN #1#2
- {
- \tex_let:D #2 #1
- \cs_if_exist:cT { tex_ \cs_to_str:N #1 :D }
- { \cs_set_eq:Nc #2 { tex_ \cs_to_str:N #1 :D } }
- }
- \__kernel_primitives:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Loading the patches}
%
% When loaded first, the patches are simply read here.
@@ -646,243 +660,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3int} functions}
-%
-% \begin{macrocode}
-%<@@=int>
-% \end{macrocode}
-%
-% \begin{variable}[deprecated = 2020-07-01]
-% {
-% \c_zero, \c_one, \c_two, \c_three, \c_four, \c_five, \c_six,
-% \c_seven, \c_eight, \c_nine, \c_ten, \c_eleven, \c_twelve,
-% \c_thirteen, \c_fourteen, \c_fifteen, \c_sixteen, \c_thirty_two,
-% \c_one_hundred, \c_two_hundred_fifty_five,
-% \c_two_hundred_fifty_six, \c_one_thousand, \c_ten_thousand,
-% }
-% \begin{macro}{\@@_deprecated_constants:nn}
-% Constants that are now deprecated. By default define them with
-% \cs{int_const:Nn}. To deprecate them call for instance
-% \cs{__kernel_deprecation_error:Nnn} \cs{c_zero} |{0}|
-% |{2020-01-01}|. To redefine them (locally), use
-% \cs{@@_constdef:Nw}, with an \cs{exp_not:N} construction because the
-% constants themselves are outer at that point.
-% \begin{macrocode}
-\cs_gset_protected:Npn \@@_deprecated_constants:nn #1#2
- {
- #1 \c_zero { 0 } #2
- #1 \c_one { 1 } #2
- #1 \c_two { 2 } #2
- #1 \c_three { 3 } #2
- #1 \c_four { 4 } #2
- #1 \c_five { 5 } #2
- #1 \c_six { 6 } #2
- #1 \c_seven { 7 } #2
- #1 \c_eight { 8 } #2
- #1 \c_nine { 9 } #2
- #1 \c_ten { 10 } #2
- #1 \c_eleven { 11 } #2
- #1 \c_twelve { 12 } #2
- #1 \c_thirteen { 13 } #2
- #1 \c_fourteen { 14 } #2
- #1 \c_fifteen { 15 } #2
- #1 \c_sixteen { 16 } #2
- #1 \c_thirty_two { 32 } #2
- #1 \c_one_hundred { 100 } #2
- #1 \c_two_hundred_fifty_five { 255 } #2
- #1 \c_two_hundred_fifty_six { 256 } #2
- #1 \c_one_thousand { 1000 } #2
- #1 \c_ten_thousand { 10000 } #2
- }
-\cs_set_protected:Npn \@@_deprecated_constants:Nn #1#2
- {
- \cs_if_free:NT #1
- { \int_const:Nn #1 {#2} }
- }
-\@@_deprecated_constants:nn { \@@_deprecated_constants:Nn } { }
-\__kernel_deprecation_code:nn
- {
- \@@_deprecated_constants:nn
- { \exp_after:wN \__kernel_deprecation_error:Nnn \exp_not:N }
- { { 2020-01-01 } }
- }
- {
- \@@_deprecated_constants:nn
- {
- \exp_after:wN \use:nnn
- \exp_after:wN \@@_constdef:Nw \exp_not:N
- }
- { \exp_stop_f: }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{variable}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\@@_value:w}
-% Made public.
-% \begin{macrocode}
-\cs_gset_eq:NN \@@_value:w \int_value:w
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3luatex} functions}
-%
-% \begin{macrocode}
-%<@@=lua>
-% \end{macrocode}
-%
-% \begin{macro}[EXP, deprecated = 2020-07-01]{\lua_now_x:n, \lua_escape_x:n}
-% \begin{macro}[deprecated = 2020-07-01]{\lua_shipout_x:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_now:e }
-\cs_gset:Npn \lua_now_x:n #1 { \@@_now:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_escape:e }
-\cs_gset:Npn \lua_escape_x:n #1 { \@@_escape:n {#1} }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \lua_shipout_e:n }
-\cs_gset_protected:Npn \lua_shipout_x:n #1 { \@@_shipout:n {#1} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3msg} functions}
-%
-% \begin{macrocode}
-%<@@=msg>
-% \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_log:n, \msg_term:n}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_log:n }
-\cs_gset_protected:Npn \msg_log:n #1
- {
- \iow_log:n { ................................................. }
- \iow_wrap:nnnN { . ~ #1} { . ~ } { } \iow_log:n
- \iow_log:n { ................................................. }
- }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \iow_term:n }
-\cs_gset_protected:Npn \msg_term:n #1
- {
- \iow_term:n { ************************************************* }
- \iow_wrap:nnnN { * ~ #1} { * ~ } { } \iow_term:n
- \iow_term:n { ************************************************* }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[deprecated = 2020-07-01]{\msg_interrupt:nnn}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { [Defined~error~message] }
-\cs_gset_protected:Npn \msg_interrupt:nnn #1#2#3
- {
- \tl_if_empty:nTF {#3}
- {
- \@@_old_interrupt_wrap:nn { \\ \c_@@_no_info_text_tl }
- {#1 \\\\ #2 \\\\ \c_@@_continue_text_tl }
- }
- {
- \@@_old_interrupt_wrap:nn { \\ #3 }
- {#1 \\\\ #2 \\\\ \c_@@_help_text_tl }
- }
- }
-\cs_gset_protected:Npn \@@_old_interrupt_wrap:nn #1#2
- {
- \iow_wrap:nnnN {#1} { | ~ } { } \@@_old_interrupt_more_text:n
- \iow_wrap:nnnN {#2} { ! ~ } { } \@@_old_interrupt_text:n
- }
-\cs_gset_protected:Npn \@@_old_interrupt_more_text:n #1
- {
- \exp_args:Nx \tex_errhelp:D
- {
- |'''''''''''''''''''''''''''''''''''''''''''''''
- #1 \iow_newline:
- |...............................................
- }
- }
-\group_begin:
- \char_set_lccode:nn {`\{} {`\ }
- \char_set_lccode:nn {`\}} {`\ }
- \char_set_lccode:nn {`\&} {`\!}
- \char_set_catcode_active:N \&
-\tex_lowercase:D
- {
- \group_end:
- \cs_gset_protected:Npn \@@_old_interrupt_text:n #1
- {
- \iow_term:x
- {
- \iow_newline:
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- \iow_newline:
- !
- }
- \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
- {
- \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
- {
- \group_begin:
- \cs_set_protected:Npn &
- {
- \tex_errmessage:D
- {
- #1
- \use_none:n
- { ............................................ }
- }
- }
- \exp_after:wN
- \group_end:
- &
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Deprecated \pkg{l3prg} functions}
-%
-% \begin{macrocode}
-%<@@=prg>
-% \end{macrocode}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-% {
-% \@@_break_point:Nn,
-% \@@_break_point:,
-% \@@_map_break:Nn,
-% \@@_break:,
-% \@@_break:n
-% }
-% Made public, but used by a few third-parties. It's not possible to
-% perfectly support a mixture of \cs{@@_map_break:Nn} and
-% \cs{prg_map_break:Nn} because they use different delimiters. The
-% following code only breaks if someone tries to break from two
-% \enquote{old-style} \cs{@@_map_break:Nn} \ldots{}
-% \cs{@@_break_point:Nn} mappings in one go. Basically, the
-% \cs{@@_map_break:Nn} converts a single \cs{@@_break_point:Nn} to
-% \cs{prg_break_point:Nn}, and that delimiter had better be the right
-% one. Then we call \cs{prg_map_break:Nn} which may end up breaking
-% intermediate looks in the (unbraced) argument |#1|. It is essential
-% to define the |break_point| functions before the corresponding
-% |break| functions: otherwise \cs{debug_on:n} |{deprecation}|
-% \cs{debug_off:n} |{deprecation}| would break when trying to restore
-% the definitions because they would involve deprecated commands whose
-% definition has not yet been restored.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point:Nn }
-\cs_gset:Npn \@@_break_point:Nn { \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break_point: }
-\cs_gset:Npn \@@_break_point: { \prg_break_point: }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_map_break:Nn }
-\cs_gset:Npn \@@_map_break:Nn #1 \@@_break_point:Nn
- { \prg_map_break:Nn #1 \prg_break_point:Nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break: }
-\cs_gset:Npn \@@_break: #1 \@@_break_point: { }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \prg_break:n }
-\cs_gset:Npn \@@_break:n #1#2 \@@_break_point: {#1}
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3str} functions}
%
% \begin{macro}[EXP, deprecated = 2022-07-01]
@@ -907,29 +684,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP, deprecated = 2020-07-01, noTF]{\str_case_x:nn}
-% \begin{macro}[EXP, deprecated = 2020-07-01, pTF]{\str_if_eq_x:nn}
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nn }
-\cs_gset:Npn \str_case_x:nn { \str_case_e:nn }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnT }
-\cs_gset:Npn \str_case_x:nnT { \str_case_e:nnT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnF }
-\cs_gset:Npn \str_case_x:nnF { \str_case_e:nnF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_case_e:nnTF }
-\cs_gset:Npn \str_case_x:nnTF { \str_case_e:nnTF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq_p:ee }
-\cs_gset:Npn \str_if_eq_x_p:nn { \str_if_eq_p:ee }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeT }
-\cs_gset:Npn \str_if_eq_x:nnT { \str_if_eq:eeT }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeF }
-\cs_gset:Npn \str_if_eq_x:nnF { \str_if_eq:eeF }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \str_if_eq:eeTF }
-\cs_gset:Npn \str_if_eq_x:nnTF { \str_if_eq:eeTF }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3seq} functions}
%
% \begin{macro}[EXP, deprecated = 2023-01-01]
@@ -1023,19 +777,6 @@
% \end{macrocode}
% \end{macro}
%
-% \subsection{Deprecated \pkg{l3tl-analysis} functions}
-%
-% \begin{macro}[deprecated = 2020-07-01]
-% {\tl_show_analysis:N, \tl_show_analysis:n}
-% Simple renames.
-% \begin{macrocode}
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:N }
-\cs_gset_protected:Npn \tl_show_analysis:N { \tl_analysis_show:N }
-\__kernel_patch_deprecation:nnNNpn { 2020-01-01 } { \tl_analysis_show:n }
-\cs_gset_protected:Npn \tl_show_analysis:n { \tl_analysis_show:n }
-% \end{macrocode}
-% \end{macro}
-%
% \subsection{Deprecated \pkg{l3token} functions}
%
% \begin{macro}[EXP, deprecated = 2021-07-01]
diff --git a/macros/latex/contrib/l3kernel/l3doc.dtx b/macros/latex/contrib/l3kernel/l3doc.dtx
index ffb7269f49..0954108c96 100644
--- a/macros/latex/contrib/l3kernel/l3doc.dtx
+++ b/macros/latex/contrib/l3kernel/l3doc.dtx
@@ -79,7 +79,7 @@ and all files in that bundle must be distributed together.
%
% \title{The \cls{l3doc} class}
% \author{\Team}
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
% \tableofcontents
%
@@ -3368,7 +3368,7 @@ and all files in that bundle must be distributed together.
{
\seq_set_map:NNn \l_@@_tmpa_seq
\g_@@_nested_names_seq
- { \exp_not:n { \@@_macro_end_wrap_item:n {##1} } }
+ { \@@_macro_end_wrap_item:n {##1} }
End~ definition~ for~
\int_compare:nTF { \seq_count:N \l_@@_tmpa_seq <= 3 }
{
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.dtx b/macros/latex/contrib/l3kernel/l3docstrip.dtx
index a334b443d0..bf56cdd54f 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.dtx
+++ b/macros/latex/contrib/l3kernel/l3docstrip.dtx
@@ -63,7 +63,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3docstrip.pdf b/macros/latex/contrib/l3kernel/l3docstrip.pdf
index 52aaff704f..4c59fc9770 100644
--- a/macros/latex/contrib/l3kernel/l3docstrip.pdf
+++ b/macros/latex/contrib/l3kernel/l3docstrip.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3expan.dtx b/macros/latex/contrib/l3kernel/l3expan.dtx
index df60bcd3ab..e902085148 100644
--- a/macros/latex/contrib/l3kernel/l3expan.dtx
+++ b/macros/latex/contrib/l3kernel/l3expan.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3file.dtx b/macros/latex/contrib/l3kernel/l3file.dtx
index c189e4bdd9..7ee7df5347 100644
--- a/macros/latex/contrib/l3kernel/l3file.dtx
+++ b/macros/latex/contrib/l3kernel/l3file.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -677,7 +677,7 @@
% If the file is not found on the path, the expansion is empty.
% \end{function}
%
-% \begin{function}[added = 2017-06-23, updated = 2017-06-26]
+% \begin{function}[added = 2017-06-23, updated = 2020-06-24]
% {\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
% \begin{syntax}
% \cs{file_parse_full_name:nNNN} \Arg{full name} \meta{dir} \meta{name} \meta{ext}
@@ -697,9 +697,28 @@
% \item The \meta{ext}: everything after the last |.| (including the dot).
% The \meta{ext} is empty if there is no |.| after the last |/|.
% \end{itemize}
-% This function does not expand the \meta{full name} before turning it
-% to a string. It assume that the \meta{full name} either contains no
-% quote (|"|) characters or is surrounded by a pair of quotes.
+%
+% Before parsing, the \meta{full name} is expanded until only non-expandable
+% tokens remain, except that active characters are also not expanded.
+% Quotes (|"|) are invalid in file names and are discarded from the input.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name:n}
+% \begin{syntax}
+% \cs{file_parse_full_name:n} \Arg{full name}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and leaves \meta{dir}, \meta{name}, and \meta{ext} in the input stream,
+% each inside a pair of braces.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2020-06-24]{\file_parse_full_name_apply:nN}
+% \begin{syntax}
+% \cs{file_parse_full_name_apply:nN} \Arg{full name} \meta{function}
+% \end{syntax}
+% Parses the \meta{full name} as described for \cs{file_parse_full_name:nNNN},
+% and passes \meta{dir}, \meta{name}, and \meta{ext} as arguments to \meta{function},
+% as an \texttt{n}-type argument each, in this order.
% \end{function}
%
% \begin{function}[rEXP, added = 2019-11-19]
@@ -2682,8 +2701,8 @@
% \end{macro}
%
% \begin{macro}[EXP]{\file_full_name:n, \@@_full_name:n}
-% \begin{macro}[EXP]{\@@_full_name_aux:nn}
-% \begin{macro}[EXP]{\@@_full_name_aux:n}
+% \begin{macro}[EXP]{\@@_full_name_aux:Nnn}
+% \begin{macro}[EXP]{\@@_full_name_aux:nN}
% \begin{macro}[EXP]{\@@_name_cleanup:w}
% \begin{macro}[EXP]{\@@_name_end:}
% \begin{macro}[EXP]{\@@_name_ext_check:n}
@@ -2714,12 +2733,12 @@
\tl_if_blank:eTF { \@@_size:n {#1} }
{
\seq_map_tokens:Nn \l_file_search_path_seq
- { \@@_full_name_aux:nn {#1} }
+ { \@@_full_name_aux:Nnn \seq_map_break:n {#1} }
%<*package>
\cs_if_exist:NT \input@path
{
\tl_map_tokens:Nn \input@path
- { \@@_full_name_aux:nn {#1} }
+ { \@@_full_name_aux:Nnn \tl_map_break:n {#1} }
}
%</package>
\@@_name_end:
@@ -2731,13 +2750,13 @@
% Two pars to the auxiliary here so we can avoid doing quoting
% twice in the event we find the right file.
% \begin{macrocode}
-\cs_new:Npn \@@_full_name_aux:nn #1#2
- { \exp_args:Ne \@@_full_name_aux:n { \tl_to_str:n {#2} / #1 } }
-\cs_new:Npn \@@_full_name_aux:n #1
+\cs_new:Npn \@@_full_name_aux:Nnn #1#2#3
+ { \exp_args:Ne \@@_full_name_aux:nN { \tl_to_str:n {#3} / #2 } #1 }
+\cs_new:Npn \@@_full_name_aux:nN #1 #2
{
\tl_if_blank:eF { \@@_size:n {#1} }
{
- \seq_map_break:n
+ #2
{
\@@_ext_check:n {#1}
\@@_name_cleanup:w
@@ -3358,63 +3377,113 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
-% \begin{macro}
-% {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
-% Parsing starts by stripping off any surrounding quotes. Then find
-% the directory |#4| by splitting at the last~|/|. (The auxiliary
-% returns \texttt{true}/\texttt{false} depending on whether it found
-% the delimiter.) We correct for the case of a file in the root |/|,
-% as in that case we wish to keep the trailing (and only) slash. Then
-% split the base name |#5| at the last dot. If there was indeed a
-% dot, |#5| contains the name and |#6| the extension without the dot,
-% which we add back for convenience. In the special case of no
-% extension given, the auxiliary stored the name into |#6|, we just
-% have to move it to |#5|.
-% \begin{macrocode}
-\cs_new_protected:Npn \file_parse_full_name:nNNN #1#2#3#4
- {
- \exp_after:wN \@@_parse_full_name_auxi:w
- \tl_to_str:n { #1 " #1 " } \s_@@_stop #2#3#4
+% \begin{macro}{\file_parse_full_name:n, \file_parse_full_name_apply:nN}
+% The main parsing macro \cs{file_parse_full_name_apply:nN} passes the
+% file name |#1| through \cs{__kernel_file_name_sanitize:n} so that we
+% have a single normalised way to treat files internally.
+% \cs{file_parse_full_name:n} uses the former, with
+% \cs{prg_do_nothing:} to
+% leave each part of the name within a pair of braces.
+% \begin{macrocode}
+\cs_new:Npn \file_parse_full_name:n #1
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \prg_do_nothing:
}
-\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
-\cs_new_protected:Npn \@@_parse_full_name_auxi:w
- #1 " #2 " #3 \s_@@_stop #4#5#6
- {
- \@@_parse_full_name_split:nNNNTF {#2} / #4 #5
- { \str_if_empty:NT #4 { \str_set:Nn #4 { / } } }
- { }
- \exp_args:No \@@_parse_full_name_split:nNNNTF {#5} . #5 #6
- { \str_put_left:Nn #6 { . } }
- {
- \str_set_eq:NN #5 #6
- \str_clear:N #6
- }
+\cs_new:Npn \file_parse_full_name_apply:nN #1
+ {
+ \exp_args:Ne \@@_parse_full_name_auxi:nN
+ { \__kernel_file_name_sanitize:n {#1} }
}
-\cs_new_protected:Npn \@@_parse_full_name_split:nNNNTF #1#2#3#4
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_auxi:nN}
+% \begin{macro}{\@@_parse_full_name_area:nw}
+% \cs{@@_parse_full_name_area:nw} splits the file name into chunks
+% separated by |/|, until the last one is reached. The last chunk is
+% the file name plus the extension, and everything before that is the
+% path. When \cs{@@_parse_full_name_area:nw} is done, it leaves
+% the path within braces after the scan mark \cs{s_@@_stop} and
+% proceeds parsing the actual file name.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_auxi:nN #1
{
- \cs_set_protected:Npn \@@_tmp:w ##1 ##2 #2 ##3 \s_@@_stop
+ \@@_parse_full_name_area:nw { } #1
+ / \s_@@_stop
+ }
+\cs_new:Npn \@@_parse_full_name_area:nw #1 #2 / #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
+ { \@@_parse_full_name_base:nw { } #2 . \s_@@_stop {#1} }
+ { \@@_parse_full_name_area:nw { #1 / #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_base:nw}
+% \cs{@@_parse_full_name_base:nw} does roughly the same as above, but
+% it separates the chunks at each period. However here there's some
+% extra complications: In case |#1| is empty, it is assumed that the
+% extension is actually empty, and the file name is |#2|. Besides, an
+% extra |.| has to be added to |#2| because it is later removed in
+% \cs{@@_parse_full_name_tidy:nnnN}. In any case, if there's an
+% extension, it is returned with a leading |.|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_base:nw #1 #2 . #3 \s_@@_stop
+ {
+ \tl_if_empty:nTF {#3}
{
- \tl_if_empty:nTF {##3}
+ \tl_if_empty:nTF {#1}
{
- \str_set:Nn #4 {##2}
- \tl_if_empty:nTF {##1}
- {
- \str_clear:N #3
- \use_ii:nn
- }
- {
- \str_set:Nx #3 { \str_tail:n {##1} }
- \use_i:nn
- }
+ \tl_if_empty:nTF {#2}
+ { \@@_parse_full_name_tidy:nnnN { } { } }
+ { \@@_parse_full_name_tidy:nnnN { .#2 } { } }
}
- { \@@_tmp:w { ##1 #2 ##2 } ##3 \s_@@_stop }
+ { \@@_parse_full_name_tidy:nnnN {#1} { .#2 } }
}
- \@@_tmp:w { } #1 #2 \s_@@_stop
+ { \@@_parse_full_name_base:nw { #1 . #2 } #3 \s_@@_stop }
+ }
+% \end{macrocode}
+%
+% \begin{macro}{\@@_parse_full_name_tidy:nnnN}
+% Now we just need to tidy some bits left loose before. The loop
+% used in the two macros above start with a leading |/| and |.| in the
+% file path an name, so here we need to remove them, except in the
+% path, if it is a single |/|, in which case it's left as is. After
+% all's done, pass to |#4|.
+% \begin{macrocode}
+\cs_new:Npn \@@_parse_full_name_tidy:nnnN #1 #2 #3 #4
+ {
+ \exp_args:Nee #4
+ {
+ \str_if_eq:nnF {#3} { / } { \use_none:n }
+ #3 \prg_do_nothing:
+ }
+ { \use_none:n #1 \prg_do_nothing: }
+ {#2}
}
% \end{macrocode}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\file_parse_full_name:nNNN, \file_parse_full_name:VNNN}
+% \begin{macrocode}
+\cs_new_protected:Npn \file_parse_full_name:nNNN #1 #2 #3 #4
+ {
+ \file_parse_full_name_apply:nN {#1}
+ \@@_full_name_assign:nnnNNN #2 #3 #4
+ }
+\cs_new_protected:Npn \@@_full_name_assign:nnnNNN #1 #2 #3 #4 #5 #6
+ {
+ \str_set:Nn #4 {#1}
+ \str_set:Nn #5 {#2}
+ \str_set:Nn #6 {#3}
+ }
+\cs_generate_variant:Nn \file_parse_full_name:nNNN { V }
+% \end{macrocode}
+% \end{macro}
%
% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
% \begin{macro}[EXP]{\@@_list_aux:n}
diff --git a/macros/latex/contrib/l3kernel/l3final.dtx b/macros/latex/contrib/l3kernel/l3final.dtx
index 5f3a74fb0d..809850d1a5 100644
--- a/macros/latex/contrib/l3kernel/l3final.dtx
+++ b/macros/latex/contrib/l3kernel/l3final.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3flag.dtx b/macros/latex/contrib/l3kernel/l3flag.dtx
index de8f7b5046..0d68f05eee 100644
--- a/macros/latex/contrib/l3kernel/l3flag.dtx
+++ b/macros/latex/contrib/l3kernel/l3flag.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3format.ins b/macros/latex/contrib/l3kernel/l3format.ins
index 99e9389728..0671ed9ee6 100644
--- a/macros/latex/contrib/l3kernel/l3format.ins
+++ b/macros/latex/contrib/l3kernel/l3format.ins
@@ -95,6 +95,7 @@ and all files in that bundle must be distributed together.
\from{l3fp-convert.dtx} {initex}
\from{l3fp-random.dtx} {initex}
\from{l3fparray.dtx} {initex}
+ \from{l3cctab.dtx} {initex}
\from{l3sort.dtx} {initex}
\from{l3str-convert.dtx}{initex}
\from{l3tl-analysis.dtx}{initex}
diff --git a/macros/latex/contrib/l3kernel/l3fp-assign.dtx b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
index 3ef09ee2c7..73e28d4b3f 100644
--- a/macros/latex/contrib/l3kernel/l3fp-assign.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-assign.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-aux.dtx b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
index adce22a426..09a876ee8d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-aux.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-aux.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-basics.dtx b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
index fd1cffd494..68cb42369d 100644
--- a/macros/latex/contrib/l3kernel/l3fp-basics.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-basics.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-convert.dtx b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
index 8c8d474918..a07e4fb982 100644
--- a/macros/latex/contrib/l3kernel/l3fp-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-convert.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-expo.dtx b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
index 93835e8c71..aafc77e1a6 100644
--- a/macros/latex/contrib/l3kernel/l3fp-expo.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-expo.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-extended.dtx b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
index 67960e47fe..498da7895c 100644
--- a/macros/latex/contrib/l3kernel/l3fp-extended.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-extended.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-logic.dtx b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
index 26c7ed784a..13457604be 100644
--- a/macros/latex/contrib/l3kernel/l3fp-logic.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-logic.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-parse.dtx b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
index 28257218e7..c3125a8478 100644
--- a/macros/latex/contrib/l3kernel/l3fp-parse.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-parse.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -1643,7 +1643,7 @@
% \end{macro}
%
% \begin{macro}[rEXP]
-% {\@@_parse_exponent:N, \@@_parse_exponent_aux:N}
+% {\@@_parse_exponent:N, \@@_parse_exponent_aux:NN}
% This function should be called within an \cs{int_value:w}
% expansion (or within an integer expression). It leaves digits of the
% exponent behind it in the input stream, and terminates the expansion
@@ -1657,22 +1657,23 @@
\cs_new:Npn \@@_parse_exponent:N #1
{
\if:w e \if:w E \exp_not:N #1 e \else: \exp_not:N #1 \fi:
- \exp_after:wN \@@_parse_exponent_aux:N
+ \exp_after:wN \@@_parse_exponent_aux:NN
+ \exp_after:wN #1
\exp:w
\else:
0 \@@_parse_return_semicolon:w #1
\fi:
\@@_parse_expand:w
}
-\cs_new:Npn \@@_parse_exponent_aux:N #1
+\cs_new:Npn \@@_parse_exponent_aux:NN #1#2
{
- \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #1
- 0 \else: `#1 \fi: > `9 \exp_stop_f:
- 0 \exp_after:wN ; \exp_after:wN e
+ \if_int_compare:w \if_catcode:w \scan_stop: \exp_not:N #2
+ 0 \else: `#2 \fi: > `9 \exp_stop_f:
+ 0 \exp_after:wN ; \exp_after:wN #1
\else:
\exp_after:wN \@@_parse_exponent_sign:N
\fi:
- #1
+ #2
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3fp-random.dtx b/macros/latex/contrib/l3kernel/l3fp-random.dtx
index 25e1d1cb9d..062f0d59b4 100644
--- a/macros/latex/contrib/l3kernel/l3fp-random.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-random.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-round.dtx b/macros/latex/contrib/l3kernel/l3fp-round.dtx
index 281e5339d0..ef2092959b 100644
--- a/macros/latex/contrib/l3kernel/l3fp-round.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-round.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp-traps.dtx b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
index 6c68c6181e..40332fc340 100644
--- a/macros/latex/contrib/l3kernel/l3fp-traps.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-traps.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
% \maketitle
%
% \begin{documentation}
diff --git a/macros/latex/contrib/l3kernel/l3fp-trig.dtx b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
index dcf57a15f9..a9c9600244 100644
--- a/macros/latex/contrib/l3kernel/l3fp-trig.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp-trig.dtx
@@ -40,7 +40,7 @@
% {latex-team@latex-project.org}^^A
% }^^A
% }
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fp.dtx b/macros/latex/contrib/l3kernel/l3fp.dtx
index 81b652565a..b76089b5c6 100644
--- a/macros/latex/contrib/l3kernel/l3fp.dtx
+++ b/macros/latex/contrib/l3kernel/l3fp.dtx
@@ -49,7 +49,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3fparray.dtx b/macros/latex/contrib/l3kernel/l3fparray.dtx
index da04ae867c..be62eac38b 100644
--- a/macros/latex/contrib/l3kernel/l3fparray.dtx
+++ b/macros/latex/contrib/l3kernel/l3fparray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3int.dtx b/macros/latex/contrib/l3kernel/l3int.dtx
index a3d0ca4a8f..7384a5f257 100644
--- a/macros/latex/contrib/l3kernel/l3int.dtx
+++ b/macros/latex/contrib/l3kernel/l3int.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3intarray.dtx b/macros/latex/contrib/l3kernel/l3intarray.dtx
index 6ab5647a82..7a96ed2873 100644
--- a/macros/latex/contrib/l3kernel/l3intarray.dtx
+++ b/macros/latex/contrib/l3kernel/l3intarray.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -266,29 +266,28 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNn}
+% \begin{macro}[EXP]{\@@_bounds:NNnTF, \@@_bounds_error:NNnw}
% The functions \cs{intarray_gset:Nnn} and \cs{intarray_item:Nn} share
% bounds checking. The |T| branch is used if |#3| is within bounds of
% the array |#2|.
% \begin{macrocode}
-\cs_new:Npn \@@_bounds:NNnTF #1#2#3#4#5
+\cs_new:Npn \@@_bounds:NNnTF #1#2#3
{
\if_int_compare:w 1 > #3 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
+ \@@_bounds_error:NNnw #1 #2 {#3}
\else:
\if_int_compare:w #3 > \intarray_count:N #2 \exp_stop_f:
- \@@_bounds_error:NNn #1 #2 {#3}
- #5
- \else:
- #4
+ \@@_bounds_error:NNnw #1 #2 {#3}
\fi:
\fi:
+ \use_i:nn
}
-\cs_new:Npn \@@_bounds_error:NNn #1#2#3
+\cs_new:Npn \@@_bounds_error:NNnw #1#2#3#4 \use_i:nn #5#6
{
+ #4
#1 { kernel } { out-of-bounds }
{ \token_to_str:N #2 } {#3} { \intarray_count:N #2 }
+ #6
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
index e63035f68e..c73b661cfc 100644
--- a/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
+++ b/macros/latex/contrib/l3kernel/l3kernel-functions.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -162,6 +162,33 @@
% than once.
% \end{function}
%
+% \begin{function}[added = 2018-03-31]{\__kernel_intarray_gset:Nnn}
+% \begin{syntax}
+% \cs{__kernel_intarray_gset:Nnn} \meta{intarray~var} \Arg{index} \Arg{value}
+% \end{syntax}
+% Faster version of \cs{intarray_gset:Nnn}. Stores the \meta{value}
+% into the \meta{integer array variable} at the \meta{position}. The
+% \meta{index} and \meta{value} must be suitable for a direct
+% assignment to a \TeX{} count register, for instance expanding to an
+% integer denotation or obtained through the primitive \tn{numexpr}
+% (which may be un-terminated). No bound checking is performed: the
+% caller is responsible for ensuring that the \meta{position} is
+% between $1$ and the \cs{intarray_count:N}, and the \meta{value}'s
+% absolute value is at most $2^{30}-1$. Assignments are always
+% global.
+% \end{function}
+%
+% \begin{function}[EXP, added = 2018-03-31]{\__kernel_intarray_item:Nn}
+% \begin{syntax}
+% \cs{__kernel_intarray_item:Nn} \meta{intarray~var} \Arg{index}
+% \end{syntax}
+% Faster version of \cs{intarray_item:Nn}. Expands to the integer
+% entry stored at the \meta{index} in the \meta{integer array
+% variable}. The \meta{index} must be suitable for a direct
+% assignment to a \TeX{} count register and must be between $1$ and
+% the \cs{intarray_count:N}, lest a low-level \TeX{} error occur.
+% \end{function}
+%
% \begin{function}{\__kernel_ior_open:Nn, \__kernel_ior_open:No}
% \begin{syntax}
% \cs{__kernel_ior_open:Nn} \meta{stream} \Arg{file name}
diff --git a/macros/latex/contrib/l3kernel/l3keys.dtx b/macros/latex/contrib/l3kernel/l3keys.dtx
index c9dd6209f6..77fa7d1aff 100644
--- a/macros/latex/contrib/l3kernel/l3keys.dtx
+++ b/macros/latex/contrib/l3kernel/l3keys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3legacy.dtx b/macros/latex/contrib/l3kernel/l3legacy.dtx
index 0a71938f2b..c0fbef3745 100644
--- a/macros/latex/contrib/l3kernel/l3legacy.dtx
+++ b/macros/latex/contrib/l3kernel/l3legacy.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3luatex.dtx b/macros/latex/contrib/l3kernel/l3luatex.dtx
index 56181c77b8..298ecee05e 100644
--- a/macros/latex/contrib/l3kernel/l3luatex.dtx
+++ b/macros/latex/contrib/l3kernel/l3luatex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
index f7182ea092..5cbc7e9b09 100644
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ b/macros/latex/contrib/l3kernel/l3msg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -404,6 +404,27 @@
% is briefer than \cs{msg_info:nnnnnn}.
% \end{function}
%
+% \begin{function}[added = 2020-07-16]
+% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \begin{syntax}
+% \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
+% \end{syntax}
+% Issues \meta{module} information \meta{message}, passing
+% \meta{arg one} to \meta{arg four} to the text-creating functions.
+% The information text is printed on the terminal (and added to the
+% log file): the output is similar to that of \cs{msg_log:nnnnnn}.
+% \end{function}
+%
% \begin{function}[updated = 2012-08-11]
% {
% \msg_none:nnnnnn ,
@@ -1214,6 +1235,31 @@
%
% \begin{macro}
% {
+% \msg_term:nnnnnn ,
+% \msg_term:nnnnn ,
+% \msg_term:nnnn ,
+% \msg_term:nnn ,
+% \msg_term:nn ,
+% \msg_term:nnxxxx ,
+% \msg_term:nnxxx ,
+% \msg_term:nnxx ,
+% \msg_term:nnx
+% }
+% \enquote{Term} is used for communicating with the user through the
+% terminal, like diagnostic messages, and debugging. This is similar
+% to \enquote{log} messages, but uses the terminal output.
+% \begin{macrocode}
+ \@@_class_new:nn { term }
+ {
+ \iow_wrap:nnnN
+ { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
+ { } { } \iow_term:n
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}
+% {
% \msg_none:nnnnnn ,
% \msg_none:nnnnn ,
% \msg_none:nnnn ,
diff --git a/macros/latex/contrib/l3kernel/l3names.dtx b/macros/latex/contrib/l3kernel/l3names.dtx
index 3a49253af6..03a9f2ae2b 100644
--- a/macros/latex/contrib/l3kernel/l3names.dtx
+++ b/macros/latex/contrib/l3kernel/l3names.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -600,9 +600,7 @@
\@@_primitive:NN \pdfuniqueresname \tex_pdfuniqueresname:D
\@@_primitive:NN \pdfvorigin \tex_pdfvorigin:D
\@@_primitive:NN \pdfxform \tex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \tex_pdfxformattr:D
\@@_primitive:NN \pdfxformname \tex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \tex_pdfxformresources:D
\@@_primitive:NN \pdfximage \tex_pdfximage:D
\@@_primitive:NN \pdfximagebbox \tex_pdfximagebbox:D
% \end{macrocode}
@@ -924,7 +922,7 @@
\@@_primitive:NN \normaldeviate \tex_normaldeviate:D
\@@_primitive:NN \outputmode \tex_pdfoutput:D
\@@_primitive:NN \pageheight \tex_pageheight:D
- \@@_primitive:NN \pagewidth \tex_pagewith:D
+ \@@_primitive:NN \pagewidth \tex_pagewidth:D
\@@_primitive:NN \protrudechars \tex_protrudechars:D
\@@_primitive:NN \pxdimen \tex_pxdimen:D
\@@_primitive:NN \randomseed \tex_randomseed:D
@@ -1209,15 +1207,26 @@
% \end{macrocode}
%
% \LaTeXe{} moves a few primitives, so these are sorted out.
-% A convenient test for \LaTeXe{} is the \cs{@@@@end} saved primitive.
+% In newer versions of \LaTeXe{}, \pkg{expl3} is loaded rather early, so
+% only some primitives are already renamed, so we need two tests here.
+% At the beginning of the \LaTeXe{} format, the primitives \tn{end} and
+% \tn{input} are renamed, and only later on the other ones.
% \begin{macrocode}
%<*package>
\tex_ifdefined:D \@@@@end
\tex_let:D \tex_end:D \@@@@end
+ \tex_let:D \tex_input:D \@@@@input
+\tex_fi:D
+% \end{macrocode}
+%
+% If \tn{@@@@hyph} is defined, we are loading \pkg{expl3} in a
+% pre-2020/10/01 release of \LaTeXe{}, so a few other primitives have to
+% be tested as well.
+% \begin{macrocode}
+\tex_ifdefined:D \@@@@hyph
\tex_let:D \tex_everydisplay:D \frozen@everydisplay
\tex_let:D \tex_everymath:D \frozen@everymath
\tex_let:D \tex_hyphen:D \@@@@hyph
- \tex_let:D \tex_input:D \@@@@input
\tex_let:D \tex_italiccorrection:D \@@@@italiccorr
\tex_let:D \tex_underline:D \@@@@underline
% \end{macrocode}
@@ -1438,652 +1447,6 @@
%</package>
% \end{macrocode}
%
-% \subsection{Deprecated functions}
-%
-% Older versions of \pkg{expl3} divided up primitives by \enquote{source}: that
-% becomes very tricky with multiple parallel engine developments, so has been
-% dropped. To cover the transition, we provide the older names here for a
-% limited period (until the end of 2019).
-%
-% To allow \cs{debug_on:n} \Arg{deprecation} to work we save the list of
-% primitives into \cs{@@_primitives:}
-% \begin{macrocode}
-%<*package>
-\tex_begingroup:D
- \tex_long:D \tex_def:D \use_ii:nn #1#2 {#2}
- \tex_long:D \tex_def:D \use_none:n #1 { }
- \tex_long:D \tex_def:D \@@_primitive:NN #1#2
- {
- \tex_ifdefined:D #1
- \tex_expandafter:D \use_ii:nn
- \tex_fi:D
- \use_none:n { \tex_global:D \tex_let:D #2 #1 }
- }
- \tex_xdef:D \@@_primitives:
- {
- \tex_unexpanded:D
- {
- \@@_primitive:NN \beginL \etex_beginL:D
- \@@_primitive:NN \beginR \etex_beginR:D
- \@@_primitive:NN \botmarks \etex_botmarks:D
- \@@_primitive:NN \clubpenalties \etex_clubpenalties:D
- \@@_primitive:NN \currentgrouplevel \etex_currentgrouplevel:D
- \@@_primitive:NN \currentgrouptype \etex_currentgrouptype:D
- \@@_primitive:NN \currentifbranch \etex_currentifbranch:D
- \@@_primitive:NN \currentiflevel \etex_currentiflevel:D
- \@@_primitive:NN \currentiftype \etex_currentiftype:D
- \@@_primitive:NN \detokenize \etex_detokenize:D
- \@@_primitive:NN \dimexpr \etex_dimexpr:D
- \@@_primitive:NN \displaywidowpenalties
- \etex_displaywidowpenalties:D
- \@@_primitive:NN \endL \etex_endL:D
- \@@_primitive:NN \endR \etex_endR:D
- \@@_primitive:NN \eTeXrevision \etex_eTeXrevision:D
- \@@_primitive:NN \eTeXversion \etex_eTeXversion:D
- \@@_primitive:NN \everyeof \etex_everyeof:D
- \@@_primitive:NN \firstmarks \etex_firstmarks:D
- \@@_primitive:NN \fontchardp \etex_fontchardp:D
- \@@_primitive:NN \fontcharht \etex_fontcharht:D
- \@@_primitive:NN \fontcharic \etex_fontcharic:D
- \@@_primitive:NN \fontcharwd \etex_fontcharwd:D
- \@@_primitive:NN \glueexpr \etex_glueexpr:D
- \@@_primitive:NN \glueshrink \etex_glueshrink:D
- \@@_primitive:NN \glueshrinkorder \etex_glueshrinkorder:D
- \@@_primitive:NN \gluestretch \etex_gluestretch:D
- \@@_primitive:NN \gluestretchorder \etex_gluestretchorder:D
- \@@_primitive:NN \gluetomu \etex_gluetomu:D
- \@@_primitive:NN \ifcsname \etex_ifcsname:D
- \@@_primitive:NN \ifdefined \etex_ifdefined:D
- \@@_primitive:NN \iffontchar \etex_iffontchar:D
- \@@_primitive:NN \interactionmode \etex_interactionmode:D
- \@@_primitive:NN \interlinepenalties \etex_interlinepenalties:D
- \@@_primitive:NN \lastlinefit \etex_lastlinefit:D
- \@@_primitive:NN \lastnodetype \etex_lastnodetype:D
- \@@_primitive:NN \marks \etex_marks:D
- \@@_primitive:NN \middle \etex_middle:D
- \@@_primitive:NN \muexpr \etex_muexpr:D
- \@@_primitive:NN \mutoglue \etex_mutoglue:D
- \@@_primitive:NN \numexpr \etex_numexpr:D
- \@@_primitive:NN \pagediscards \etex_pagediscards:D
- \@@_primitive:NN \parshapedimen \etex_parshapedimen:D
- \@@_primitive:NN \parshapeindent \etex_parshapeindent:D
- \@@_primitive:NN \parshapelength \etex_parshapelength:D
- \@@_primitive:NN \predisplaydirection \etex_predisplaydirection:D
- \@@_primitive:NN \protected \etex_protected:D
- \@@_primitive:NN \readline \etex_readline:D
- \@@_primitive:NN \savinghyphcodes \etex_savinghyphcodes:D
- \@@_primitive:NN \savingvdiscards \etex_savingvdiscards:D
- \@@_primitive:NN \scantokens \etex_scantokens:D
- \@@_primitive:NN \showgroups \etex_showgroups:D
- \@@_primitive:NN \showifs \etex_showifs:D
- \@@_primitive:NN \showtokens \etex_showtokens:D
- \@@_primitive:NN \splitbotmarks \etex_splitbotmarks:D
- \@@_primitive:NN \splitdiscards \etex_splitdiscards:D
- \@@_primitive:NN \splitfirstmarks \etex_splitfirstmarks:D
- \@@_primitive:NN \TeXXeTstate \etex_TeXXeTstate:D
- \@@_primitive:NN \topmarks \etex_topmarks:D
- \@@_primitive:NN \tracingassigns \etex_tracingassigns:D
- \@@_primitive:NN \tracinggroups \etex_tracinggroups:D
- \@@_primitive:NN \tracingifs \etex_tracingifs:D
- \@@_primitive:NN \tracingnesting \etex_tracingnesting:D
- \@@_primitive:NN \tracingscantokens \etex_tracingscantokens:D
- \@@_primitive:NN \unexpanded \etex_unexpanded:D
- \@@_primitive:NN \unless \etex_unless:D
- \@@_primitive:NN \widowpenalties \etex_widowpenalties:D
- \@@_primitive:NN \pdfannot \pdftex_pdfannot:D
- \@@_primitive:NN \pdfcatalog \pdftex_pdfcatalog:D
- \@@_primitive:NN \pdfcompresslevel \pdftex_pdfcompresslevel:D
- \@@_primitive:NN \pdfcolorstack \pdftex_pdfcolorstack:D
- \@@_primitive:NN \pdfcolorstackinit \pdftex_pdfcolorstackinit:D
- \@@_primitive:NN \pdfcreationdate \pdftex_pdfcreationdate:D
- \@@_primitive:NN \pdfdecimaldigits \pdftex_pdfdecimaldigits:D
- \@@_primitive:NN \pdfdest \pdftex_pdfdest:D
- \@@_primitive:NN \pdfdestmargin \pdftex_pdfdestmargin:D
- \@@_primitive:NN \pdfendlink \pdftex_pdfendlink:D
- \@@_primitive:NN \pdfendthread \pdftex_pdfendthread:D
- \@@_primitive:NN \pdffontattr \pdftex_pdffontattr:D
- \@@_primitive:NN \pdffontname \pdftex_pdffontname:D
- \@@_primitive:NN \pdffontobjnum \pdftex_pdffontobjnum:D
- \@@_primitive:NN \pdfgamma \pdftex_pdfgamma:D
- \@@_primitive:NN \pdfimageapplygamma \pdftex_pdfimageapplygamma:D
- \@@_primitive:NN \pdfimagegamma \pdftex_pdfimagegamma:D
- \@@_primitive:NN \pdfgentounicode \pdftex_pdfgentounicode:D
- \@@_primitive:NN \pdfglyphtounicode \pdftex_pdfglyphtounicode:D
- \@@_primitive:NN \pdfhorigin \pdftex_pdfhorigin:D
- \@@_primitive:NN \pdfimagehicolor \pdftex_pdfimagehicolor:D
- \@@_primitive:NN \pdfimageresolution \pdftex_pdfimageresolution:D
- \@@_primitive:NN \pdfincludechars \pdftex_pdfincludechars:D
- \@@_primitive:NN \pdfinclusioncopyfonts
- \pdftex_pdfinclusioncopyfonts:D
- \@@_primitive:NN \pdfinclusionerrorlevel
- \pdftex_pdfinclusionerrorlevel:D
- \@@_primitive:NN \pdfinfo \pdftex_pdfinfo:D
- \@@_primitive:NN \pdflastannot \pdftex_pdflastannot:D
- \@@_primitive:NN \pdflastlink \pdftex_pdflastlink:D
- \@@_primitive:NN \pdflastobj \pdftex_pdflastobj:D
- \@@_primitive:NN \pdflastxform \pdftex_pdflastxform:D
- \@@_primitive:NN \pdflastximage \pdftex_pdflastximage:D
- \@@_primitive:NN \pdflastximagecolordepth
- \pdftex_pdflastximagecolordepth:D
- \@@_primitive:NN \pdflastximagepages \pdftex_pdflastximagepages:D
- \@@_primitive:NN \pdflinkmargin \pdftex_pdflinkmargin:D
- \@@_primitive:NN \pdfliteral \pdftex_pdfliteral:D
- \@@_primitive:NN \pdfminorversion \pdftex_pdfminorversion:D
- \@@_primitive:NN \pdfnames \pdftex_pdfnames:D
- \@@_primitive:NN \pdfobj \pdftex_pdfobj:D
- \@@_primitive:NN \pdfobjcompresslevel
- \pdftex_pdfobjcompresslevel:D
- \@@_primitive:NN \pdfoutline \pdftex_pdfoutline:D
- \@@_primitive:NN \pdfoutput \pdftex_pdfoutput:D
- \@@_primitive:NN \pdfpageattr \pdftex_pdfpageattr:D
- \@@_primitive:NN \pdfpagebox \pdftex_pdfpagebox:D
- \@@_primitive:NN \pdfpageref \pdftex_pdfpageref:D
- \@@_primitive:NN \pdfpageresources \pdftex_pdfpageresources:D
- \@@_primitive:NN \pdfpagesattr \pdftex_pdfpagesattr:D
- \@@_primitive:NN \pdfrefobj \pdftex_pdfrefobj:D
- \@@_primitive:NN \pdfrefxform \pdftex_pdfrefxform:D
- \@@_primitive:NN \pdfrefximage \pdftex_pdfrefximage:D
- \@@_primitive:NN \pdfrestore \pdftex_pdfrestore:D
- \@@_primitive:NN \pdfretval \pdftex_pdfretval:D
- \@@_primitive:NN \pdfsave \pdftex_pdfsave:D
- \@@_primitive:NN \pdfsetmatrix \pdftex_pdfsetmatrix:D
- \@@_primitive:NN \pdfstartlink \pdftex_pdfstartlink:D
- \@@_primitive:NN \pdfstartthread \pdftex_pdfstartthread:D
- \@@_primitive:NN \pdfsuppressptexinfo
- \pdftex_pdfsuppressptexinfo:D
- \@@_primitive:NN \pdfthread \pdftex_pdfthread:D
- \@@_primitive:NN \pdfthreadmargin \pdftex_pdfthreadmargin:D
- \@@_primitive:NN \pdftrailer \pdftex_pdftrailer:D
- \@@_primitive:NN \pdfuniqueresname \pdftex_pdfuniqueresname:D
- \@@_primitive:NN \pdfvorigin \pdftex_pdfvorigin:D
- \@@_primitive:NN \pdfxform \pdftex_pdfxform:D
- \@@_primitive:NN \pdfxformattr \pdftex_pdfxformattr:D
- \@@_primitive:NN \pdfxformname \pdftex_pdfxformname:D
- \@@_primitive:NN \pdfxformresources \pdftex_pdfxformresources:D
- \@@_primitive:NN \pdfximage \pdftex_pdfximage:D
- \@@_primitive:NN \pdfximagebbox \pdftex_pdfximagebbox:D
- \@@_primitive:NN \ifpdfabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifpdfabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ifpdfprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \pdfadjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \pdfcopyfont \pdftex_copyfont:D
- \@@_primitive:NN \pdfdraftmode \pdftex_draftmode:D
- \@@_primitive:NN \pdfeachlinedepth \pdftex_eachlinedepth:D
- \@@_primitive:NN \pdfeachlineheight \pdftex_eachlineheight:D
- \@@_primitive:NN \pdffilemoddate \pdftex_filemoddate:D
- \@@_primitive:NN \pdffilesize \pdftex_filesize:D
- \@@_primitive:NN \pdffirstlineheight \pdftex_firstlineheight:D
- \@@_primitive:NN \pdffontexpand \pdftex_fontexpand:D
- \@@_primitive:NN \pdffontsize \pdftex_fontsize:D
- \@@_primitive:NN \pdfignoreddimen \pdftex_ignoreddimen:D
- \@@_primitive:NN \pdfinsertht \pdftex_insertht:D
- \@@_primitive:NN \pdflastlinedepth \pdftex_lastlinedepth:D
- \@@_primitive:NN \pdflastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \pdflastypos \pdftex_lastypos:D
- \@@_primitive:NN \pdfmapfile \pdftex_mapfile:D
- \@@_primitive:NN \pdfmapline \pdftex_mapline:D
- \@@_primitive:NN \pdfmdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \pdfnoligatures \pdftex_noligatures:D
- \@@_primitive:NN \pdfnormaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \pdfpageheight \pdftex_pageheight:D
- \@@_primitive:NN \pdfpagewidth \pdftex_pagewidth:D
- \@@_primitive:NN \pdfpkmode \pdftex_pkmode:D
- \@@_primitive:NN \pdfpkresolution \pdftex_pkresolution:D
- \@@_primitive:NN \pdfprimitive \pdftex_primitive:D
- \@@_primitive:NN \pdfprotrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pdfpxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \pdfrandomseed \pdftex_randomseed:D
- \@@_primitive:NN \pdfsavepos \pdftex_savepos:D
- \@@_primitive:NN \pdfstrcmp \pdftex_strcmp:D
- \@@_primitive:NN \pdfsetrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \pdfshellescape \pdftex_shellescape:D
- \@@_primitive:NN \pdftracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \pdfuniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \pdftexbanner \pdftex_pdftexbanner:D
- \@@_primitive:NN \pdftexrevision \pdftex_pdftexrevision:D
- \@@_primitive:NN \pdftexversion \pdftex_pdftexversion:D
- \@@_primitive:NN \efcode \pdftex_efcode:D
- \@@_primitive:NN \ifincsname \pdftex_ifincsname:D
- \@@_primitive:NN \leftmarginkern \pdftex_leftmarginkern:D
- \@@_primitive:NN \letterspacefont \pdftex_letterspacefont:D
- \@@_primitive:NN \lpcode \pdftex_lpcode:D
- \@@_primitive:NN \quitvmode \pdftex_quitvmode:D
- \@@_primitive:NN \rightmarginkern \pdftex_rightmarginkern:D
- \@@_primitive:NN \rpcode \pdftex_rpcode:D
- \@@_primitive:NN \synctex \pdftex_synctex:D
- \@@_primitive:NN \tagcode \pdftex_tagcode:D
- \@@_primitive:NN \mdfivesum \pdftex_mdfivesum:D
- \@@_primitive:NN \ifprimitive \pdftex_ifprimitive:D
- \@@_primitive:NN \primitive \pdftex_primitive:D
- \@@_primitive:NN \shellescape \pdftex_shellescape:D
- \@@_primitive:NN \adjustspacing \pdftex_adjustspacing:D
- \@@_primitive:NN \copyfont \pdftex_copyfont:D
- \@@_primitive:NN \draftmode \pdftex_draftmode:D
- \@@_primitive:NN \expandglyphsinfont \pdftex_fontexpand:D
- \@@_primitive:NN \ifabsdim \pdftex_ifabsdim:D
- \@@_primitive:NN \ifabsnum \pdftex_ifabsnum:D
- \@@_primitive:NN \ignoreligaturesinfont
- \pdftex_ignoreligaturesinfont:D
- \@@_primitive:NN \insertht \pdftex_insertht:D
- \@@_primitive:NN \lastsavedboxresourceindex
- \pdftex_pdflastxform:D
- \@@_primitive:NN \lastsavedimageresourceindex
- \pdftex_pdflastximage:D
- \@@_primitive:NN \lastsavedimageresourcepages
- \pdftex_pdflastximagepages:D
- \@@_primitive:NN \lastxpos \pdftex_lastxpos:D
- \@@_primitive:NN \lastypos \pdftex_lastypos:D
- \@@_primitive:NN \normaldeviate \pdftex_normaldeviate:D
- \@@_primitive:NN \outputmode \pdftex_pdfoutput:D
- \@@_primitive:NN \pageheight \pdftex_pageheight:D
- \@@_primitive:NN \pagewidth \pdftex_pagewith:D
- \@@_primitive:NN \protrudechars \pdftex_protrudechars:D
- \@@_primitive:NN \pxdimen \pdftex_pxdimen:D
- \@@_primitive:NN \randomseed \pdftex_randomseed:D
- \@@_primitive:NN \useboxresource \pdftex_pdfrefxform:D
- \@@_primitive:NN \useimageresource \pdftex_pdfrefximage:D
- \@@_primitive:NN \savepos \pdftex_savepos:D
- \@@_primitive:NN \saveboxresource \pdftex_pdfxform:D
- \@@_primitive:NN \saveimageresource \pdftex_pdfximage:D
- \@@_primitive:NN \setrandomseed \pdftex_setrandomseed:D
- \@@_primitive:NN \tracingfonts \pdftex_tracingfonts:D
- \@@_primitive:NN \uniformdeviate \pdftex_uniformdeviate:D
- \@@_primitive:NN \suppressfontnotfounderror
- \xetex_suppressfontnotfounderror:D
- \@@_primitive:NN \XeTeXcharclass \xetex_charclass:D
- \@@_primitive:NN \XeTeXcharglyph \xetex_charglyph:D
- \@@_primitive:NN \XeTeXcountfeatures \xetex_countfeatures:D
- \@@_primitive:NN \XeTeXcountglyphs \xetex_countglyphs:D
- \@@_primitive:NN \XeTeXcountselectors \xetex_countselectors:D
- \@@_primitive:NN \XeTeXcountvariations \xetex_countvariations:D
- \@@_primitive:NN \XeTeXdefaultencoding \xetex_defaultencoding:D
- \@@_primitive:NN \XeTeXdashbreakstate \xetex_dashbreakstate:D
- \@@_primitive:NN \XeTeXfeaturecode \xetex_featurecode:D
- \@@_primitive:NN \XeTeXfeaturename \xetex_featurename:D
- \@@_primitive:NN \XeTeXfindfeaturebyname
- \xetex_findfeaturebyname:D
- \@@_primitive:NN \XeTeXfindselectorbyname
- \xetex_findselectorbyname:D
- \@@_primitive:NN \XeTeXfindvariationbyname
- \xetex_findvariationbyname:D
- \@@_primitive:NN \XeTeXfirstfontchar \xetex_firstfontchar:D
- \@@_primitive:NN \XeTeXfonttype \xetex_fonttype:D
- \@@_primitive:NN \XeTeXgenerateactualtext
- \xetex_generateactualtext:D
- \@@_primitive:NN \XeTeXglyph \xetex_glyph:D
- \@@_primitive:NN \XeTeXglyphbounds \xetex_glyphbounds:D
- \@@_primitive:NN \XeTeXglyphindex \xetex_glyphindex:D
- \@@_primitive:NN \XeTeXglyphname \xetex_glyphname:D
- \@@_primitive:NN \XeTeXinputencoding \xetex_inputencoding:D
- \@@_primitive:NN \XeTeXinputnormalization
- \xetex_inputnormalization:D
- \@@_primitive:NN \XeTeXinterchartokenstate
- \xetex_interchartokenstate:D
- \@@_primitive:NN \XeTeXinterchartoks \xetex_interchartoks:D
- \@@_primitive:NN \XeTeXisdefaultselector
- \xetex_isdefaultselector:D
- \@@_primitive:NN \XeTeXisexclusivefeature
- \xetex_isexclusivefeature:D
- \@@_primitive:NN \XeTeXlastfontchar \xetex_lastfontchar:D
- \@@_primitive:NN \XeTeXlinebreakskip \xetex_linebreakskip:D
- \@@_primitive:NN \XeTeXlinebreaklocale \xetex_linebreaklocale:D
- \@@_primitive:NN \XeTeXlinebreakpenalty \xetex_linebreakpenalty:D
- \@@_primitive:NN \XeTeXOTcountfeatures \xetex_OTcountfeatures:D
- \@@_primitive:NN \XeTeXOTcountlanguages \xetex_OTcountlanguages:D
- \@@_primitive:NN \XeTeXOTcountscripts \xetex_OTcountscripts:D
- \@@_primitive:NN \XeTeXOTfeaturetag \xetex_OTfeaturetag:D
- \@@_primitive:NN \XeTeXOTlanguagetag \xetex_OTlanguagetag:D
- \@@_primitive:NN \XeTeXOTscripttag \xetex_OTscripttag:D
- \@@_primitive:NN \XeTeXpdffile \xetex_pdffile:D
- \@@_primitive:NN \XeTeXpdfpagecount \xetex_pdfpagecount:D
- \@@_primitive:NN \XeTeXpicfile \xetex_picfile:D
- \@@_primitive:NN \XeTeXselectorname \xetex_selectorname:D
- \@@_primitive:NN \XeTeXtracingfonts \xetex_tracingfonts:D
- \@@_primitive:NN \XeTeXupwardsmode \xetex_upwardsmode:D
- \@@_primitive:NN \XeTeXuseglyphmetrics \xetex_useglyphmetrics:D
- \@@_primitive:NN \XeTeXvariation \xetex_variation:D
- \@@_primitive:NN \XeTeXvariationdefault \xetex_variationdefault:D
- \@@_primitive:NN \XeTeXvariationmax \xetex_variationmax:D
- \@@_primitive:NN \XeTeXvariationmin \xetex_variationmin:D
- \@@_primitive:NN \XeTeXvariationname \xetex_variationname:D
- \@@_primitive:NN \XeTeXrevision \xetex_XeTeXrevision:D
- \@@_primitive:NN \XeTeXversion \xetex_XeTeXversion:D
- \@@_primitive:NN \alignmark \luatex_alignmark:D
- \@@_primitive:NN \aligntab \luatex_aligntab:D
- \@@_primitive:NN \attribute \luatex_attribute:D
- \@@_primitive:NN \attributedef \luatex_attributedef:D
- \@@_primitive:NN \automaticdiscretionary
- \luatex_automaticdiscretionary:D
- \@@_primitive:NN \automatichyphenmode
- \luatex_automatichyphenmode:D
- \@@_primitive:NN \automatichyphenpenalty
- \luatex_automatichyphenpenalty:D
- \@@_primitive:NN \begincsname \luatex_begincsname:D
- \@@_primitive:NN \breakafterdirmode \luatex_breakafterdirmode:D
- \@@_primitive:NN \catcodetable \luatex_catcodetable:D
- \@@_primitive:NN \clearmarks \luatex_clearmarks:D
- \@@_primitive:NN \crampeddisplaystyle
- \luatex_crampeddisplaystyle:D
- \@@_primitive:NN \crampedscriptscriptstyle
- \luatex_crampedscriptscriptstyle:D
- \@@_primitive:NN \crampedscriptstyle \luatex_crampedscriptstyle:D
- \@@_primitive:NN \crampedtextstyle \luatex_crampedtextstyle:D
- \@@_primitive:NN \directlua \luatex_directlua:D
- \@@_primitive:NN \dviextension \luatex_dviextension:D
- \@@_primitive:NN \dvifeedback \luatex_dvifeedback:D
- \@@_primitive:NN \dvivariable \luatex_dvivariable:D
- \@@_primitive:NN \etoksapp \luatex_etoksapp:D
- \@@_primitive:NN \etokspre \luatex_etokspre:D
- \@@_primitive:NN \explicithyphenpenalty
- \luatex_explicithyphenpenalty:D
- \@@_primitive:NN \expanded \luatex_expanded:D
- \@@_primitive:NN \explicitdiscretionary
- \luatex_explicitdiscretionary:D
- \@@_primitive:NN \firstvalidlanguage \luatex_firstvalidlanguage:D
- \@@_primitive:NN \fontid \luatex_fontid:D
- \@@_primitive:NN \formatname \luatex_formatname:D
- \@@_primitive:NN \hjcode \luatex_hjcode:D
- \@@_primitive:NN \hpack \luatex_hpack:D
- \@@_primitive:NN \hyphenationbounds \luatex_hyphenationbounds:D
- \@@_primitive:NN \hyphenationmin \luatex_hyphenationmin:D
- \@@_primitive:NN \hyphenpenaltymode \luatex_hyphenpenaltymode:D
- \@@_primitive:NN \gleaders \luatex_gleaders:D
- \@@_primitive:NN \initcatcodetable \luatex_initcatcodetable:D
- \@@_primitive:NN \lastnamedcs \luatex_lastnamedcs:D
- \@@_primitive:NN \latelua \luatex_latelua:D
- \@@_primitive:NN \letcharcode \luatex_letcharcode:D
- \@@_primitive:NN \luaescapestring \luatex_luaescapestring:D
- \@@_primitive:NN \luafunction \luatex_luafunction:D
- \@@_primitive:NN \luatexbanner \luatex_luatexbanner:D
- \@@_primitive:NN \luatexrevision \luatex_luatexrevision:D
- \@@_primitive:NN \luatexversion \luatex_luatexversion:D
- \@@_primitive:NN \mathdelimitersmode \luatex_mathdelimitersmode:D
- \@@_primitive:NN \mathdisplayskipmode
- \luatex_mathdisplayskipmode:D
- \@@_primitive:NN \matheqnogapstep \luatex_matheqnogapstep:D
- \@@_primitive:NN \mathnolimitsmode \luatex_mathnolimitsmode:D
- \@@_primitive:NN \mathoption \luatex_mathoption:D
- \@@_primitive:NN \mathpenaltiesmode \luatex_mathpenaltiesmode:D
- \@@_primitive:NN \mathrulesfam \luatex_mathrulesfam:D
- \@@_primitive:NN \mathscriptsmode \luatex_mathscriptsmode:D
- \@@_primitive:NN \mathscriptboxmode \luatex_mathscriptboxmode:D
- \@@_primitive:NN \mathstyle \luatex_mathstyle:D
- \@@_primitive:NN \mathsurroundmode \luatex_mathsurroundmode:D
- \@@_primitive:NN \mathsurroundskip \luatex_mathsurroundskip:D
- \@@_primitive:NN \nohrule \luatex_nohrule:D
- \@@_primitive:NN \nokerns \luatex_nokerns:D
- \@@_primitive:NN \noligs \luatex_noligs:D
- \@@_primitive:NN \nospaces \luatex_nospaces:D
- \@@_primitive:NN \novrule \luatex_novrule:D
- \@@_primitive:NN \outputbox \luatex_outputbox:D
- \@@_primitive:NN \pagebottomoffset \luatex_pagebottomoffset:D
- \@@_primitive:NN \pageleftoffset \luatex_pageleftoffset:D
- \@@_primitive:NN \pagerightoffset \luatex_pagerightoffset:D
- \@@_primitive:NN \pagetopoffset \luatex_pagetopoffset:D
- \@@_primitive:NN \pdfextension \luatex_pdfextension:D
- \@@_primitive:NN \pdffeedback \luatex_pdffeedback:D
- \@@_primitive:NN \pdfvariable \luatex_pdfvariable:D
- \@@_primitive:NN \postexhyphenchar \luatex_postexhyphenchar:D
- \@@_primitive:NN \posthyphenchar \luatex_posthyphenchar:D
- \@@_primitive:NN \prebinoppenalty \luatex_prebinoppenalty:D
- \@@_primitive:NN \predisplaygapfactor
- \luatex_predisplaygapfactor:D
- \@@_primitive:NN \preexhyphenchar \luatex_preexhyphenchar:D
- \@@_primitive:NN \prehyphenchar \luatex_prehyphenchar:D
- \@@_primitive:NN \prerelpenalty \luatex_prerelpenalty:D
- \@@_primitive:NN \savecatcodetable \luatex_savecatcodetable:D
- \@@_primitive:NN \scantextokens \luatex_scantextokens:D
- \@@_primitive:NN \setfontid \luatex_setfontid:D
- \@@_primitive:NN \shapemode \luatex_shapemode:D
- \@@_primitive:NN \suppressifcsnameerror
- \luatex_suppressifcsnameerror:D
- \@@_primitive:NN \suppresslongerror \luatex_suppresslongerror:D
- \@@_primitive:NN \suppressmathparerror
- \luatex_suppressmathparerror:D
- \@@_primitive:NN \suppressoutererror \luatex_suppressoutererror:D
- \@@_primitive:NN \suppressprimitiveerror
- \luatex_suppressprimitiveerror:D
- \@@_primitive:NN \toksapp \luatex_toksapp:D
- \@@_primitive:NN \tokspre \luatex_tokspre:D
- \@@_primitive:NN \tpack \luatex_tpack:D
- \@@_primitive:NN \vpack \luatex_vpack:D
- \@@_primitive:NN \bodydir \luatex_bodydir:D
- \@@_primitive:NN \boxdir \luatex_boxdir:D
- \@@_primitive:NN \leftghost \luatex_leftghost:D
- \@@_primitive:NN \linedir \luatex_linedir:D
- \@@_primitive:NN \localbrokenpenalty \luatex_localbrokenpenalty:D
- \@@_primitive:NN \localinterlinepenalty
- \luatex_localinterlinepenalty:D
- \@@_primitive:NN \localleftbox \luatex_localleftbox:D
- \@@_primitive:NN \localrightbox \luatex_localrightbox:D
- \@@_primitive:NN \mathdir \luatex_mathdir:D
- \@@_primitive:NN \pagedir \luatex_pagedir:D
- \@@_primitive:NN \pardir \luatex_pardir:D
- \@@_primitive:NN \rightghost \luatex_rightghost:D
- \@@_primitive:NN \textdir \luatex_textdir:D
- \@@_primitive:NN \Uchar \utex_char:D
- \@@_primitive:NN \Ucharcat \utex_charcat:D
- \@@_primitive:NN \Udelcode \utex_delcode:D
- \@@_primitive:NN \Udelcodenum \utex_delcodenum:D
- \@@_primitive:NN \Udelimiter \utex_delimiter:D
- \@@_primitive:NN \Udelimiterover \utex_delimiterover:D
- \@@_primitive:NN \Udelimiterunder \utex_delimiterunder:D
- \@@_primitive:NN \Uhextensible \utex_hextensible:D
- \@@_primitive:NN \Umathaccent \utex_mathaccent:D
- \@@_primitive:NN \Umathaxis \utex_mathaxis:D
- \@@_primitive:NN \Umathbinbinspacing \utex_binbinspacing:D
- \@@_primitive:NN \Umathbinclosespacing \utex_binclosespacing:D
- \@@_primitive:NN \Umathbininnerspacing \utex_bininnerspacing:D
- \@@_primitive:NN \Umathbinopenspacing \utex_binopenspacing:D
- \@@_primitive:NN \Umathbinopspacing \utex_binopspacing:D
- \@@_primitive:NN \Umathbinordspacing \utex_binordspacing:D
- \@@_primitive:NN \Umathbinpunctspacing \utex_binpunctspacing:D
- \@@_primitive:NN \Umathbinrelspacing \utex_binrelspacing:D
- \@@_primitive:NN \Umathchar \utex_mathchar:D
- \@@_primitive:NN \Umathcharclass \utex_mathcharclass:D
- \@@_primitive:NN \Umathchardef \utex_mathchardef:D
- \@@_primitive:NN \Umathcharfam \utex_mathcharfam:D
- \@@_primitive:NN \Umathcharnum \utex_mathcharnum:D
- \@@_primitive:NN \Umathcharnumdef \utex_mathcharnumdef:D
- \@@_primitive:NN \Umathcharslot \utex_mathcharslot:D
- \@@_primitive:NN \Umathclosebinspacing \utex_closebinspacing:D
- \@@_primitive:NN \Umathcloseclosespacing
- \utex_closeclosespacing:D
- \@@_primitive:NN \Umathcloseinnerspacing
- \utex_closeinnerspacing:D
- \@@_primitive:NN \Umathcloseopenspacing \utex_closeopenspacing:D
- \@@_primitive:NN \Umathcloseopspacing \utex_closeopspacing:D
- \@@_primitive:NN \Umathcloseordspacing \utex_closeordspacing:D
- \@@_primitive:NN \Umathclosepunctspacing
- \utex_closepunctspacing:D
- \@@_primitive:NN \Umathcloserelspacing \utex_closerelspacing:D
- \@@_primitive:NN \Umathcode \utex_mathcode:D
- \@@_primitive:NN \Umathcodenum \utex_mathcodenum:D
- \@@_primitive:NN \Umathconnectoroverlapmin
- \utex_connectoroverlapmin:D
- \@@_primitive:NN \Umathfractiondelsize \utex_fractiondelsize:D
- \@@_primitive:NN \Umathfractiondenomdown
- \utex_fractiondenomdown:D
- \@@_primitive:NN \Umathfractiondenomvgap
- \utex_fractiondenomvgap:D
- \@@_primitive:NN \Umathfractionnumup \utex_fractionnumup:D
- \@@_primitive:NN \Umathfractionnumvgap \utex_fractionnumvgap:D
- \@@_primitive:NN \Umathfractionrule \utex_fractionrule:D
- \@@_primitive:NN \Umathinnerbinspacing \utex_innerbinspacing:D
- \@@_primitive:NN \Umathinnerclosespacing
- \utex_innerclosespacing:D
- \@@_primitive:NN \Umathinnerinnerspacing
- \utex_innerinnerspacing:D
- \@@_primitive:NN \Umathinneropenspacing \utex_inneropenspacing:D
- \@@_primitive:NN \Umathinneropspacing \utex_inneropspacing:D
- \@@_primitive:NN \Umathinnerordspacing \utex_innerordspacing:D
- \@@_primitive:NN \Umathinnerpunctspacing
- \utex_innerpunctspacing:D
- \@@_primitive:NN \Umathinnerrelspacing \utex_innerrelspacing:D
- \@@_primitive:NN \Umathlimitabovebgap \utex_limitabovebgap:D
- \@@_primitive:NN \Umathlimitabovekern \utex_limitabovekern:D
- \@@_primitive:NN \Umathlimitabovevgap \utex_limitabovevgap:D
- \@@_primitive:NN \Umathlimitbelowbgap \utex_limitbelowbgap:D
- \@@_primitive:NN \Umathlimitbelowkern \utex_limitbelowkern:D
- \@@_primitive:NN \Umathlimitbelowvgap \utex_limitbelowvgap:D
- \@@_primitive:NN \Umathnolimitsubfactor \utex_nolimitsubfactor:D
- \@@_primitive:NN \Umathnolimitsupfactor \utex_nolimitsupfactor:D
- \@@_primitive:NN \Umathopbinspacing \utex_opbinspacing:D
- \@@_primitive:NN \Umathopclosespacing \utex_opclosespacing:D
- \@@_primitive:NN \Umathopenbinspacing \utex_openbinspacing:D
- \@@_primitive:NN \Umathopenclosespacing \utex_openclosespacing:D
- \@@_primitive:NN \Umathopeninnerspacing \utex_openinnerspacing:D
- \@@_primitive:NN \Umathopenopenspacing \utex_openopenspacing:D
- \@@_primitive:NN \Umathopenopspacing \utex_openopspacing:D
- \@@_primitive:NN \Umathopenordspacing \utex_openordspacing:D
- \@@_primitive:NN \Umathopenpunctspacing \utex_openpunctspacing:D
- \@@_primitive:NN \Umathopenrelspacing \utex_openrelspacing:D
- \@@_primitive:NN \Umathoperatorsize \utex_operatorsize:D
- \@@_primitive:NN \Umathopinnerspacing \utex_opinnerspacing:D
- \@@_primitive:NN \Umathopopenspacing \utex_opopenspacing:D
- \@@_primitive:NN \Umathopopspacing \utex_opopspacing:D
- \@@_primitive:NN \Umathopordspacing \utex_opordspacing:D
- \@@_primitive:NN \Umathoppunctspacing \utex_oppunctspacing:D
- \@@_primitive:NN \Umathoprelspacing \utex_oprelspacing:D
- \@@_primitive:NN \Umathordbinspacing \utex_ordbinspacing:D
- \@@_primitive:NN \Umathordclosespacing \utex_ordclosespacing:D
- \@@_primitive:NN \Umathordinnerspacing \utex_ordinnerspacing:D
- \@@_primitive:NN \Umathordopenspacing \utex_ordopenspacing:D
- \@@_primitive:NN \Umathordopspacing \utex_ordopspacing:D
- \@@_primitive:NN \Umathordordspacing \utex_ordordspacing:D
- \@@_primitive:NN \Umathordpunctspacing \utex_ordpunctspacing:D
- \@@_primitive:NN \Umathordrelspacing \utex_ordrelspacing:D
- \@@_primitive:NN \Umathoverbarkern \utex_overbarkern:D
- \@@_primitive:NN \Umathoverbarrule \utex_overbarrule:D
- \@@_primitive:NN \Umathoverbarvgap \utex_overbarvgap:D
- \@@_primitive:NN \Umathoverdelimiterbgap
- \utex_overdelimiterbgap:D
- \@@_primitive:NN \Umathoverdelimitervgap
- \utex_overdelimitervgap:D
- \@@_primitive:NN \Umathpunctbinspacing \utex_punctbinspacing:D
- \@@_primitive:NN \Umathpunctclosespacing
- \utex_punctclosespacing:D
- \@@_primitive:NN \Umathpunctinnerspacing
- \utex_punctinnerspacing:D
- \@@_primitive:NN \Umathpunctopenspacing \utex_punctopenspacing:D
- \@@_primitive:NN \Umathpunctopspacing \utex_punctopspacing:D
- \@@_primitive:NN \Umathpunctordspacing \utex_punctordspacing:D
- \@@_primitive:NN \Umathpunctpunctspacing\utex_punctpunctspacing:D
- \@@_primitive:NN \Umathpunctrelspacing \utex_punctrelspacing:D
- \@@_primitive:NN \Umathquad \utex_quad:D
- \@@_primitive:NN \Umathradicaldegreeafter
- \utex_radicaldegreeafter:D
- \@@_primitive:NN \Umathradicaldegreebefore
- \utex_radicaldegreebefore:D
- \@@_primitive:NN \Umathradicaldegreeraise
- \utex_radicaldegreeraise:D
- \@@_primitive:NN \Umathradicalkern \utex_radicalkern:D
- \@@_primitive:NN \Umathradicalrule \utex_radicalrule:D
- \@@_primitive:NN \Umathradicalvgap \utex_radicalvgap:D
- \@@_primitive:NN \Umathrelbinspacing \utex_relbinspacing:D
- \@@_primitive:NN \Umathrelclosespacing \utex_relclosespacing:D
- \@@_primitive:NN \Umathrelinnerspacing \utex_relinnerspacing:D
- \@@_primitive:NN \Umathrelopenspacing \utex_relopenspacing:D
- \@@_primitive:NN \Umathrelopspacing \utex_relopspacing:D
- \@@_primitive:NN \Umathrelordspacing \utex_relordspacing:D
- \@@_primitive:NN \Umathrelpunctspacing \utex_relpunctspacing:D
- \@@_primitive:NN \Umathrelrelspacing \utex_relrelspacing:D
- \@@_primitive:NN \Umathskewedfractionhgap
- \utex_skewedfractionhgap:D
- \@@_primitive:NN \Umathskewedfractionvgap
- \utex_skewedfractionvgap:D
- \@@_primitive:NN \Umathspaceafterscript \utex_spaceafterscript:D
- \@@_primitive:NN \Umathstackdenomdown \utex_stackdenomdown:D
- \@@_primitive:NN \Umathstacknumup \utex_stacknumup:D
- \@@_primitive:NN \Umathstackvgap \utex_stackvgap:D
- \@@_primitive:NN \Umathsubshiftdown \utex_subshiftdown:D
- \@@_primitive:NN \Umathsubshiftdrop \utex_subshiftdrop:D
- \@@_primitive:NN \Umathsubsupshiftdown \utex_subsupshiftdown:D
- \@@_primitive:NN \Umathsubsupvgap \utex_subsupvgap:D
- \@@_primitive:NN \Umathsubtopmax \utex_subtopmax:D
- \@@_primitive:NN \Umathsupbottommin \utex_supbottommin:D
- \@@_primitive:NN \Umathsupshiftdrop \utex_supshiftdrop:D
- \@@_primitive:NN \Umathsupshiftup \utex_supshiftup:D
- \@@_primitive:NN \Umathsupsubbottommax \utex_supsubbottommax:D
- \@@_primitive:NN \Umathunderbarkern \utex_underbarkern:D
- \@@_primitive:NN \Umathunderbarrule \utex_underbarrule:D
- \@@_primitive:NN \Umathunderbarvgap \utex_underbarvgap:D
- \@@_primitive:NN \Umathunderdelimiterbgap
- \utex_underdelimiterbgap:D
- \@@_primitive:NN \Umathunderdelimitervgap
- \utex_underdelimitervgap:D
- \@@_primitive:NN \Unosubscript \utex_nosubscript:D
- \@@_primitive:NN \Unosuperscript \utex_nosuperscript:D
- \@@_primitive:NN \Uoverdelimiter \utex_overdelimiter:D
- \@@_primitive:NN \Uradical \utex_radical:D
- \@@_primitive:NN \Uroot \utex_root:D
- \@@_primitive:NN \Uskewed \utex_skewed:D
- \@@_primitive:NN \Uskewedwithdelims \utex_skewedwithdelims:D
- \@@_primitive:NN \Ustack \utex_stack:D
- \@@_primitive:NN \Ustartdisplaymath \utex_startdisplaymath:D
- \@@_primitive:NN \Ustartmath \utex_startmath:D
- \@@_primitive:NN \Ustopdisplaymath \utex_stopdisplaymath:D
- \@@_primitive:NN \Ustopmath \utex_stopmath:D
- \@@_primitive:NN \Usubscript \utex_subscript:D
- \@@_primitive:NN \Usuperscript \utex_superscript:D
- \@@_primitive:NN \Uunderdelimiter \utex_underdelimiter:D
- \@@_primitive:NN \Uvextensible \utex_vextensible:D
- \@@_primitive:NN \autospacing \ptex_autospacing:D
- \@@_primitive:NN \autoxspacing \ptex_autoxspacing:D
- \@@_primitive:NN \dtou \ptex_dtou:D
- \@@_primitive:NN \epTeXinputencoding \ptex_inputencoding:D
- \@@_primitive:NN \epTeXversion \ptex_epTeXversion:D
- \@@_primitive:NN \euc \ptex_euc:D
- \@@_primitive:NN \ifdbox \ptex_ifdbox:D
- \@@_primitive:NN \ifddir \ptex_ifddir:D
- \@@_primitive:NN \ifmdir \ptex_ifmdir:D
- \@@_primitive:NN \iftbox \ptex_iftbox:D
- \@@_primitive:NN \iftdir \ptex_iftdir:D
- \@@_primitive:NN \ifybox \ptex_ifybox:D
- \@@_primitive:NN \ifydir \ptex_ifydir:D
- \@@_primitive:NN \inhibitglue \ptex_inhibitglue:D
- \@@_primitive:NN \inhibitxspcode \ptex_inhibitxspcode:D
- \@@_primitive:NN \jcharwidowpenalty \ptex_jcharwidowpenalty:D
- \@@_primitive:NN \jfam \ptex_jfam:D
- \@@_primitive:NN \jfont \ptex_jfont:D
- \@@_primitive:NN \jis \ptex_jis:D
- \@@_primitive:NN \kanjiskip \ptex_kanjiskip:D
- \@@_primitive:NN \kansuji \ptex_kansuji:D
- \@@_primitive:NN \kansujichar \ptex_kansujichar:D
- \@@_primitive:NN \kcatcode \ptex_kcatcode:D
- \@@_primitive:NN \kuten \ptex_kuten:D
- \@@_primitive:NN \noautospacing \ptex_noautospacing:D
- \@@_primitive:NN \noautoxspacing \ptex_noautoxspacing:D
- \@@_primitive:NN \postbreakpenalty \ptex_postbreakpenalty:D
- \@@_primitive:NN \prebreakpenalty \ptex_prebreakpenalty:D
- \@@_primitive:NN \ptexminorversion \ptex_ptexminorversion:D
- \@@_primitive:NN \ptexrevision \ptex_ptexrevision:D
- \@@_primitive:NN \ptexversion \ptex_ptexversion:D
- \@@_primitive:NN \showmode \ptex_showmode:D
- \@@_primitive:NN \sjis \ptex_sjis:D
- \@@_primitive:NN \tate \ptex_tate:D
- \@@_primitive:NN \tbaselineshift \ptex_tbaselineshift:D
- \@@_primitive:NN \tfont \ptex_tfont:D
- \@@_primitive:NN \xkanjiskip \ptex_xkanjiskip:D
- \@@_primitive:NN \xspcode \ptex_xspcode:D
- \@@_primitive:NN \ybaselineshift \ptex_ybaselineshift:D
- \@@_primitive:NN \yoko \ptex_yoko:D
- \@@_primitive:NN \disablecjktoken \uptex_disablecjktoken:D
- \@@_primitive:NN \enablecjktoken \uptex_enablecjktoken:D
- \@@_primitive:NN \forcecjktoken \uptex_forcecjktoken:D
- \@@_primitive:NN \kchar \uptex_kchar:D
- \@@_primitive:NN \kchardef \uptex_kchardef:D
- \@@_primitive:NN \kuten \uptex_kuten:D
- \@@_primitive:NN \ucs \uptex_ucs:D
- \@@_primitive:NN \uptexrevision \uptex_uptexrevision:D
- \@@_primitive:NN \uptexversion \uptex_uptexversion:D
- }
- }
- \@@_primitives:
-\tex_endgroup:D
-%</package>
-% \end{macrocode}
-%
% \begin{macrocode}
%</initex|package>
% \end{macrocode}
diff --git a/macros/latex/contrib/l3kernel/l3news.pdf b/macros/latex/contrib/l3kernel/l3news.pdf
index b5ccaa4abd..9463b85375 100644
--- a/macros/latex/contrib/l3kernel/l3news.pdf
+++ b/macros/latex/contrib/l3kernel/l3news.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news01.pdf b/macros/latex/contrib/l3kernel/l3news01.pdf
index 9df1d2e357..5c3bb76914 100644
--- a/macros/latex/contrib/l3kernel/l3news01.pdf
+++ b/macros/latex/contrib/l3kernel/l3news01.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news02.pdf b/macros/latex/contrib/l3kernel/l3news02.pdf
index 986447ba43..0d80eae081 100644
--- a/macros/latex/contrib/l3kernel/l3news02.pdf
+++ b/macros/latex/contrib/l3kernel/l3news02.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news03.pdf b/macros/latex/contrib/l3kernel/l3news03.pdf
index b574f29d39..29264d3578 100644
--- a/macros/latex/contrib/l3kernel/l3news03.pdf
+++ b/macros/latex/contrib/l3kernel/l3news03.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news04.pdf b/macros/latex/contrib/l3kernel/l3news04.pdf
index bd28986715..1b990e3889 100644
--- a/macros/latex/contrib/l3kernel/l3news04.pdf
+++ b/macros/latex/contrib/l3kernel/l3news04.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news05.pdf b/macros/latex/contrib/l3kernel/l3news05.pdf
index 98f1049a04..ab75e4b939 100644
--- a/macros/latex/contrib/l3kernel/l3news05.pdf
+++ b/macros/latex/contrib/l3kernel/l3news05.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news06.pdf b/macros/latex/contrib/l3kernel/l3news06.pdf
index 09db992250..95606ad096 100644
--- a/macros/latex/contrib/l3kernel/l3news06.pdf
+++ b/macros/latex/contrib/l3kernel/l3news06.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news07.pdf b/macros/latex/contrib/l3kernel/l3news07.pdf
index 7c1d2e11a6..a51e4512e4 100644
--- a/macros/latex/contrib/l3kernel/l3news07.pdf
+++ b/macros/latex/contrib/l3kernel/l3news07.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news08.pdf b/macros/latex/contrib/l3kernel/l3news08.pdf
index fde17f4305..45e221f9ba 100644
--- a/macros/latex/contrib/l3kernel/l3news08.pdf
+++ b/macros/latex/contrib/l3kernel/l3news08.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news09.pdf b/macros/latex/contrib/l3kernel/l3news09.pdf
index b088958a78..c2a1cc1816 100644
--- a/macros/latex/contrib/l3kernel/l3news09.pdf
+++ b/macros/latex/contrib/l3kernel/l3news09.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news10.pdf b/macros/latex/contrib/l3kernel/l3news10.pdf
index bc0ccc14ec..af9d89b61a 100644
--- a/macros/latex/contrib/l3kernel/l3news10.pdf
+++ b/macros/latex/contrib/l3kernel/l3news10.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news11.pdf b/macros/latex/contrib/l3kernel/l3news11.pdf
index 6a3bc0787d..c9a93fa975 100644
--- a/macros/latex/contrib/l3kernel/l3news11.pdf
+++ b/macros/latex/contrib/l3kernel/l3news11.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3news12.pdf b/macros/latex/contrib/l3kernel/l3news12.pdf
index 573feb45f8..cc045f3a19 100644
--- a/macros/latex/contrib/l3kernel/l3news12.pdf
+++ b/macros/latex/contrib/l3kernel/l3news12.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.csv b/macros/latex/contrib/l3kernel/l3prefixes.csv
index 3738670cf3..bcf02f23b6 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.csv
+++ b/macros/latex/contrib/l3kernel/l3prefixes.csv
@@ -123,6 +123,7 @@ morewrites,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrite
msg,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
msvg,media4svg,Alexander Grahn,,https://gitlab.com/agrahn/media4svg,https://gitlab.com/agrahn/media4svg/issues,2020-04-15,2020-04-15,
muskip,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+namedef,namedef,Phelype Oleinik,https://github.com/PhelypeOleinik/namedef,https://github.com/PhelypeOleinik/namedef.git,https://github.com/PhelypeOleinik/namedef/issues,2020-06-22,2020-06-22,
nan,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
nicematrix,nicematrix,François Pantigny,,,,2019-12-19,2019-12-19,
nil,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
@@ -138,9 +139,11 @@ overleaf,overleaf,Overleaf,https://www.overleaf.com/about,,support+tex-dev@overl
parameter,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
pbs,media9,Alexander Grahn,,https://gitlab.com/agrahn/media9,https://gitlab.com/agrahn/media9/issues,2016-02-26,2020-04-15,
pdf,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2019-06-02,2019-06-02,
+pdfoverlay,pdfoverlay,David Purton,https://github.com/dcpurton/pdfoverlay,https://github.com/dcpurton/pdfoverlay.git,https://github.com/dcpurton/pdfoverlay/issues,2020-06-22,2020-06-22,
pdftex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
peek,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
percent,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
+pgf,pgf,The PGF/TikZ Team,https://pgf-tikz.github.io,https://github.com/pgf-tikz/pgf,https://github.com/pgf-tikz/pgf/issues,2020-07-03,2020-07-03,
pi,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
pkgploader,pkgploader,Michiel Helvensteijn,,,,2014-02-05,2014-02-05,
polyglossia,polyglossia,Arthur Reutenauer,https://www.polyglossia.org/,https://github.com/reutenauer/polyglossia,https://github.com/reutenauer/polyglossia/issues,2019-09-03,,
@@ -149,7 +152,9 @@ primargs,morewrites,Bruno Le Floch,https://github.com/blefloch/latex-morewrites,
prop,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
pseudo,pseudo,Magnus Lie Hetland,https://github.com/mlhetland/pseudo.sty,https://github.com/mlhetland/pseudo.sty.git,https://github.com/mlhetland/pseudo.sty/issues,2019-06-24,2019-06-24,
ptex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2015-07-28,2015-07-28,
+ptxcd,ptxcd, Marei Peischl,,,,2020-07-27,2020-07-27,Used for specific corporate design templates
quark,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2012-09-27,
+qrbill,qrbill,Marei Peischl,https://github.com/peiTeX/qrbill,https://github.com/peiTeX/qrbill.git,https://github.com/peiTeX/qrbill/issues,2020-06-27,2020-06-27,
randomwalk,randomwalk,Bruno Le Floch,https://github.com/blefloch/latex-randomwalk,https://github.com/blefloch/latex-randomwalk.git,https://github.com/blefloch/latex-randomwalk/issues,2013-03-16,2015-09-22,
recursion,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2018-05-12,2018-05-12,
regex,l3kernel,The LaTeX3 Project,https://www.latex-project.org/latex3.html,https://github.com/latex3/latex3.git,https://github.com/latex3/latex3/issues,2012-09-27,2018-04-06,
diff --git a/macros/latex/contrib/l3kernel/l3prefixes.pdf b/macros/latex/contrib/l3kernel/l3prefixes.pdf
index fe9b65c217..9b9fc68466 100644
--- a/macros/latex/contrib/l3kernel/l3prefixes.pdf
+++ b/macros/latex/contrib/l3kernel/l3prefixes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3prg.dtx b/macros/latex/contrib/l3kernel/l3prg.dtx
index 52d6794833..c1f794e015 100644
--- a/macros/latex/contrib/l3kernel/l3prg.dtx
+++ b/macros/latex/contrib/l3kernel/l3prg.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3prop.dtx b/macros/latex/contrib/l3kernel/l3prop.dtx
index a85becf5e3..790f0e3b31 100644
--- a/macros/latex/contrib/l3kernel/l3prop.dtx
+++ b/macros/latex/contrib/l3kernel/l3prop.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -146,13 +146,17 @@
% \begin{function}[updated = 2012-07-09]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo,, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo,
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx,
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:NVx, \prop_gput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{syntax}
% \cs{prop_put:Nnn} \meta{property list} \Arg{key} \Arg{value}
@@ -186,8 +190,8 @@
%
% \begin{function}[updated = 2011-08-28]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN,
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN,
% }
% \begin{syntax}
% \cs{prop_get:NnN} \meta{property list} \Arg{key} \meta{tl var}
@@ -319,8 +323,8 @@
%
% \begin{function}[updated = 2012-05-19, TF]
% {
-% \prop_get:NnN, \prop_get:NVN, \prop_get:NoN,
-% \prop_get:cnN, \prop_get:cVN, \prop_get:coN
+% \prop_get:NnN, \prop_get:NVN, \prop_get:NvN, \prop_get:NoN,
+% \prop_get:cnN, \prop_get:cVN, \prop_get:cvN, \prop_get:coN
% }
% \begin{syntax}
% \cs{prop_get:NnNTF} \meta{property list} \Arg{key} \meta{token list variable} \\
@@ -911,8 +915,8 @@
{ \tl_set:Nn #3 {##2} }
{ \tl_set:Nn #3 { \q_no_value } }
}
-\cs_generate_variant:Nn \prop_get:NnN { NV , No }
-\cs_generate_variant:Nn \prop_get:NnN { c , cV , co }
+\cs_generate_variant:Nn \prop_get:NnN { NV , Nv , No }
+\cs_generate_variant:Nn \prop_get:NnN { c , cV , cv , co }
% \end{macrocode}
% \end{macro}
%
@@ -1038,16 +1042,20 @@
% \begin{macro}[tested = m3prop002]
% {
% \prop_put:Nnn, \prop_put:NnV, \prop_put:Nno, \prop_put:Nnx,
-% \prop_put:NVn, \prop_put:NVV, \prop_put:Non, \prop_put:Noo,
+% \prop_put:NVn, \prop_put:NVV, \prop_put:NVx, \prop_put:Nvx,
+% \prop_put:Non, \prop_put:Noo, \prop_put:Nxx,
% \prop_put:cnn, \prop_put:cnV, \prop_put:cno, \prop_put:cnx,
-% \prop_put:cVn, \prop_put:cVV, \prop_put:con, \prop_put:coo
+% \prop_put:cVn, \prop_put:cVV, \prop_put:cVx, \prop_put:cvx,
+% \prop_put:con, \prop_put:coo, \prop_put:cxx
% }
% \begin{macro}[tested = m3prop002]
% {
% \prop_gput:Nnn, \prop_gput:NnV, \prop_gput:Nno, \prop_gput:Nnx,
-% \prop_gput:NVn, \prop_gput:NVV, \prop_gput:Non, \prop_gput:Noo,
+% \prop_gput:NVn, \prop_gput:NVV, \prop_hput:NVx, \prop_hput:Nvx,
+% \prop_gput:Non, \prop_gput:Noo, \prop_gput:Nxx,
% \prop_gput:cnn, \prop_gput:cnV, \prop_gput:cno, \prop_gput:cnx,
-% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:con, \prop_gput:coo
+% \prop_gput:cVn, \prop_gput:cVV, \prop_gput:cVx, \prop_gput:cvx,
+% \prop_gput:con, \prop_gput:coo, \prop_gput:cxx
% }
% \begin{macro}{\@@_put:NNnn}
% Since the branches of \cs{@@_split:NnTF} are used as the replacement
@@ -1077,13 +1085,13 @@
{ #1 #2 { \exp_not:o {#2} \l_@@_internal_tl } }
}
\cs_generate_variant:Nn \prop_put:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_put:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { NnV , Nno , Nnx , NV , NVV , No , Noo }
+ { NnV , Nno , Nnx , NV , NVV , NVx , Nvx , No , Noo , Nxx }
\cs_generate_variant:Nn \prop_gput:Nnn
- { c , cnV , cno , cnx , cV , cVV , co , coo }
+ { c , cnV , cno , cnx , cV , cVV , cVx , cvx , co , coo , cxx }
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1230,7 +1238,7 @@
{ \prg_return_false: }
}
\prg_generate_conditional_variant:Nnn \prop_get:NnN
- { NV , No , c , cV , co } { T , F , TF }
+ { NV , Nv , No , c , cV , cv , co } { T , F , TF }
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex/contrib/l3kernel/l3quark.dtx b/macros/latex/contrib/l3kernel/l3quark.dtx
index 3368fa159b..62474447ef 100644
--- a/macros/latex/contrib/l3kernel/l3quark.dtx
+++ b/macros/latex/contrib/l3kernel/l3quark.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3regex.dtx b/macros/latex/contrib/l3kernel/l3regex.dtx
index 30e355eada..3820ecdb67 100644
--- a/macros/latex/contrib/l3kernel/l3regex.dtx
+++ b/macros/latex/contrib/l3kernel/l3regex.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -3699,7 +3699,7 @@
\cs_new_protected:Npn \@@_show_item_exact_cs:n #1
{
\seq_set_split:Nnn \l_@@_internal_seq { \scan_stop: } {#1}
- \seq_set_map:NNn \l_@@_internal_seq
+ \seq_set_map_x:NNn \l_@@_internal_seq
\l_@@_internal_seq { \iow_char:N\\##1 }
\@@_show_one:n
{ control~sequence~ \seq_use:Nn \l_@@_internal_seq { ~or~ } }
@@ -6109,7 +6109,7 @@
{ \flag_height:n { @@_end } }
{ \flag_height:n { @@_begin } }
}
- \seq_set_map:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
+ \seq_set_map_x:NNn \l_@@_internal_seq \l_@@_internal_seq {##1}
\exp_args:NNNo
\group_end:
\tl_set:Nn #1 { \l_@@_internal_seq }
diff --git a/macros/latex/contrib/l3kernel/l3seq.dtx b/macros/latex/contrib/l3kernel/l3seq.dtx
index 40d829f96c..bd935c6f60 100644
--- a/macros/latex/contrib/l3kernel/l3seq.dtx
+++ b/macros/latex/contrib/l3kernel/l3seq.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -139,7 +139,7 @@
% this space trimming behaviour is identical to that of
% \pkg{l3clist} functions. Empty \meta{items} are preserved by
% \cs{seq_set_split:Nnn}, and can be removed afterwards using
-% \cs{seq_remove_all:Nn} \meta{sequence} \Arg{}.
+% \cs{seq_remove_all:Nn} \meta{sequence} |{}|.
% The \meta{delimiter} may not contain |{|, |}| or |#|
% (assuming \TeX{}'s normal category code r\'egime).
% If the \meta{delimiter} is empty, the \meta{token list} is split
@@ -653,6 +653,40 @@
% \end{texnote}
% \end{function}
%
+% \begin{function}[added = 2011-12-22, updated = 2020-07-16]
+% {\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{syntax}
+% \cs{seq_set_map:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting applying \meta{inline function} to each
+% \meta{item} is assigned to \meta{sequence_1}.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
+% \begin{function}[added = 2020-07-16]
+% {\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{syntax}
+% \cs{seq_set_map_x:NNn} \meta{sequence_1} \meta{sequence_2} \Arg{inline function}
+% \end{syntax}
+% Applies \meta{inline function} to every \meta{item} stored
+% within the \meta{sequence_2}. The \meta{inline function} should
+% consist of code which will receive the \meta{item} as |#1|.
+% The sequence resulting from \texttt{x}-expanding
+% \meta{inline function} applied to each \meta{item}
+% is assigned to \meta{sequence_1}. As such, the code
+% in \meta{inline function} should be expandable.
+% \begin{texnote}
+% Contrarily to other mapping functions, \cs{seq_map_break:} cannot
+% be used in this function, and would lead to low-level \TeX{} errors.
+% \end{texnote}
+% \end{function}
+%
% \begin{function}[EXP, added = 2012-07-13]{\seq_count:N, \seq_count:c}
% \begin{syntax}
% \cs{seq_count:N} \meta{sequence}
@@ -2082,6 +2116,45 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\seq_set_map_x:NNn, \seq_gset_map_x:NNn}
+% \begin{macro}{\@@_set_map_x:NNNn}
+% Very similar to \cs{seq_set_filter:NNn}. We could actually
+% merge the two within a single function, but it would have weird
+% semantics.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map_x:NNn
+ { \@@_set_map_x:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map_x:NNn
+ { \@@_set_map_x:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map_x:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:N \@@_item:n {#4} }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\seq_set_map:NNn, \seq_gset_map:NNn}
+% \begin{macro}{\@@_set_map:NNNn}
+% Similar to \cs{seq_set_map_x:NNn}, but prevents expansion of the
+% <inline function>.
+% \begin{macrocode}
+\cs_new_protected:Npn \seq_set_map:NNn
+ { \@@_set_map:NNNn \tl_set:Nx }
+\cs_new_protected:Npn \seq_gset_map:NNn
+ { \@@_set_map:NNNn \tl_gset:Nx }
+\cs_new_protected:Npn \@@_set_map:NNNn #1#2#3#4
+ {
+ \@@_push_item_def:n { \exp_not:n { \@@_item:n {#4} } }
+ #1 #2 { #3 }
+ \@@_pop_item_def:
+ }
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
% \begin{macro}{\seq_count:N, \seq_count:c}
% \begin{macro}{\@@_count:w, \@@_count_end:w}
% Since counting the items in a sequence is quite common, we optimize
diff --git a/macros/latex/contrib/l3kernel/l3skip.dtx b/macros/latex/contrib/l3kernel/l3skip.dtx
index 7b534be25c..a87f940938 100644
--- a/macros/latex/contrib/l3kernel/l3skip.dtx
+++ b/macros/latex/contrib/l3kernel/l3skip.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3sort.dtx b/macros/latex/contrib/l3kernel/l3sort.dtx
index 9163b494d0..b84c2e298a 100644
--- a/macros/latex/contrib/l3kernel/l3sort.dtx
+++ b/macros/latex/contrib/l3kernel/l3sort.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str-convert.dtx b/macros/latex/contrib/l3kernel/l3str-convert.dtx
index 6a910b8040..e57c165f1b 100644
--- a/macros/latex/contrib/l3kernel/l3str-convert.dtx
+++ b/macros/latex/contrib/l3kernel/l3str-convert.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3str.dtx b/macros/latex/contrib/l3kernel/l3str.dtx
index a6fad22d02..539881e139 100644
--- a/macros/latex/contrib/l3kernel/l3str.dtx
+++ b/macros/latex/contrib/l3kernel/l3str.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -306,7 +306,8 @@
% \end{syntax}
% Compares the content of two \meta{str variables} and
% is logically \texttt{true} if the two contain the same characters
-% in the same order.
+% in the same order. See \cs{tl_if_eq:NNTF} to compare tokens
+% (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[EXP,pTF, updated = 2018-06-18]
@@ -326,7 +327,8 @@
% \begin{verbatim}
% \str_if_eq_p:no { abc } { \tl_to_str:n { abc } }
% \end{verbatim}
-% is logically \texttt{true}.
+% is logically \texttt{true}. See \cs{tl_if_eq:nnTF} to compare
+% tokens (including their category codes) rather than characters.
% \end{function}
%
% \begin{function}[TF, added = 2017-10-08]{\str_if_in:Nn, \str_if_in:cn}
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.pdf b/macros/latex/contrib/l3kernel/l3styleguide.pdf
index 73d3f8840b..575770b6c8 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.pdf
+++ b/macros/latex/contrib/l3kernel/l3styleguide.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3styleguide.tex b/macros/latex/contrib/l3kernel/l3styleguide.tex
index 915534ed11..0d2028f2c2 100644
--- a/macros/latex/contrib/l3kernel/l3styleguide.tex
+++ b/macros/latex/contrib/l3kernel/l3styleguide.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\begin{document}
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
index 15c831eb55..76dc0f00c9 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3syntax-changes.tex b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
index 4e280f75d2..58824c3b4b 100644
--- a/macros/latex/contrib/l3kernel/l3syntax-changes.tex
+++ b/macros/latex/contrib/l3kernel/l3syntax-changes.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\newcommand{\TF}{\textit{(TF)}}
diff --git a/macros/latex/contrib/l3kernel/l3sys.dtx b/macros/latex/contrib/l3kernel/l3sys.dtx
index 8a27d4b78e..b15b61d521 100644
--- a/macros/latex/contrib/l3kernel/l3sys.dtx
+++ b/macros/latex/contrib/l3kernel/l3sys.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.pdf b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
index 1a6beba13f..5826dda253 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.pdf
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/l3term-glossary.tex b/macros/latex/contrib/l3kernel/l3term-glossary.tex
index 99464b67c9..90e2c3c768 100644
--- a/macros/latex/contrib/l3kernel/l3term-glossary.tex
+++ b/macros/latex/contrib/l3kernel/l3term-glossary.tex
@@ -32,7 +32,7 @@ The released version of this bundle is available from CTAN.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\newcommand{\TF}{\textit{(TF)}}
@@ -53,7 +53,98 @@ beginning of a line.
\section{Structure of tokens}
-Copy there the section ``Description of all possible tokens'' from \texttt{l3token}.
+We refer to the documentation of \texttt{l3token} for a complete
+description of all \TeX{} tokens. We distinguish the meaning of the
+token, which controls the expansion of the token and its effect on
+\TeX{}'s state, and its shape, which is used when comparing token lists
+such as for delimited arguments. At any given time two tokens of the
+same shape automatically have the same meaning, but the converse does
+not hold, and the meaning associated with a given shape change when
+doing assignments.
+
+Apart from a few exceptions, a token has one of the following shapes.
+\begin{itemize}
+ \item A control sequence, characterized by the sequence of characters
+ that constitute its name: for instance, \cs{use:n} is a five-letter
+ control sequence.
+ \item An active character token, characterized by its character code
+ (between $0$ and $1114111$ for \LuaTeX{} and \XeTeX{} and less for
+ other engines) and category code~$13$.
+ \item A character token such as |A| or |#|, characterized by its
+ character code and category code (one of $1$, $2$, $3$, $4$, $6$,
+ $7$, $8$, $10$, $11$ or~$12$ whose meaning is described below).
+\end{itemize}
+
+The meaning of a (non-active) character token is fixed by its category
+code (and character code) and cannot be changed. We call these tokens
+\emph{explicit} character tokens. Category codes that a character token
+can have are listed below by giving a sample output of the \TeX{}
+primitive \tn{meaning}, together with their \LaTeX3 names and most
+common example:
+\begin{itemize}
+ \item[1] begin-group character (|group_begin|, often |{|),
+ \item[2] end-group character (|group_end|, often |}|),
+ \item[3] math shift character (|math_toggle|, often |$|), % $
+ \item[4] alignment tab character (|alignment|, often |&|),
+ \item[6] macro parameter character (|parameter|, often |#|),
+ \item[7] superscript character (|math_superscript|, often |^|),
+ \item[8] subscript character (|math_subscript|, often |_|),
+ \item[10] blank space (|space|, often character code~$32$),
+ \item[11] the letter (|letter|, such as |A|),
+ \item[12] the character (|other|, such as |0|).
+\end{itemize}
+Category code~$13$ (|active|) is discussed below. Input characters can
+also have several other category codes which do not lead to character
+tokens for later processing: $0$~(|escape|), $5$~(|end_line|),
+$9$~(|ignore|), $14$~(|comment|), and $15$~(|invalid|).
+
+The meaning of a control sequence or active character can be identical
+to that of any character token listed above (with any character code),
+and we call such tokens \emph{implicit} character tokens. The meaning
+is otherwise in the following list:
+\begin{itemize}
+ \item a macro, used in \LaTeX3 for most functions and some variables
+ (|tl|, |fp|, |seq|, \ldots{}),
+ \item a primitive such as \tn{def} or \tn{topmark}, used in \LaTeX3
+ for some functions,
+ \item a register such as \tn{count}|123|, used in \LaTeX3{} for the
+ implementation of some variables (|int|, |dim|, \ldots{}),
+ \item a constant integer such as \tn{char}|"56| or
+ \tn{mathchar}|"121|, used when defining a constant using
+ \cs{int_const:Nn},
+ \item a font selection command,
+ \item undefined.
+\end{itemize}
+Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
+what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in \LaTeX3).
+Their \tn{meaning} takes the form
+\begin{quote}
+ \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
+\end{quote}
+where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+\meta{argument} describes parameters that the macro expects, such as
+|#1#2#3|, and \meta{replacement} describes how the parameters are
+manipulated, such as~|\int_eval:n{#2+#1*#3}|. This information can be
+accessed by \cs{cs_prefix_spec:N}, \cs{cs_argument_spec:N},
+\cs{cs_replacement_spec:N}.
+
+When a macro takes an undelimited argument, explicit space characters
+(with character code $32$ and category code $10$) are ignored. If the
+following token is an explicit character token with category code $1$
+(begin-group) and an arbitrary character code, then \TeX{} scans ahead
+to obtain an equal number of explicit character tokens with category
+code $1$ (begin-group) and $2$ (end-group), and the resulting list of
+tokens (with outer braces removed) becomes the argument. Otherwise, a
+single token is taken as the argument for the macro: we call such single
+tokens \enquote{N-type}, as they are suitable to be used as an argument
+for a function with the signature~\texttt{:N}.
+
+When a macro takes a delimited argument \TeX{} scans ahead until finding
+the delimiter (outside any pairs of begin-group/end-group explicit
+characters), and the resulting list of tokens (with outer braces
+removed) becomes the argument. Note that explicit space characters at
+the start of the argument are \emph{not} ignored in this case (and they
+prevent brace-stripping).
\section{Quantities and expressions}
diff --git a/macros/latex/contrib/l3kernel/l3text-case.dtx b/macros/latex/contrib/l3kernel/l3text-case.dtx
index b8e534b4b6..a3dde63359 100644
--- a/macros/latex/contrib/l3kernel/l3text-case.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-case.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text-purify.dtx b/macros/latex/contrib/l3kernel/l3text-purify.dtx
index 2543dbebae..c48ac585a2 100644
--- a/macros/latex/contrib/l3kernel/l3text-purify.dtx
+++ b/macros/latex/contrib/l3kernel/l3text-purify.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3text.dtx b/macros/latex/contrib/l3kernel/l3text.dtx
index 00648a4b84..2946a48df3 100644
--- a/macros/latex/contrib/l3kernel/l3text.dtx
+++ b/macros/latex/contrib/l3kernel/l3text.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
index a5662491e1..4944e42682 100644
--- a/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl-analysis.dtx
@@ -44,7 +44,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/l3tl.dtx b/macros/latex/contrib/l3kernel/l3tl.dtx
index b10167ca25..c315612b43 100644
--- a/macros/latex/contrib/l3kernel/l3tl.dtx
+++ b/macros/latex/contrib/l3kernel/l3tl.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -305,7 +305,8 @@
% This allows the \meta{tl~var} to contain material
% with category codes other than those that apply when \meta{tokens}
% are absorbed. The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_rescan:nn}.
% \begin{texnote}
% The \meta{tokens} are first turned into a string (using
@@ -332,7 +333,8 @@
% by the \meta{setup} are those in force at the point of use of
% \cs{tl_rescan:nn}.)
% The \meta{setup} is run within a group and may
-% contain any valid input, although only changes in category codes
+% contain any valid input, although only changes in category codes,
+% such as uses of \cs{cctab_select:N},
% are relevant. See also \cs{tl_set_rescan:Nnn}, which is more
% robust than using \cs{tl_set:Nn} in the \meta{tokens} argument of
% \cs{tl_rescan:nn}.
@@ -401,6 +403,19 @@
% \tl_if_eq:NNTF \l_tmpa_tl \l_tmpb_tl { true } { false }
% \end{verbatim}
% yields \texttt{false}.
+% See also \cs{str_if_eq:nnTF} for a comparison that ignores category codes.
+% \end{function}
+%
+% \begin{function}[TF, added = 2020-07-14]{\tl_if_eq:Nn, \tl_if_eq:cn}
+% \begin{syntax}
+% \cs{tl_if_eq:NnTF} \meta{tl~var_1} \Arg{token list_2} \Arg{true code} \Arg{false code}
+% \end{syntax}
+% Tests if the \meta{token list variable_1} and the \meta{token
+% list_2} contain the same list of tokens, both in respect of
+% character codes and category codes. This conditional is not
+% expandable: see \cs{tl_if_eq:NNTF} for an expandable version when
+% both token lists are stored in variables, or \cs{str_if_eq:nnTF} if
+% category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_eq:nn}
@@ -409,7 +424,9 @@
% \end{syntax}
% Tests if \meta{token list_1} and \meta{token list_2} contain the
% same list of tokens, both in respect of character codes and category
-% codes.
+% codes. This conditional is not expandable: see \cs{tl_if_eq:NNTF}
+% for an expandable version when token lists are stored in variables,
+% or \cs{str_if_eq:nnTF} if category codes are not important.
% \end{function}
%
% \begin{function}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
@@ -1203,7 +1220,7 @@
% will \emph{not} match the simple text input |-NoValue-|, \emph{i.e.}
% that
% \begin{verbatim}
-% \tl_if_eq:VnTF \c_novalue_tl { -NoValue- }
+% \tl_if_eq:NnTF \c_novalue_tl { -NoValue- }
% \end{verbatim}
% is logically \texttt{false}. The \cs{c_novalue_tl} marker is intended for
% use in creating document-level interfaces, where it serves as an indicator
@@ -2125,8 +2142,34 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}[TF]{\tl_if_eq:nn}
% \begin{variable}{\l_@@_internal_a_tl, \l_@@_internal_b_tl}
+% Temporary storage.
+% \begin{macrocode}
+\tl_new:N \l_@@_internal_a_tl
+\tl_new:N \l_@@_internal_b_tl
+% \end{macrocode}
+% \end{variable}
+%
+% \begin{macro}[TF]{\tl_if_eq:Nn}
+% A simple store and compare routine.
+% \begin{macrocode}
+\prg_new_protected_conditional:Npnn \tl_if_eq:Nn #1#2 { T , F , TF }
+ {
+ \group_begin:
+ \tl_set:Nn \l_@@_internal_b_tl {#2}
+ \exp_after:wN
+ \group_end:
+ \if_meaning:w #1 \l_@@_internal_b_tl
+ \prg_return_true:
+ \else:
+ \prg_return_false:
+ \fi:
+ }
+\prg_generate_conditional_variant:Nnn \tl_if_eq:Nn { c } { TF , T , F }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}[TF]{\tl_if_eq:nn}
% A simple store and compare routine.
% \begin{macrocode}
\prg_new_protected_conditional:Npnn \tl_if_eq:nn #1#2 { T , F , TF }
@@ -2142,10 +2185,7 @@
\prg_return_false:
\fi:
}
-\tl_new:N \l_@@_internal_a_tl
-\tl_new:N \l_@@_internal_b_tl
% \end{macrocode}
-% \end{variable}
% \end{macro}
%
% \begin{macro}[TF]{\tl_if_in:Nn, \tl_if_in:cn}
diff --git a/macros/latex/contrib/l3kernel/l3token.dtx b/macros/latex/contrib/l3kernel/l3token.dtx
index d12c5deeed..cffbea2c97 100644
--- a/macros/latex/contrib/l3kernel/l3token.dtx
+++ b/macros/latex/contrib/l3kernel/l3token.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
@@ -992,11 +992,7 @@
% other engines) and category code~$13$.
% \item A character token, characterized by its character code and
% category code (one of $1$, $2$, $3$, $4$, $6$, $7$, $8$, $10$,
-% $11$ or~$12$ whose meaning is described below).\footnote{In
-% \LuaTeX{}, there is also the case of \enquote{bytes}, which behave as
-% character tokens of category code $12$~(other) and character code
-% between $1114112$ and~$1114366$. They are used to output
-% individual bytes to files, rather than UTF-8.}
+% $11$ or~$12$ whose meaning is described below).
% \end{itemize}
% There are also a few internal tokens. The following list may be
% incomplete in some engines.
@@ -1017,6 +1013,19 @@
% \item Tricky programming might access a frozen |\endwrite|.
% \item Some frozen tokens can only be accessed in interactive
% sessions: |\cr|, |\right|, |\endgroup|, |\fi|, |\inaccessible|.
+% \item In \LuaTeX{}, there is also the strange case of \enquote{bytes}
+% |^^^^^^1100|$x$$y$ where $x,y$ are any two lowercase hexadecimal
+% digits, so that the hexadecimal number ranges from
+% $"\text{110000}=1114112$ to~$"\text{1100ff}=1114367$. These are
+% used to output individual bytes to files, rather than UTF-8. For
+% the purposes of token comparisons they behave like non-expandable
+% primitive control sequences (\emph{not characters}) whose
+% \tn{meaning} is \verb*|the character | followed by the given byte.
+% If this byte is in the range |80|--|ff| this gives an ``invalid
+% utf-8 sequence'' error: applying \cs{token_to_str:N} or
+% \cs{token_to_meaning:N} to these tokens is unsafe. Unfortunately,
+% they don't seem to be detectable safely by any means except perhaps
+% Lua code.
% \end{itemize}
%
% The meaning of a (non-active) character token is fixed by its category
@@ -1028,7 +1037,7 @@
% \begin{itemize}
% \item[1] begin-group character (|group_begin|, often |{|),
% \item[2] end-group character (|group_end|, often |}|),
-% \item[3] math shift character (|math_toggle|, often |$|),
+% \item[3] math shift character (|math_toggle|, often |$|), %^^A $
% \item[4] alignment tab character (|alignment|, often |&|),
% \item[6] macro parameter character (|parameter|, often |#|),
% \item[7] superscript character (|math_superscript|, often |^|),
@@ -1058,18 +1067,16 @@
% \item a font selection command,
% \item undefined.
% \end{itemize}
-% Macros be \tn{protected} or not, \tn{long} or not (the opposite of
+% Macros can be \tn{protected} or not, \tn{long} or not (the opposite of
% what \LaTeX3 calls |nopar|), and \tn{outer} or not (unused in
% \LaTeX3). Their \tn{meaning} takes the form
% \begin{quote}
-% \meta{properties} |macro:|\meta{parameters}|->|\meta{replacement}
+% \meta{prefix} |macro:|\meta{argument}|->|\meta{replacement}
% \end{quote}
-% where \meta{properties} is among \tn{protected}\tn{long}\tn{outer},
-% \meta{parameters} describes parameters that the macro expects, such as
+% where \meta{prefix} is among \tn{protected}\tn{long}\tn{outer},
+% \meta{argument} describes parameters that the macro expects, such as
% |#1#2#3|, and \meta{replacement} describes how the parameters are
-% manipulated, such as~|#2/#1/#3|.
-%
-% ^^A todo Bruno: discuss here some other subtleties of space tokens? when looking for numbers, when looking for equal signs in let, in expressions, etc.
+% manipulated, such as~|\int_eval:n{#2+#1*#3}|.
%
% Now is perhaps a good time to mention some subtleties relating to
% tokens with category code $10$ (space). Any input character with this
@@ -1087,6 +1094,13 @@
% single tokens \enquote{N-type}, as they are suitable to be used as an
% argument for a function with the signature~\texttt{:N}.
%
+% When a macro takes a delimited argument \TeX{} scans ahead until
+% finding the delimiter (outside any pairs of begin-group/end-group
+% explicit characters), and the resulting list of tokens (with outer
+% braces removed) becomes the argument. Note that explicit space
+% characters at the start of the argument are \emph{not} ignored in this
+% case (and they prevent brace-stripping).
+%
% \end{documentation}
%
% \begin{implementation}
diff --git a/macros/latex/contrib/l3kernel/l3unicode.dtx b/macros/latex/contrib/l3kernel/l3unicode.dtx
index 28452d5a2c..334e8b7086 100644
--- a/macros/latex/contrib/l3kernel/l3unicode.dtx
+++ b/macros/latex/contrib/l3kernel/l3unicode.dtx
@@ -43,7 +43,7 @@
% }^^A
% }
%
-% \date{Released 2020-06-18}
+% \date{Released 2020-07-17}
%
% \maketitle
%
diff --git a/macros/latex/contrib/l3kernel/source3.pdf b/macros/latex/contrib/l3kernel/source3.pdf
index 4ea4120d6d..01a6f88ddf 100644
--- a/macros/latex/contrib/l3kernel/source3.pdf
+++ b/macros/latex/contrib/l3kernel/source3.pdf
Binary files differ
diff --git a/macros/latex/contrib/l3kernel/source3.tex b/macros/latex/contrib/l3kernel/source3.tex
index 985adb77b5..e9381760fc 100644
--- a/macros/latex/contrib/l3kernel/source3.tex
+++ b/macros/latex/contrib/l3kernel/source3.tex
@@ -53,7 +53,7 @@ for those people who are interested.
{latex-team@latex-project.org}%
}%
}
-\date{Released 2020-06-18}
+\date{Released 2020-07-17}
\pagenumbering{roman}
\maketitle
diff --git a/macros/latex/contrib/l3kernel/source3body.tex b/macros/latex/contrib/l3kernel/source3body.tex
index 83203e6427..5586d73799 100644
--- a/macros/latex/contrib/l3kernel/source3body.tex
+++ b/macros/latex/contrib/l3kernel/source3body.tex
@@ -476,6 +476,7 @@ used on top of \LaTeXe{} if \cs{outer} tokens are used in the arguments.
\ExplSyntaxOff
\DocInput{l3fparray.dtx}
+\DocInput{l3cctab.dtx}
\DocInput{l3sort.dtx}
\DocInput{l3tl-analysis.dtx}
\DocInput{l3regex.dtx}
diff --git a/macros/latex/contrib/thmtools/README b/macros/latex/contrib/thmtools/README
deleted file mode 100644
index 711b6051ff..0000000000
--- a/macros/latex/contrib/thmtools/README
+++ /dev/null
@@ -1,22 +0,0 @@
- The \thmtools\ bundle provides several packages for commonly-needed
- features for theorems. As designed, the bundle should work with kernel
- theorems, the theorem package and the amsthm package.
-
- WARNING: Currently, things might still be a bit rough. You
- might want to consider not relying on \thmtools\ for your Ph.D. thesis
- masterpiece.
-
-Provided features:
-a keyval interface to \newtheorem
-a \listoftheorem command
-hyperref/autoref compatibility
-a way of restating entire theorems with a single macro call
-
-License: LPPL 1.3c
-
-Currently the package has no maintainer ... and is looking for one!
-
-Previous Maintainer was Ulrich M. Schwarz, ulmi@absatzen.de
-
-
-$Id: README,v 1.1 2008/02/17 21:13:58 ulmi Exp ulmi $
diff --git a/macros/latex/contrib/thmtools/README.md b/macros/latex/contrib/thmtools/README.md
new file mode 100644
index 0000000000..ffcfb135d3
--- /dev/null
+++ b/macros/latex/contrib/thmtools/README.md
@@ -0,0 +1,17 @@
+The `thmtools` bundle provides several packages for commonly-needed
+features for theorems. As designed, the bundle should work with kernel
+theorems (theorems ‘out of the box’ with LaTeX),
+the [`amsthm`](https://ctan.org/pkg/amsmath) package and
+the [`ntheorem`](https://ctan.org/pkg/ntheorem) package.
+
+Provided features:
+ - a keyval interface to `\newtheorem` and `\newtheoremstyle`
+ - a `\listoftheorem` command with filtering ability
+ - [`hyperref`](https://ctan.org/pkg/hyperref) and [`cleveref`](https://ctan.org/pkg/cleveref) compatibility
+ - a way of restating entire theorems with a single macro call
+
+License: LPPL 1.3c
+
+Currently the package is maintained by Yukai Chou, <span>muzimuzhi@gmail.com</span>
+
+Previous Maintainer was Ulrich M. Schwarz, <span>ulmi@absatzen.de</span>
diff --git a/macros/latex/contrib/thmtools/TODO b/macros/latex/contrib/thmtools/TODO
deleted file mode 100644
index e35b77530a..0000000000
--- a/macros/latex/contrib/thmtools/TODO
+++ /dev/null
@@ -1,3 +0,0 @@
-- ref close-by/far-away
-- complex refs
- (these two are very similar)
diff --git a/macros/latex/contrib/thmtools/VERSION.tex b/macros/latex/contrib/thmtools/VERSION.tex
deleted file mode 100644
index 466ff0ebce..0000000000
--- a/macros/latex/contrib/thmtools/VERSION.tex
+++ /dev/null
@@ -1,2 +0,0 @@
-% set by hand as I don't use CVS
-\def\x #1-#2-#3 #4 v#5\@{\def\VERSION{#1/#2/#3 v#5}}\x 2019-12-22 00:00:00 +0200 v68\@
diff --git a/macros/latex/contrib/thmtools/changes.txt b/macros/latex/contrib/thmtools/changes.txt
deleted file mode 100644
index 06dc12ef79..0000000000
--- a/macros/latex/contrib/thmtools/changes.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
-
- * thm-kv.dtx:
- removed dependency on etexcmds package
-
-
diff --git a/macros/latex/contrib/thmtools/COPYING b/macros/latex/contrib/thmtools/doc/COPYING
index 2244313901..2244313901 100644
--- a/macros/latex/contrib/thmtools/COPYING
+++ b/macros/latex/contrib/thmtools/doc/COPYING
diff --git a/macros/latex/contrib/thmtools/doc/VERSION.tex b/macros/latex/contrib/thmtools/doc/VERSION.tex
new file mode 100644
index 0000000000..9bfeb6f890
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/VERSION.tex
@@ -0,0 +1 @@
+\def\VERSION{2020/07/16 v69}
diff --git a/macros/latex/contrib/thmtools/doc/changes.txt b/macros/latex/contrib/thmtools/doc/changes.txt
new file mode 100644
index 0000000000..c16fb63e78
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/changes.txt
@@ -0,0 +1,12 @@
+2019-12-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * thm-kv.dtx:
+ removed dependency on etexcmds package
+
+2020-07-16 Yukai Chou <muzimuzhi@gmail.com>
+
+ * thm-restate.dtx:
+ made compatible with cleveref's \label[]{} syntax
+
+ * thmtools-manual.tex (and comment part of dtx files):
+ refined manual
diff --git a/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
new file mode 100644
index 0000000000..8d9ff5fc01
--- /dev/null
+++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.pdf
Binary files differ
diff --git a/macros/latex/contrib/thmtools/thmtools-manual.tex b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex
index 111acda6dc..47f1235f5f 100644
--- a/macros/latex/contrib/thmtools/thmtools-manual.tex
+++ b/macros/latex/contrib/thmtools/doc/thmtools-manual.tex
@@ -1,4 +1,4 @@
-%&pdflatex
+% !TeX program = pdflatex
\documentclass[paper=a4, pagesize, DIV=20,
english,
headings=small,11pt,
@@ -27,10 +27,18 @@
\usepackage{listings}
\usepackage{amsmath, amsthm}
+\usepackage{enumitem}
+\setlist[description, 1]{labelindent=2em, leftmargin=2em, rightmargin=2em, labelwidth=!}
\usepackage{tikz}
+\usetikzlibrary{tikzmark}
\usepackage{nameref}
\usepackage{hyperref}
+\hypersetup{
+ colorlinks,
+ linkcolor=RoyalBlue,
+ linktocpage
+}
\usepackage{cleveref}[2010/05/01]
\usepackage{thmtools, thm-restate}
@@ -115,11 +123,13 @@
\input{VERSION.tex}
\title{\Thmtools Users' Guide}
-\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{
+\author{Dr. Ulrich M. Schwarz -- ulmi@absatzen.de\thanks{%
who would like to thank the users for testing, encouragement, feature requests, and
bug reports. In particular, Denis Bitouz\'e prompted further improvement
- when \thmtools got stuck in a ``good enough for me'' slump.
-}}
+ when \thmtools got stuck in a ``good enough for me'' slump.}
+ \and
+ Yukai Chou -- muzimuzhi@gmail.com
+}
\date{\VERSION}
\begin{document}
@@ -138,7 +148,8 @@
\autoref{cha:reference}.
\begin{multicols}{2}[\section*{\contentsname}]
- \makeatletter\let\chapter\@gobbletwo
+ \makeatletter
+ \let\chapter\@gobbletwo
\tableofcontents
\end{multicols}
\clearpage
@@ -160,13 +171,13 @@
\begin{body}[gobble=4]
% Document code looks like this.
\begin{theorem}[Euclid]
- \label{thm:euclid}%
- For every prime $p$, there is a prime $p'>p$.
- In particular, the list of primes,
- \begin{equation}\label{eq:1}
- 2,3,5,7,\dots
- \end{equation}
- is infinite.
+ \label{thm:euclid}%
+ For every prime $p$, there is a prime $p'>p$.
+ In particular, the list of primes,
+ \begin{equation}\label{eq:1}
+ 2,3,5,7,\dots
+ \end{equation}
+ is infinite.
\end{theorem}
\end{body}
\end{source}
@@ -220,8 +231,8 @@
\end{restatable}
\end{result}
- Instead of ``numberwithin='', you can also use ``parent='' and
- ``within=''. They're all the same, use the one you find easiest to
+ Instead of |numberwithin=|, you can also use |parent=| and
+ |within=|. They're all the same, use the one you find easiest to
remember.
Note the example above looks somewhat bad: sometimes, the name of the environment,
@@ -272,8 +283,8 @@
\end{lemma}
\end{result}
- Again, instead of ``sibling='', you can also use ``numberlike='' and
- ``sharecounter=''.
+ Again, instead of |sibling=|, you can also use |numberlike=| and
+ |sharecounter=|.
Some theorems have a fixed name and are not supposed to get a number.
To this end, \pkg{amsthm} provides |\newtheorem*|, which is
@@ -355,7 +366,8 @@
\begin{preamble}[gobble=6]
\usepackage{amsthm, thmtools}
\usepackage{
- nameref,%\nameref
+ % nameref,%\nameref
+ % n.b. usually nameref is autoloaded by hyperref
hyperref,%\autoref
% n.b. \Autoref is defined by thmtools
cleveref,% \cref
@@ -391,6 +403,7 @@
\end{result}
\section{Styling theorems}
+ \label{sec:styling}
The major backends provide a command |\theoremstyle| to switch
between looks of theorems. This is handled as follows:
@@ -403,10 +416,11 @@
\end{preamble}
\begin{body}[gobble=4]
\begin{Theorem}
- This is a theorem.
+ Note how it still retains the default style,
+ `plain'.
\end{Theorem}
\begin{remark}
- Note how it still retains the default style, `plain'.
+ This is a remark.
\end{remark}
\end{body}
\end{source}
@@ -419,7 +433,7 @@
\end{remark}
\end{result}
- Thmtools also supports the shadethm and thmbox packages:
+ Thmtools also supports the \pkg{shadethm} and \pkg{thmbox} packages:
\begin{source}
\begin{preamble}[gobble=4]
\usepackage{amsthm}
@@ -457,9 +471,9 @@
start with a curly brace, in which case it is assumed that
|\definecolor{colorname}|$\langle$\textsl{what you said}$\rangle$ will be
valid \LaTeX\ code. In our case, we use the rbg model to manually specify
- white. (Shadethm's default value is some sort of gray.)
+ white. (|shadethm|'s default value is {\fboxsep=0pt \fcolorbox{black}[gray]{0.92}{\phantom{XX}}} |[gray]{0.92}|)
- For the thmbox package, use the thmbox key:
+ For the \pkg{thmbox} package, use the |thmbox| key:
\begin{source}
\begin{preamble}[gobble=4]
\usepackage{amsthm}
@@ -498,7 +512,7 @@
\end{boxtheorem S}
\end{result}
- Note that for both thmbox and shaded keys, it's quite possible they will not
+ Note that for both |thmbox| and |shaded| keys, it's quite possible they will not
cooperate with a style key you give at the same time.
\subsection{Declaring new theoremstyles}
@@ -539,52 +553,62 @@
more keys you can pass to |\declaretheoremstyle|: if \thmtools\ cannot
figure out at all what to do with it, it will pass it on to the
|\declaretheorem| commands that use that style. For example, you may use
- the boxed and shaded keys here.
+ the |boxed| and |shaded| keys here.
To change the order in which title, number and note appear, there is a key
- headformat. Currently, the values ``margin'' and ``swapnumber'' are
+ |headformat|. Currently, the values ``margin'' and ``swapnumber'' are
supported. The daring may also try to give a macro here that uses the
commands |\NUMBER|, |\NAME| and |\NOTE|.
You cannot circumvent the fact
- that headpunct comes at the end, though, nor the fonts and braces you
+ that |headpunct| comes at the end, though, nor the fonts and braces you
select with the other keys.
- \begin{figure}\centering
- % please don't make me touch this picture ever again.
- \fbox{
- \begin{minipage}{0.618\textwidth}\Large
- \tikzset{font=\normalfont\small\sffamily\itshape,y=12pt,>=latex}
- \noindent which resulted in the following insight:
- \par
- \tikz{\draw[|<->|] (0,-1)--(0,1);
- \draw[anchor=west] (0,0) node {spaceabove};}
- \par
- \tikz{\draw[|<->|] (-1,0)--(1,0);
- \draw[anchor=south] (0,0) node {headindent};}
- \textbf{Theo%
- \smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{headfont};}}}%
- rem 1.2
- (\smash{\rlap{\tikz{\draw (0,0)--(0,2.5) node [anchor=base west]{notebraces};}}}%
- Euc%
-\smash{\clap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south]{notefont};}}}%
- lid)%
- .\smash{\rlap{\tikz{\draw (0,0)--(0,1.2) node [anchor=south west]{headpunct};}}}}%
- \tikz{\draw[|<->|] (-1,0)--(1,0);
- \draw[anchor=south] (0,0) node {postheadspace};}
- For every prime $p$, there is a prime $p'>p$.
- In particular, the list of primes,
- $2,3,5,7,\dots$,
- is infinite.
- \hfill{\tikz{\draw[anchor=north east] (0,0) node{qed}; }}$\Box$
- \par
- \tikz{\draw[|<->|] (0,-1)--(0,1);
- \draw[anchor=west] (0,0) node {spacebelow};}
- \par
-
- As a consequence, lorem ipsum dolor sit amet frob-%nicate foo
-% paret.
- \end{minipage}
- }
+ \begin{figure}
+ \centering
+ \fbox{%
+ \begin{tikzpicture}[
+ remember picture,
+ >=latex,
+ nodes={
+ font=\normalfont\sffamily\itshape\small,
+ RoyalBlue
+ },
+ every subnode/.style={
+ inner sep=0pt
+ },
+ tip/.style={|<->|}
+ ]
+ \node[black, font=\Large, text width=.618\textwidth, align=justify]
+ {%
+ which resulted in the following insight: \\
+ \subnode{space above}{\rule{0pt}{1.3\baselineskip}} \\
+ \subnode{head indent}{\strut\hspace*{4em}}
+ \textbf{%
+ \subnode{head}{Theorem} 1.2
+ \subnode{note brace}{(}%
+ \subnode{note}{\textit{Euclid}})%
+ \subnode{head punct}{.} %
+ }
+ \subnode{post head space}{\strut\hspace*{4.5em}}
+ For every prime~$p$, there is a prime~$p'>p$. In particular, the list
+ of primes, $2,3,5,7,\dots$, is infinite. \hfill
+ \subnode{qed}{$\Box$} \\
+ \subnode{space below}{\rule{0pt}{1.3\baselineskip}} \\
+ As a consequence, lorem ipsum dolor sit amet frob-%nicate foo
+ % paret.
+ };
+
+ \draw[tip] (space above.south west) -- node[right] {spaceabove} (space above.north west);
+ \draw[tip] (head indent.west) -- node[above] {headindent} (head indent.east);
+ \draw (head.center) -- +(0, 10pt) node[above] {headfont};
+ \draw (note brace.north) -- +(0, 20pt) node[above] {notebraces};
+ \draw (note.center) -- +(0, 10pt) node[above] {notefont};
+ \draw (head punct.base east) -- +(0, 28pt) node[above] {headpunct};
+ \draw[tip] (post head space.west) -- node[above] {postheadspace} (post head space.east);
+ \node at ([xshift=-12pt]qed.150) {qed};
+ \draw[tip] (space below.south west) -- node[right] {spacebelow} (space below.north west);
+ \end{tikzpicture}%
+ }
\caption{Settable parameters of a theorem style.}
\label{fig:params}
\end{figure}
@@ -631,14 +655,14 @@
mechanism, so that this reference: \autoref{thm:euclid} points to
p.\,\pageref{thm:euclid}, where the unstarred environment is used. (You can
also use a starred environment and an unstarred command, in which case the
- behaviour is reversed.) Also, if you use \pkg{hyperref}, the links will lead you
+ behaviour is reversed.) Also, if you use \pkg{hyperref} (like you see in this manual), the links will lead you
to the unstarred occurence.
Just to demonstrate that we also handle more involved cases, I repeat
another theorem here, but this one was numbered within its section: note
we retain the section number which does not fit the current section:
\begin{source}
- \begin{body}
+ \begin{body}[gobble=6]
\euclidii*
\end{body}
\end{source}
@@ -678,7 +702,7 @@
And you can also restrict to those environments that have an optional
argument given. Note that two theorems disappear compared to the previous
- example. You could also say just ``onlynamed'', in which case it will
+ example. You could also say just |onlynamed|, in which case it will
apply to \emph{all} theorem environments you have defined.
\begin{source}
\begin{body}[gobble=6]
@@ -705,13 +729,16 @@
\emph{optional} argument, which will go into the list of theorems. Be
aware that since we already are within an optional argument, you have to
use an extra level of curly braces:
- |\begin{theorem}[{name=[Short name]A long name,...}]|
+ |\begin{theorem}[name={[Short name]A long name,...]}|
+
\item[label] This will issue a |\label| command after the head. Not very
useful, more of a demo.
+
\item[continues] Saying |continues=foo| will cause the number that is
given to be changed to |\ref{foo}|, and a text is added to the note.
(The exact text is given by the macro |\thmcontinues|, which takes the
label as its argument.)
+
\item[restate] Saying |restate=foo| will hopefully work like
wrapping this theorem in a restatable environment. (It probably still fails
in cases that I didn't think of.) This key also accepts an optional
@@ -766,8 +793,8 @@
|...postheadhook|, |...prefoothook|
and |...postfoothook|.
All of these take an \emph{optional} argument, the name of the
- environment, and the new code as a mandatory argument. The environment is
- optional because there is also a set of ``generic'' hooks added to every
+ environment, and the new code as a mandatory argument. The name of environment is
+ optional because there is also a set of ``generic'' hooks added to every
theorem that you define.
The other way is to use the keys |preheadhook| et al. in your
@@ -796,9 +823,9 @@
handling itself is added as part of the headkeys.)
- \section{Case in point: the shaded key}
+ \section{Case in point: the \texttt{shaded} key}
- Let us look at a reasonably simple example: the shaded key, which we've
+ Let us look at a reasonably simple example: the |shaded| key, which we've
already seen in the first section. You'll observe that we run into a
problem similar to the four-hook mess: your code may either want to modify
parameters that need to be set beforehand, or it wants to modify the
@@ -826,8 +853,8 @@
using internal macros with @ in their name (viz.,
|\thmt@envname| and friends). You can also put them into a
package (then, without the |\makeat...|),
- which is simply a file ending in .sty put somewhere that \LaTeX\ can find
- it, which can then be laoded with |\usepackage|.
+ which is simply a file ending in |.sty| put somewhere that \LaTeX\ can find
+ it, which can then be loaded with |\usepackage|.
To find out where exactly that is, and if you'd need to update
administrative helper files such as a filename database FNDB,
please consult the documentation of your \TeX\ distribution.
@@ -912,7 +939,8 @@
Additionally, a number of keywords are allowed here instead of \LaTeX\
code:
\begin{description}
- \item[margin] Lets the number protude in the (left) margin.
+ \item[margin] Lets the number protrude in the (left) margin.
+
\item[swapnumber] Puts the number before the name. Currently
not working so well for unnumbered theorems.
\item[] \emph{This list is likely to grow}
@@ -932,16 +960,10 @@
|section|.
\key{numberwithin}
- Value: a counter name. The theorem will be reset whenever that counter
- is incremented. Usually, this will be a sectioning level, |chapter| or
- |section|.
- (Same as parent.)
+ (Same as |parent|.)
\key{within}
- Value: a counter name. The theorem will be reset whenever that counter
- is incremented. Usually, this will be a sectioning level, |chapter| or
- |section|.
- (Same as parent.)
+ (Same as |parent|.)
\key{sibling}
@@ -949,31 +971,21 @@
Usually, this is the name of another theorem environment.
\key{numberlike}
- Value: a counter name. The theorem will use this counter for numbering.
- Usually, this is the name of another theorem environment.
- (Same as sibling.)
+ (Same as |sibling|.)
\key{sharenumber}
- Value: a counter name. The theorem will use this counter for numbering.
- Usually, this is the name of another theorem environment.
- (Same as sibling.)
+ (Same as |sibling|.)
\key{title}
Value: \TeX\ code. The title of the theorem. Default is the name of the
environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
+ this if your title starts with an accented character, for example.
\key{name}
- Value: \TeX\ code. The title of the theorem. Default is the name of the
- environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
(Same as title.)
\key{heading}
- Value: \TeX\ code. The title of the theorem. Default is the name of the
- environment, with |\MakeUppercase| prepended. You'll have to give
- this if your title starts with a accented character, for example.
(Same as title.)
\key{numbered}
@@ -1009,14 +1021,14 @@
group defined by the environment.
\key{refname}
- Value: one string, or two string separated by a comma (no spaces). This
+ Value: one string, or two strings separated by a comma (no spaces). This
is the name of the theorem as used by |\autoref|, |\cref| and friends. If it is
two strings, the second is the plural form used by |\cref|. Default
value is the value of |name|, i.e. usually the environment name, with
- \MakeUppercase.
+ |\MakeUppercase| prepended.
\key{Refname}
- Value: one string, or two string separated by a comma (no spaces). This
+ Value: one string, or two strings separated by a comma (no spaces). This
is the name of the theorem as used by |\Autoref|, |\Cref| and friends. If it is
two strings, the second is the plural form used by |\Cref|. This can be
used for alternate spellings, for example if your style requests no
@@ -1041,7 +1053,7 @@
\end{description}
\key{thmbox}
- Value: one of the characters L, M and S; see examples above.
+ Value: one of the characters |L|, |M| and |S|; see examples in \autoref{sec:styling}.
\section{Known keys to in-document theorems}
@@ -1053,16 +1065,16 @@
\key{name} Value: \TeX\ code that will be typeset.
What you would have put in the optional argument in the
non-keyval style, i.e. the note to the head. This is \emph{not} the same
- as the name key to |\declaretheorem|, you cannot override that from within
+ as the |name| key to |\declaretheorem|, you cannot override that from within
the document.
\key{listhack} Value: doesn't matter. (But put something to trigger
- key-val behaviour, maybe listhack=true.) Linebreak styles in \pkg{amsthm}
+ key-val behaviour, maybe |listhack=true|.) Linebreak styles in \pkg{amsthm}
don't linebreak if they start with another list, like an |enumerate|
environment. Giving the |listhack| key fixes that. \emph{Don't} give this
key for non-break styles, you'll get too little vertical space! (Just use
|\leavevmode| manually there.)
- An all-around listhack that handles both situations might come in a
+ An all-around |listhack| that handles both situations might come in a
cleaner rewrite of the style system.
\section{Restatable -- hints and caveats}
@@ -1071,14 +1083,14 @@
\begin{itemize}
\item Some counters are saved so that the same values appear when you
re-use them. The list of these counters is stored in the macro
- |\thmt@innercounters| as a comma-separated list without spaces; default: equation.
+ |\thmt@innercounters| as a comma-separated list without spaces; default: |equation|.
\item To preserve the influence of other counters (think: equation
numbered per section and recall the theorem in another section), we need
to know all macros that are used to turn a counter into printed output.
Again, comma-separated list without spaces, without leading backslash, stored as
|\thmt@counterformatters|. Default:
- |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol|
+ |@alph,@Alph,@arabic,@roman,@Roman,@fnsymbol|.
All these only take
the \LaTeX\ counter |\c@foo| as arguments. If you bypass this and use
|\romannumeral|, your numbers go wrong and you get what you deserve.
@@ -1101,7 +1113,7 @@
\chapter{\Thmtools for the morbidly curious}\label{cha:sourcecode}
- This chapter consists of the implementation of Thmtools, in case you
+ This chapter consists of the implementation of \thmtools, in case you
wonder how this or that feature was implemented. Read on if you want a
look under the bonnet, but you enter at your own risk, and bring an oily
rag with you.
@@ -1123,18 +1135,18 @@
\subsection{Re-using environments}
\DocInput{thm-restate.dtx}
- \subsection{Fixing autoref and friends}
+ \subsection{Fixing \texttt{autoref} and friends}
\DocInput{thm-autoref.dtx}
\section{Glue code for different backends}
- \subsection{amsthm}
+ \subsection{\texttt{amsthm}}
\DocInput{thm-amsthm.dtx}
- \subsection{beamer}
+ \subsection{\texttt{beamer}}
\DocInput{thm-beamer.dtx}
- \subsection{ntheorem}
+ \subsection{\texttt{ntheorem}}
\DocInput{thm-ntheorem.dtx}
\section{Generic tools}
@@ -1145,7 +1157,7 @@
\subsection{Different counters sharing the same register}
\DocInput{aliasctr.dtx}
- \subsection{Tracking occurences: none, one or many}
+ \subsection{Tracking occurrences: none, one or many}
\DocInput{unique.dtx}
diff --git a/macros/latex/contrib/thmtools/aliasctr.dtx b/macros/latex/contrib/thmtools/source/aliasctr.dtx
index b492f95f56..3c75e11c98 100644
--- a/macros/latex/contrib/thmtools/aliasctr.dtx
+++ b/macros/latex/contrib/thmtools/source/aliasctr.dtx
@@ -1,10 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-7 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a. The full license text
-% is available from http://www.latex-project.org/
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
%<*code>
% \fi
diff --git a/macros/latex/contrib/thmtools/parseargs.dtx b/macros/latex/contrib/thmtools/source/parseargs.dtx
index 8f4aa42171..4efcd3ecd9 100644
--- a/macros/latex/contrib/thmtools/parseargs.dtx
+++ b/macros/latex/contrib/thmtools/source/parseargs.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-amsthm.dtx b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx
index 31a2397f47..b45a6c276e 100644
--- a/macros/latex/contrib/thmtools/thm-amsthm.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-amsthm.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-autoref.dtx b/macros/latex/contrib/thmtools/source/thm-autoref.dtx
index 90a164f1af..cf84463c09 100644
--- a/macros/latex/contrib/thmtools/thm-autoref.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-autoref.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-beamer.dtx b/macros/latex/contrib/thmtools/source/thm-beamer.dtx
index 7c56099ce6..44319480c7 100644
--- a/macros/latex/contrib/thmtools/thm-beamer.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-beamer.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-kv.dtx b/macros/latex/contrib/thmtools/source/thm-kv.dtx
index 4a31a51885..bdac30899d 100644
--- a/macros/latex/contrib/thmtools/thm-kv.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-kv.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-listof.dtx b/macros/latex/contrib/thmtools/source/thm-listof.dtx
index e91219eca1..39603b4341 100644
--- a/macros/latex/contrib/thmtools/thm-listof.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-listof.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-llncs.dtx b/macros/latex/contrib/thmtools/source/thm-llncs.dtx
index 5a3b480c2e..134acb18b7 100644
--- a/macros/latex/contrib/thmtools/thm-llncs.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-llncs.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-ntheorem.dtx b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
index ccd12dc30d..ef29870931 100644
--- a/macros/latex/contrib/thmtools/thm-ntheorem.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
@@ -1,7 +1,14 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thm-patch.dtx b/macros/latex/contrib/thmtools/source/thm-patch.dtx
index b1e28b6fe4..dd00028ca8 100644
--- a/macros/latex/contrib/thmtools/thm-patch.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-patch.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thm-restate.dtx b/macros/latex/contrib/thmtools/source/thm-restate.dtx
index 033a48254e..d02b3630ab 100644
--- a/macros/latex/contrib/thmtools/thm-restate.dtx
+++ b/macros/latex/contrib/thmtools/source/thm-restate.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
@@ -224,7 +226,7 @@
\@xa\let\csname c@#2\endcsname=\c@thmt@dummyctr
\@xa\let\csname theH#2\endcsname=\theHthmt@dummyctr
% disable labeling.
- \let\label=\@gobble
+ \let\label=\thmt@gobble@label
\let\ltx@label=\@gobble% amsmath needs this
% We shall need to restore the counters at the end
% of the environment, so we get
@@ -268,6 +270,14 @@
%% now empty, just used as a marker.
}
+\let\thmt@gobble@label\@gobble
+% cleveref extends syntax of \label to \label[...]{...}
+\AtBeginDocument{
+ \@ifpackageloaded{cleveref}{
+ \renewcommand*\thmt@gobble@label[2][]{}
+ }{}
+}
+
\newenvironment{restatable}{%
\thmt@thisistheonetrue\thmt@restatable
}{%
diff --git a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
index a3fd3658cb..85c5d9bd2d 100644
--- a/macros/latex/contrib/thmtools/thmdef-mdframed.dtx
+++ b/macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*mdframed>
%\fi
%
-% Mostly, this key wraps the theorem in a mdframed environment.
+% Mostly, this key wraps the theorem in a |mdframed| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -20,7 +27,7 @@
\addtotheorempreheadhook[\thmt@envname]{%
\begin{mdframed}[#1]}%
\addtotheorempostfoothook[\thmt@envname]{\end{mdframed}}%
- }%
+ }%
}
% \end{macrocode}
%\iffalse (hide this from DocInput)
diff --git a/macros/latex/contrib/thmtools/thmdef-shaded.dtx b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
index 6377182c3e..c7501cae36 100644
--- a/macros/latex/contrib/thmtools/thmdef-shaded.dtx
+++ b/macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
@@ -1,14 +1,21 @@
% \iffalse meta-comment
%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
%\fi
%
%\iffalse (hide this from DocInput)
%<*shaded>
%\fi
%
-% Mostly, this key wraps the theorem in a shadebox environment.
+% Mostly, this key wraps the theorem in a |shadebox| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
@@ -24,45 +31,45 @@
}%
}
% \end{macrocode}
-% The docs for shadethm say:
+% The docs for |shadethm| say:
% \begin{quote}
% There are some parameters you could set the default for (try them as is,
% first).
% \begin{itemize}
-% \item shadethmcolor The shading color of the background. See the
+% \item |shadethmcolor|\quad The shading color of the background. See the
% documentation for the color package, but with a `gray' model, I find .97
% looks good out of my printer, while a darker shade like .92 is needed
% to make it copy well. (Black is 0, white is 1.)
-% \item shaderulecolor The shading color of the border of the shaded box.
+% \item |shaderulecolor|\quad The shading color of the border of the shaded box.
% See (i). If shadeboxrule is set to 0pt then this won't print anyway.
-% \item shadeboxrule The width of the border around the shading. Set it to
+% \item |shadeboxrule|\quad The width of the border around the shading. Set it to
% 0pt (not just 0) to make it disappear.
-% \item shadeboxsep The length by which the shade box surrounds the text.
+% \item |shadeboxsep|\quad The length by which the shade box surrounds the text.
% \end{itemize}
% \end{quote}
%
% So, let's just define keys for all of these.
%
% \begin{macrocode}
-\define@key{thmt@shade}{textwidth}{\setlength\shadedtextwidth{#1}}
-\define@key{thmt@shade}{bgcolor}{\thmt@definecolor{shadethmcolor}{#1}}
-\define@key{thmt@shade}{rulecolor}{\thmt@definecolor{shaderulecolor}{#1}}
-\define@key{thmt@shade}{rulewidth}{\setlength\shadeboxrule{#1}}
-\define@key{thmt@shade}{margin}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{padding}{\setlength\shadeboxsep{#1}}
-\define@key{thmt@shade}{leftmargin}{\setlength\shadeleftshift{#1}}
+\define@key{thmt@shade}{textwidth} {\setlength\shadedtextwidth{#1}}
+\define@key{thmt@shade}{bgcolor} {\thmt@definecolor{shadethmcolor}{#1}}
+\define@key{thmt@shade}{rulecolor} {\thmt@definecolor{shaderulecolor}{#1}}
+\define@key{thmt@shade}{rulewidth} {\setlength\shadeboxrule{#1}}
+\define@key{thmt@shade}{margin} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{padding} {\setlength\shadeboxsep{#1}}
+\define@key{thmt@shade}{leftmargin} {\setlength\shadeleftshift{#1}}
\define@key{thmt@shade}{rightmargin}{\setlength\shaderightshift{#1}}
% \end{macrocode}
%
% What follows is wizardry you don't have to understand. In essence,
% we want to support two notions of color: one is ``everything that goes
-% after \lstinline|\definecolor{shadethmcolor}|'', such as
-% \lstinline|{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
-% to recognize an already defined color name such as \lstinline|blue|.
+% after |\definecolor{shadethmcolor}|'', such as
+% |{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
+% to recognize an already defined color name such as |blue|.
%
% To handle the latter case, we need to copy the definition of one color
-% into another. The xcolor package offers \lstinline|\colorlet| for that,
-% for the color package, we just cross our fingers.
+% into another. The \pkg{xcolor} package offers |\colorlet| for that,
+% for the \pkg{color} package, we just cross our fingers.
% \begin{macrocode}
\def\thmt@colorlet#1#2{%
%\typeout{don't know how to let color `#1' be like color `#2'!}%
@@ -78,19 +85,19 @@
% \end{macrocode}
% Now comes the interesting part: we assume that a simple color name
% must not be in braces, and a color definition starts with an opening
-% curly brace. (So, if \lstinline|\definecolor| ever gets an optional arg,
+% curly brace. (So, if |\definecolor| ever gets an optional arg,
% we are in a world of pain.)
%
-% If the second argument to \lstinline|\thmt@definecolor| (the key) starts
+% If the second argument to |\thmt@definecolor| (the key) starts
% with a brace,
-% then \lstinline|\thmt@def@color| will have an empty second argument,
+% then |\thmt@def@color| will have an empty second argument,
% delimited by the brace of the key. Hopefully, the key will have exactly
-% enough arguments to satisfy \lstinline|\definecolor|. Then,
-% \lstinline|thmt@drop@relax| will be executed and gobble the fallback
-% values and the \lstinline|\thmt@colorlet|.
+% enough arguments to satisfy |\definecolor|. Then,
+% |thmt@drop@relax| will be executed and gobble the fallback
+% values and the |\thmt@colorlet|.
%
-% If the key does not contain an opening brace, \lstinline|\thmt@def@color|
-% will drop everything up to \lstinline|{gray}{0.5}|. So, first the color
+% If the key does not contain an opening brace, |\thmt@def@color|
+% will drop everything up to |{gray}{0.5}|. So, first the color
% gets defined to a medium gray, but then, it immediately gets overwritten
% with the definition corresponding to the color name.
% \begin{macrocode}
diff --git a/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
new file mode 100644
index 0000000000..59409fd79e
--- /dev/null
+++ b/macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
@@ -0,0 +1,43 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2010-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1-3c.txt
+%
+%\fi
+%
+%\iffalse (hide this from DocInput)
+%<*thmbox>
+%\fi
+% The \pkg{thmbox} package does something else: instead of having a separate
+% environment, we have to use a command different from
+% |\newtheorem| to get the boxed style. Fortunately,
+% \thmtools stores the command as |\thmt@theoremdefiner|, so we
+% can modify it. (One of the perks if extension writer and framework writer
+% are the same person.) So, in contrast to the previous example, this time
+% we need to do something before the actual |\newtheorem| is
+% called.
+% \begin{macrocode}
+\define@key{thmdef}{thmbox}[L]{%
+ \thmt@trytwice{%
+ \let\oldproof=\proof
+ \let\oldendproof=\endproof
+ \let\oldexample=\example
+ \let\oldendexample=\endexample
+ \RequirePackage[nothm]{thmbox}
+ \let\proof=\oldproof
+ \let\endproof=\oldendproof
+ \let\example=\oldexample
+ \let\endexample=\oldendexample
+ \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
+ }{}%
+}%
+% \end{macrocode}
+%\iffalse (hide this from DocInput)
+%</thmbox>
+%\fi
diff --git a/macros/latex/contrib/thmtools/thmtools.dtx b/macros/latex/contrib/thmtools/source/thmtools.dtx
index d5139e30c6..32e819c8e1 100644
--- a/macros/latex/contrib/thmtools/thmtools.dtx
+++ b/macros/latex/contrib/thmtools/source/thmtools.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2008 by Ulrich M. Schwarz
+% Copyright (C) 2008-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/source/thmtools.ins b/macros/latex/contrib/thmtools/source/thmtools.ins
new file mode 100644
index 0000000000..461856c73c
--- /dev/null
+++ b/macros/latex/contrib/thmtools/source/thmtools.ins
@@ -0,0 +1,64 @@
+%%
+%% This is a bog-standard .ins file: thmtools.ins
+%%
+\input VERSION.tex
+%\show\VERSION
+\def\dropext #1.#2\relax{#1}
+\input docstrip.tex
+%\keepsilent
+\askonceonly
+\preamble
+This is a generated file.
+
+This file is part of the `thmtools' package.
+The `thmtools' package has the LPPL maintenance status: maintained.
+Current Maintainer is Yukai Chou, muzimuzhi@gmail.com
+
+Copyright (C) 2008-2014 by Ulrich M. Schwarz
+Copyright (C) 2019 by Frank Mittelbach
+Copyright (C) 2020- by Yukai Chou
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, version 1.3c.
+This version is obtainable at
+http://www.latex-project.org/lppl/lppl-1-3c.txt
+
+^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION]
+\endpreamble
+
+\generate{%
+ \file{thmtools.sty} {\from{thmtools.dtx}{thmtools}}
+ \file{thm-restate.sty} {\from{thm-restate.dtx}{restate}}
+ \file{thm-patch.sty} {\from{thm-patch.dtx}{patch}}
+ \file{thm-autoref.sty} {\from{thm-autoref.dtx}{autoref}}
+ \file{thm-listof.sty} {\from{thm-listof.dtx}{listof}}
+ \file{thm-kv.sty} {\from{thm-kv.dtx}{kv}}
+ \file{parseargs.sty} {\from{parseargs.dtx}{parseargs}}
+ \file{aliasctr.sty} {\from{aliasctr.dtx}{code}}
+ \file{unique.sty} {\from{unique.dtx}{code}}
+ \file{thm-amsthm.sty} {\from{thm-amsthm.dtx}{amsthm}}
+ \file{thm-ntheorem.sty} {\from{thm-ntheorem.dtx}{ntheorem}}
+ \file{thm-beamer.sty} {\from{thm-beamer.dtx}{beamer}}
+ \file{thm-llncs.sty} {\from{thm-llncs.dtx}{llncs}}
+ \file{thmdef-shaded.sty} {\from{thmdef-shaded.dtx}{shaded}}
+ \file{thmdef-thmbox.sty} {\from{thmdef-thmbox.dtx}{thmbox}}
+ \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
+}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space thmtools.sty}
+\Msg{* \space\space thm-restate.sty}
+\Msg{* \space\space thm-patch.sty}
+\Msg{* \space\space thm-autoref.sty}
+\Msg{* \space\space thm-listof.sty}
+\Msg{* \space\space thm-kv.sty}
+\Msg{* \space\space aliasctr.sty}
+\Msg{* \space\space unique.sty}
+\Msg{* \space\space parseargs.sty}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
diff --git a/macros/latex/contrib/thmtools/unique.dtx b/macros/latex/contrib/thmtools/source/unique.dtx
index 9afbd2cffa..bf013ca6d4 100644
--- a/macros/latex/contrib/thmtools/unique.dtx
+++ b/macros/latex/contrib/thmtools/source/unique.dtx
@@ -1,11 +1,13 @@
% \iffalse meta-comment
%
-% Copyright (C) 2005-8 by Ulrich M. Schwarz
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019 by Frank Mittelbach
+% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
-% the LaTeX Project Public License, version 1.3a.
+% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
-% http://www.latex-project.org/lppl/lppl-1-3a.txt
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
%
% \fi
%
diff --git a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx b/macros/latex/contrib/thmtools/thmdef-thmbox.dtx
deleted file mode 100644
index ea22cbae97..0000000000
--- a/macros/latex/contrib/thmtools/thmdef-thmbox.dtx
+++ /dev/null
@@ -1,36 +0,0 @@
-% \iffalse meta-comment
-%
-% Copyright (C) 2010 by Ulrich M. Schwarz
-% See file COPYING for more details.
-%\fi
-%
-%\iffalse (hide this from DocInput)
-%<*thmbox>
-%\fi
-% The thmbox package does something else: instead of having a separate
-% environment, we have to use a command different from
-% \lstinline|\newtheorem| to get the boxed style. Fortunately,
-% \thmtools stores the command as \lstinline|\thmt@theoremdefiner|, so we
-% can modify it. (One of the perks if extension writer and framework writer
-% are the same person.) So, in contrast to the previous example, this time
-% we need to do something before the actual \lstinline|\newtheorem| is
-% called.
-% \begin{macrocode}
-\define@key{thmdef}{thmbox}[L]{%
- \thmt@trytwice{%
- \let\oldproof=\proof
- \let\oldendproof=\endproof
- \let\oldexample=\example
- \let\oldendexample=\endexample
- \RequirePackage[nothm]{thmbox}
- \let\proof=\oldproof
- \let\endproof=\oldendproof
- \let\example=\oldexample
- \let\endexample=\oldendexample
- \def\thmt@theoremdefiner{\newboxtheorem[#1]}%
- }{}%
-}%
-% \end{macrocode}
-%\iffalse (hide this from DocInput)
-%</thmbox>
-%\fi
diff --git a/macros/latex/contrib/thmtools/thmtools.ins b/macros/latex/contrib/thmtools/thmtools.ins
deleted file mode 100644
index 4b97aae226..0000000000
--- a/macros/latex/contrib/thmtools/thmtools.ins
+++ /dev/null
@@ -1,61 +0,0 @@
-%%
-%% This is a bog-standard .ins file: thmtools.ins
-%%
-\input VERSION.tex
-%\show\VERSION
-\def\dropext #1.#2\relax{#1}
-\input docstrip.tex
-%\keepsilent
-\askonceonly
-\preamble
-This is a generated file.
-
-This file is part of the `thmtools' package.
-The `thmtools' package has the LPPL maintenance status: unmaintained.
-
-Copyright (C) 2008-2014 by Ulrich M. Schwarz.
-
-This file may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, version 1.3a.
-This version is obtainable at
-http://www.latex-project.org/lppl/lppl-1-3a.txt
-
-^^J\noexpand\noexpand\noexpand\NeedsTeXFormat{LaTeX2e}^^J\noexpand\noexpand\noexpand\ProvidesPackage{\noexpand\expandafter\noexpand\dropext\outFileName\relax}[\VERSION]
-\endpreamble
-
-\generate{%
- \file{thmtools.sty}{\from{thmtools.dtx}{thmtools}}
- \file{thm-restate.sty}{\from{thm-restate.dtx}{restate}}
- \file{thm-patch.sty}{\from{thm-patch.dtx}{patch}}
- \file{thm-autoref.sty}{\from{thm-autoref.dtx}{autoref}}
- \file{thm-listof.sty}{\from{thm-listof.dtx}{listof}}
- \file{thm-kv.sty}{\from{thm-kv.dtx}{kv}}
- \file{parseargs.sty}{\from{parseargs.dtx}{parseargs}}
- \file{aliasctr.sty}{\from{aliasctr.dtx}{code}}
- \file{unique.sty}{\from{unique.dtx}{code}}
- \file{thm-amsthm.sty}{\from{thm-amsthm.dtx}{amsthm}}
- \file{thm-ntheorem.sty}{\from{thm-ntheorem.dtx}{ntheorem}}
- \file{thm-beamer.sty}{\from{thm-beamer.dtx}{beamer}}
- \file{thm-llncs.sty}{\from{thm-llncs.dtx}{llncs}}
- \file{thmdef-shaded.sty}{\from{thmdef-shaded.dtx}{shaded}}
- \file{thmdef-thmbox.sty}{\from{thmdef-thmbox.dtx}{thmbox}}
- \file{thmdef-mdframed.sty}{\from{thmdef-mdframed.dtx}{mdframed}}
- }
-\Msg{*********************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the}
-\Msg{* following files into a directory searched by TeX:}
-\Msg{*}
-\Msg{* \space\space thmtools.sty}
-\Msg{* \space\space thm-restate.sty}
-\Msg{* \space\space thm-patch.sty}
-\Msg{* \space\space thm-autoref.sty}
-\Msg{* \space\space thm-listof.sty}
-\Msg{* \space\space thm-kv.sty}
-\Msg{* \space\space aliasctr.sty}
-\Msg{* \space\space unique.sty}
-\Msg{* \space\space parseargs.sty}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*********************************************************}
-\endbatchfile
diff --git a/macros/latex/contrib/thmtools/thmtools.pdf b/macros/latex/contrib/thmtools/thmtools.pdf
deleted file mode 100644
index 5ab3fd1d69..0000000000
--- a/macros/latex/contrib/thmtools/thmtools.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/plain/contrib/zztex/README b/macros/plain/contrib/zztex/README
new file mode 100644
index 0000000000..dedbd02896
--- /dev/null
+++ b/macros/plain/contrib/zztex/README
@@ -0,0 +1,17 @@
+ZzTeX Macro Package, version 17.7
+
+The ZzTeX macro package is a full-featured TeX macro package specially
+designed for producing books, journals, and manuals. Development of the
+package began in 1989. Since then, about 500 textbooks and journals have
+been produced with it for a variety of publishers. Numerous authors have
+used the package to produce subsequent editions of their books.
+
+I provide the TeX files for ZzTeX under The MIT License. You may use any or
+all of the code for whatever purpose you desire. ZzTeX runs under Plain TeX.
+The only documentation available for the package is contained in the zz*.dat
+files that accompany the TeX files.
+
+I hope you find some of the code useful for your TeX projects.
+
+Copyright 1989--2020 by Paul C. Anagnostopoulos
+under The MIT License (opensource.org/licenses/MIT)
diff --git a/macros/plain/contrib/zztex/doc/zzbuiltin.dat b/macros/plain/contrib/zztex/doc/zzbuiltin.dat
new file mode 100644
index 0000000000..09599a8a48
--- /dev/null
+++ b/macros/plain/contrib/zztex/doc/zzbuiltin.dat
@@ -0,0 +1,325 @@
+\@catcodes %~ Establish INITEX catcode defaults.
+\@markdef \botmark %~ Last mark on the current page.
+\@markdef \firstmark %~ First mark on the current page.
+\@markdef \splitbotmark %~ Last mark in material split off by |\vsplit.|
+\@markdef \splitfirstmark %~ First mark in material split off by |\vsplit.|
+\@markdef \topmark %~ Last mark from previous page.
+\@prefix \global %~ Establishes a global definition.
+\@prefix \immediate %~ Performs the I/O operation immediately.
+\@prefix \long %~ Allows command arguments to be multiple paragraphs.
+\@prefix \outer %~ Restricts command to appear at top level.
+\@suffix \displaylimits %~ Limits are set above/below in display style, as scripts otherwise.
+\@suffix \limits %~ Limits are set above and below symbols.
+\@suffix \nolimits %~ Limits are set next to symbol like scripts.
+\countdef \adjdemerits = 0 %~ Demerits for adjacent incompatible lines.
+\countdef \badness = 0
+\countdef \binoppenalty = 0 %~ Penalty for line break after binary operator.
+\countdef \brokenpenalty = 0
+\countdef \clubpenalty = 0
+\countdef \day = 0
+\countdef \deadcycles = 0
+\countdef \defaulthyphenchar = 0
+\countdef \defaultskewchar = 0
+\countdef \delimiterfactor = 0
+\countdef \displaywidowpenalty = 0
+\countdef \doublehyphendemerits = 0
+\countdef \endlinechar = 0
+\countdef \errorcontextlines = 0
+\countdef \escapechar = 0
+\countdef \exhyphenpenalty = 0
+\countdef \fam = 0
+\countdef \finalhyphendemerits = 0
+\countdef \floatingpenalty = 0
+\countdef \globaldefs = 0
+\countdef \hangafter = 0
+\countdef \hbadness = 0
+\countdef \holdinginserts = 0
+\countdef \hypenchar = 0
+\countdef \hyphenpenalty = 0
+\countdef \insertpenalties = 0
+\countdef \interlinepenalty = 0
+\countdef \language = 0
+\countdef \lastpenalty = 0
+\countdef \lefthyphenmin = 0
+\countdef \linepenalty = 0
+\countdef \looseness = 0
+\countdef \mag = 0
+\countdef \maxdeadcycles = 0
+\countdef \month = 0
+\countdef \newlinechar = 0
+\countdef \outputpenalty = 0
+\countdef \pausing = 0
+\countdef \postdisplaypenalty = 0
+\countdef \predisplaypenalty = 0
+\countdef \pretolerance = 0
+\countdef \pretolerand = 0
+\countdef \prevgraf = 0
+\countdef \relpenalty = 0
+\countdef \righthyphenmin = 0
+\countdef \showboxbreadth = 0
+\countdef \showboxdepth = 0
+\countdef \skewchar = 0
+\countdef \spacefactor = 0
+\countdef \time = 0
+\countdef \tolerance = 0
+\countdef \tracingcommands = 0
+\countdef \tracinglostchars = 0
+\countdef \tracinglostchars = 0
+\countdef \tracingmacros = 0
+\countdef \tracingonline = 0
+\countdef \tracingoutput = 0
+\countdef \tracingpages = 0
+\countdef \tracingparagraphs = 0
+\countdef \tracingrestores = 0
+\countdef \tracingstats = 0
+\countdef \uchyph = 0
+\countdef \vbadness = 0
+\countdef \widowpenalty = 0
+\countdef \year = 0
+\def \ { %~ Command space.
+\def \"{ % {char} %~ Umlaut accent %^accent
+\def \'{ % {char} %~ Accute accent %^accent
+\def \-{
+\def \.{ % {char} %~ Dot accent %^accent
+\def \/{
+\def \={ % {char} %~ Macron accent %^accent
+\def \AA { %~ Scandinavian A with circle
+\def \aa { %~ Scandinavian a with circle
+\def \above { % dimen
+\def \abovewithdelims { % delim delim dimen
+\def \accent { % nnn
+\def \advance { % \name by value
+\def \AE { %~ Scandinavian ligature OE
+\def \ae { %~ Scandinavian ligature oe
+\def \afterassignment { % token
+\def \aftergroup { % token
+\def \atop
+\def \atopwithdelims { % delim delim
+\def \batchmode
+\def \begingroup
+\def \bgroup
+\def \box { % nnn
+\def \b{ % {char} %~ Bar-under accent %^accent
+\def \catcode { % char = nn
+\def \char
+\def \chardef { % \name = nn
+\def \cleaders
+\def \closein { % nn
+\def \closeout { % nn
+\def \copy { % nnn
+\def \count { % nnn = integer
+\def \countdef { % \name
+\def \cr
+\def \crcr
+\def \c{ % {char} %~ Cedilla accent %^accent
+\def \dag { %~ Dagger
+\def \ddag { %~ Double dagger
+\def \def
+\def \delcode
+\def \delimiter
+\def \dimendef { % \name
+\def \diment { % nnn
+\def \discretionary{text}{text}{text}
+\def \displaystyle
+\def \divide { % \name by number
+\def \dp
+\def \dump
+\def \d{ % {char} %~ Dot-under accent %^accent
+\def \edef
+\def \egroup
+\def \end
+\def \endgroup
+\def \errmessage{text}
+\def \errorstopmode
+\def \font { % \name = file-name [at size]
+\def \fontdiment { % nn \font = dimen
+\def \futurelet { % \name token token
+\def \gdef
+\def \halign{material}
+\def \hbox { % [to dimen] {text}
+\def \hfil
+\def \hfill
+\def \hfilneg
+\def \hrule { % width dimen height dimen depth dimen
+\def \hskip { % skip
+\def \hss
+\def \ht
+\def \hyphenation{text}
+\def \hyphenchar { % \font = nn
+\def \H{ % {char} %~ Long Hungarian umlaut accent %^accent
+\def \ignorespaces
+\def \indent
+\def \insert { % nnn {text}
+\def \kern { % dimen
+\def \L { %~ Polish suppressed L
+\def \l { %~ Polish suppressed l
+\def \lastbox
+\def \lccode { % char = char
+\def \leaders
+\def \left { % delim math \right delim
+\def \let { % \name = token
+\def \lower { % dimen box
+\def \lowercase { % {text}
+\def \mark { % {text}
+\def \mathaccent { % nnnnn math
+\def \mathbin { % {expression} %~ Binary operator class (2) %^math_class
+\def \mathchar { % "cfnn
+\def \mathchardef { % \name = nnnnn
+\def \mathchoice{text}{text}{text}{text}
+\def \mathclose { % {expression} %~ Closing fence class (5) %^math_class
+\def \mathcode
+\def \mathinner { % {expression} %~ Inner subexpression
+\def \mathop { % {expression} %~Large operator class (1) %^math_class
+\def \mathopen { % {expression} %~ Opening fence class (4) %^math_class
+\def \mathord { % {expression} %~ Ordinary symbol class (0) %^math_class
+\def \mathpunct { % {expression} %~ Punctuation class (6) %^math_class
+\def \mathrel { % {expression} %~ Relation class (3) %^math_class
+\def \message { % {text}
+\def \moveleft { % dimen box
+\def \moveright { % dimen box
+\def \mukern { % mudimen
+\def \multiply { % \name by number
+\def \muskip { % nnn = mu-glue
+\def \muskipdef { % \name
+\def \noalign { % {text}
+\def \noboundary
+\def \noboundary
+\def \noindent
+\def \nonscript
+\def \nonstopmode
+\def \number { % {number} %~ This command formats an integer as Arabic numerals.
+\def \O { %~ Scandinavian O with slash
+\def \o { %~ Scandinavian o with slash
+\def \OE { %~ French ligature OE
+\def \oe { %~ French ligature oe
+\def \omit
+\def \openin { % nn = file-name
+\def \openout { % nn = file-name
+\def \over
+\def \overline{text}
+\def \overwithdelims { % delim delim
+\def \P { %~ Paragraph sign (pilcrow)
+\def \par
+\def \parshape { % = nn dimen ...
+\def \patterns{text}
+\def \penalty { % nnnnn
+\def \radical { % nnnnn math
+\def \raise { % dimen box
+\def \read { % n to \name
+\def \relax
+\def \romannumeral { % {number} %~ This command formats an integer as uppercase Roman numerals.
+\def \S { %~ Section sign
+\def \scriptfont
+\def \scriptscriptfont
+\def \scriptscriptstyle
+\def \scriptstyle
+\def \scrollmode
+\def \setbox { % nnn = box
+\def \setlanguage { % nnn
+\def \sfcode
+\def \shipout { % box
+\def \show { % token
+\def \showbox { % nnn
+\def \showlists
+\def \showthe { % internal-quantity
+\def \skewchar { % \font = nn
+\def \skip { % nnn = glue
+\def \skipdef { % \name
+\def \span
+\def \special { % {text}
+\def \ss { %~ German es-zet
+\def \t { % {char} %~ Tie-after accent %^accent
+\def \textfont
+\def \textstylestyle
+\def \toks { % nnn
+\def \toksdef { % \name
+\def \uccode { % char = char
+\def \underline{text}
+\def \unhbox { % nnn
+\def \unhcopy { % nnn
+\def \unkern
+\def \unpenalty
+\def \unskip
+\def \unvbox { % nnn
+\def \unvcopy { % nnn
+\def \uppercase { % {text}
+\def \u{ % {char} %~ Breve accent %^accent
+\def \vadjust{text}
+\def \valign{text}
+\def \vbox { % [to dimen] {text}
+\def \vcenter{text}
+\def \vfil
+\def \vfill
+\def \vfilneg
+\def \vrule { % width dimen height dimen depth dimen
+\def \vskip { % dimen
+\def \vsplit { % nnn to dimen
+\def \vss
+\def \vtop { % [to dimen] {text}
+\def \v{ % {char} %~ Hacek accent %^accent
+\def \wd
+\def \write { % nn {text}
+\def \xdef
+\def \xleaders
+\def \^{ % {char} %~ Circumflex accent %^accent
+\def \`{ % {char} %~ Grave accent %^accent
+\def \~{ % {char} %~ Tilde accent %^accent
+\dimendef \boxmaxdepth = 0
+\dimendef \delimitershortfall = 0
+\dimendef \displayindent = 0
+\dimendef \displaywidth = 0
+\dimendef \emergencystretch = 0
+\dimendef \hangindent = 0
+\dimendef \hfuzz = 0
+\dimendef \hoffset = 0
+\dimendef \hsize = 0
+\dimendef \lastkern = 0
+\dimendef \lineskiplimit = 0
+\dimendef \mathsurround = 0
+\dimendef \maxdepth = 0
+\dimendef \nulldelimiterspace = 0
+\dimendef \overfullrule = 0
+\dimendef \pagedepth = 0
+\dimendef \pagefilllstretch = 0
+\dimendef \pagefillstretch = 0
+\dimendef \pagefilstretch = 0
+\dimendef \pagegoal = 0
+\dimendef \pageshrink = 0
+\dimendef \pagestretch = 0
+\dimendef \pagetotal = 0
+\dimendef \parindent = 0
+\dimendef \predisplaysize = 0
+\dimendef \prevdepth = 0
+\dimendef \scriptspace = 0
+\dimendef \splitmaxdepth = 0
+\dimendef \vfuzz = 0
+\dimendef \voffset = 0
+\dimendef \vsize = 0
+\muskipdef \medmuskip = 0
+\muskipdef \thickmuskip = 0
+\muskipdef \thinmuskip = 0
+\skipdef \abovedisplayshortskip = 0
+\skipdef \abovedisplayskip = 0
+\skipdef \baselineskip = 0
+\skipdef \belowdisplayshortskip = 0
+\skipdef \belowdisplayskip = 0
+\skipdef \lastskip = 0
+\skipdef \leftskip = 0
+\skipdef \lineskip = 0
+\skipdef \parfillskip = 0
+\skipdef \parskip = 0
+\skipdef \rightskip = 0
+\skipdef \spaceskip = 0
+\skipdef \splittopskip = 0
+\skipdef \tabskip = 0
+\skipdef \topskip = 0
+\skipdef \xspaceskip = 0
+\toksdef \errhelp = 0
+\toksdef \everycr = 0
+\toksdef \everydisplay = 0
+\toksdef \everyhbox = 0
+\toksdef \everyjob = 0
+\toksdef \everymath = 0
+\toksdef \everypar = 0
+\toksdef \everyvbox = 0
+\toksdef \output = 0
diff --git a/macros/plain/contrib/zztex/doc/zzdetails.dat b/macros/plain/contrib/zztex/doc/zzdetails.dat
new file mode 100644
index 0000000000..c1ef6d0b8f
--- /dev/null
+++ b/macros/plain/contrib/zztex/doc/zzdetails.dat
@@ -0,0 +1,1597 @@
+//---------------------------------------------------------------------------
+//
+// Copyright (c) 2012--2018 by Paul C. Anagnostopoulos
+//
+// This software may be used on your own computer systems and may
+// be distributed freely to other people. It may not be sold or
+// incorporated into any commercial products.
+//
+// Paul C. Anagnostopoulos
+// Windfall Software
+// 978 371-2316
+// paul@windfall.com
+//
+//---------------------------------------------------------------------------
+//
+// ZzExplore: Describe built-in TeX, Plain TeX, ZzTeX, and design
+// file entities for compositors.
+//
+// This is the details phrase file.
+//
+// Created: 7 May 2016
+
+// \art Block
+// ---- -----
+
+.details art_details \art
+.template art_details
+== The |\art| Block
+
+This tutorial describes the ZzTeX |\art| block, which is used to place
+Encapsulated PostScript (EPS) files on the page. EPS files can be created
+with many different applications, the most common being Adobe Illustrator
+and PhotoShop.
+
+=== The |\art| Command
+
+The format of the |\art| command is:
+
+| \art{*type*}{*file*,*width*,*height*,*scale*[,*gutter*,*file*,*width*,*height*,*scale*,...]}
+
+The *type* argument specifies the type of the code block and thus its
+design. Common examples are |figure| for art in floating figures and
+|text| for art in text.
+
+A single piece of art is described by four values in the second argument:
+
+& *file*& The name of the EPS file. See below.
+& *width*& The width of the art, usually specified in picas.
+& *height*& The height of the art.
+& *scale*& The scale factor for the art. See below.
+&.
+
+You can place multiple pieces of art, or panels, side-by-side by including
+additional values in the second argument. The *gutter* specifies the
+horizontal distance between the adjacent panels. The next four arguments specify
+the second art file, in the same manner as the first. This sequence can be
+continued to place three or four panels side-by-side.
+
+=== File Name
+
+The file name specified in the |\art| command is the name of an EPS file to be
+placed on the page. There is no need to specify the extension |.eps|. The
+file is assumed to reside in the directory specifed by the |\setartroot|
+command in the book's root file. If the name is preceded by an exclamation
+point (|!|), then the file is located in the main project directory (this
+feature is used for design art).
+
+Occasionally, a piece of art will include spurious whitespace on the edges
+of the art, but within its bounding box. This whitespace is called *slop*,
+and will result in the art appearing out of position. ZzTeX can compensate
+for the slops if you specify them with the file name, as follows:
+
+ \art{figure}{{smi01f01,0pt,5pt,0pt,3pt},...}
+
+Note the extra set of braces around the file name and slops. All four slops
+must be specified, in this order: left side, right side, top, bottom. If all
+the slops are less than 1.5 points or so, there is no need to include them.
+We haven't used slops much in the past decade or so; we simply ask the
+illustrator to eliminate the whitespace.
+
+=== Width and Height
+
+If both the width and height are specified as zero (i.e., |0pc,0pc|), then the
+art will be dynamically sized when the file is processed. ZzTeX inspects the
+EPS file to determine the art size. If it cannot find the |%%BoundingBox|
+comment that specifies the size, an error results. We use this feature
+only for design art.
+
+The ZzSizeArt utility can automatically size the art in a chapter file.
+Try |~.facility; sizing art| for more details.
+
+=== Scale Factor
+
+The scale factor specifies the scale at which the piece of art should be
+placed, relative to its natural size. The scale factor must always be
+specified, even if it is 100. There are three ways to specify it:
+
+* *percentage*&_A number that specifes the percentage of scaling.
+The number may include decimal places.
+
+* |=|&_An equal sign specifies that the art should be scaled
+to fit in the prevailing width. The width is usually the
+text measure or the type area width.
+
+* |=*width*|&_An equal sign and a width specifies that the art should
+be scaled to the specified width.
+*.
+
+=== Aligning Side-by-Side Panels
+
+The |\art| command aligns side-by-side panels along their top edges. Sometimes
+you want them aligned differently. To shift a panel vertically, specify a
+top slop that is positive to shift the panel up or negative to shift the panel
+down.
+
+Note that the slops are scaled by the scale factor, so the exact slop
+required to shift the panel correctly may not be obvious.
+
+// Art Sizing
+// --- ------
+
+
+.phrase art_sizing art sizing : text
+.synonym sizing art
+.synonym zzsizeart
+.template
+= ZzSizeArt Art Sizing Utility
+
+The ZzSizeArt utility allows you to manipulate the art sizes specified in
+|\art| commands in ZzTeX source files. Its two primary capabilities are to set
+the sizes of art files by inspecting the Encapsulated PostScript (EPS) files
+and to replace existing EPS files with new versions.
+
+The ZzSizeArt facility relies on the following conventions for art files:
+
+* The bulk of the art files for a book are stored in the art/
+subdirectory under the primary project directory.
+
+* Replacement art files are loaded into the new/ subdirectory under
+the art/ directory before eventually being hoisted into the
+art/ directory.
+
+* Before an art file in an |\art| command is sized, its width and height are
+coded as |20pc,10pc|. This special combination signals that the art has not
+been sized.
+
+* ZzTeX supports dynamic sizing by setting the |\art| size
+to |0pc,0pc|. In this case, the size is determined by inspecting the
+EPS file every time the chapter is processed, rather than being set
+statically. Most ZzSizeArt commands ignore dynamically sized files.
+*.
+
+== zzsizeart Command
+
+The zzsizeart command has the following syntax:
+
+| zzsizeart *root* *command* *additional-items*
+
+The *root* parameter specifies the root name of the book. It is usually
+specified as a period (|.|), which causes ZzSizeArt to figure out the root
+name. The command parameter is a keyword that determines which function
+ZzSizeArt performs. Its functions are described in alphabetical order
+in the following paragraphs.
+
+* |zzsizeart *root* reset *source-file*|
+
+This command resets all the art sizes in the specified ZzTeX source file to
+|20pc,10pc|. Dynamically sized art files are ignored unless the |-all| option is
+included, in which case they are reset also.
+
+If the |-scale| option is specified, then ZzSizeArt also resets the scale of
+the art files to 100.
+
+* |zzsizeart *root* replace *optional-file-spec*|
+
+This command analyzes the replacement art files in the art/new/ subdirectory
+to determine whether they are the same size as the existing art files and
+can safely replace them. If a *file-spec* parameter is provided, only the
+replacement files that match the file spec are analyzed. The command
+generates a report about the replacement art files and displays it on the
+screen. This reports tells you whether the replacement art files are the
+same size or a different size.
+
+If the |-hoist| option is included, then any replacement art files that are the
+same size as the existing files are hoisted from the new/ subdirectory up to
+the art/ directory, replacing the old art files of the same names. The rest of
+the replacement art files are left in the new/ subdirectory. You can use the
+PrintEPS utility to generate a proof of the remaining art files, from which
+you can read the sizes of those files. Also see the |tell| command below.
+
+If the |-all| option is also specified, then all replacement art files are
+hoisted, including those that are a different size from the existing art
+files.
+
+The |-epsilon=*w*,*h*| option specifies the epsilon values for the width (*w*) and
+height (*h*). If the difference in size is within these epsilons, the
+replacement file is considered the same size as the existing file. The
+default width and heigh epsilons are both 1.5 points.
+
+* |zzsizeart *root* size *source-file*|
+
+This command sizes the |\art| commands in the specified ZzTeX source file by
+analyzing the EPS files named in those |\art| commands. Every art file must have
+the size |20pc,10pc|, except for dynamically-sized art files, which are
+ignored. Every named art file must exist in the art/ subdirectory. The
+source file is modified so that the art files have their actual sizes.
+
+If the |-ifexists| option is specified, then ZzSizeArt will size those art
+files that exist in the art/ subdirectory and ignore any other files named
+in |\art| commands. *All* art files must still have the size |20pc,10pc|, but any
+files that do not exist will not be set to their actual sizes.
+
+If the |-partial| option is specified, then ZzSizeArt will size those art
+files whose sizes are |20pc,10pc| and ignore any other art files named in |\art|
+commands. This allows you to size art files that were not sized previously
+for whatever reason, possibly due to a prior use of the |-ifexists| option.
+
+If both |-ifexists| and |-partial| are specified, then ZzTeX will size any
+art file who size is |20pc,10pc| and that exists in the art/ subdirectory.
+
+* |zzsizeart *root* tell *eps-file* ...|
+
+This command analyzes the specified EPS files and displays a report giving
+their sizes. This is useful when you need to know the sizes of a few EPS
+files in order to update their |\art| commands by hand.
+*.
+----
+For more details on the |\art| command, try |~.facility; \art|.
+
+// Cleanup Report
+// ------- ------
+
+
+.phrase cleanup_report cleanup report
+.synonym clean-up report
+.synonym clean up report
+.template
+= Cleanup Report for ~.project;
+
+This report describes the chapter cleanup activities for books
+in general and ~.project; in particular.
+
+Before reading this report, it's a good idea to read the design
+report for ~.project;. Try |~.facility; design report|.
+
+== General Cleanup
+
+=== Clean Up Headings
+
+The heads in sectioning commands (e.g., |\chapter|, |\section|) and
+tables, along with the titles in captions, must be formatted according
+to the design. This involves
+
+* Captitalizing them correctly
+
+* Adding or removing trailing punctuation
+
+* Ensuring that run-in heads have no blank lines after them
+
+* Adding |\noindent| commands where they might be missing
+
+* Once the chapter is processed, turning multi-line heads with
+|\titlenl;| or |\titletl;|
+*.
+
+Here are the styles of the various heads and titles.
+
+&= Command& Style
+----
+~foreach cmd, style_table;
+& ~.cmd;& ~.style_table[cmd];
+~end;
+&.
+
+=== Clean Up Floats
+
+The cleanup for floats involves
+
+* Making sure there is a blank line on either side
+
+* Determining whether the author embedded floats in the middle of
+paragraphs and merging the broken paragraph segments
+
+* Moving floats after the first paragraph of reference (this may be
+easier during page make-up)
+
+* Placing the correct file names in |\art| commands.
+
+* Checking captions to see if they need a |\legend| marker.
+*.
+
+// \code Block
+// ----- -----
+
+.details code_details \code
+.template code_details subclass_set command code
+== Code Facilities
+
+This tutorial describes the ZzTeX code facilities. These facilities are
+used to produce computer program code examples.
+
+=== The |\code| Block
+
+The |\code| command has the following syntax:
+
+| \code{*type*}
+| *line of code*
+| ...
+| *line of code*
+| \endcode
+
+The *type* argument specifies the type of the code block and thus its
+design. Each line of code is set more or less verbatim and line breaks
+are preserved as they are. Code blocks are almost always set in a monospaced
+font so that indentation can be accomplished with spaces at the beginnings
+of lines.
+
+=== Verbatim Lines
+
+The degree to which the code lines are taken verbatim is determined
+by certain block design parameters. To investigate the design
+parameters for a code block, try |~.facility; \code*type* details|.
+
+* |\allowTeXcommands|&_If this flag is on, ZzTeX commands can be
+included in the code, as long as they use only backslash and
+braces (|\|, |{|, |}|). This flag is on in most code blocks.
+To include those characters in the code itself, you must use:
+|\\|, |\{|, |\}|.
+
+* |\allowTeXmath|&_If this flag is on, math expressions can be
+included in the code, using dollar sign, underscore, and hat (|$|,
+|_|, |^|). This flag is off in most code blocks. To include those
+character in the code itself, you must use: |\$|, |\_|, |\hat|.
+(See |\codemath| for another way to include math in code.)
+
+* |\allowatsigncommands|&_If this flag is on, at-sign commands
+can be included in the code and would probably be provided by
+the code design. This flag is off in most code blocks. To include an
+at-sign in the code itself, you must use: |\@|.
+
+=== |\code| Tools
+
+The following list includes all the tools that can be used within a |\code|
+block. You can explore these various commands to learn what they do.
+
+~foreach name, name_set;
+* |~.name;|
+~end;
+*.
+
+// \enunciation Block
+// ------------ -----
+
+.details enunciation_details \enunciation
+.template enunciation_details
+== The |\enunciation| Block
+
+This tutorial describes the ZzTeX |\enunciation| block, which produces
+mathematical "enunciations" such as theorems, corollaries, and proofs.
+Using the |\enunciation| command is reasonably straightforward,
+but defining the various types of enunciations is a bit trickier.
+
+The format is the |\enunciation| command is:
+
+| \enunciation{*type*}{*optional-attribution*}
+
+The *type* argument specifies the type of the code block and thus its
+design. The *optional-attribution* argument can have one of three
+formats. Note that the second set of braces is required in *all* cases.
+
+# |{}|&_If empty, there is no attribution for the enunciation.
+& Theorem 1.1.&_There exist irrational numbers ...
+&.
+
+# |{Smith's Conjecture}|&_The specified text is the attribution for the
+enunciation.
+& Conjecture 1.2 (Smith's Conjecture).&_Let *K* be the *n*th cyclotomic field ...
+&.
+
+# |{\title Kleene's Theorem}|&_The text specified after the |\title| marker
+is the complete title for the enunciation.
+& Kleene's Theorem.&_Every language definable with a regular expression ...
+&.
+#.
+
+=== Defining an Enunciation Type
+
+Prior to ZzTeX v5.8, each enunciation type had to be defined by
+writing a complete design macro, as with other block types. There
+are some subtle issues that make this difficult. In v5.8, the
+|\definenunciation| command was added.
+
+| \defineenunciation{*type*}{*association*}{*design*}
+
+The first argument is the enunciation's type. The second argument
+can be empty or specify the type of another enunciation whose
+number counter is to be shared. Both types of enunciation will be
+numbered sequentially with the same counter.
+
+The third argument specifies a design macro for the base design
+that is to be used for this new enunciation type. Multiple enunciations
+can share the same base design. For example,
+
+ \defineenunciation{conjecture}{}{\enunciationtheoremlikedesign{Conjecture}}
+ \defineenunciation{corollary}{}{\enunciationtheoremlikedesign{Corollary}}
+ \defineenunciation{definition}{}{\enunciationtheoremlikedesign{Definition}}
+ \defineenunciation{lemma}{}{\enunciationtheoremlikedesign{Lemma}}
+ \defineenunciation{proof}{}{\enunciationprooflikedesign{Proof}}
+ \defineenunciation{proposition}{}{\enunciationtheoremlikedesign{Proposition}}
+
+There are two base designs for these enunciations: |\enunciationtheoremlikedesign|
+for enunciations formatted like theorems, and |\enunciationprooflikedesign|
+for enunciations formatted like proofs. Note that the two design macros expect
+an argument that is the word to appear in the title of the enunciation (e.g.,
+"Conjecture", "Proof").
+
+So defining a set of related enunciations boils down to writing one
+base design macro.
+
+=== Base Enunciation Design
+
+Most of the details about enunciation design macros are the same
+as other design macros. There are two interesting additions.
+
+ \def \enunciationtheoremlikedesign #1{%
+ \aboveskip = \standardskip
+ ...
+ \def \labelformat ##1{%
+ \noindent
+ \attributiontypecase
+ {\llap{\colortext{darkblue}{\enunnumbersize\dbf #1 \the\enunciationcomptext}%
+ \hspace{10pt}}}% no attribution
+ {\llap{\colortext{darkblue}{\enunnumbersize\dbf #1 \the\enunciationcomptext}%
+ \hspace{10pt}}##1.\quad}% normal attribution
+ {\llap{\colortext{darkblue}{\enunnumbersize\dbf ##1}%
+ \hspace{10pt}}}% title override
+ \ignorespaces}%
+
+The first addition is that the design macro accepts an argument that is
+the word to be set in the title. The |#1| in the first line represents
+that argument.
+
+The second addition is the |\attributiontypecase| command in the
+label formatter. It takes three arguments, each of which formats the
+title (label) of the enunciation. The three arguments correspond to the
+three title argument formats described above.
+
+# The attribution argument is empty.
+# The attribution argument specifies an attribution.
+# The attribution argument includes the |\title| marker.
+#.
+
+=== The |\defineeoedingbat| Command
+
+The |\enunciation| block includes a design parameter named |\autoqed|.
+This parameter can specify the name of an "end-of-enunciation dingbat"
+that should appear at the end of the enunciation.
+
+ \def \enunciationprooflikedesign #1{%
+ ...
+ \autoqed = {\qed}%
+
+The |\qed| command, which typesets a dingbat, is automatically performed
+at the end of enunciations based on the |\enunciationprooflikedesign|
+design. To override the position of the resulting dingbat, you can
+specify the |\qed| command explicitly in the text of the enunciation.
+
+An end-of-enunciation dingbat is defined with
+
+| \defineeoedingbat{*name*}{*text*}{*space*}
+
+The first argument is the name of the dingbat command. The second argument
+is the text of the dingbat. The third argument specifies how to
+separate the dingbat from the final word of the enunciation.
+
+* |{10pt}|&_The dingbat is set 10 points from the final word.
+
+* |{\flushright 8pt}|&_The dingbat is set flush right, but a minimum
+of 8 points must separate it from the final word.
+*.
+
+So the |\qed| dingbat used above could be defined with
+
+ \defineeoedingbat{\qed}{\colortext{darkblue}{\slug{5pt}{5pt}}}{\flushright 8pt}
+
+// Environments
+// ------------
+
+
+.phrase environments environments : text
+.synonym LaTeX environments
+.template
+= LaTeX Environments
+
+A LaTeX *environment* is the equivalent of a ZzTeX *block*.
+The term environment is not used in ZzTeX.
+
+// \eqno Marker
+// ----- ------
+
+.details eqno_details \eqno
+.template eqno_details
+== Equation Numbers
+
+This tutorial describes the ZzTeX facilities for setting equation numbers on
+math displays. An equation number is set with the |\eqno| marker, which can
+appear in three places:
+
+# At the end of a single-line math display, before the closing |$$|.
+
+# At the end of an aligned math display, *after* the close brace of the
+|\eqaligned| and before the closing |$$|. In this case, the number pertains
+to the entire display.
+
+# At the end of a row of an aligned display, just *before* the |\cr| or
+close brace of the |\eqaligned|. In this case, the number pertains to
+the row in which it appears.
+#.
+
+Almost all book designs call for one of two formats of equation number. In
+most cases, the number consists of the chapter composite text and a sequence
+number within the chapter, as in "3.17". In a few cases, only a sequence
+number is used, as in "17". In the descriptions below, *chap* stands for the
+chapter composite text, while *num* stands for the equation sequence number. The
+sequence number is derived from the math display counter, in the same manner
+as section numbers are derived from the section counter.
+
+You can code an equation number in one of four ways:
+
+| \eqno
+| \eqno \tag{*xyz*}
+| \eqno *override*
+| \eqno *override* \tag{*xyz*}
+
+The optional *override* text is used to override the normal numbering sequence.
+A space or line break can be placed before and/or after the |\tag| command to
+aid readability. The |\tag| command must appear immediately following its
+paired |\eqno| in order to associate the tag with the correct equation
+number.
+
+The following paragraphs present the various forms of the *override* text for
+overriding the numbering sequence. Each case includes two examples, the
+first where the equations are numbered in the common (*chap*.*num*) format, and
+the second where the equations are numbered with only a sequence number, as
+in (*num*). The examples assume that the chapter number is 2 and the
+math display counter is at 4 prior to the display
+and also show the counter *after* the equation number is typeset.
+
+* |\eqno|&_&_&_Next sequence number
+
+The math display counter is incremented and its arabic form is used as
+the *num* text. This is the common case.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.5)& (5)& 5
+&.
+
+* |\eqno +a|&_&_&_Next sequence number; use with suffix
+
+The math display counter is incremented and its arabic form is joined
+with the suffix following the plus sign to make up the *num* text.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.6a)& (6a)& 5
+&.
+
+* |\eqno ,b|&_&_&_Same sequence number with suffix
+
+The math display counter is *not* incremented. Its arabic form is joined
+with the suffix following the comma to make up the *num* text.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.4b)& (4b)& 4
+&.
+
+* |\eqno ,$'$|&_&_&_Same sequence number with suffix
+
+This is another example of the preceding case, showing the common use
+of a prime after the *num* text.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.4&prime;)& (4&prime;)& 4
+&.
+
+* |\eqno A1|&_&_&_Ignore sequence number; use specified *num*
+
+The math display counter is ignored. The specified text is used as the
+complete *num* text.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.A1)& (A1)& 4
+&.
+
+* |\eqno :A1|&_&_&_Next sequence number; use specified *num*
+
+The math display counter is incremented *but then ignored*. The specified
+text is used as the complete *num* text.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.A1)& (A1)& 5
+&.
+
+* |\eqno =12;a|&_&_&_Set sequence number; use with suffix
+
+The math display counter is set to 12 and its arabic form is joined
+with the suffix following the semicolon to make up the *num* text. Note that
+the suffix (|a| here) is optional but the semicolon is required.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2.12a)& (12a)& 12
+&.
+
+* |\eqno !2B.1|&_&_&_Use specified text for number
+
+The chapter composite text and math display counter are ignored. The text
+following the exclamation point is the complete equation number. This
+feature is useful when you need to set an out-of-sequence equation number
+in something like a sidebar or a chapter appendix.
+
+&= Result when& Result when
+&= (*chap*.*num*) style& (*num*) style& Counter After
+----
+& (2B.1)& (2B.1)& 4
+&.
+
+* |\eqno >{*tag*}|&_&_&_Use equation number associated with tag
+
+The chapter composite text and math display counter are ignored. The equation
+number associated with the tag is duplicated for the equation number
+of this display.
+*.
+
+If you ever need to reset the math display counter, the following command
+will do it:
+
+| \setmathdisplaynumber{*num*}
+
+// Indexing
+// --------
+
+.phrase indexing indexing : text
+.template
+= Indexing Facilities, version 2
+
+This tutorial describes the second generation ZzTeX indexing facilities.
+These facilities are used to index a document with embedded indexing commands and
+then generate one or more indexes for typesetting.
+
+First, some definitions.
+
+* Locator.&_An item followng a heading that refers the reader to related
+information in the book. This is usually a page number or range,
+but sometimes a "See" or "See also." The term *locator* is also used
+for the commands that are inserted in the text to create index entries.
+
+* Main heading.&_The heading of a top-level entry in an index.
+
+* Raw index entry.&_A locator command such as |\xpage| generates
+a raw index entry in the raw index entry files. The entry contains
+unformatted information about the locator.
+
+* Sort override.&_An alternate heading used in place of a regular heading
+to specify how it should be sorted, For example, the heading "3-D"
+might have a sort heading of "three D".
+
+* Subheading.&_The heading of a second- or third-level entry in an index,
+subordinate to a main heading.
+*.
+
+== Indexing Locators
+
+Indexing locators are commands that are inserted in the text to produce raw index
+entries that ultimately make up the index. This section describes typical
+indexing locators. For another overview of locators, try |~.facility;
+locators|.
+
+Most locator commands produce a raw index entry that identifies a page or range of
+pages relevant to the headings.
+
+ \xpage{Automobiles}
+ \xpage{Automobiles|muscle cars}
+
+Locator commands begin with an |x| and include a type word that identifies
+the type of locator produced. The argument specifies one to three
+headings, separated by vertical bars (|&||). The first heading is the main heading
+and any remaining headings are subheadings.
+
+If the locator allows a page range, then the commands |\x*type*begin| and
+|\x*type*end| identify the beginning and ending positions of the range.
+
+ \xpagebegin{Automobiles}
+ ...
+ \xpageend{Automobiles}
+
+Some locators require an additional argument called the "text." This provides
+more information about the locator.
+
+ \xsee{Cars}{Automobiles}
+ \xseealso{Automobiles|muscle cars}{Automobiles|pony cars}
+
+Such locator commands produce locators that do not include a page number
+but rather text that refers the reader to other entries. The additional
+text argument is always the first argument of the locator command.
+
+=== Sort Overrides
+
+(To be supplied.)
+
+== Design File
+
+This section describes the commands that appear in the design file to define
+locators and their formatting and specify the design of the indexes in the
+book. The commands are described in the order in which they must appear in
+the design file.
+
+ \indexversion{2}
+
+This command must appear at the beginning of the Index section of the design
+file. It specifies that version 2 of the indexing facility is being used.
+
+=== Generating Indexes
+
+Multiple indexes can be generated from the raw index entries of a book. Each
+index is assigned a name and declared using the following command.
+
+| \generateindex{*name*}
+
+Typical names are |subject|, |author|, and |symbol|. For each generated
+index, ZzTeX produces an "index parameter file" with the same name as the
+index and the extension |zzp|. A parameter file contains information about
+the defined locators and information taken from the design definition for
+the named index. This information is used by the index generator to build
+the final index file. (See below for a description of index parameter files.)
+
+=== Defining Locators
+
+| \definelocator{*type*}{*attributes*}{*optional-format*}
+
+This command defines an index locator and establishes the indexing commands
+used to include the locator in the index. The first argument is the type word that
+identifies the type of locator. Typical examples are |page|, |figure|, and
+|see|.
+
+The second argument gives the attributes of the locator. It is a series
+of keywords:
+
+* |\page|, |\nopage|&_Indicates whether the locator includes a page number.
+
+* |\range|, |\norange|&_Indicates whether the locator may be used to specify
+a range of pages in addition to a single page.
+
+* |\text|, |\notext|&_Indicates whether the locator includes additional text.
+*.
+
+Assume that the type is |thing|. In all cases, the following locator command
+is defined:
+
+| \xthing{*headings*}
+
+If a range is allowed, then two additional commands are defined:
+
+| \xthingbegin{*headings*}
+| \xthingend{*headings*}
+
+If the locator includes additional text, then all commands take a first
+argument specifying the text:
+
+| \xthing{*text*}{*headings*}
+| \xthingbegin{*text*}{*headings*}
+| \xthingend{*text*}{*headings*}
+
+The third argument to |\definelocator| is optional and specifies the format
+of the locator in the final index. If the braces are empty, then the
+separetely defined format with the same name as the locator is used. To
+provide the format, use three sets of braces to specify the second, third,
+and fourth arguments for the |\definelocatorformat| command (below). The new
+format will be given the same name as the locator.
+
+=== Defining Formats
+
+| \definelocatorformat{*name*}{*rank*.*order*}{*level-1-items*}{*level-2-items*}
+
+This command defines a locator format with the given name for the final index.
+The third and fourth arguments specify items that are needed to format
+the locator. The level-1-items are used for locators associated with main
+headings, while the level-2-items include overrides that pertain to
+subheadings (both second- and third-level).
+
+The second argument specifies the rank and order of this locator. The *rank*
+determines this locator's position in the overall sequence of locators for a
+heading. Typically, the page locators appear first, then the "see" locator,
+then any "see also" locators.
+
+The *order* determines the order of the locator within a series of locators
+all with the same page number. Typically, plain page numbers appear first,
+then pages with suffix 'f' for figure, then pages with suffix 't' for table,
+etc.
+
+& Mustang, 13, 44--49, 45*f*, 45*t*
+&.
+
+Each item list argument is in the following format:
+
+| {*item*:*text*&|*item*:*text*&|...}
+
+There is a sequence of items separated by bars (|&||). Each item consists of
+an item tag, a colon (|:|), and some text. The following item tags are
+available.
+
+* |prefix1|&_Text to precede all locators of this rank, when this is
+the first locator after the heading. Defaults to empty.
+
+* |prefix2|&_Text to precede all locators of this rank, when this is
+not the first locator after the heading. Defaults to |prefix1|.
+
+* |tmplt|&_Template for this locator when there is a single page
+or no page (only text). No default.
+
+* |rtmplt|&_Template for this locator when there is a range of pages.
+No default.
+
+* |sep|&_Separator between locators of this rank. Defaults to empty.
+
+* |suffix|&_Text to follow all locators of this rank. Defaults to empty.
+
+* |term|&_Text to terminate the entire sequence of locators. Defaults to empty.
+*.
+
+The templates |tmplt| and |rtmplt| may include the following substitutors.
+
+&= Substitutor& What is substituted
+----
+& |?P|& Single page or first page of range.
+& |?Q|& Second page of range.
+& |?T|& Text (e.g., for |see| or |seealso| locators).
+& |??|& Single question mark (|?|).
+&.
+
+The builtin locators can be found in the ZzTeX file zzindexv2.tex. They
+are good examples of how locator formats are defined.
+
+== Index Design
+
+Each index of a book is typeset inside an index block whose design is
+specified, as usual, with a design macro. The parameters of the design macro
+include many common ones, but also a few that are special for index designs.
+The following paragraphs describe the special parameters.
+
+* |\def \alphaformat ##1{*text*}|
+
+This parameter specifies how to format the break between letters produced by
+the |\alphbreak{...}| command. The macro is passed the argument text from the
+|\alphabreak|.
+
+* |\divisions = {*div1*,*div2*,...}|
+
+This parameter specifies the book divisions to be included in the index.
+The value can be |\all|; a list of division names; or |\allbut| followed by a
+list of division names.
+
+* |\locators = {*loc1*,*loc2*,...}|
+
+This parameter specifies the locators to be included in the index. The value
+can be |\all|; a list of locators; or |\allbut| followed by a list of locators.
+Each locator consists of the locator type followed by an optional colon and
+format name. If a format name is not included, then the locator is formatted
+according to the format with the same name as the locator.
+
+* |\indexparams = {...}|
+
+This parameter specifies index parameter statements to be included in the
+index parameter file. See below for a description of the parameter
+statements.
+
+* |\position = {*options*}|
+
+This parameter specifies the overall format of the index. It consists of a
+sequence of the following options:
+
+&= Option& Meaning
+----
+& |\oneup|& Run index in one column.
+& |\outline|& Format entries in outline style.
+& |\runin|& Format entries in run-in (paragraph) style.
+& |\threeup|& Run index in three columns.
+& |\twoup|& Run index in two columns.
+& |\usetextmeasure|& Use the text measure for the columns.
+& |\usetextwidth|& Synonym for |\usetextmeasure|.
+& |\usetypewidth|& Use the type area width for the columns.
+&.
+*.
+
+=== Entry Formatters
+
+(To be supplied.)
+
+== Raw Index Entry Files
+
+ZzTeX populates raw index entry files as it encounters indexing locator
+commands in the book files. Each indexing locator generates one raw entry
+record in the file whose name is the same as the division with an extension
+of |.zzi|. A raw entry record has the following format. The semicolon (|;|)
+represents the field separator character hex B8, chosen because it cannot
+appear in an index heading.
+
+| *type*;*code*;*folio*;*main-head*;*subhead*;*sub-subhead*;*text*
+
+The *code* is |S| for a single page entry, |B| for a begin page range entry,
+or |E| for an end range entry.
+
+== Index Parameter Files
+
+(This material is highly technical and incomplete.)
+
+An index parameter file contains a series of statements that specify
+parameters for the index generator (zzindex2.exe). Each time an index is
+generated, at least two parameter files are read:
+
+* *index-name*.zzp&_The parameter file generated by the |\generateindex|
+command for the specific index being generated.
+
+* zzindex2.zzp&_A generic parameter file included with ZzTeX.
+*.
+
+Each statement in a parameter file has the following format:
+
+| [*mode*] *keyword* *item* ... ;
+
+The optional mode is enclosed in brackets and specifies the mode to which
+the statement pertains. If the mode is not specified, the statement is used
+in all modes. The items are separated by spaces. The statement ends with a
+semicolon.
+
+A parameter file may also contain blank lines and comment lines beginning
+with |//|. Comment lines are ignored.
+
+Statements that specify actions for tokens in headings include the token for
+which the action is to be performed. A token can be one of the following:
+
+&= Token& Meaning
+----
+& |SP|& space
+& |\SP|& TeX \<space> command
+& |\*name*|& TeX |\*name*| command
+& |\*c*|& TeX |\*c*| character command
+& *x*& any other character
+&.
+
+The following statements can appear in an index parameter file.
+
+* |begin-group *token* ;|
+
+The token begins a group and is discarded. The mode stack is pushed with the
+current mode.
+
+* |define-format *format-text* ;|
+
+(To be supplied.)
+
+* |define-locator *definition-text* ;|
+
+(To be supplied.)
+
+* |[mode] discard *token* ;|
+
+The token is discarded and does not appear in the canonicalized heading.
+
+* |[mode] discard/u *token* ;|
+
+The token is removed from the heading but suffixed to the canonicalized
+heading.
+
+* |divisions *divisions-text* ;|
+
+This statement specifies the required divisions from the |\divisions| parameter
+of the index design.
+
+* |end-group *token* ;|
+
+The token ends a group and is discarded. The mode stack is popped.
+
+* |include-param *file* ;|
+
+This statement requests that the named index parameter file be loaded.
+
+* |include-raw *file* ;|
+
+This statement requests that the named raw index entry file be included in
+the set of raw index entry files.
+
+* |index "*name*" ;|
+
+This statement specifies the name of the index to be generated.
+
+* |[mode] invalid *token* ;|
+
+The token is invalid and an error message is produced.
+
+* |[mode] keep *token* ;|
+
+The token is preserved as is on the canonicalized heading.
+
+* |locators *locators-text* ;|
+
+This statement specifies the required locators from the |\locators| parameter
+of the index design.
+
+* |math/u *token* ;|
+
+The token begins or ends math mode. The mode stack is pushed or popped as
+appropriate. The token is suffixed to the canonicalized heading.
+
+* |noise/u "*word*" ;|
+
+If the word appears at the beginning of a subheading or sub-subheading, it
+is removed but suffixed to the canonicalized heading.
+
+* |[mode] replace *token* "*text*" ;|
+
+The token is discarded and replaced with the specified text, which is not
+rescanned.
+
+* |[mode] replace/u *token* "*text*" ;|
+
+The token is discarded and replaced with the specified text, which is not
+rescanned. The token is, however, suffixed to the canonicalized heading.
+
+* |root "*name*" ;|
+
+This statement specifies the name of the book's root file.
+
+* |sort *mode* ;|
+
+(To be supplied.)
+
+* |[mode] synonym *token* "*text*" ;|
+
+The token is discarded and replaced with the specified text, which is then
+rescanned.
+*.
+
+// Letterspacing
+// -------------
+
+.details letterspace_details \letterspace
+.template letterspace_details
+== Letterspacing
+
+This tutorial describes the letterspacing facility in ZzTeX. All letterspacing
+is accomplished with the \letterspace command, which comes in two flavors:
+
+| \letterspace{*amount*}{*text*}
+
+This command letterspaces the specified text. The amount of letterspace is
+specified by the first argument, usually in ems.
+
+| \letterspace{*amount*,*space*}{*text*}
+
+This command operates like the first variant, except that the width of a
+space is specified explicitly after the letterspace amount.
+
+Note that |\letterspace| commands are usually embedded in design macros in
+the design file. Rarely does one appear directly in book files. However, to
+code titles that will be letterspaced, the compositor needs to understand
+the behavior of the |\letterspace| command.
+
+=== What Happens Automatically
+
+What a title or other text is letterspaced, the |\letterspace| command does
+the following things automatically:
+
+* Inserts the letterspace amount between adjacent pairs of keyboarded
+characters (e.g, |AB|, |01|, |l.|). A "keyboarded character" is one that
+is typed on the keyboard, not coded like |\copyright| or |\alpha|.
+
+* Replaces explicit spaces and tie characters (|~~|) with the space width
+derived from the first argument to the |\letterspace| command.
+
+* Recognizes en dashes (|--|), em dashes (|---|), and double quotes (|``...''|)
+and does not break them apart with letterspace.
+
+* Does *not* letterspace before or after ZzTeX commands, open braces (|{|), or
+close braces (|}|). This means that there will be no letterspacing around
+|\copyright|, |\ellipsis|, |\alpha|, |\times|, etc.
+*.
+
+=== Explicit Control of Letterspacing
+
+The automatic rules take care of many letterspacing problems. However,
+sometimes you need explicit control over letterspacing, so the following
+commands can be used within a title that is letterspaced. If the same
+title is carried elsewhere (such as into a running head)
+but is not letterspaced there, these commands have no effect.
+
+& |\lsp|& Insert a letterspace amount here.
+& |\lspspace|& Insert a letterspaced space here.
+& |\lspoff|& Turn off letterspacing completely.
+& |\lspon|& Restore letterspacing.
+&.
+
+=== An Example
+
+The following diabolical example shows the power of the letterspacing
+facility. Here is a chapter title that is letterspaced:
+
+ \chapter{Text Access\titlenl; ``Methods''\titlenl;
+ \lspoff$a-b'\times c$\lspon\lsp---Why~~Isn't It?}
+
+This produces the following title, where the vertical bar represents a
+letterspace and the underscore represents a space:
+
+& T&|e&|x&|t_A&|c&|c&|e&|s&|s
+& "&|M&|e&|t&|h&|o&|d&|s&|"
+& *a*&thinsp;-&thinsp;*b*&prime;&thinsp;&times;&thinsp;*c*&|---&|W&|h&|y_I&|s&|n&|'&|t_I&|t&|?
+&.
+
+If this title is used in a running head or table of contents, the control
+commands |\lspoff|, |\lspon|, and |\lsp| are ignored (as well as |\titlenl|,
+of course). Note that the |\lsp| command is necessary to produce a
+letterspace before the em-dash, since letterspacing is automatically
+supressed after the |\lspon| command.
+
+// Runners
+// -------
+
+.phrase runners runners
+.synonym running heads
+.synonym running feet
+.template
+= Running Heads and Feet
+
+Running heads and feet are collectively called *runners*. A design file can
+make use of multiple styles of runners. One is built into ZzTeX:
+
+* |blind|&_A style with empty running heads and feet.
+*.
+
+ZzTeX assumes the existence of two styles that must be defined in the
+design file:
+
+* |normal|&_The style for normal body pages.
+* |chapter|&_the style for chapter opener pages.
+*.
+
+Specific designs may use additional styles defined in the design file,
+for example:
+
+* |part|&_The style for part opener pages.
+*.
+
+For each style (except |blind|), the design file contains two definitions,
+one for the running head and one for the foot. These macros are responsible
+for formatting the header and footer, often using mark information to
+obtain chapter numbers, section titles, etc., and using |\folio| to obtain
+the page number:
+
+ \def \headernormalformat {...}
+
+ \def \footernormalformat {...}
+
+ \def \headerchapterformat {...}
+
+ \def \footerchapterformat {...}
+
+== Runner Commands
+
+The following commands are used to establish the runner styles
+for subsequent pages in the book.
+
+~foreach cmd, command_set;
+* |~.cmd;|
+~end;
+*.
+
+Those commands are lovely but rarely used explicitly, except in
+the front matter. Instead, runners are established using the |\runners|
+parameter of certain blocks.
+
+== |\runners| Parameter
+
+The |\runners| parameter is a design parameter for certain blocks in ZzTeX.
+It is usually specified in the design macros for those blocks in the design
+file, but you can override the normal styles by using the |\with| modifier on
+such blocks.
+
+The following list specifies the blocks that use the |\runner| parameter to
+perform an implicit |\setrunners| command. Each entry shows the standard
+value of the parameter:
+
+& |\part|& | \runners={blind,normal}|
+& |\quasipart|& |\runners={blind,normal}|
+& |\chapter|& |\runners={chapter,normal}|
+& |\quasichapter|& |\runners={chapter,normal}|
+& |\appendix|& |\runners={chapter,normal}|
+& |\float|& |\runners={normal}|
+&.
+
+Imagine you had a quasichapter and you wanted to suppress the drop folio
+normally set by the chapter runners. You simply do the following:
+
+ \with{\runners={blind,normal}}
+ \quasichapter{Weird Back Matter}
+
+You must remember to specify a second style of |normal| for the remaining
+pages of the quasichapter or they will all have blind runners.
+
+You can accomplish the same goal as follows:
+
+ \quasichapter{Weird Back Matter}
+ \overriderunners{blind}
+
+The |\float| block uses the |\runner| parameter to perform an implicit
+|\overriderunners| command.
+The float mechanism arranges to perform an |\overriderunners| with the
+style specified by the |\runner| parameter when it is about set a page
+containing *only floats*. If you want to suppress the running head on such a
+page:
+
+ \with{\runners={blind}}
+ \float{figure}
+
+However, see the |\userharea| block modifier for the best way to
+accomplish this.
+
+== Some Examples
+
+A book with a two-page-spread chapter opener could use the |\runners|
+parameter in the chapter design to set the correct runners for both
+opener pages:
+
+ \def \chapterdesign {%
+ ...
+ \def \paging {\freshpage{\short\floats\even}}%
+ ...
+ \runners = {blind,chapter,normal}%
+ ...}
+
+Some books have part pages but Chapter 1 occurs before Part I. If the
+running heads include the part number and title, that will probably fail in
+Chapter 1 because no part has been established. If the design file provides
+a special runners style |normalnopart| for such "part-less" chapters, you
+can use it quite easily:
+
+ \with{\runners={chapter,normalnopart}}
+ \chapter{The First Chapter}
+
+// \tabbing Block
+// -------- -----
+
+.details tabbing_details \tabbing
+.template tabbing_details
+== Tabbing Facilities
+
+This tutorial describes the ZzTeX tabbing facilities. The primary
+tabbing feature is the |\tabbing| block, which replaced the tabbing
+capability of the |\text| block in ZzTeX v17.2.
+
+=== The |\tabbing| Block
+
+The |\tabbing| command has the following syntax:
+
+| \tabbing{*type*}
+| *line of text*\nl
+| *another line*
+| &_*of text*\nl
+| ...
+| *last line of text*\nl
+| \endtabbing
+
+The *type* argument specifies the type of the tabbing block and thus its
+design. A line in the typeset block can occupy multiple lines in the
+TeX file but must end with an |\nl| command. Line breaks in the file are
+not taken verbatim. The |\nl| after the final line is optional.
+
+=== Setting Tab Stops
+
+There are two ways to set tab stops for the lines in a tabbing block.
+The first is to set uniform tab stops across the line. The distance
+between tab stops is specified by the |\defaulttabwidth| design
+parameter. If this parameter is a positive dimension, say, |14pt|,
+then tab stops are set every 14 points across the line.
+
+The second method of setting tab stops is to include a *template line*
+at the beginning of the tabbing block. For example,
+
+ \tabbing{algorithm}
+ @Cxxxxx@.xxxxx@.xxxxx@.xxxxxxxxxxxxxxx@.@D
+
+The |@C| command clears any existing tab stops. Each |@.| command
+sets a tab stop at the current width of the line. In this example,
+there will be a tab stop at the width of 5 |x| letters, 10 letters,
+15 letters, and 30 letters. The |@D| command discards the line
+so it doesn't show up on the page. The line exists only for the
+purpose of setting the stops.
+
+=== Tabbing
+
+The |@>| command is used to tab from one tab stop to the next. In this
+example, assume that tab stops are set every 14 points.
+
+ \tabbing{algorithm}
+ $\mvar{scores} = \{\}$\qquad // score accumulator maps doc IDs to scores\nl
+ \For $w\in q$ \Do\nl
+ @>\For $d, \mvar{count}\in \mvar{Idx}.\mvar{fetch}\_\mvar{docs}(w)$ \Do\nl
+ @>@>$\mvar{scores}[d] = \mvar{scores}[d] + \mvar{score}\_\mvar{term}(\mvar{count})$
+ @>\EndFor\nl
+ \EndFor\nl
+ \Return top $k$ documents from $\mvar{scores}$\nl
+ \endtabbing
+
+The third line is indented 14 points, the fourth line is indented 28 points, etc.
+
+Note that each |@>| command tabs to the next tab stop in the sequence of stops,
+regardless of whether the width of the text is beyond that stop. If the width
+of the text is beyond the next stop, the text following that stop will overprint
+the preceding text.
+
+=== Vertical Adjustments
+
+The are two ways to make vertical adjustments between lines of text.
+The first is to code a blank line:
+
+ \tabbing{algorithm}
+ $\mvar{scores} = \{\}$\qquad // score accumulator maps doc IDs to scores\nl
+ \nl
+ \For $w\in q$ \Do\nl
+
+A blank line produces the amount of vertical space specified by the
+|\tabbinggapskip| design parameter. This vertical space is usually
+less than a full line.
+
+The second method of performaing a vertical adjustment is to use the
+|\adjusttabbing| command in between two lines. Try |~.facility; \adjusttabbing|
+for more information.
+
+=== Line Numbers
+
+[To be supplied.]
+
+// \tabular Block
+// -------- -----
+
+.details tabular_details \tabular
+.template tabular_details subclass_set command tabular
+== Tabular Facilities, version 3
+
+This tutorial describes the third generation of the ZzTeX tabular
+facilities. These facilities are used to produce tabular material in
+text or in a floating table.
+
+First, some definitions:
+
+* Cell.&_The intersection of each row and column is called a cell.
+The cell contains the text at that row/column intersection.
+
+* Column.&_Tabular material is organized into vertical columns.
+Each column has a particular format, specified in the template.
+
+* Gutter.&_The gutter is the horizontal space between columns. It is
+typically 1 pica and can stretch or shrink if tables are
+to be forced to a particular width. The gutter between two
+columns can be changed on a case-by-case basis.
+
+* Interrow space.&_An extra amount of vertical space that is placed between
+rows of tabular material.
+
+* Picture.&_A sequence of characters used to determine the alignment
+of decimal-aligned numeric columns.
+
+* Row.&_Tabular material is organized into horizontal rows, with
+
+* Ruled table.&_Tabular material that includes vertical rules.
+
+* Template.&_An argument to the \tabular command that specifies the
+number of columns and the format for each column.
+*.
+
+=== The |\tabular| Command
+
+The |\tabular| command has the following syntax:
+
+| \tabular{*type*}{*template*}
+| *row* ... \cr
+| *row* ... \cr
+| ...
+| *row* ... \cr
+| \endtabular
+
+The *type* argument specifies the type of the tabular block and thus its
+design. The *template* argument specifies the number of columns and their
+associated formats (see below).
+
+Each row consists of a series of cells and is terminated by the |\cr| command
+("carriage return" or "complete row"). The cells are specified as follows:
+
+| *cell-1*&& *cell-2*&&&& *cell-4*&& ...&& *cell-n*\cr
+
+There is one cell for each column and they are separated by ampersands
+(|&&|). It is important to eliminate any spaces *preceding* the ampersands,
+although spaces following them are fine. An empty cell is allowed, as with
+the third cell above.
+
+In a ruled table, every cell in a row must be specified, although some may
+be empty (the cells corresponding to rule columns usually are). In a table
+that is not ruled, rightmost cells that are empty need not be specified.
+
+=== How ZzTeX Formats Tabular Material
+
+ZzTeX goes through the following steps to format tabular material.
+
+# The template is analyzed to check it, count the columns, and prepare the
+individual column formats.
+
+# All rows are read and each cell is formatted in its own box.
+
+# The maximum width of the cells in each column is determined, and all the
+cell boxes in that column are set to the maximum width. (See |\hidewidth| for
+an exception.)
+
+# All the boxes in each row are set side by side, with the column gutter
+between them. The widths of the rows are forced to the specified overall
+table width, if required by the design. The extra space is placed in the
+gutters.
+
+# The rows are butted together vertically, with no extra space between
+them.
+#.
+
+There are some interesting implications of this scheme:
+
+* Because every cell box in a column, except the widest, will not be filled
+with text, the template for each column must include at least one |\hfil|
+command to take up the slack. These |\hfil| commands are included in the
+builtin templates described below.
+
+* Because there is no extra space between the rows, each row must occupy the
+full height and depth of the tabular body font, plus any interrow space.
+Otherwise the rows will not be spaced uniformly. It is this requirement that
+makes ruled tables tricky.
+*.
+
+=== The Template
+
+The template argument to the |\tabular| command is coded as a sequence of
+format specifications, one for each column, in the desired order.
+
+| \tabular{*type*}{@*x* @*y* ... @*z*}
+
+The available column formats are specified as follows. Spaces and line
+breaks may appear in the template for readability.
+
+* |@l|&_Single line; text flush left.
+
+* |@c|&_Single line; text centered.
+
+* |@r|&_Single line; text flush right.
+
+* |@L{*picture*}|&_Decimal-aligned number; text flush left. See below.
+
+* |@C{*picture*}|&_Decimal-aligned number; text centered.
+
+* |@R{*picture*}|&_Decimal-aligned number; text flush right.
+
+* |@p{*width*}|&_Text set in multiple lines as one or more
+paragraphs. The width of the line is specified.
+The raggedness, hang, and paragraph skip is
+determined by the design.
+
+* |@e{*width*}|&_Empty column of the specified width.
+
+* |@s{*sequence*}|&_Special custom column. See below.
+
+* |@&||&_Column contains a vertical rule whose color and
+width are determined by the design. This is a real
+column that must be included in each row, but is
+normally empty.
+
+* |@!{*color*}{*width*}|&_Column contains a vertical rule whose color and
+width are specified.
+
+* |@>{*width*}|&_This template may appear following any of the
+above templates. It specifies the exact width of
+the gutter between the current column and the next,
+in place of the standard gutter determined by the
+design. Rule columns are surrounded by gutters half
+as wide as the standard, unless overridden with |@>|.
+If the width is follow by an asterisk (|&*|), then
+the gutter can vary in width according to the
+|\columngutter| parameter of the design.
+*.
+
+=== Decimal-Aligned Columns
+
+Decimal-aligned column templates include a picture that determines how the
+cells are aligned. The picture is composed of the following characters:
+
+& |0|& Represents a digit.
+& |.|& Specifies the position of the decimal point.
+& |,|& Indicates a comma in the number.
+& |$-$|& Indicates that the number may be preceded by a negative sign.
+& |(...)|& Indicates that the number may be surrounded by parentheses.
+&.
+
+If there is no decimal point in the picture, the cells are aligned on the
+right. If there is a decimal point, they are aligned on the point. The
+difference between left-, center-, and right-aligned number columns is
+irrelevant unless a nonnumeric cell in the column is wider than the widest
+numeric cell. In this case the numeric cells are set flush left, center, or
+right on those wider cells. This happens when the column heads are wider
+than the numbers.
+
+Because ZzTeX splits decimal-aligned numbers at their decimal points, it is
+necessary that both halves of the picture and of all the cell numbers
+be balanced with respect to braces and dollar signs.
+
+=== Special Custom Columns
+
+A special custom column can be used to construct a complex column that
+contains boilerplate material. For example, imagine a left column in which
+all entries should be in italic and enclosed in parentheses. This column
+could be specified as follows:
+
+| \tabular{table}{... @s{\emph{(#)}\hfil} ...}
+| ...& special& ...\cr
+| ...& critical& ...\cr
+
+The two cells would appear in italic in this format:
+
+| ... *(special)* ...
+| ... *(critical)* ...
+
+Each cell is formatted by replacing the template sequence's sharp sign (|#|)
+with the text specified in the row cell, then using the resulting sequence as
+the final text of the cell. In the first row above, the final text would be
+|\emph{(special)}\hfil|. Note that the template includes an |\hfil| command to
+take up the slack and left-align the text. Don't forget the sharp sign and
+at least one |\hfil|.
+
+=== |\tabular| Tools
+
+The following list includes all the tools that can be used with a |\tabular|
+block. You can explore these various commands to learn what they do.
+
+~foreach name, name_set;
+* |~.name;|
+~end;
+*.
+
+// \todo Block
+// ----- -----
+
+.details todo_details \todo
+.template todo_details
+== To-Do Facility
+
+The to-do facility allows you to place a
+reminder in a book file and optionally to typeset '???' to represent text
+that is still to come.
+
+The \todo command has three forms. The first form is used most frequently.
+
+| \todo{This math display needs to be cleaned up later.}
+
+This command displays the message on your console and includes it in the log
+file. Processing continues without interruption. A summary of the number of
+to-do reminders is displayed at the end of the run.
+
+| \todo{!Cannot continue until this table is formatted correctly.}
+
+This variant includes the message in the log file, but then generates a
+warning message and halts execution. You can continue processing by
+pressing Enter. Use this variant to force a halt when the division is
+processed.
+
+| \todo{?cover image credit}
+
+This command is similar to the first variant, but also typesets a triple
+question mark (|???|) where the |\todo| appears. You can use this variant to set
+the standard triple question mark where text will be supplied later.
+
+To obtain a list of all the outstanding to-dos, try |~.facility; to-dos|.
+
+.end
diff --git a/macros/plain/contrib/zztex/doc/zzphrase.dat b/macros/plain/contrib/zztex/doc/zzphrase.dat
new file mode 100644
index 0000000000..5265a53372
--- /dev/null
+++ b/macros/plain/contrib/zztex/doc/zzphrase.dat
@@ -0,0 +1,3085 @@
+//---------------------------------------------------------------------------
+//
+// Copyright (c) 2012--2018 by Paul C. Anagnostopoulos
+//
+// This software may be used on your own computer systems and may
+// be distributed freely to other people. It may not be sold or
+// incorporated into any commercial products.
+//
+// Paul C. Anagnostopoulos
+// Windfall Software
+// 978 371-2316
+// paul@windfall.com
+//
+//---------------------------------------------------------------------------
+//
+// ZzExplore: Describe built-in TeX, Plain TeX, ZzTeX, and design
+// file entities for compositors.
+//
+// This is the main phrase file.
+//
+// Created: 3 March 2016
+
+
+// The following three templates are used to produce helpful explanations
+// for phrases that do not match.
+
+// No match to phrase
+
+.template no_match
+= No Match
+Your request: ~.phrase;
+
+There is no match for "~.word;".
+
+~if not empty? choice;
+Some possibilities are:
+~foreach ph, choice;
+* ~.ph;
+~end;
+*.
+~fi;
+----
+If you think your request is reasonable, please inform Paul.
+
+// Ambiguous match to phrase
+
+.template ambiguous_match
+= Ambiguous Match
+Your request: ~.phrase;
+
+The word "~.word;" is ambiguous.
+
+Some possibilities are:
+~foreach ph, choice;
+* ~.ph;
+~end;
+*.
+----
+If you think your request is unambiguous, please inform Paul.
+
+// Partial phrase
+
+.template partial_phrase
+= Partial Phrase
+Your request: ~.phrase;
+
+These words match the beginning of a phrase, but additional
+words are needed.
+
+~if not empty? choice;
+Some possibilities are:
+~foreach ph, choice;
+* ~.ph;
+~end;
+*.
+~fi;
+
+If you are looking for a concept instead of specific examples,
+it might help to try the plural of the word.
+----
+If you think your request is complete enough to produce
+a description, please inform Paul.
+
+// Help Text
+// ---- ----
+
+
+// Help
+
+.phrase help help : text
+.template
+= ~.facility; v~.version;
+
+~.facility; allows you to view descriptions of characters, commands,
+block designs, and other entities that are defined by built-in TeX,
+Plain TeX, ZzTeX, and book design files. It can also present more
+detailed reports on concepts such as tags and tabular material.
+
+Invoke ~.facility; as follows:
+
+| > ~.facility; *word* *word* ...
+
+The *word* parameters form a phrase that ~.facility; uses to determine
+which information you want to see. If you don't include any words, this
+help text is displayed. Do *not* include question words and verbs in your
+request (e.g., "what is").
+
+~include command_line_chars;
+
+Without any options, the description is displayed on your terminal. If you
+want to view a more stylish description in your browser, enter
+
+| > ~.facility; -browser *word* *word* ...
+
+The browser starts up in an independent window, allowing you to work and
+read the description at the same time. Remember that you can close the
+browser window with Alt+F4.
+
+It is recommended that you add the following
+alias to your 4NT/Take Command alias file:
+
+ exp*lore=~.facility; -browser %$
+
+For a list of interesting examples of ~.facility;, enter
+
+| > ~.facility; examples
+
+For a list of what's new in version ~.version; and earlier versions, enter
+
+| > ~.facility; what's new
+
+.phrase examples examples : text
+.template
+= Examples
+
+Here are some examples of things you can do with ~.facility;.
+
+* To see an overview of the current project:
+
+ ~.facility; overview
+
+* To learn about a particular command:
+
+ ~.facility; \overrideparlength
+
+* To find out whether a command is available for the current book:
+
+ ~.facility; \separatefloat
+
+* To get information about a particular math character:
+
+ ~.facility; \beta
+
+* To find out which types of enunciations or lists are available:
+
+ ~.facility; enunciations
+ ~.facility; lists
+
+* To see some details about a particular enunciation:
+
+ ~.facility; \enunciation theorem
+
+* To learn the names of the zzd design macros for enunciations:
+
+ ~.facility; enunciation designs
+
+* To see all the details about the design of a particular enunciation:
+
+ ~.facility; \enunciationtheoremdesign details
+
+* To learn what a count register is:
+
+ ~.facility; counts
+
+* To get a list of all count registers or learn about a particular one:
+
+ ~.facility; all counts
+ ~.facility; \sectionnumber
+
+* To see which type styles are available in the current book:
+
+ ~.facility; type styles
+
+* To find out which type relationship commands are available
+for a particular style:
+
+ ~.facility; \tt
+
+* To find out which styles are established for a particular type
+size and whether they can be used in math:
+
+ ~.facility; \footnotesize
+
+.phrase whats_new what's new : text
+.synonym what is new
+.template
+= What's New in ~.facility; v~.version;
+
+* Complete description of the |\enunciation| block.
+* Complete description of the indexing facility.
+* Report of all bibliography entries for the project.
+* Report of missing art files.
+* List of commands for bibliography citations.
+* Improved word matching for design elements that are not blocks.
+* Improved report on at-sign commands.
+* Complete documentation on the ZzSizeArt utility.
+* Complete documentation on the new |\tabbing| block.
+*.
+
+== What's New in ~.facility; v1.1
+
+* This "what's new" report.
+* Improved report on math classes.
+* Improved report on individual characters.
+* Improved report on Greek letter commands.
+* Report on the new |\immediatemathdisplay| modifier.
+* Improved report on the |\immediatesublist| modifier.
+* Reports on the new |\breakabove| and |\breakbelow| modifiers.
+* Improved reports on the |\bottomfloat| et al. modifiers.
+* New page make-up report.
+* Complete documentation on the |\tabular| block and related commands.
+* Lists of commands for horizontal spacing and vertical spacing.
+* Report on penalties.
+* Complete documentation on the |\todo| command.
+* Complete documentation on the title adjustment commands.
+* Report on block modifiers.
+* Complete documentation on the |\code| block and related commands.
+* Improved documentation on tags.
+* Complete documentation on the various forms of |\eqno|.
+* Complete documentation on the |\letterspace| command.
+* Complete documentation on the |\art| block.
+* Complete documentation on running heads and feet (runners).
+*.
+
+// ZzTeX et al Phrases
+// ----- -- -- -------
+
+
+// Accents
+
+.phrase accents accents
+.synonym text accents
+.template
+= Accent Commands
+
+An accent command produces an accent over a character.
+For example,
+
+ Ha\v{c}ek na\"{\i}vet\'e, anyone?
+
+produces
+
+& Ha&ccaron;ek na&iuml;vet&eacute;, anyone?
+&.
+
+Here is a list of all the accent commands.
+
+&= Command& Description
+----
+~foreach acc, accent_table;
+& |~.acc;|& ~.accent_table[acc];
+~end;
+&.
+----
+For information on a specific accent, try |~.facility; \*name*|.
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_accent <name> accent
+.synonym accent <name>
+.synonym <name> text accent
+.synonym text accent <name>
+.template
+= |~.name;| Accent Command
+
+~include common_info;
+
+~.comment;
+
+An accent command produces an accent over a character.
+----
+For a list of all accents, try |~.facility; accents|.
+
+// Attributes
+
+.phrase attributes attributes : text
+.synonym command attributes
+.template
+= Attributes
+
+When ~.facility; reports information about commands, math characters, and
+other entities, it includes an item called *attributes*. An attribute
+specifies special behavior of the command or character. Here is a list
+of all the attributes.
+
+* internal: The command is internal to Plain TeX or ZzTeX and is never
+used directly in design or book files.
+* long: The argument to the command can include multiple paragraphs.
+* outer: The command can only be used directly in a book file; it cannot
+be used by another command.
+* limits: The large operator (e.g., |\sum|) sets its limits above and below.
+* no limits: The large operator sets its limit as sub- and
+superscripts.
+* display limits: The large operator set its limits above and below when
+used in a math display; as scripts when used in text.
+*.
+
+// Blocks
+
+.phrase blocks blocks : text
+.synonym elements
+.template
+= Blocks
+
+The block is the primary design element provided by ZzTeX design
+files. A block generally spans a large amount of text that must
+be formatted in a special way. Examples are lists, footnotes,
+and framed text.
+
+Most blocks are started and ended with specific commands:
+
+ \list{bullet}
+ \item ...
+ ...
+ \endlist
+
+A few blocks, however, are started and ended with the same command:
+
+ \footnote{This is a footnote that will appear at the bottom.}
+
+A footnote has only one design style, or *type*. However, there can be an
+arbitrary number of different types of lists, such as bullet, number,
+label, and dialog. If a block requires a type, the type name is the first
+argument to the block command, as with |\list{bullet}| above.
+
+Two blocks, |\text| and |\list|, can also be nested to produce, say,
+multi-level lists. ZzTeX maintains the level counter automatically.
+
+Each block type and level has its own design. The designs are
+embodied in design macros in the design file. For example,
+the name of the design macro for a second-level bullet list is
+|\listbulletiidesign|. A design macro is essentially a list of
+assignments to *parameters* that control the formatting of the
+block's text.
+
+There are two ways to modify the design of a specific block.
+The first is to use a variant modifier, which produces predetermined
+changes to the design. Try |~.facility; variants| for more information.
+The second method is the |\with| modifier, which alters specified
+design parameters for the block. Try |~.facility; \with| for
+more information.
+----
+For a list of all the available blocks, try |~.facility; all blocks|.&/
+For details on a specific block, try |~.facility; \*name*|.
+
+.phrase all_blocks all blocks
+.template
+= List of Blocks
+
+This is the list of all the block elements available in ZzTeX.
+
+&= & Multiple& Can be& Used in
+&= Block command& types?& nested?& ~.project; design?
+----
+~foreach blk, type_table;
+& |~.blk;|& ~.type_table[blk];& ~.nest_table[blk];& ~.used_table[blk];
+~end;
+&.
+----
+For more information, try |~.facility; blocks|&/
+For information on a particular block, try |~.facility; \*name*|
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_block <name> block
+.synonym block <name>
+.synonym <name> element
+.synonym element <name>
+.synonym <name> types
+.synonym <nb-name>
+.synonym <nb-name> blocks
+.synonym <nb-name> elements
+.synonym <nb-name> types
+.synonym <nb-name-s>
+.template
+= |~.name;| Block
+
+~include common_info;
+
+~.comment;
+
+The ~.name; block is one of the primary elements supported
+by ZzTeX.
+
+~if not used?;
+This block is not used in the ~.project; book.
+~elsif empty? level_table;
+This block is used in the ~.project; book.
+A ~.name; does not have multiple design types. Its single
+design is defined in ~.design_where;.
+~else;
+This table presents all the different
+types of |~.name;| blocks available in the ~.project; design.
+
+&= Type& Levels& Defined
+----
+~foreach type, level_table;
+& |~.type;|& ~.level_table[type];& ~.where_table[type];
+~end;
+&.
+~fi;
+----
+To see a description of this block's design parameters,
+try |~.facility; ~.name; parameters|.&/
+~if used?;~
+To see some details about the |~.name;| design~* not empty? level_table; for the ~.project;
+book, try |~.facility; ~.name; design|.&/~
+~fi;
+For more information about blocks in general, try |~.facility; blocks|.&/
+For a list of all available blocks, try |~.facility; all blocks|.&/
+
+.phrase block_params <name> parameters
+.synonym <name>=\mathdisplay:$$ parameters
+.synonym <name> design parameters
+.synonym <name>=\mathdisplay:$$ design parameters
+.template
+= |~.name;| Block Design Parameters
+
+Here is a list of all the design parameters for the |~.name;|
+block.
+
+&= Parameter& Type& Description
+----
+~foreach param, type_table;
+& |~.param;|& ~.type_table[param];& ~.desc_table[param];
+~end;
+&.
+
+// Block variants
+
+.phrase block_variants block variants : text
+.synonym variants
+.synonym design variants
+.template
+= Block Variants
+
+A block variant is a modifier that can be applied to a block
+command to alter the design of the block. Variants may only
+be applied to block commands.
+
+For example, the |\widefigure| variant might be applicable
+to a |\float| command to select a wider style for the figure.
+
+ \widefigure \float{figure}
+
+Often there is a group of variants that all vary the design
+of a block is related ways. For example, in addition to
+|\widefigure| we might have
+
+* |\sidebysidefigure|
+* |\widefigure|
+* |\broadsidefigure|
+*.
+
+Each of these modifiers applies to a figure float and vary its
+design in specific ways. The three variants are mutually exclusive:
+only one may be specified on any given |\float| command.
+----
+For more information about a specific variant, try |~.facility; \*name*|.&/
+To see a list of variants for a specific block, try |~.facility; \*block*|.
+
+.phrase one_block_variant <name>
+.synonym <name> variant
+.synonym variant <name>
+.synonym <name> block variant
+.synonym block variant <name>
+.synonym <name> design variant
+.synonym design variant <name>
+.template
+= |~.name;| Block Variant
+
+~include common_info;
+
+~.comment;
+
+A block variant is a modifier that can be applied to a block
+command to alter the design of the block. This variant
+applies to the |~.block;| block. It is a member of a group
+of variants:
+
+~foreach i, variant_list;
+* |~.variant_list[i];|
+~end;
+*.
+
+----
+For more information on block variants, try |~.facility; variants|.
+
+// Block modifiers
+
+.phrase block_modifiers block modifiers
+.synonym modifiers
+.template
+= Block Modifiers
+
+A block modifier is a command that can be applied to a block
+to alter the design of the block. Modifiers may only
+be applied to block commands.
+
+For example, the |\bottomfloat| modifier can be applied to
+a |\float| command to place the float at the bottom of the page.
+
+ \bottomfloat \float{figure}
+
+Note that block variants are another type of block modifier.
+
+Here is a list of all the block modifiers provided by ZzTeX and
+the ~.project; design. It does not include block variants.
+
+&= Modifier& Where defined
+----
+~foreach mod, where_table;
+& |~.mod;|& ~.where_table[mod];
+~end;
+&.
+----
+For more information about a specific modifier, try |~.facility; \*name*|.&/
+For more information on block variants, a type of modifier,
+try |~.facility; variants|.
+
+.phrase one_block_modifier <name>
+.synonym <name> modifier
+.synonym modifier <name>
+.synonym <name> block modifier
+.synonym block modifier <name>
+.template
+= |~.name;| Block Modifier
+
+~include common_info;
+
+~.comment;
+
+A block modifier is a command that can be applied to a block
+to alter the design of the block.
+----
+For more information on block modifiers, try |~.facility; modifiers|.
+
+// Box registers
+
+.phrase boxes box registers : text
+.synonym boxes
+.template
+= Box Registers
+
+A box register contains a box that has horizontal or vertical material
+in it. A box can contain a paragraph, a vertical sequence of paragraphs,
+a short text fragment for measuring, etc.
+
+A box register is accessed and set as follows:
+
+| \box \*name*
+| \setbox \*name* = \hbox {*horizontal material*}
+| \setbox \*name* = \vbox {*vertical material*}
+| \setbox \*name* = \vtop {*vertical material*}
+
+Boxes are never used directly in book files.
+----
+For a list of all boxes, try |~.facility; all boxes|.&/
+For information on a particular box, try |~.facility; \*name*|
+
+.phrase all_boxes all box registers
+.synonym all boxes
+.template
+= List of Box Registers
+
+This is the list of all box registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; boxes|
+
+.phrase one_box <name>
+.synonym <name> box
+.synonym box <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> box register
+.synonym box register <name>
+.template
+= |~.name;| Box Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A box register contains a box that has horizontal or vertical material
+in it. A box can contain a paragraph, a vertical sequence of paragraphs,
+a short text fragment for measuring, etc.
+----
+For more information, try |~.facility; boxes|
+
+// Catcodes
+
+.phrase catcodes catcodes
+.synonym category codes
+.synonym character categories
+.synonym character category codes
+.template
+= Catcodes (Category Codes)
+
+A category code is assigned to every character read by TeX as it
+processes files. A character's category code determines how TeX handles
+that character.
+
+Here is a list of all the category codes.
+
+&= Number& Name& Meaning (example)
+----
+~foreach i, name_table;
+& ~.i;& |~.name_table[i];|& ~.meaning_table[i];
+~end;
+&.
+
+.phrase one_catcode <name>
+.synonym <name> catcode
+.synonym catcode <name>
+.synonym <name> category code
+.synonym category code <name>
+.template
+= |~.name;| Category Code
+
+~include common_info;
+
+~.comment;
+
+Value: ~.value;
+
+A category code is assigned to every character read by TeX as it
+processes files. A character's category code determines how TeX handles
+that character.
+----
+For more information and list of all catcodes, try |~.facility; catcodes|
+
+// Characters
+
+.phrase characters characters
+
+.phrase one_character <name>
+.synonym <name>=`T:tab
+.synonym <name>=`F:formfeed
+.synonym <name>=`R:newline
+.synonym <name>=`_:space
+.synonym <name>=":quote
+.synonym <name>=%:percent
+.synonym <name>=&:ampersand
+.synonym <name>=':apostrophe
+.synonym <name>=(:lparen
+.synonym <name>=,:comma
+.synonym <name>=<:less
+.synonym <name>=>:greater
+.synonym <name>=^:hat
+.synonym <name>=`=:equal
+.synonym <name>=``:backquote
+.synonym <name>=|:bar
+.template
+= ~.name; Character
+
+~include common_info;
+
+~.comment;
+
+& Catcode:& |~.catcode;|
+& Font position:& |~.position;|
+& Math class:& |~.math_class;|
+& Math family:& |~.math_family;|
+&.
+----
+For information on catcodes, try |~.facility; catcodes|.&/
+For information on math classes, try |~.facility; classes|.&/
+For information on math families, try |~.facility; families|.
+
+// Citation commands
+
+.phrase citations citations
+.synonym citation commands
+.template
+= Citation Commands
+
+A citation command is a command that accepts a bibliography item tag and produces
+a citation (reference) to that item. For example
+
+ As \citenoun{smith16} describes, the widget ...
+
+might produce
+
+& As Smith [2016] describes, the widget ...
+&.
+
+The following table lists all the citation commands available
+for the ~.project; book. Be careful to read about the commands
+defined in the design file (~.project;.zzd) first; some of
+them might specify that certain other citation commands should
+not be used.
+
+&= Command& Defined
+----
+~foreach cmd, where_table;
+& |~.cmd;|& ~.where_table[cmd];
+~end;
+&.
+
+// Command line
+
+.phrase command_line command line : text
+.template
+= Command Line
+
+Some characters are difficult or impossible to specify on the
+4NT/Take Command command line. The following table shows how to
+specify such characters by themselves or as the second
+character of a character command.
+
+& & How to Specify& How to Specify
+& Character& Character& Character Command
+----
+& <newline>& |newline|& |\.newline|
+& <formfeed>& |formfeed|& |\.formfeed|
+& <space>& |space|& |\.space|
+& |"|& |quote|& |\.quote|
+& |%|& |percent|& |\.percent|
+& |&&|& |ampersand|& |\.ampersand|
+& |'|& |apostrophe|& |\.apostrophe|
+& |(|& |lparen|& |\.lparen|
+& |,|& |comma|& |\.comma|
+& |<|& |less|& |\.less|
+& |&=|& |equal|& |\.equal|
+& |>|& |greater|& |\.greater|
+& |^|& |hat|& |\.hat|
+& |`|& |backquote|& |\.backquote|
+& |&||& |bar|& |\.bar|
+&.
+
+// Commands
+
+.phrase commands commands
+.synonym macros
+.template
+= Commands
+
+Commands are the primary entity with which TeX files are coded
+to produce beautiful text. A command name consists of a backslash
+(|\|) followed by
+
+* A sequence of upper- and lowercase letters (e.g., |\sin|), or
+* A single non-letter character (e.g., |\,|)
+*.
+
+Command names are *case-sensitive;* that is, an uppercase letter
+is different from the same lowercase letter. So |\big| and |\Big|
+are two different commands.
+
+A command name can operate by itself or it can require *arguments,*
+which are pieces of text that the command uses to perform its
+function. Arguments are usually enclosing in braces (|{|...|}|).
+However, if there is a single argument composed of a single Roman
+or Greek letter, then no braces are necessary.
+
+ For example, you can set an acute accent on a character using
+ braces, as in \'{a}, but the braces aren't necessary: \'a.
+
+When scanning a command, TeX has one rule that can cause trouble.
+Spaces and a single line break following a letter command are ignored.
+So the text
+
+ Don't you love the text that \TeX can produce?
+
+will result in the following:
+
+& Don't you love the text that TeXcan produce?
+&.
+
+There are two solutions, the first of which is preferred.
+
+ Don't you love the text that \TeX\ can produce?
+ Don't you love the text that \TeX{} can produce?
+
+Command names containing an at-sign (|@|) or beginning with '|z|'
+are internal to TeX and ZzTeX.
+----
+For information on a specific command, try |~.facility; \*name*|.&/
+For information on the attributes item included with individual
+command descriptions, try |~.facility; attributes|.&/
+~include command_line_chars;
+
+== Command Counts
+
+For your edification, this table presents the number of commands
+defined by TeX and ZzTeX.
+
+&= Count& Origin of command
+----
+& ~.builtin_count;& Built-in TeX
+& ~.plain_count;& Plain TeX macro package (many superceded by ZzTeX)
+& ~.zztex_count;& ZzTeX macro package
+& ~.zzd_count;& Design file(s)
+&.
+
+.phrase one_command <name>
+.synonym <name>=\`R:\.newline
+.synonym <name>=\`_:\.space
+.synonym <name>=\":\.quote
+.synonym <name>=\':\.apostrophe
+.synonym <name>=\,:\.comma
+.synonym <name>=\^:\.hat
+.synonym <name>=\`=:\.equal
+.synonym <name>=\``:\.backquote
+.synonym <name>=\mathdisplay:$$
+.synonym <name> command
+.synonym <name>=\`R:\.newline command
+.synonym <name>=\`_:\.space command
+.synonym <name>=\":\.quote command
+.synonym <name>=\':\.apostrophe command
+.synonym <name>=\,:\.comma command
+.synonym <name>=\^:\.hat command
+.synonym <name>=\`=:\.equal command
+.synonym <name>=\``:\.backquote command
+.synonym command <name>
+.synonym <name> macro
+.synonym macro <name>
+.template
+= |~.name;| Command
+
+~include common_info;
+
+~.comment;
+----
+~include command_info;
+
+// Count registers
+
+.phrase counts count registers : text
+.synonym counts
+.template
+= Count Registers
+
+A count register contains an integer that can be used as a counter,
+to number elements, to hold an integer parameter value, etc.
+
+A count register is accessed and set as follows:
+
+| \*name*
+| \*name* = *integer*
+
+Counts are rarely used directly in book files.
+----
+For a list of all count registers, try |~.facility; all counts|.&/
+For information on a particular count register, try |~.facility; \*name*|.
+
+.phrase all_counts all count registers
+.synonym all counts
+.template
+= List of Count Registers
+
+This is the list of all count registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; count registers|
+
+.phrase one_count <name>
+.synonym <name> count
+.synonym count <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> count register
+.synonym count register <name>
+.template
+= |~.name;| Count Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A count register contains an integer that can be used as a counter,
+to number elements, to hold an integer parameter value, etc.
+----
+For more information, try |~.facility; counts|
+
+// Declarations
+
+.phrase declarations declarations : text
+.template
+= Declarations
+
+A TeX declaration has a name like a command, but it does not
+take any arguments. Instead, it pertains to the following text in
+the current brace group.
+
+Example: |{\it *text*}|
+
+The *text* is set in italic style, but text following the close brace
+is not. The braces limit the scope of the declaration.
+
+Declarations are used in design files but rarely in book files.
+There is almost always a command that should be used instead.
+
+Example: |\emph{*text*}|
+----
+For information on commands, try |~.facility; commands|
+
+.phrase one_declaration <name>
+.synonym <name> declaration
+.synonym declaration <name>
+
+// Designs
+
+.phrase designs designs : text
+.synonym block designs
+.template
+= Block Designs
+
+A block design is embodied in a macro usually located in a
+book's design file. There are a few block designs built into
+ZzTeX. The block design macro contains a list of block
+parameter assignments that together specify the features
+and format of the block.
+
+The block design macro name comes in three flavors.
+
+& |\def \footnotedesign|& The block does not have multiple types
+& |\def \floatfiguredesign|& The block has multiple types
+& |\def \listbulletidesign|& The block has multiple types and levels
+&.
+
+Within the design macro definition is a sequence of parameter
+assignments and other TeX coding to establish the design for
+that particular block, block type, or block type/level. Each
+time ZzTeX encounters a block in a book file, it executes the
+design macro to establish the design, then processes the contents
+of the block.
+----
+To see details about a design, try things like:
+
+| ~.facility; \listbulletidesign
+| ~.facility; \float{figure}
+| ~.facility; list bullet i
+
+// The phrases for a block with no type; e.g., \footnotedesign.
+
+.phrase one_design_notype <name>
+.synonym <name> macro
+.synonym <block> design
+.synonym <block>=\mathdisplay:$$ design
+.synonym <block> design macro
+.synonym <nb-block> design
+.synonym <nb-block> design macro
+.template
+= |~.name;| Design Macro
+
+~include common_info;
+
+~include design_info;
+
+~.comment;
+----
+~include gory_details;
+
+// The phrases for a block with a type, but no type specified.
+
+.phrase-dups one_design_type_general <block> designs
+.synonym <block> design macros
+.synonym <nb-block> designs
+.synonym <nb-block> design macros
+.template
+= |~.block;| Design Macros
+
+The following table shows a list of all the design macros
+available in the ~.project; book for the various types of |~.block;|.
+
+&= Design Macro& Element
+----
+~foreach des, design_table;
+& |~.des;|& ~.design_table[des];
+~end;
+&.
+----
+For information on a specific type, try |~.facility; ~.block; *type*|.
+
+// The phrases for a block with a specified type.
+
+.phrase one_design_type_specific <name>
+.synonym <name> macro
+.synonym <block> <type>
+.synonym <block> <type> design
+.synonym <block> <type> design macro
+.synonym <nb-block> <type>
+.synonym <nb-block> <type> design
+.synonym <nb-block> <type> design macro
+.synonym <type> <nb-block-s>
+.synonym <type> <nb-block> designs
+.synonym <type> <nb-block> design macros
+.template
+= |~.name;| Design Macro
+
+~include common_info;
+
+~include design_info;
+
+~.comment;
+----
+~include gory_details;
+
+// The phrases for a block with a type and level, but no type or level specified.
+
+.phrase-dups one_design_level_general <block> designs
+.synonym <block> design macros
+.synonym <nb-block> designs
+.synonym <nb-block> design macros
+.synonym <block> <type> designs
+.synonym <block> <type> design macros
+.synonym <nb-block> <type> designs
+.synonym <nb-block> <type> design macros
+.synonym <type> <nb-block-s>
+.synonym <type> <nb-block> designs
+.synonym <type> <nb-block> design macros
+.template
+= |~.block;| Design Macros
+
+The following table shows a list of all the design macros
+available in the ~.project; book for the various types of |~.block;|.
+
+&= Design Macro& Element
+----
+~foreach des, design_table;
+& |~.des;|& ~.design_table[des];
+~end;
+&.
+----
+For information on a specific type and level,
+try |~.facility; ~.block; *type* *level*|.
+
+// The phrases for a block with a specified type and level.
+
+.phrase one_design_level_specific <name>
+.synonym <name> macro
+.synonym <block> <type> <level>
+.synonym <block> <type> <level> design
+.synonym <block> <type> <level> design macro
+.synonym <nb-block> <type> <level>
+.synonym <nb-block> <type> <level> design
+.synonym <nb-block> <type> <level> design macro
+.template
+= |~.name;| Design Macro
+
+~include common_info;
+
+~include design_info;
+
+~.comment;
+----
+~include gory_details;
+
+.phrase design_details <name> details
+.template
+= ~.name; Design Details
+
+~include common_info;
+
+~include design_info;
+
+~if not empty? inblock_set;
+The design is modified when the block appears inside these surrounding blocks:
+~foreach blk,inblock_set,iter;~,blk,iter /= 1;~end;
+~fi;
+
+Here is a table of all the parameter values set by this design macro.
+
+&= Parameter& Type& Value& Note
+----
+~foreach param, type_table;
+& |~.param;|& ~.type_table[param];& |~.value_table[param];|& ~.note_table[param];
+~end;
+&.
+
+~if affected?;
+(Some parameters may be missing due to design changes caused by variants
+or nesting inside outer blocks.)
+~fi;
+----
+For the complete story on this design, see ~.where;.
+
+// Dimen registers
+
+.phrase dimens dimension registers : text
+.synonym dimensions
+.template
+= Dimen(sion) Registers
+
+A dimen register contains a dimension that can be used as the width,
+height, or depth of a box, an indentation amount, a page dimension, etc.
+
+A dimen register is accessed and set as follows:
+
+| \*name*
+| \*name* = *dimension*
+
+Dimensions are rarely used directly in book files.
+----
+For a list of all dimen registers, try |~.facility; all dimens|.&/
+For information on a particular dimen register, try |~.facility; \*name*|.
+
+.phrase all_dimens all dimension registers
+.synonym all dimensions
+.template
+= List of Dimen(sion) Registers
+
+This is the list of all dimen registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; dimen registers|
+
+.phrase one_dimen <name>
+.synonym <name> dimension
+.synonym dimension <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> dimension register
+.synonym dimension register <name>
+.template
+= |~.name;| Dimen(sion) Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A dimen(sion) register contains a dimension that can be used as the width,
+height, or depth of a box, an indentation amount, a page dimension, etc.
+----
+For more information, try |~.facility; dimens|
+
+// Encodings
+
+.phrase encodings style encodings
+.synonym encodings
+.synonym font encodings
+.template
+= Style Encodings
+
+A style encoding is an integer value that specifies the overall organization
+of the fonts associated with that style. For example:
+
+* \encoderoman is the encoding for typical Roman text fonts.
+* \encodeitalic is the encoding for typical italic text fonts.
+* \encodemathitalic is the encoding for math fonts containing
+italic letters for use as variables.
+*.
+
+The encoding for a type style is specified in the |\definetypestyle|
+command for that style.
+
+Here are all the style encodings supported by ZzTeX.
+
+&= Encoding& Value& Meaning
+----
+~foreach val, value_set;
+& ~.encoding_table[val];& ~.val;& ~.meaning_table[val];
+~end;
+&.
+----
+For a list of type styles and their encodings, try |~.facility; type styles|.
+
+.phrase one_encoding <name>
+.synonym <name> encoding
+.synonym encoding <name>
+.synonym <name> style encoding
+.synonym style encoding <name>
+.synonym <name> font encoding
+.synonym font encoding <name>
+.template
+= |~.name;| Style Encoding
+
+~include common_info;
+
+~.comment;
+
+Value: ~.value;
+
+A style encoding is an integer value that specifies the overall organization
+of the fonts associated with that style.
+----
+For more information and list of all encodings, try |~.facility; style encodings|
+
+// End-of-enunciation dingbats
+
+.phrase eoe_dingbats end-of-enunciation dingbats : text
+.synonym dingbats
+.synonym eoe dingbats
+.synonym enunciation dingbats
+.template
+= End-of-Enunciation Dingbats
+
+An end-of-enunciation dingbat (eoe dingbat) is an icon that is set
+at the end of an enunciation. A mathemtical proof, for example, almost
+always has a dingbat at the end. The command for the dingbat would be
+|\qed|.
+
+The dingbat is set automatically at the end of the enunciation, or you
+can specify it explicitly using its command name.
+----
+For information on a specific dingbat, try |~.facility; \*name*|
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_eoe_dingbat <name> dingbat
+.synonym dingbat <name>
+.synonym <name> eoe dingbat
+.synonym eoe dingbat <name>
+.synonym <name> enunciation dingbat
+.synonym enunciation dingbat <name>
+.synonym <name> end-of-enunciation dingbat
+.synonym end-of-enunciation dingbat <name>
+.template
+= |~.name;| End-of-Enunciation Dingbat Command
+
+~include common_info;
+
+~.comment;
+
+& Text of dingbat:& |~.text;|
+& Position:& |~.position;|
+&.
+
+An end-of-enunciation dingbat (eoe dingbat) is an icon that is set
+at the end of an enunciation.
+----
+For information on dingbats in general, try |~.facility; dingbats|
+
+// Enumerated Names
+
+.phrase one_chardef_enum <name>
+.template
+= ~.name; Symbolic Number
+
+~include common_info;
+
+~.comment;
+
+Value: ~.value;
+
+A symbolic number is a name assigned to a number to make it easier
+to refer to the number without having to remember its value. A symbolic
+number is often referred to as an *enumerated value.*
+
+~include internal_note;
+
+// Flags
+
+.phrase flags flags : text
+.synonym booleans
+.template
+= Flags
+
+A flag is a true/false (boolean) value stored in a TeX macro
+(not a register). It can be used to specify a yes/no option,
+the state of some binary choice, the result of a test, etc.
+
+A flag is accessed and set as follows:
+
+| \*name*
+| \setflag \*name* = \true
+| \setflag \*name* = \false
+
+Flags are rarely used directly in book files.
+----
+For a list of all flags, try |~.facility; all flags|.&/
+For information on a particular flag, try |~.facility; \*name*|.
+
+.phrase all_flags all flags
+.synonym all booleans
+.template
+= List of Flags
+
+This is the list of all flags available in ZzTeX.
+
+&= Name& Description
+----
+~foreach flag, flag_table;
+& |~.flag;|& ~.flag_table[flag];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; flags|
+
+.phrase one_flag <name>
+.synonym <name> flag
+.synonym flag <name>
+.synonym <name> boolean
+.synonym boolean <name>
+.template
+= |~.name;| Flag
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A flag is a true/false (boolean) value stored in a TeX macro
+(not a register). It can be used to specify a yes/no option,
+the state of some binary choice, the result of a test, etc.
+----
+For more information, try |~.facility; flags|
+
+// Fonts
+
+.phrase fonts fonts : text
+.synonym type fonts
+.template
+= Font Declarations
+
+A font declaration establishes the type font for the current brace
+group. In TeX, a font is a specific type family and style set at a
+particular size. Some common examples:
+
+&= Font Declaration& Family, Style, Size
+----
+& |\tenhalfrm|& morg at 10.5pt& (|morg| is Minion-Regular)
+& |\tenhalfmit|& mtmiz at 10.5pt& (|mtmiz| is MathTime Math Italic)
+& |\tenhalfit|& moi at 10.5pt& (|moi| is Minion-Italic)
+& |\twelvedbf|& Flama-Bold at 12pt
+&.
+
+Font declarations are never used directly in design or book files, instead
+operating behind the scenes when font sizes and styles are selected.
+----
+For a list of all fonts in the ~.project; book, try |~.facility; all fonts|.&/
+For information about a particular font, try |~.facility; \*name*|.&/
+For information on type sizes or styles, try |~.facility; sizes| or
+|~.facility; styles|.
+
+.phrase all_fonts all fonts
+.template
+= List of Fonts
+
+This is the list of all the fonts used in the ~.project; book.
+
+&= Fonts& Family, style, size
+----
+~foreach font, font_table;
+& |~.font;|& ~.font_table[font];
+~end;
+&.
+----
+For more information, try |~.facility; fonts|.
+
+// (Assumes that the 'one_declaration' group will also be populated.)
+.phrase one_font <name> font
+.synonym font <name>
+.synonym <name> type font
+.synonym type font <name>
+.template
+= |~.name;| Font Declaration
+
+~include common_info;
+
+Font: ~.font_size;.
+
+A font declaration establishes the type font for the current brace group.
+Font declarations are never used directly in design or book files, instead
+operating behind the scenes when font sizes or styles are selected.
+----
+For more information on fonts, try |~.facility; fonts|.&/
+~include declaration_info;
+
+// Glyphs
+
+.phrase glyphs glyphs
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_glyph <name> glyph
+.synonym glyph <name>
+.template
+= |~.name;| Glyph Command
+
+~include common_info;
+
+~.comment;
+
+Art spec: ~.art_spec;
+
+A glyph is a command that sets a small graphic used as an icon
+or attention indicator. The glyph scales with the surrounding font.
+
+// Ifs
+
+.phrase ifs ifs : text
+.synonym if flags
+.template
+= If Flags
+
+An if flag is similar to ZzTeX's flags but is only used by Plain
+TeX. Because all the if flags are internal to Plain TeX and
+never used in design or book files, no more information will
+be provided.
+
+// Inserts
+
+.phrase inserts inserts : text
+.template
+= Inserts
+
+An insert is one or more chunks of text that are to be inserted on
+the page at the top or bottom. Examples are floating figures,
+floating tables, and footnotes.
+
+ZzTeX defines an insert for floats at the top of the page,
+floats at the bottom, and footnotes. Each insert consist of
+three registers needed to manage the text: a count, a dimen,
+and a skip.
+
+Since the operation of inserts is entirely internal, there is no
+additional information about them.
+
+// Lets
+
+.phrase one_let <name>
+.synonym <name>=\%:\.percent
+.synonym <name>=\&:\.ampersand
+.synonym <name>=\<:\.less
+.synonym <name>=\>:\.greater
+.synonym <name> synonym
+.synonym <name>=\&:\.ampersand synonym
+.synonym <name>=\%:\.percent synonym
+.synonym <name>=\<:\.less synonym
+.synonym <name>=\>:\.greater synonym
+.synonym synonym <name>
+.template
+= |~.name;| Synonym
+
+~include common_info;
+
+Synonym for: |~.parent;|
+
+~.comment;
+
+A synonym is a name established with the |\let| command and is
+equivalent to its "parent" command. To see information on this name's
+parent command, try |~.facility; ~.parent;|.
+
+// Locators
+
+.phrase locators locators
+.synonym indexing commands
+.synonym indexing locators
+.template
+= Index Locators
+
+An index locator is a command that creates an entry in the
+book's index. It takes an argument with one, two, or three headings
+separated by bars:
+
+ \xpage{Main|subhead}
+
+Some locators can specify a page range, in which case there are
+two additional commands:
+
+ \xpagebegin{Main|subhead}
+ \xpageend{Main|subhead}
+
+If it is a command like |\xsee| and |\xseealso|, it takes an additional
+first argument with the heading to consult. In this example, the heading
+|Synonym| will refer to the heading |Primary|:
+
+ \xsee{Primary}{Synonym}
+
+The following locators are available for the ~.project; book:
+
+&= & Begin/end& See-like
+&= Command& commands?& reference?
+----
+~foreach i, command_list;
+& |~.command_list[i];|& ~.range_list[i];& ~.refers_list[i];
+~end;
+&.
+----
+~include indexing_info;
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_locator <name> locator
+.synonym locator <name>
+.synonym <name> indexer
+.synonym indexer <name>
+.synonym <name> indexing command
+.synonym indexing command <name>
+.synonym <name> locator command
+.synonym locator command <name>
+.template
+= |~.name;| Index Locator Command
+
+~include common_info;
+
+~.comment;
+
+An index locator is a command that creates an entry in the book's index.
+The format of this locator command is shown above. There is one command
+if this kind of locator can only specify a single page. There are three
+commands if it can specify a single page or a page range. The commands for
+this locator are:
+
+~foreach cmd, command_list;
+* ~.command_list[cmd];
+~end;
+*.
+----
+For more information on locators, try |~.facility; locators|.
+
+// Marks
+
+.phrase marks marks
+.synonym page marks
+.template
+= Mark Pseudo-Commands
+
+A mark is a chunk of text inserted into the current page using the
+|\mark| command. The purpose of a mark is to hold information
+for running heads and feet. This information can be extracted from
+the page using pseudo-commands such as |\topmark| in the header
+and footer formatting macros.
+
+The |\mark| command and the extracting pseudo-commands are not used
+directly in ZzTeX design or book files. Instead, |\setmarkinfo| and
+|\markinfo| are used.
+
+Here is a list of all the mark pseudo-commands.
+
+&= Command& Description
+----
+~foreach mark, desc_table;
+& |~.mark;|& ~.desc_table[mark];
+~end;
+&.
+
+(Do not confuse marks with markers.)
+----
+For information on a specific mark, try |~.facility; \*name*|.
+
+.phrase one_mark <name>
+.synonym <name> mark
+.synonym mark <name>
+.synonym <name> page mark
+.synonym page mark <name>
+.template
+= |~.name;| Mark Pseudo-Command
+
+~include common_info;
+
+~.comment;
+
+A mark is a chunk of text inserted into the current page using the
+|\mark| command. The purpose of a mark is to hold information
+for running heads and feet.
+----
+For more information on marks, try |~.facility; marks|.
+
+// Markers
+
+.phrase markers markers
+.synonym argument markers
+.synonym command markers
+.template
+= Markers
+
+A marker indicates a point in a command argument where the following
+text is interpreted differently from the preceding text. For example,
+
+ $$
+ a = b \eqno
+ $$
+
+The |\eqno| marker indicates that the following text (empty in this
+example) should be interpreted as the equation number.
+
+Here is a list of all the markers provided by ZzTeX.
+
+&= Marker& Meaning
+----
+~foreach marker, comment_table;
+& |~.marker;|& ~.comment_table[marker];
+~end;
+&.
+
+(Do not confuse markers with marks.)
+----
+For information on a specific marker, try |~.facility; \*name*|.
+
+.phrase one_marker <name>
+.synonym <name> marker
+.synonym marker <name>
+.template
+= |~.name;| Marker
+
+~include common_info;
+
+~.comment;
+
+A marker indicates a point in a command argument where the following
+text is interpreted differently from the preceding text.
+----
+For more information on markers, try |~.facility; markers|.
+
+// Math accents
+
+.phrase math_accents math accents
+.template
+= Math Accent Commands
+
+A math accent command produces an accent over a math character.
+For example,
+
+ x = y \times \hat{a}
+
+produces
+
+& *x* = *y* &times; *&acirc;*
+&.
+
+Here is a list of all the math accent commands.
+
+&= Command& Description
+----
+~foreach acc, accent_table;
+& |~.acc;|& ~.accent_table[acc];
+~end;
+&.
+~include internal_note;
+----
+For information on a specific accent, try |~.facility; \*name*|.
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_math_accent <name> accent
+.synonym accent <name>
+.synonym <name> math accent
+.synonym math accent <name>
+.template
+= |~.name;| Math Accent Command
+
+~include common_info;
+
+~.comment;
+
+A math accent command produces an accent over a math character.
+----
+For a list of all math accents, try |~.facility; math accents|.
+
+// Math characters
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_math_char <name> character
+.synonym character <name>
+.synonym <name> symbol
+.synonym symbol <name>
+.synonym <name> math character
+.synonym math character <name>
+.synonym <name> math symbol
+.synonym math symbol <name>
+.template
+= |~.name;| Math Character
+
+~include common_info;
+
+~.comment;
+
+This command sets a math character or symbol with the following properties.
+
+& Math class:& |~.math_class;|
+& Math family:& |~.math_family;|
+& Font position:& ~.position;
+&.
+
+// Math character constants
+
+.phrase one_math_char_constant <name>
+
+// Math classes
+
+.phrase math_classes math classes
+.synonym classes
+.template
+= Math Classes
+
+Each math character and subexpression is assigned to one of the
+math classes shown below. The class determines how the character or
+subexpression is formatted. In particular, it determines the amount
+of space on each side of it. Each class is assigned a number, although
+you never need to worry about them.
+
+You can force a math expression into a particular class using the
+commands in the following table. Each takes an argument that is
+the expression to be classified. For example:
+
+ x \mathbin{.} y
+
+This forces the period to act like a binary operator, thus being set
+with a thin space on either side of it.
+
+&= Class& Number& Class Command& Description
+----
+~foreach i, class_list;
+& |~.class_list[i];|& ~.i;& |~.command_list[i];|& ~.desc_list[i];
+~end;
+&.
+
+.phrase one_chardef_math_class <name>
+.synonym <name> math class
+.synonym math class <name>
+.synonym <name> class
+.synonym class <name>
+.template
+= |~.name;| Math Class
+
+~include common_info;
+
+~.comment;
+
+Value: ~.value;
+
+Each math character and subexpression is assigned to a math class.
+The class determines how the character or subexpression is formatted.
+----
+For more information and list of all math classes, try |~.facility; math classes|.
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_command_math_class <name> math class
+.synonym math class <name>
+.synonym <name> class
+.synonym class <name>
+.template
+= |~.name;| Math Class Command
+
+~include common_info;
+
+~.comment;
+
+A math class command forces its argument to be interpreted
+according to a particular math class (specified above) rather than its standard
+math class.
+----
+For more information on math classes, try |~.facility; math classes|.&/
+~include command_info;
+
+// Math families
+
+.phrase math_families math families : text
+.synonym family
+.synonym families
+.synonym type family
+.synonym type families
+.template
+= Math Families
+
+A math family is a number that is assigned to a type style so the
+style can be used in math expressions. Associated with the family
+are three fonts, one each for text size, script size, and scriptscript
+size. A type style cannot be used in math without a family number.
+This is occasionally a problem because there is a limit of 15 families.
+----
+For information about a particular family, try |~.facility; \*xx*fam|;
+for example, |~.facility; \rmfam|&/
+For a list of type styles and their associated families,
+try |~.facility; type styles|.
+
+.phrase one_math_family <name>
+.synonym family <name>
+.synonym <name> family
+.synonym <name> math family
+.synonym <name> type family
+.synonym math family <name>
+.synonym type family <name>
+.template
+= |~.name;| Math Family
+
+~include common_info;
+
+~.comment;
+
+& Type style:& |~.style;|
+& Family number:& ~.number;
+&.
+
+A math family is a number assigned to a type style so the style
+can be used in math expressions. Only families 0--14 are usable
+in math.
+----
+For more information on math families, try |~.facility; math families|
+
+// Math functions
+
+.phrase math_functions math functions : text
+.synonym functions
+.template
+= Math Functions
+
+Math functions are commands that set the names of mathematical functions
+such as sin and max. If the command is followed by a fence, the fence
+abuts the name. Otherwise a thin space follows the name. For example,
+
+ ... the $\sin x$ and the $\sin(x)$ are both ways of writing ...
+
+produces
+
+& ... the sin&thinsp;*x* and the sin(*x*) are both ways of writing ...
+&.
+----
+For information on a specific function, try |~.facility; \*name*|
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_math_function <name> function
+.synonym function <name>
+.synonym <name> math function
+.synonym math function <name>
+.template
+= |~.name;| Math Function
+
+~include common_info;
+
+~.comment;
+
+& Sets:& ~.function;
+& Limits:& ~.limits;
+&.
+
+A math function is a command that sets a math function name,
+usually in roman.
+----
+For more information, try |~.facility; math functions|
+
+// Math joined symbols
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_math_joined <name> joined math symbol
+.synonym joined math symbol <name>
+.synonym <name> joined symbol
+.synonym joined symbol <name>
+.synonym <name> math symbol
+.synonym math symbol <name>
+.template
+= |~.name;| Joined Math Symbol
+
+~include common_info;
+
+~.comment;
+
+A joined math symbol is constructed by adjoining one symbol
+with another. In this case, the symbol is built as:
+
+ ~.left; ~.right;
+----
+~include math_class_info;
+
+// Math stacked symbols
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_math_stacked <name> stacked math symbol
+.synonym stacked math symbol <name>
+.synonym <name> stacked symbol
+.synonym stacked symbol <name>
+.synonym <name> math symbol
+.synonym math symbol <name>
+.template
+= |~.name;| Stacked Math Symbol
+
+~include common_info;
+
+~.comment;
+
+A stacked math symbol is constructed by stacking one symbol
+on top of another. In this case, the symbol is built as:
+
+ ~.above;
+ ~.below;
+----
+~include math_class_info;
+
+// Muskip registers
+
+.phrase muskips muskip registers : text
+.synonym muskips
+.template
+= Muskip Registers
+
+A muskip register contains a glue value (nominal, stretch, shrink)
+measured in math mu units (1/18 em). It can specify a horizontal space
+to be used in math. Muskip registers are only used in math.
+
+A muskip register is accessed and set as follows:
+
+| \*name*
+| \*name* = *mu-glue*
+
+Muskip registers are never used directly in book files.
+----
+For a list of all muskip registers, try |~.facility; all muskips|.&/
+For information on a particular muskip register, try |~.facility; \*name*|.
+
+.phrase all_muskips all muskip registers
+.synonym all muskips
+.template
+= List of Muskip Registers
+
+This is the list of all muskip registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; muskip registers|
+
+.phrase one_muskip <name>
+.synonym <name> muskip
+.synonym muskip <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> muskip register
+.synonym muskip register <name>
+.template
+= |~.name;| Muskip Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A muskip register contains a glue value (nominal, stretch, shrink)
+measured in math mu units (1/18 em). It can specify a horizontal space
+to be used in math.
+----
+For more information, try |~.facility; muskips|
+
+// Math \text command
+
+.phrase math_text math \text : text
+.template
+= Math |\text| Command
+
+There is a |\text| command that can be used in math expressions
+to typeset its argument in text mode.
+
+Usage: |\text{*text*}|
+
+For example,
+
+ $$
+ x = 0.999\ldots = 1\quad \text{(see limits description)}
+ $$
+
+This math display would be set as follows.
+
+& *x*&thinsp;=&thinsp;0.999...&thinsp;=&thinsp;1&_(see limits description)
+&.
+
+Note that this |\text| command is only defined in math mode.
+
+// Named Characters
+
+.phrase one_named_char <name>
+.synonym <name>=\|:\.bar
+.synonym <name> character
+.synonym <name>=\|:\.bar character
+.synonym character <name>
+.template
+= ~.name; Named Character
+
+~include common_info;
+
+~.comment;
+
+Font position: |~.position;|
+
+A named character is a single character that is not on the keyboard but is
+assigned a name so that it can be easily typed. Some named characters also
+have a character command synonym (e.g., |\@| = |\atsign|).
+
+// Page make-up
+
+.phrase page_makeup page make-up
+.synonym page makeup
+.synonym paging
+.template
+= Page Make-Up
+
+Page make-up is the process of formatting the text on each
+page of a book. In particular, it involves deciding what
+text should appear on each page and on each spread.
+
+The following ZzTeX commands can help with page make-up.
+
+~foreach name, makeup_set;
+* |~.name;|
+~end;
+*.
+
+// Penalties
+
+.phrase penalties penalties
+.synonym penalty
+.template
+= Penalties
+
+A penalty is a number that specifies how much TeX should favor or
+disfavor a line break or page break. Positive penalties cause TeX
+to disfavor breaks, while negative penalties cause it to favor breaks.
+Penalties range from -10,000 (meaning always break) to +10,000 (meaning
+never break).
+
+Penalties are used in commands such as |\vpenalty|, |\linebreak|, and
+|\columnbreak|. These commands are rarely used in book files.
+
+Here is a table of all the available penalties.
+
+&= Penalty& Meaning
+----
+~foreach name, comment_table;
+& |~.name;|& ~.comment_table[name];
+~end;
+&.
+
+.phrase one_penalty <name>
+.synonym <name> penalty
+.synonym penalty <name>
+.template
+= |~.name;| Penalty
+
+~include common_info;
+
+~.comment;
+----
+For more information, try |~.facility; penalties|.
+
+// Prefixes
+
+.phrase prefixes prefixes
+.synonym command prefixes
+.template
+= Prefixes
+
+A prefix specifies an attribute of the name being defined
+using |\def| and related commands. It also specifies an
+attribute of I/O operations.
+
+Here is a list of all the prefixes.
+
+&= Prefix& Description
+----
+~foreach pre, prefix_table;
+& |~.pre;|& ~.prefix_table[pre];
+~end;
+&.
+
+.phrase one_prefix <name>
+.synonym <name> prefix
+.synonym prefix <name>
+.synonym <name> command prefix
+.synonym command prefix <name>
+.template
+= |~.name;| Prefix
+
+~include common_info;
+
+~.comment;
+
+A prefix specifies an attribute of the name being defined
+using |\def| and related commands. It also specifies an
+attribute of I/O operations.
+----
+For more information, try |~.facility; prefixes|.
+
+// Skip (Glue) registers
+
+.phrase skips skip registers : text
+.synonym skips
+.synonym glue registers
+.synonym glues
+.template
+= Skip Registers
+
+A skip register contains a glue value (nominal, stretch, shrink)
+that can specify a horizontal or vertical space, a left or right
+indentation, a gutter, etc.
+
+A skip register is accessed and set as follows:
+
+| \*name*
+| \*name* = *glue*
+
+Skip registers are never used directly in book files.
+----
+For a list of all skip registers, try |~.facility; all skips|.&/
+For information on a particular skip register, try |~.facility; \*name*|.
+
+.phrase all_skips all skip registers
+.synonym all skips
+.synonym all glue registers
+.template
+= List of Skip (Glue) Registers
+
+This is the list of all skip registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; skip registers|
+
+.phrase one_skip <name>
+.synonym <name> skip
+.synonym skip <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> skip register
+.synonym skip register <name>
+
+.synonym <name> glue
+.synonym glue <name>
+.synonym <name> glue register
+.synonym glue register <name>
+.template
+= |~.name;| Skip (Glue) Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A skip register contains a glue value (nominal, stretch, shrink)
+that can specify a horizontal or vertical space, a left or right
+indentation, a gutter, etc.
+----
+For more information, try |~.facility; skips|
+
+// Spacing
+
+.phrase spacing spacing : text
+.template
+= Spacing Commands
+
+To see a list of commands for horizontal spacing,
+try |~.facility; horizontal spacing|.
+
+To see a list of commands for vertical spacing,
+try |~.facility; vertical spacing|.
+
+.phrase horizontal_spacing horizontal spacing
+.template
+= Horizontal Spacing
+
+This table presents a list of all the horizontal spacing commands
+available in ZzTeX.
+
+A command described as *breakable* allows a preceding line break, and the
+space is discarded. A command described as *unbreakable* does not allow a
+preceding line break.
+
+~foreach cmd, comment_table;
+& |~.cmd;|& ~.comment_table[cmd];
+~end;
+&.
+----
+For more information on any of these commands, try |~.facility; \*name*|.
+
+.phrase vertical_spacing vertical spacing
+.template
+= Vertical Spacing
+
+Here is a list of all the vertical spacing commands available in ZzTeX.
+
+~foreach name, name_set;
+* |~.name;|
+~end;
+*.
+----
+For more information on any of these commands, try |~.facility; \*name*|.
+
+// Suffixes
+
+.phrase suffixes suffixes
+.synonym command suffixes
+.template
+= Suffixes
+
+A suffix can be affixed to certain math commands to specify
+how limits are to be set.
+
+Here is a list of all the suffixes.
+
+&= Suffix& Description
+----
+~foreach suf, suffix_table;
+& |~.suf;|& ~.suffix_table[suf];
+~end;
+&.
+
+.phrase one_suffix <name>
+.synonym <name> suffix
+.synonym suffix <name>
+.synonym <name> command suffix
+.synonym command suffix <name>
+.template
+= |~.name;| Suffix
+
+~include common_info;
+
+~.comment;
+
+A suffix can be affixed to certain math commands to specify
+how limits are to be set.
+----
+For more information, try |~.facility; suffixes|.
+
+// Titles
+
+.phrase titles titles
+.synonym heads
+.synonym adjustments
+.synonym head adjustments
+.synonym title adjustments
+.template
+= Titles and Their Adjustment
+
+A *title* or *head* appears in various ZzTeX commands, including
+hierarchy commands such as |\chapter| and |\section|, captions,
+enunciations, etc. Each of these commands takes an argument that
+specifies the text of the title.
+
+| \chapter{*title-text*}
+
+The title text can appear in various places:
+
+* In the body of the text at the position of the |\chapter| command.
+* In the running heads or feet of multiple pages.
+* In the main table of contents or a "mini-ToC" such as might
+appear at the beginning of each chapter.
+*.
+
+Sometimes it is necessary to modify the title slightly when it appears in
+these various places. For example, if a title has a footnote, that footnote
+does not want to appear in the running head or table of contents. ZzTeX
+provides the following commands that can be used within the text of a title
+to make such adjustments.
+
+~foreach cmd, command_set;
+* |~.cmd;|
+~end;
+*.
+
+// Toks registers
+
+.phrase toks toks registers : text
+.synonym toks
+.synonym tokens
+.synonym token registers
+.template
+= Toks (Token) Registers
+
+A toks (token) register contains a sequence of TeX tokens (characters, commands,
+spaces, etc.) that can specify a text fragment, file name, tag, options
+list, etc.
+
+A toks register is accessed and set as follows:
+
+| \*name*
+| \*name* = {*tokens*}
+
+Toks registers are never used directly in book files.
+----
+For a list of all toks registers, try |~.facility; all toks|.&/
+For information on a particular toks register, try |~.facility; \*name*|.
+
+.phrase all_toks all toks registers
+.synonym all toks
+.synonym all token registers
+.synonym all tokens
+.template
+= List of Toks (Token) Registers
+
+This is the list of all toks registers available in ZzTeX.
+
+&= Register& Description
+----
+~foreach reg, reg_table;
+& |~.reg;|& ~.reg_table[reg];
+~end;
+&.
+~include internal_note;
+----
+For more information, try |~.facility; toks registers|
+
+.phrase one_toks <name>
+.synonym <name> toks
+.synonym toks <name>
+.synonym <name> register
+.synonym register <name>
+.synonym <name> toks register
+.synonym toks register <name>
+
+.synonym <name> token
+.synonym token <name>
+.synonym <name> token register
+.synonym token register <name>
+.template
+= |~.name;| Toks (Token) Register
+
+~include common_info;
+
+~.comment;
+
+Default: |~.default;|
+
+A toks register contains a sequence of TeX tokens (characters, commands,
+spaces, etc.) that can specify a text fragment, file name, tag, options
+list, etc.
+----
+For more information, try |~.facility; toks|
+
+// Style relations
+
+.phrase style_relations style relations
+.synonym relations
+.synonym font relations
+.synonym type relations
+.template
+= Style Relation Commands
+
+A style relation is a command that selects a new type style for
+its argument text based on the prevailing type style. The argument text
+is set in the new style and then the prevailing style continues.
+For example,
+
+| *...* a set of \emph{dependencies} on parent structures *...*
+
+might typeset the text as
+
+& *...* a set of *dependencies* on parent structures *...*
+&.
+
+Style relation commands are used instead of the underlying type
+style declarations (e.g., |\it|) for various reasons, the most
+important one being that the style change is restricted to the
+argument text.
+
+Here is a list of the relation commands available for the ~.project;
+book. For more details about a particular relation, try |~.facility;
+\*name*|.
+
+&= Relation& Where defined
+----
+~foreach rel, relation_table;
+& |~.rel;|& ~.relation_table[rel];
+~end;
+&.
+
+*Note:* The |\mono| command is used like a relation, but it is
+actually just a normal command.
+----
+~include command_info;
+
+// (Assumes that the 'one_command' group will also be populated.)
+.phrase one_style_relation relation <name>
+.synonym <name> relation
+.synonym <name> font relation
+.synonym <name> style relation
+.synonym <name> type relation
+.synonym font relation <name>
+.synonym style relation <name>
+.synonym type relation <name>
+.template
+= |~.name;| Style Relation Command
+
+~include common_info;
+
+~.comment;
+
+A style relation is a command that selects a new type style for
+its argument based on the prevailing type style. The argument text
+is set in the new style and then the prevailing style continues.
+
+Here is a table of all the relationships established by this command.
+
+&= Prevailing& & New
+&= style& & style
+----
+~foreach sty, style_map;
+& ~.sty;& &rArr;& ~.style_map[sty];
+~end;
+&.
+----
+For more information on style relations and a list of all available
+relations, try |~.facility; style relations|.&/
+~include command_info;
+
+// Tags
+
+.phrase tags tags : text
+.template
+= Tags
+
+A tag is a TeX name that is used to store information about a particular
+spot in a book. You can tag a spot using the |\tag| command.
+
+ \section{All About Tags}
+ \tag{S:about-tags}
+
+The following information is associated with the tag |S:about-tags|:
+
+* The page number on which the tag is defined.
+
+* The composite number text of the enclosing element (in the above example,
+the section number).
+
+* The title or caption of the enclosing element.
+*.
+
+The following cross-referencing commands can be used to typeset the
+information asociated with a tag:
+
+& |\ref{*tag*}|& Set the composite number text.
+& |\refpage{*tag*}|& Set the page number.
+& |\reftitle{*tag*}|& Set the title (rarely used).
+&.
+
+If the |\tag| command is used at a point in the text where there is
+no surrounding taggable element, an error message is produced. In this
+situation, if you only want to reference the page number, use the |\tagpageonly|
+command instead.
+
+== Tag Names
+
+If you need to add a tag to a book, please follow the naming conventions
+chosen by the author. If the author was haphazard, use the following
+prefixes on tags of various kinds:
+
+&= Prefix& Meaning
+----
+& |A:|& appendix
+& |C:|& chapter or quasichapter
+& |E:|& equation
+& |F:|& figure
+& |I:|& list item
+& |P:|& page number of arbitrary text (with |\tagpageonly|)
+& |S:|& section, subsection, etc.
+& |T:|& table
+& |X:|& exercise
+&.
+
+Tags names beginning with |z*X*:|, where *X* is a capital letter, are
+internal to ZzTeX. For a description of these internal tags,
+try |~.facility; internal tags|.
+----
+To obtain a list of all the tags in the ~.project; book, try
+|~.facility; all tags|.
+
+.phrase internal_tags internal tags : text
+.template
+= Internal Tags
+
+Here is a list of all the internal tags used by ZzTeX.
+
+&= Tag prefix& Usage
+----
+& |zB:|& Bibliographic entry information.
+& |zE:|& Page number of frame element.
+& |zF:|& Page number of float element.
+& |zH:|& Error message help text.
+& |zM:|& Page number of marginnote element.
+& |zP:|& Page number of proofnote element.
+& |zR:|& Page number of marginrule element.
+& |zS:|& Composite cross-reference snapshot information.
+&.
+----
+For a description of tags in general, try |~.facility; tags|.
+
+// Type styles
+
+.phrase type_styles type styles
+.synonym styles
+.synonym font styles
+.template
+= Type Styles
+
+A type style is a declaration that establishes the current style for
+text (e.g., roman, italic). As with all declarations, it pertains only
+to the following text in the current brace group.
+
+Type styles are rarely used directly in book files. Instead, the current
+style is established using a style relation command such as |\emph| or
+|\bold|. To see a list of all the relation commands, try |~.facility;
+type relations|. To see a list for a particular style, along with
+information about that style, try |~.facility; \*style*|.
+
+Here are all the type styles available for the ~.project; book.
+&= & & Family& Family& Usable
+&= Style& Encoding& number& name& in math?
+----
+~foreach fam, family_list;
+& |~.style_list[fam];|& |~.encoding_list[fam];|& ~.fam;& |~.family_list[fam];|&
+~.math_list[fam];
+~end;
+&.
+----
+For information on encodings, try |~.facility; encodings|.&/
+~include declaration_info;
+
+// (Assumes that the 'one_declaration' group will also be populated.)
+.phrase one_type_style type style <name>
+.synonym <name> style
+.synonym style <name>
+.synonym <name> font style
+.synonym font style <name>
+.template
+= |~.name;| Type Style Declaration
+
+~include common_info;
+
+~.comment;
+
+A type style is a declaration that establishes the current style for
+text (e.g., roman, italic). Instead of using the style declaration,
+you should use a style relation command. Here are the style relations
+pertinent to this style.
+
+&= Current style& Relation& New style
+----
+~foreach rel, new_style;
+& |~.name;|& |~.rel;|& |~.new_style[rel];|
+~end;
+&.
+----
+For more information on type styles, try |~.facility; type styles|&/
+For more information on type relations, try |~.facility; type relations|
+
+// Type sizes
+
+.phrase type_sizes type sizes : text
+.synonym sizes
+.synonym font sizes
+.template
+= Type Sizes
+
+A type size is a declaration that establishes the current size
+for text. As with all declarations, it pertains only
+to the following text in the current brace group.
+
+When a type size is established, there is no current style
+for the subsequent text. You must also establish a style
+after establishing a size.
+
+ {\footnotesize\it That '\it' command was necessary
+ to establish the style.}
+
+Type sizes are rarely used directly in book files. Instead, the
+surrounding element (typically a block) establishes the size
+for the text in that element. The main text size is always called
+|\textsize|.
+----
+To see a list of all the available type sizes, try |~.facility; all sizes|.&/
+To see the details of a particular size, try |~.facility; \*name*|.
+
+.phrase all_type_sizes all type sizes
+.synonym all sizes
+.synonym all font sizes
+.template
+= List of Type Sizes
+
+This is the list of all type sizes available in the ~.project; book.
+
+&= Size declaration& Available styles
+----
+~foreach size, style_table;
+& |~.size;|& |~.style_table[size];|
+~end;
+&.
+----
+For more information, try |~.facility; type sizes|.&/
+To see the details of a particular size, try |~.facility; \*name*|.
+
+// (Assumes that the 'one_declaration' group will also be populated.)
+.phrase one_type_size size <name>
+.synonym <name> size
+.synonym <name> type size
+.synonym type size <name>
+.synonym <name> font size
+.synonym font size <name>
+.template
+= |~.name;| Type Size Declaration
+
+~include common_info;
+
+~.comment;
+
+A type size is a declaration that establishes the current size
+for text. As with all declarations, it pertains only
+to the following text in the current brace group.
+
+Here is a list of all the type styles available in |~.name;|.
+
+&= & Can use& Can use
+&= Style& in math?& in scripts?& Family, style, size
+----
+~foreach i, style_list;
+& |~.style_list[i];|& ~.math_list[i];& ~.script_list[i];& ~.font_list[i];
+~end;
+&.
+----
+For more information on type sizes, try |~.facility; type sizes|.&/
+To see a list of all the available type sizes, try |~.facility; all sizes|.
+
+// Composite Cross-Reference Phrases
+// --------- --------------- -------
+
+
+.phrase all_art_files all art files
+.synonym art files
+.template
+= List of All Art Files for ~.project;
+
+This is a list of all the art files used in ~.project;, in order
+by file name.
+
+Count: ~.*div_table;
+
+&= Division& Page& File& Size at scale& Reused?
+----
+~foreach file, div_table;
+& ~.div_table[file];& ~.page_table[file];& ~.file;& ~.size_table[file];& ~.reused_table[file];
+~end;
+&.
+----
+For a list of just the missing art files, try |~.facility; missing art files|.
+
+.phrase all_biblio_entries all bibliography entries
+.synonym all bibliography tags
+.synonym bibliography entry list
+.synonym bibliography entries
+.template
+= List of All Bibliography Entries for ~.project;
+
+This is a list of all the bibliography entries in the ~.project;
+bibliography, in order by tag.
+
+Count: ~.*page_table;
+
+&= Page& Tag& Author& Year
+----
+~foreach tag, page_table;
+& ~.page_table[tag];& |~.tag;|& ~.author_table[tag];& ~.year_table[tag];
+~end;
+&.
+
+.phrase all_tags all tags
+.synonym tag list
+.template
+= List of All Tags for ~.project;
+
+This is a list of all the tags used in ~.project;,
+in order by tag name.
+(This list does not include bibliography entry tags.)
+
+Count: ~.*comp_table;
+
+&= Tag& Comp. Text& Division& Page
+----
+~foreach tag, comp_table;
+& |~.tag;|& ~.comp_table[tag];& ~.div_table[tag];& ~.page_table[tag];
+~end;
+&.
+
+Tags beginning with |\z*X*:| are internal to ZzTeX. For a description
+of those tags, try |~.facility; internal tags|.&/
+----
+For a list of all the bibliography entry tags, try |~.facility;
+all biblio tags|.
+
+.phrase book_info book information : text
+.template
+= Book Information
+
+~.facility; can show you all kinds of information about the
+~.project; project.
+
+& |~.facility;| command words& Report produced
+----
+& |overview|& Overview of the book and its design.
+& |all art files|& List of all art files.
+& |all biblio entries|& List of all bibliography entries.
+& |all tags|& List of all tags.
+& |cleanup report|& Report about cleanup of files.
+& |contents|& High-level table of contents.
+& |design report|& Report of elements with explanatory comments.
+& |duplicate tags|& List of duplicate tags.
+& |library|& List of documentation files in ZzTeX directory.
+& |missing art files|& List of missing art files.
+& |printer report|& Report to accompany final printer PDF.
+& |proofnote list|& List of outstanding proofnotes.
+& |to-do list|& List of outstanding to-dos.
+& |undefined tags|& List of undefined tags.
+&.
+
+.phrase contents contents
+.synonym table of contents
+.template
+= Table of Contents for ~.project;
+
+~foreach i, page_list;
+& ~.page_list[i];& ~.comp_list[i];& ~.title_list[i];
+~end;
+&.
+
+.phrase design_report design report
+.synonym compositor's design report
+.template
+= Design Report for ~.project;
+
+~include title_author_publisher_isbn;
+&.
+
+== Summary of Design
+
+~include design_summary;
+
+Every project starts with a cleanup of the text files.
+Try |~.facility; cleanup report| for a description of
+the cleanup of ~.project;.
+
+== Documented Elements
+
+The following sections present the book design elements that
+have specific documentation in the main design file ~.zzd_file;.
+It is a good idea to review these elements at the start of a project.
+
+~foreach i, head_list;
+~if not empty? head_list[i];
+=== ~.head_list[i];
+~fi;
+
+&starf;&_~.usage_list[i];
+
+~if value? style_list[i];
+& Style: ~.style_list[i];
+&.
+~fi;
+
+~.comment_list[i];
+~end;
+
+.phrase duplicate_tags duplicate tags
+.synonym duplicate tags list
+.template
+= List of Duplicate Tags for ~.project;
+
+This is a list of all the duplicate tags in the ~.project; book.
+
+Count: ~.*comp_table;
+
+&= Tag& Comp. Texts& Divisions& Pages
+----
+~foreach tag, comp_table;
+& |~.tag;|& ~.comp_table[tag];& ~.div_table[tag];& ~.page_table[tag];
+~end;
+&.
+----
+To see a list of all the tags, try |~.facility; all tags|.
+
+.phrase library library
+.synonym documentation
+.template
+= ZzTeX Documentation library
+
+The following text documents are available in the ZzTeX directory.
+They present details about various facilities in ZzTeX.
+
+&= Document& Topic
+----
+~foreach file, title_table;
+& ~.file;& ~.title_table[file];
+~end;
+&.
+
+.phrase missing_art_files missing art files
+.synonym missing art
+.template
+= List of Missing Art Files for ~.project;
+
+This is a list of the missing art files used in ~.project;, in order
+by file name. An art file is missing if there is an |\art| command
+for it but it does not exist in the art directory.
+
+Count: ~.*div_table;
+
+&= Division& Page& File& Size at scale& Reused?
+----
+~foreach file, div_table;
+& ~.div_table[file];& ~.page_table[file];& ~.file;& ~.size_table[file];& ~.reused_table[file];
+~end;
+&.
+----
+For a list of all the art files, try |~.facility; all art files|.
+
+.phrase printer_report printer report
+.template
+= Printer Report for ~.project;
+
+~include title_author_publisher_isbn;
+& &`
+& Trim:& ~.trimwidth; &times; ~.trimheight;
+& Head&`margin:& ~.headmargin;
+& Gutter:& ~.eveninnermargin;
+& &`
+& Fonts:& All embedded and subsetted at 100%
+& Art:& All embedded
+&.
+
+&`
+
+----
+Black: For 2-color books, please set Overprint Black as the default.
+----
+
+&`
+
+Paul C. Anagnostopoulos&/
+Windfall Software&/
+978 371-2316&/
+paul@windfall.com
+
+&`
+
+= Pagination
+
+~foreach i, page_list;
+& ~.page_list[i];& ~.comp_list[i];& ~.title_list[i];
+~end;
+&.
+
+.phrase-dups project_overview <project>
+.synonym book
+.synonym overview
+.synonym project
+.synonym book overview
+.synonym project overview
+.template
+= ~.project; Overview
+
+~include title_author_publisher_isbn;
+& &`
+& Processed:& ~.date; ~.time;
+& ZzTeX&`version:& v~.zztex_version;
+& &`
+& Art&`root:& ~.art_root;
+& Placing&`art?& ~.place_art;
+& PDF&`hyperlinks?& ~.hyperlinks;
+& &`
+& Proof&`ident:& ~.proof;
+& Compositor:& ~.compositor;
+& Company:& ~.company;
+&.
+
+== Summary of Design
+
+~include design_summary;
+----
+~.facility; can present all sorts of information about this project.
+Try |~.facility; book info|.
+
+.phrase proofnote_list proofnote list
+.synonym all proofnotes
+.template
+= List of All Proofnotes for ~.project;
+
+This is a list of all the outstanding proofnotes in the ~.project;
+files.
+
+Count: ~.*div_list;
+
+&= Division& Page& Note
+----
+~foreach i, div_list;
+& ~.div_list[i];& ~.page_list[i];& ~.note_list[i];
+~end;
+&.
+
+.phrase todo_list to-dos
+.synonym todos
+.synonym to-do list
+.synonym todo list
+.synonym all to-dos
+.synonym all todos
+.template
+= List of All To-Dos for ~.project;
+
+This is a list of all the outstanding to-do notes in the ~.project;
+files.
+
+Count: ~.*div_list;
+
+&= Division& Page& Note
+----
+~foreach i, div_list;
+& ~.div_list[i];& ~.page_list[i];& ~.note_list[i];
+~end;
+&.
+----
+
+.phrase undefined_tags undefined tags
+.synonym undefined tags list
+.template
+= List of Undefined Tags for ~.project;
+
+This is a list of all the undefined tags in the ~.project; files.
+
+Count: ~.*div_table;
+
+&= & First& First
+&= Tag& Division& Page& References
+----
+~foreach tag, div_table;
+& |~.tag;|& ~.div_table[tag];& ~.page_table[tag];& ~.refs_table[tag];
+~end;
+&.
+----
+To see a list of all the tags, try |~.facility; all tags|.
+
+// Footnotes
+// ---------
+
+
+.footnote defineenunciation_enunciation \defineenunciation one_command
+.footnote defineenunciation_enunciation \title one_marker
+.footnote defineenunciation_enunciation \attributiontypecase one_command
+.footnote defineenunciation_enunciation \defineeoedingbat one_command
+.template defineenunciation_enunciation
+For a complete description of this item, try |~.facility; \enunciation|.
+
+.footnote definelocator_locators \definelocator one_command
+.footnote definelocator_locators \definelocatorformat one_command
+.footnote definelocator_locators \generateindex one_command
+.footnote definelocator_locators \indexentry one_command
+.footnote definelocator_locators \alphabreak one_command
+.template definelocator_locators
+~include indexing_info;
+
+.footnote hat_zmhat \hat one_named_char
+.template hat_zmhat
+*Note:* When used in math mode, |\hat| is a synonym for |\zmhat|
+and produces a hat accent over its argument.
+
+.footnote space_spacing space one_character
+.template space_spacing
+If you are looking for information on spacing commands,
+try |~.facility; spacing|.
+
+.footnote proofnote_note_list \proofnote one_block
+.template proofnote_note_list
+If you are looking for a list of the outstanding proofnotes
+for the ~.project; project, try |~.facility; proofnote list|.
+
+.footnote text_math_text \text one_block
+.template text_math_text
+If you are looking for information on the \text command that
+is used in math, try |~.facility; math \text|.
+
+.footnote tilde_zmtilde \tilde one_named_char
+.template tilde_zmtilde
+*Note:* When used in math mode, |\tilde| is a synonym for |\zmtilde|
+and produces a tilde accent over its argument.
+
+.footnote toc_contents \toc one_block
+.template toc_contents
+If you are looking for a table of contents for ~.project;,
+try |~.facility; contents|.
+
+.footnote zmhat_hat \zmhat one_math_accent
+.template zmhat_hat
+*Note:* This is the internal accent command. Use |\hat| in book files.
+
+.footnote zmtilde_tilde \zmtilde one_math_accent
+.template zmtilde_tilde
+*Note:* This is the internal accent command. Use |\tilde| in book files.
+
+// Included Templates
+// -------- ---------
+
+
+.template command_line_chars
+Some characters are difficult or impossible to type on the 4NT/Take
+Command command line. For an explanation of how to enter them,
+try |~.facility; command line|.
+
+.template common_info
+& What it is:& ~.class;
+& Where it is:& ~.where;
+& Attributes:& ~.attributes;
+~if value? overridden;& Supercedes:& ~.overridden;~fi;
+&.
+
+~if value? usage;Usage: |~.usage;|~fi;
+
+.template command_info
+For information on commands in general, try |~.facility; commands|.
+
+.template declaration_info
+For information on declarations in general, try |~.facility; declarations|.
+
+.template design_info
+& Design macro for:& ~.design;
+~if value? derived;& Derived from:& |~.derived;|~fi;
+~if value? style;& Element style:& |~.style;|~fi;
+~if not empty? variant_list;& Affecting variants:& ~
+ |~foreach i,variant_list,iter;~,variant_list[i],iter /= 1;~end;|~fi;
+&.
+
+.template design_summary
+& Trim:& ~.trimwidth; &times; ~.trimheight;
+& Text measure:& ~.textmeasure;
+& Lines per page:& ~.linesperpage;
+& For make-up:& ~.linesshort; short, ~.lineslong; long
+& Even text margins:& left = ~.evenlefttextmargin;, right = ~.evenrighttextmargin;
+& Odd text margins:& left = ~.oddlefttextmargin;, right = ~.oddrighttextmargin;
+& Paragraph indent:& ~.parindent;
+&.
+
+.template gory_details
+To see more details about the design, try |~.facility; ~.name; details|.
+
+.template indexing_info
+For a complete description of the ZzTeX indexing facility,
+try |~.facility; indexing|.
+
+.template internal_note
+(Note that names containing at-signs or beginning with 'z' are internal.)
+
+.template math_class_info
+For more information on math classes, try |~.facility; math classes|.
+
+.template title_author_publisher_isbn
+& Title:& *~.title;*
+~foreach i,author,iter;
+& ~if iter = 1;Author:~fi;& ~.author[i];
+~end;
+& Publisher:& ~.publisher;
+& ISBN:& ~.isbn;
+
+.include zzdetails.dat
+.end
diff --git a/macros/plain/contrib/zztex/doc/zzplain.dat b/macros/plain/contrib/zztex/doc/zzplain.dat
new file mode 100644
index 0000000000..5aebd853cd
--- /dev/null
+++ b/macros/plain/contrib/zztex/doc/zzplain.dat
@@ -0,0 +1,1315 @@
+% This is the plain TeX format that's described in The TeXbook.
+% N.B.: A version number is defined at the very end of this file;
+% please change that number whenever the file is modified!
+% And don't modify the file under any circumstances.
+
+\catcode`\{=1 % left brace is begin-group character
+\catcode`\}=2 % right brace is end-group character
+\catcode`\$=3 % dollar sign is math shift
+\catcode`\&=4 % ampersand is alignment tab
+\catcode`\#=6 % hash mark is macro parameter character
+\catcode`\^=7
+\catcode`\^^K=7 % circumflex and uparrow are for superscripts
+\catcode`\_=8
+\catcode`\^^A=8 % underline and downarrow are for subscripts
+\catcode`\^^I=10 % ascii tab is a blank space
+\chardef\active=13
+\catcode`\~=\active % tilde is active
+\catcode`\^^L=\active
+\outer\def^^L{\par} % ASCII formfeed is |\outer\par|
+
+\message{Preloading the plain format: codes,}
+
+% We had to define the \catcodes right away, before the message line,
+% since \message uses the { and } characters.
+% When INITEX (the TeX initializer) starts up,
+% it has defined the following \catcode values:
+% \catcode`\^^@=9 % ascii null is ignored
+% \catcode`\^^M=5 % ascii return is end-line
+% \catcode`\\=0 % backslash is TeX escape character
+% \catcode`\%=14 % percent sign is comment character
+% \catcode`\ =10 % ascii space is blank space
+% \catcode`\^^?=15 % ascii delete is invalid
+% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters
+% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters
+% all others are type 12 (other)
+
+% Here is a list of the characters that have been specially catcoded:
+\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~}
+% (not counting ascii null, tab, linefeed, formfeed, return, delete)
+% Each symbol in the list is preceded by \do, which can be defined
+% if you want to do something to every item in the list.
+
+% We make @ signs act like letters, temporarily, to avoid conflict
+% between user names and internal control sequences of plain format.
+\catcode`@=11
+
+% INITEX sets up \mathcode x=x, for x=0..255, except that
+% \mathcode x=x+"7100, for x = `A to `Z and `a to `z;
+% \mathcode x=x+"7000, for x = `0 to `9.
+% The following changes define internal codes as recommended
+% in Appendix C of The TeXbook:
+\mathcode`\^^@="2201 % \cdot
+\mathcode`\^^A="3223 % \downarrow
+\mathcode`\^^B="010B % \alpha
+\mathcode`\^^C="010C % \beta
+\mathcode`\^^D="225E % \land
+\mathcode`\^^E="023A % \lnot
+\mathcode`\^^F="3232 % \in
+\mathcode`\^^G="0119 % \pi
+\mathcode`\^^H="0115 % \lambda
+\mathcode`\^^I="010D % \gamma
+\mathcode`\^^J="010E % \delta
+\mathcode`\^^K="3222 % \uparrow
+\mathcode`\^^L="2206 % \pm
+\mathcode`\^^M="2208 % \oplus
+\mathcode`\^^N="0231 % \infty
+\mathcode`\^^O="0140 % \partial
+\mathcode`\^^P="321A % \subset
+\mathcode`\^^Q="321B % \supset
+\mathcode`\^^R="225C % \cap
+\mathcode`\^^S="225B % \cup
+\mathcode`\^^T="0238 % \forall
+\mathcode`\^^U="0239 % \exists
+\mathcode`\^^V="220A % \otimes
+\mathcode`\^^W="3224 % \leftrightarrow
+\mathcode`\^^X="3220 % \leftarrow
+\mathcode`\^^Y="3221 % \rightarrow
+\mathcode`\^^Z="8000 % \ne
+\mathcode`\^^[="2205 % \diamond
+\mathcode`\^^\="3214 % \le
+\mathcode`\^^]="3215 % \ge
+\mathcode`\^^^="3211 % \equiv
+\mathcode`\^^_="225F % \lor
+\mathcode`\ ="8000 % \space
+\mathcode`\!="5021
+\mathcode`\'="8000 % ^\prime
+\mathcode`\(="4028
+\mathcode`\)="5029
+\mathcode`\*="2203 % \ast
+\mathcode`\+="202B
+\mathcode`\,="613B
+\mathcode`\-="2200
+\mathcode`\.="013A
+\mathcode`\/="013D
+\mathcode`\:="303A
+\mathcode`\;="603B
+\mathcode`\<="313C
+\mathcode`\=="303D
+\mathcode`\>="313E
+\mathcode`\?="503F
+\mathcode`\[="405B
+\mathcode`\\="026E % \backslash
+\mathcode`\]="505D
+\mathcode`\_="8000 % \_
+\mathcode`\{="4266
+\mathcode`\|="026A
+\mathcode`\}="5267
+\mathcode`\^^?="1273 % \smallint
+
+% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x,
+% and \lccode`x=`x, \lccode`X=`x; all other values are zero.
+% No changes to those tables are needed in plain TeX format.
+
+% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999
+% for uppercase letters. The following changes are needed:
+\sfcode`\)=0
+\sfcode`\'=0
+\sfcode`\]=0
+% The \nonfrenchspacing macro will make further changes to \sfcode values.
+
+% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0
+\delcode`\(="028300
+\delcode`\)="029301
+\delcode`\[="05B302
+\delcode`\]="05D303
+\delcode`\<="26830A
+\delcode`\>="26930B
+\delcode`\/="02F30E
+\delcode`\|="26A30C
+\delcode`\\="26E30F
+% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails!
+
+% To make the plain macros more efficient in time and space,
+% several constant values are declared here as control sequences.
+% If they were changed, anything could happen; so they are private symbols.
+\chardef\@ne=1
+\chardef\tw@=2
+\chardef\thr@@=3
+\chardef\sixt@@n=16
+\chardef\@cclv=255
+\mathchardef\@cclvi=256
+\mathchardef\@m=1000
+\mathchardef\@M=10000
+\mathchardef\@MM=20000
+
+% Allocation of registers
+
+% Here are macros for the automatic allocation of \count, \box, \dimen,
+% \skip, \muskip, and \toks registers, as well as \read and \write
+% stream numbers, \fam codes, \language codes, and \insert numbers.
+
+\message{registers,}
+
+% When a register is used only temporarily, it need not be allocated;
+% grouping can be used, making the value previously in the register return
+% after the close of the group. The main use of these macros is for
+% registers that are defined by one macro and used by others, possibly at
+% different nesting levels. All such registers should be defined through
+% these macros; otherwise conflicts may occur, especially when two or more
+% macro packages are being used at once.
+
+% The following counters are reserved:
+% 0 to 9 page numbering
+% 10 count allocation
+% 11 dimen allocation
+% 12 skip allocation
+% 13 muskip allocation
+% 14 box allocation
+% 15 toks allocation
+% 16 read file allocation
+% 17 write file allocation
+% 18 math family allocation
+% 19 language allocation
+% 20 insert allocation
+% 21 the most recently allocated number
+% 22 constant -1
+% New counters are allocated starting with 23, 24, etc. Other registers are
+% allocated starting with 10. This leaves 0 through 9 for the user to play
+% with safely, except that counts 0 to 9 are considered to be the page and
+% subpage numbers (since they are displayed during output). In this scheme,
+% \count 10 always contains the number of the highest-numbered counter that
+% has been allocated, \count 14 the highest-numbered box, etc.
+% Inserts are given numbers 254, 253, etc., since they require a \count,
+% \dimen, \skip, and \box all with the same number; \count 20 contains the
+% lowest-numbered insert that has been allocated. Of course, \box255 is
+% reserved for \output; \count255, \dimen255, and \skip255 can be used freely.
+
+% It is recommended that macro designers always use
+% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and
+% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255.
+% This will prevent ``save stack buildup'' that might otherwise occur.
+
+\count10=22 % allocates \count registers 23, 24, ...
+\count11=9 % allocates \dimen registers 10, 11, ...
+\count12=9 % allocates \skip registers 10, 11, ...
+\count13=9 % allocates \muskip registers 10, 11, ...
+\count14=9 % allocates \box registers 10, 11, ...
+\count15=9 % allocates \toks registers 10, 11, ...
+\count16=-1 % allocates input streams 0, 1, ...
+\count17=-1 % allocates output streams 0, 1, ...
+\count18=3 % allocates math families 4, 5, ...
+\count19=0 % allocates \language codes 1, 2, ...
+\count20=255 % allocates insertions 254, 253, ...
+\countdef\insc@unt=20 % the insertion counter
+\countdef\allocationnumber=21 % the most recent allocation
+\countdef\m@ne=22
+\m@ne=-1 % a handy constant
+\def\wlog{\immediate\write\m@ne} % write on log file (only)
+
+% Here are abbreviations for the names of scratch registers
+% that don't need to be allocated.
+
+\countdef\count@=255
+\dimendef\dimen@=0
+\dimendef\dimen@i=1 % global only
+\dimendef\dimen@ii=2
+\skipdef\skip@=0
+\toksdef\toks@=0
+
+% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo
+% and \foo will be defined (with \countdef) to be the next counter.
+% To find out which counter \foo is, you can look at \allocationnumber.
+% Since there's no \boxdef command, \chardef is used to define a \newbox,
+% \newinsert, \newfam, and so on.
+
+\outer\def\newcount{\alloc@0\count\countdef\insc@unt}
+\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt}
+\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt}
+\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi}
+\outer\def\newbox{\alloc@4\box\chardef\insc@unt}
+\let\newtoks=\relax % we do this to allow plain.tex to be read in twice
+\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}}
+\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi}
+\outer\def\newread{\alloc@6\read\chardef\sixt@@n}
+\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n}
+\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n}
+\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi}
+\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne
+ \ch@ck#1#4#2% make sure there's still room
+ \allocationnumber=\count1#1%
+ \global#3#5=\allocationnumber
+ \wlog{\string#5=\string#2\the\allocationnumber}}
+\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne
+ \ch@ck0\insc@unt\count
+ \ch@ck1\insc@unt\dimen
+ \ch@ck2\insc@unt\skip
+ \ch@ck4\insc@unt\box
+ \allocationnumber=\insc@unt
+ \global\chardef#1=\allocationnumber
+ \wlog{\string#1=\string\insert\the\allocationnumber}}
+\def\ch@ck#1#2#3{\ifnum\count1#1<#2%
+ \else\errmessage{No room for a new #3}\fi}
+
+% Here are some examples of allocation.
+\newdimen\maxdimen
+\maxdimen=16383.99999pt % the largest legal <dimen>
+\newskip\hideskip
+\hideskip=-1000pt plus 1fill % negative but can grow
+\newskip\centering
+\centering=0pt plus 1000pt minus 1000pt
+\newdimen\p@
+\p@=1pt % this saves macro space and time
+\newdimen\z@
+\z@=0pt % can be used both for 0pt and 0
+\newskip\z@skip
+\z@skip=0pt plus0pt minus0pt
+\newbox\voidb@x % permanently void box register
+
+% And here's a different sort of allocation:
+% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo.
+\outer\def\newif#1{\count@\escapechar \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \def\@if#1{true}{\let#1=\iftrue}%
+ \expandafter\expandafter\expandafter
+ \def\@if#1{false}{\let#1=\iffalse}%
+ \@if#1{false}\escapechar\count@} % the condition starts out false
+\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname}
+{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required
+
+% Assign initial values to TeX's parameters
+
+\message{parameters,}
+
+% All of TeX's numeric parameters are listed here,
+% but the code is commented out if no special value needs to be set.
+% INITEX makes all parameters zero except where noted.
+
+\pretolerance=100
+\tolerance=200 % INITEX sets this to 10000
+\hbadness=1000
+\vbadness=1000
+\linepenalty=10
+\hyphenpenalty=50
+\exhyphenpenalty=50
+\binoppenalty=700
+\relpenalty=500
+\clubpenalty=150
+\widowpenalty=150
+\displaywidowpenalty=50
+\brokenpenalty=100
+\predisplaypenalty=10000
+% \postdisplaypenalty=0
+% \interlinepenalty=0
+% \floatingpenalty=0, set during \insert
+% \outputpenalty=0, set before TeX enters \output
+\doublehyphendemerits=10000
+\finalhyphendemerits=5000
+\adjdemerits=10000
+% \looseness=0, cleared by TeX after each paragraph
+% \pausing=0
+% \holdinginserts=0
+% \tracingonline=0
+% \tracingmacros=0
+% \tracingstats=0
+% \tracingparagraphs=0
+% \tracingpages=0
+% \tracingoutput=0
+\tracinglostchars=1
+% \tracingcommands=0
+% \tracingrestores=0
+% \language=0
+\uchyph=1
+% \lefthyphenmin=2 \righthyphenmin=3 set below
+% \globaldefs=0
+% \maxdeadcycles=25 % INITEX does this
+% \hangafter=1 % INITEX does this, also TeX after each paragraph
+% \fam=0
+% \mag=1000 % INITEX does this
+% \escapechar=`\\ % INITEX does this
+\defaulthyphenchar=`\-
+\defaultskewchar=-1
+% \endlinechar=`\^^M % INITEX does this
+\newlinechar=-1
+\delimiterfactor=901
+% \time=now % TeX does this at beginning of job
+% \day=now % TeX does this at beginning of job
+% \month=now % TeX does this at beginning of job
+% \year=now % TeX does this at beginning of job
+\showboxbreadth=5
+\showboxdepth=3
+\errorcontextlines=5
+
+\hfuzz=0.1pt
+\vfuzz=0.1pt
+\overfullrule=5pt
+\hsize=6.5in
+\vsize=8.9in
+\maxdepth=4pt
+\splitmaxdepth=\maxdimen
+\boxmaxdepth=\maxdimen
+% \lineskiplimit=0pt, changed by \normalbaselines
+\delimitershortfall=5pt
+\nulldelimiterspace=1.2pt
+\scriptspace=0.5pt
+% \mathsurround=0pt
+% \predisplaysize=0pt, set before TeX enters $$
+% \displaywidth=0pt, set before TeX enters $$
+% \displayindent=0pt, set before TeX enters $$
+\parindent=20pt
+% \hangindent=0pt, zeroed by TeX after each paragraph
+% \hoffset=0pt
+% \voffset=0pt
+
+% \baselineskip=0pt, changed by \normalbaselines
+% \lineskip=0pt, changed by \normalbaselines
+\parskip=0pt plus 1pt
+\abovedisplayskip=12pt plus 3pt minus 9pt
+\abovedisplayshortskip=0pt plus 3pt
+\belowdisplayskip=12pt plus 3pt minus 9pt
+\belowdisplayshortskip=7pt plus 3pt minus 4pt
+% \leftskip=0pt
+% \rightskip=0pt
+\topskip=10pt
+\splittopskip=10pt
+% \tabskip=0pt
+% \spaceskip=0pt
+% \xspaceskip=0pt
+\parfillskip=0pt plus 1fil
+
+\thinmuskip=3mu
+\medmuskip=4mu plus 2mu minus 4mu
+\thickmuskip=5mu plus 5mu
+
+% We also define special registers that function like parameters:
+\newskip\smallskipamount
+\smallskipamount=3pt plus 1pt minus 1pt
+\newskip\medskipamount
+\medskipamount=6pt plus 2pt minus 2pt
+\newskip\bigskipamount
+\bigskipamount=12pt plus 4pt minus 4pt
+\newskip\normalbaselineskip
+\normalbaselineskip=12pt
+\newskip\normallineskip
+\normallineskip=1pt
+\newdimen\normallineskiplimit
+\normallineskiplimit=0pt
+\newdimen\jot
+\jot=3pt
+\newcount\interdisplaylinepenalty
+\interdisplaylinepenalty=100
+\newcount\interfootnotelinepenalty
+\interfootnotelinepenalty=100
+
+% Definitions for preloaded fonts
+
+\def\magstephalf{1095 }
+\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax}
+
+% Fonts assigned to \preloaded are not part of "plain TeX",
+% but they are preloaded so that other format packages can use them.
+% For example, if another set of macros says "\font\ninerm=cmr9",
+% TeX will not have to reload the font metric information for cmr9.
+
+\message{fonts,}
+
+\font\tenrm=cmr10 % roman text
+% \font\preloaded=cmr9
+% \font\preloaded=cmr8
+\font\sevenrm=cmr7
+% \font\preloaded=cmr6
+\font\fiverm=cmr5
+
+\font\teni=cmmi10 % math italic
+% \font\preloaded=cmmi9
+% \font\preloaded=cmmi8
+\font\seveni=cmmi7
+% \font\preloaded=cmmi6
+\font\fivei=cmmi5
+
+\font\tensy=cmsy10 % math symbols
+% \font\preloaded=cmsy9
+% \font\preloaded=cmsy8
+\font\sevensy=cmsy7
+% \font\preloaded=cmsy6
+\font\fivesy=cmsy5
+
+\font\tenex=cmex10 % math extension
+
+% \font\preloaded=cmss10 % sans serif
+% \font\preloaded=cmssq8
+
+% \font\preloaded=cmssi10 % sans serif italic
+% \font\preloaded=cmssqi8
+
+\font\tenbf=cmbx10 % boldface extended
+% \font\preloaded=cmbx9
+% \font\preloaded=cmbx8
+\font\sevenbf=cmbx7
+% \font\preloaded=cmbx6
+\font\fivebf=cmbx5
+
+\font\tentt=cmtt10 % typewriter
+% \font\preloaded=cmtt9
+% \font\preloaded=cmtt8
+
+% \font\preloaded=cmsltt10 % slanted typewriter
+
+\font\tensl=cmsl10 % slanted roman
+% \font\preloaded=cmsl9
+% \font\preloaded=cmsl8
+
+\font\tenit=cmti10 % text italic
+% \font\preloaded=cmti9
+% \font\preloaded=cmti8
+% \font\preloaded=cmti7
+
+\message{more fonts,}
+% \font\preloaded=cmu10 % unslanted text italic
+
+% \font\preloaded=cmmib10 % bold math italic
+% \font\preloaded=cmbsy10 % bold math symbols
+
+% \font\preloaded=cmcsc10 % caps and small caps
+
+% \font\preloaded=cmssbx10 % sans serif bold extended
+
+% \font\preloaded=cmdunh10 % Dunhill style
+
+% \font\preloaded=cmr7 scaled \magstep4 % for titles
+% \font\preloaded=cmtt10 scaled \magstep2
+% \font\preloaded=cmssbx10 scaled \magstep2
+
+% \font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols
+
+% Additional \preloaded fonts can be specified here.
+% (And those that were \preloaded above can be eliminated.)
+
+\let\preloaded=\undefined % preloaded fonts must be declared anew later.
+
+\skewchar\teni='177
+\skewchar\seveni='177
+\skewchar\fivei='177
+\skewchar\tensy='60
+\skewchar\sevensy='60
+\skewchar\fivesy='60
+
+\textfont0=\tenrm
+\scriptfont0=\sevenrm
+\scriptscriptfont0=\fiverm
+\def\rm{\fam\z@\tenrm}
+\textfont1=\teni
+\scriptfont1=\seveni
+\scriptscriptfont1=\fivei
+\def\mit{\fam\@ne}
+\def\oldstyle{\fam\@ne\teni}
+\textfont2=\tensy
+\scriptfont2=\sevensy
+\scriptscriptfont2=\fivesy
+\def\cal{\fam\tw@}
+\textfont3=\tenex
+\scriptfont3=\tenex
+\scriptscriptfont3=\tenex
+\newfam\itfam
+\def\it{\fam\itfam\tenit} % \it is family 4
+\textfont\itfam=\tenit
+\newfam\slfam
+\def\sl{\fam\slfam\tensl} % \sl is family 5
+\textfont\slfam=\tensl
+\newfam\bffam
+\def\bf{\fam\bffam\tenbf} % \bf is family 6
+\textfont\bffam=\tenbf
+\scriptfont\bffam=\sevenbf
+\scriptscriptfont\bffam=\fivebf
+\newfam\ttfam
+\def\tt{\fam\ttfam\tentt} % \tt is family 7
+\textfont\ttfam=\tentt
+
+% Macros for setting ordinary text
+\message{macros,}
+
+\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m
+ \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m}
+\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000%
+ \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 }
+
+\def\normalbaselines{\lineskip\normallineskip
+ \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit}
+
+\def\^^M{\ } % \<return> = \<space>
+\def\^^I{\ } % \<tab> = \<space>
+
+\def\lq{`}
+\def\rq{'}
+\def\lbrack{[}
+\def\rbrack{]}
+
+\let\endgraf=\par
+\let\endline=\cr
+
+\def\space{ }
+\def\empty{}
+\def\null{\hbox{}}
+
+\let\bgroup={
+\let\egroup=}
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\catcode`\^^M=\active % these lines must end with %
+\gdef\obeylines{\catcode`\^^M\active \let^^M\par}%
+\global\let^^M=\par} % this is in case ^^M appears in a \write
+\def\obeyspaces{\catcode`\ \active}
+{\obeyspaces\global\let =\space}
+
+\def\loop#1\repeat{\def\body{#1}\iterate}
+\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next}
+\let\repeat=\fi % this makes \loop...\if...\repeat skippable
+
+\def\thinspace{\kern .16667em }
+\def\negthinspace{\kern-.16667em }
+\def\enspace{\kern.5em }
+
+\def\enskip{\hskip.5em\relax}
+\def\quad{\hskip1em\relax}
+\def\qquad{\hskip2em\relax}
+
+\def\smallskip{\vskip\smallskipamount}
+\def\medskip{\vskip\medskipamount}
+\def\bigskip{\vskip\bigskipamount}
+
+\def\nointerlineskip{\prevdepth-1000\p@}
+\def\offinterlineskip{\baselineskip-1000\p@
+ \lineskip\z@ \lineskiplimit\maxdimen}
+
+\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page
+\def\vglue{\afterassignment\vgl@\skip@=}
+\def\vgl@{\par \dimen@\prevdepth \hrule height\z@
+ \nobreak\vskip\skip@ \prevdepth\dimen@}
+\def\hglue{\afterassignment\hgl@\skip@=}
+\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@
+ \nobreak\hskip\skip@ \spacefactor\count@}
+
+\def~{\penalty\@M \ }
+\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-'
+
+\def\break{\penalty-\@M}
+\def\nobreak{\penalty \@M}
+\def\allowbreak{\penalty \z@}
+
+\def\filbreak{\par\vfil\penalty-200\vfilneg}
+\def\goodbreak{\par\penalty-500 }
+\def\eject{\par\break}
+\def\supereject{\par\penalty-\@MM}
+
+\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi}
+\def\smallbreak{\par\ifdim\lastskip<\smallskipamount
+ \removelastskip\penalty-50\smallskip\fi}
+\def\medbreak{\par\ifdim\lastskip<\medskipamount
+ \removelastskip\penalty-100\medskip\fi}
+\def\bigbreak{\par\ifdim\lastskip<\bigskipamount
+ \removelastskip\penalty-200\bigskip\fi}
+
+\def\line{\hbox to\hsize}
+\def\leftline#1{\line{#1\hss}}
+\def\rightline#1{\line{\hss#1}}
+\def\centerline#1{\line{\hss#1\hss}}
+
+\def\rlap#1{\hbox to\z@{#1\hss}}
+\def\llap#1{\hbox to\z@{\hss#1}}
+
+\def\m@th{\mathsurround\z@}
+\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@
+ \m@th \underline{\box\z@}$}
+
+\newbox\strutbox
+\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@}
+\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi}
+
+\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out
+\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign
+\newcount\mscount
+\def\multispan#1{\omit \mscount#1\relax
+ \loop\ifnum\mscount>\@ne \sp@n\repeat}
+\def\sp@n{\span\omit\advance\mscount\m@ne}
+
+\newif\ifus@
+\newif\if@cr
+\newbox\tabs
+\newbox\tabsyet
+\newbox\tabsdone
+
+\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null}
+\def\settabs{\setbox\tabs\null \futurelet\next\sett@b}
+\let\+=\relax % in case this file is being read in twice
+\def\sett@b{\ifx\next\+\def\nxt{\afterassignment\s@tt@b\let\nxt}%
+ \else\let\nxt\s@tcols\fi \let\next\relax \nxt}
+\def\s@tt@b{\let\nxt\relax \us@false\m@ketabbox}
+\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+
+\outer\def\+{\tabalign}
+\def\s@tcols#1\columns{\count@#1\dimen@\hsize
+ \loop\ifnum\count@>\z@ \@nother \repeat}
+\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@
+ \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}%
+ \advance\dimen@-\dimen@ii \advance\count@\m@ne}
+
+\def\m@ketabbox{\begingroup
+ \global\setbox\tabsyet\copy\tabs
+ \global\setbox\tabsdone\null
+ \def\cr{\@crtrue\crcr\egroup\egroup
+ \ifus@\unvbox\z@\lastbox\fi\endgroup
+ \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}%
+ \setbox\z@\vbox\bgroup\@crfalse
+ \ialign\bgroup&\t@bbox##\t@bb@x\crcr}
+
+\def\t@bbox{\setbox\z@\hbox\bgroup}
+\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column
+ \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet
+ \global\setbox\@ne\lastbox}% now \box\@ne holds its size
+ \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}%
+ \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi
+ \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi
+ \box\z@}
+
+\def\hang{\hangindent\parindent}
+\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces}
+\def\item{\par\hang\textindent}
+\def\itemitem{\par\indent \hangindent2\parindent \textindent}
+\def\narrower{\advance\leftskip\parindent
+ \advance\rightskip\parindent}
+
+\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250
+ \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip
+ \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent}
+\outer\def\proclaim #1. #2\par{\medbreak
+ \noindent{\bf#1.\enspace}{\sl#2\par}%
+ \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi}
+
+\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax}
+\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only
+
+\chardef\%=`\%
+\chardef\&=`\&
+\chardef\#=`\#
+\chardef\$=`\$
+\chardef\ss="19
+\chardef\ae="1A
+\chardef\oe="1B
+\chardef\o="1C
+\chardef\AE="1D
+\chardef\OE="1E
+\chardef\O="1F
+\chardef\i="10 % dotless i
+\chardef\j="11 % dotless j
+\def\aa{\accent23a} %^accent
+\def\l{\char32l}
+\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}}
+
+\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary
+\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}}
+\def\AA{\leavevmode\setbox0\hbox{!}\dimen@\ht0\advance\dimen@-1ex%
+ \rlap{\raise.67\dimen@\hbox{\char'27}}A}
+
+\def\mathhexbox#1#2#3{\leavevmode
+ \hbox{$\m@th \mathchar"#1#2#3$}}
+\def\dag{\mathhexbox279}
+\def\ddag{\mathhexbox27A}
+\def\S{\mathhexbox278}
+\def\P{\mathhexbox27B}
+\def\Orb{\mathhexbox20D}
+
+\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex%
+ \ialign{##\crcr#1\crcr}}} \def\o@lign{\lineskiplimit\z@ \oalign}
+\def\ooalign{\lineskiplimit-\maxdimen \oalign} % chars over each other
+{\catcode`p=12 \catcode`t=12 \gdef\\#1pt{#1}} \let\getf@ctor=\\
+\def\sh@ft#1{\dimen@#1\kern\expandafter\getf@ctor\the\fontdimen1\font
+ \dimen@} % kern by #1 times the current slant
+\def\d#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{-1ex}.\hidewidth}}}
+\def\b#1{{\o@lign{\relax#1\crcr\hidewidth\sh@ft{-3ex}%
+ \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}}}
+\def\c#1{{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% %^accent
+ \else\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}\fi}}
+\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\Orb}}}
+
+\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
+
+\def\`#1{{\accent18 #1}} %^accent
+\def\'#1{{\accent19 #1}} %^accent
+\def\v#1{{\accent20 #1}} %^accent
+\let\^^_=\v
+\def\u#1{{\accent21 #1}} %^accent
+\let\^^S=\u
+\def\=#1{{\accent22 #1}} %^accent
+\def\^#1{{\accent94 #1}} %^accent
+\let\^^D=\^
+\def\.#1{{\accent95 #1}} %^accent
+\def\H#1{{\accent"7D #1}} %^accent
+\def\~#1{{\accent"7E #1}} %^accent
+\def\"#1{{\accent"7F #1}} %^accent
+\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} %^accent
+
+\def\hrulefill{\leaders\hrule\hfill}
+\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill}
+\def\rightarrowfill{$\m@th\smash-\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\mathord\rightarrow$}
+\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-7mu%
+ \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
+ \mkern-7mu\smash-$}
+\mathchardef\braceld="037A
+\mathchardef\bracerd="037B
+\mathchardef\bracelu="037C
+\mathchardef\braceru="037D
+\def\downbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
+ \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru
+ \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd$}
+\def\upbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
+ \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd
+ \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru$}
+
+\outer\def\bye{\par\vfill\supereject\end}
+
+% Macros for math setting
+\message{math definitions,}
+
+\let\sp=^
+\let\sb=_
+\def\,{\mskip\thinmuskip}
+\def\>{\mskip\medmuskip}
+\def\;{\mskip\thickmuskip}
+\def\!{\mskip-\thinmuskip}
+\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+{\catcode`\'=\active \gdef'{^\bgroup\prim@s}}
+\def\prim@s{\prime\futurelet\next\pr@m@s}
+\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t
+ \else\let\nxt\egroup\fi\fi \nxt}
+\def\pr@@@s#1{\prim@s}
+\def\pr@@@t#1#2{#2\egroup}
+{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math
+
+{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_
+
+\mathchardef\alpha="010B
+\mathchardef\beta="010C
+\mathchardef\gamma="010D
+\mathchardef\delta="010E
+\mathchardef\epsilon="010F
+\mathchardef\zeta="0110
+\mathchardef\eta="0111
+\mathchardef\theta="0112
+\mathchardef\iota="0113
+\mathchardef\kappa="0114
+\mathchardef\lambda="0115
+\mathchardef\mu="0116
+\mathchardef\nu="0117
+\mathchardef\xi="0118
+\mathchardef\pi="0119
+\mathchardef\rho="011A
+\mathchardef\sigma="011B
+\mathchardef\tau="011C
+\mathchardef\upsilon="011D
+\mathchardef\phi="011E
+\mathchardef\chi="011F
+\mathchardef\psi="0120
+\mathchardef\omega="0121
+\mathchardef\varepsilon="0122
+\mathchardef\vartheta="0123
+\mathchardef\varpi="0124
+\mathchardef\varrho="0125
+\mathchardef\varsigma="0126
+\mathchardef\varphi="0127
+\mathchardef\Gamma="7000
+\mathchardef\Delta="7001
+\mathchardef\Theta="7002
+\mathchardef\Lambda="7003
+\mathchardef\Xi="7004
+\mathchardef\Pi="7005
+\mathchardef\Sigma="7006
+\mathchardef\Upsilon="7007
+\mathchardef\Phi="7008
+\mathchardef\Psi="7009
+\mathchardef\Omega="700A
+
+\mathchardef\aleph="0240
+\def\hbar{{\mathchar'26\mkern-9muh}}
+\mathchardef\imath="017B
+\mathchardef\jmath="017C
+\mathchardef\ell="0160
+\mathchardef\wp="017D
+\mathchardef\Re="023C
+\mathchardef\Im="023D
+\mathchardef\partial="0140
+\mathchardef\infty="0231
+\mathchardef\prime="0230
+\mathchardef\emptyset="023B
+\mathchardef\nabla="0272
+\def\surd{{\mathchar"1270}}
+\mathchardef\top="023E
+\mathchardef\bot="023F
+\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}}
+\mathchardef\triangle="0234
+\mathchardef\forall="0238
+\mathchardef\exists="0239
+\mathchardef\neg="023A
+\let\lnot=\neg
+\mathchardef\flat="015B
+\mathchardef\natural="015C
+\mathchardef\sharp="015D
+\mathchardef\clubsuit="027C
+\mathchardef\diamondsuit="027D
+\mathchardef\heartsuit="027E
+\mathchardef\spadesuit="027F
+
+\mathchardef\coprod="1360
+\mathchardef\bigvee="1357
+\mathchardef\bigwedge="1356
+\mathchardef\biguplus="1355
+\mathchardef\bigcap="1354
+\mathchardef\bigcup="1353
+\mathchardef\intop="1352
+\def\int{\intop\nolimits}
+\mathchardef\prod="1351
+\mathchardef\sum="1350
+\mathchardef\bigotimes="134E
+\mathchardef\bigoplus="134C
+\mathchardef\bigodot="134A
+\mathchardef\ointop="1348
+\def\oint{\ointop\nolimits}
+\mathchardef\bigsqcup="1346
+\mathchardef\smallint="1273
+
+\mathchardef\triangleleft="212F
+\mathchardef\triangleright="212E
+\mathchardef\bigtriangleup="2234
+\mathchardef\bigtriangledown="2235
+\mathchardef\wedge="225E
+\let\land=\wedge
+\mathchardef\vee="225F
+\let\lor=\vee
+\mathchardef\cap="225C
+\mathchardef\cup="225B
+\mathchardef\ddagger="227A
+\mathchardef\dagger="2279
+\mathchardef\sqcap="2275
+\mathchardef\sqcup="2274
+\mathchardef\uplus="225D
+\mathchardef\amalg="2271
+\mathchardef\diamond="2205
+\mathchardef\bullet="220F
+\mathchardef\wr="226F
+\mathchardef\div="2204
+\mathchardef\odot="220C
+\mathchardef\oslash="220B
+\mathchardef\otimes="220A
+\mathchardef\ominus="2209
+\mathchardef\oplus="2208
+\mathchardef\mp="2207
+\mathchardef\pm="2206
+\mathchardef\circ="220E
+\mathchardef\bigcirc="220D
+\mathchardef\setminus="226E % for set difference A\setminus B
+\mathchardef\cdot="2201
+\mathchardef\ast="2203
+\mathchardef\times="2202
+\mathchardef\star="213F
+
+\mathchardef\propto="322F
+\mathchardef\sqsubseteq="3276
+\mathchardef\sqsupseteq="3277
+\mathchardef\parallel="326B
+\mathchardef\mid="326A
+\mathchardef\dashv="3261
+\mathchardef\vdash="3260
+\mathchardef\nearrow="3225
+\mathchardef\searrow="3226
+\mathchardef\nwarrow="322D
+\mathchardef\swarrow="322E
+\mathchardef\Leftrightarrow="322C
+\mathchardef\Leftarrow="3228
+\mathchardef\Rightarrow="3229
+\def\neq{\not=}
+\let\ne=\neq
+\mathchardef\leq="3214
+\let\le=\leq
+\mathchardef\geq="3215
+\let\ge=\geq
+\mathchardef\succ="321F
+\mathchardef\prec="321E
+\mathchardef\approx="3219
+\mathchardef\succeq="3217
+\mathchardef\preceq="3216
+\mathchardef\supset="321B
+\mathchardef\subset="321A
+\mathchardef\supseteq="3213
+\mathchardef\subseteq="3212
+\mathchardef\in="3232
+\mathchardef\ni="3233
+\let\owns=\ni
+\mathchardef\gg="321D
+\mathchardef\ll="321C
+\mathchardef\not="3236
+\mathchardef\leftrightarrow="3224
+\mathchardef\leftarrow="3220
+\let\gets=\leftarrow
+\mathchardef\rightarrow="3221
+\let\to=\rightarrow
+\mathchardef\mapstochar="3237
+\def\mapsto{\mapstochar\rightarrow}
+\mathchardef\sim="3218
+\mathchardef\simeq="3227
+\mathchardef\perp="323F
+\mathchardef\equiv="3211
+\mathchardef\asymp="3210
+\mathchardef\smile="315E
+\mathchardef\frown="315F
+\mathchardef\leftharpoonup="3128
+\mathchardef\leftharpoondown="3129
+\mathchardef\rightharpoonup="312A
+\mathchardef\rightharpoondown="312B
+
+\def\joinrel{\mathrel{\mkern-3mu}}
+\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
+\def\Relbar{\mathrel=}
+\mathchardef\lhook="312C
+\def\hookrightarrow{\lhook\joinrel\rightarrow}
+\mathchardef\rhook="312D
+\def\hookleftarrow{\leftarrow\joinrel\rhook}
+\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
+\def\models{\mathrel|\joinrel=}
+\def\Longrightarrow{\Relbar\joinrel\Rightarrow}
+\def\longrightarrow{\relbar\joinrel\rightarrow}
+\def\longleftarrow{\leftarrow\joinrel\relbar}
+\def\Longleftarrow{\Leftarrow\joinrel\Relbar}
+\def\longmapsto{\mapstochar\longrightarrow}
+\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
+\def\iff{\;\Longleftrightarrow\;}
+
+\mathchardef\ldotp="613A % ldot as a punctuation mark
+\mathchardef\cdotp="6201 % cdot as a punctuation mark
+\mathchardef\colon="603A % colon as a punctuation mark
+\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}
+\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@
+ \kern6\p@\hbox{.}\hbox{.}\hbox{.}}}
+\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu
+ \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}}
+
+\def\acute{\mathaccent"7013 } %^math_accent
+\def\grave{\mathaccent"7012 } %^math_accent
+\def\ddot{\mathaccent"707F } %^math_accent
+\def\tilde{\mathaccent"707E } %^math_accent
+\def\bar{\mathaccent"7016 } %^math_accent
+\def\breve{\mathaccent"7015 } %^math_accent
+\def\check{\mathaccent"7014 } %^math_accent
+\def\hat{\mathaccent"705E } %^math_accent
+\def\vec{\mathaccent"017E } %^math_accent
+\def\dot{\mathaccent"705F } %^math_accent
+\def\widetilde{\mathaccent"0365 } %^math_accent
+\def\widehat{\mathaccent"0362 } %^math_accent
+\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
+ \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr
+ \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}
+\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
+ \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
+ $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
+\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
+ \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\skew#1#2#3{{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@
+ #2{\mkern-\muskip\z@{#3}\mkern\muskip\z@}\mkern-\muskip\z@}{}}
+
+\def\lmoustache{\delimiter"437A340 } % top from (, bottom from )
+\def\rmoustache{\delimiter"537B341 } % top from ), bottom from (
+\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips
+\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips
+\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads
+\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads
+\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces
+\def\Vert{\delimiter"26B30D }
+\let\|=\Vert
+\def\vert{\delimiter"26A30C }
+\def\uparrow{\delimiter"3222378 }
+\def\downarrow{\delimiter"3223379 }
+\def\updownarrow{\delimiter"326C33F }
+\def\Uparrow{\delimiter"322A37E }
+\def\Downarrow{\delimiter"322B37F }
+\def\Updownarrow{\delimiter"326D377 }
+\def\backslash{\delimiter"26E30F } % for double coset G\backslash H
+\def\rangle{\delimiter"526930B }
+\def\langle{\delimiter"426830A }
+\def\rbrace{\delimiter"5267309 }
+\let\}=\rbrace
+\def\lbrace{\delimiter"4266308 }
+\let\{=\lbrace
+\def\rceil{\delimiter"5265307 }
+\def\lceil{\delimiter"4264306 }
+\def\rfloor{\delimiter"5263305 }
+\def\lfloor{\delimiter"4262304 }
+
+\def\bigl{\mathopen\big}
+\def\bigm{\mathrel\big}
+\def\bigr{\mathclose\big}
+\def\Bigl{\mathopen\Big}
+\def\Bigm{\mathrel\Big}
+\def\Bigr{\mathclose\Big}
+\def\biggl{\mathopen\bigg}
+\def\biggm{\mathrel\bigg}
+\def\biggr{\mathclose\bigg}
+\def\Biggl{\mathopen\Bigg}
+\def\Biggm{\mathrel\Bigg}
+\def\Biggr{\mathclose\Bigg}
+\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
+\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
+\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
+\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
+\def\n@space{\nulldelimiterspace\z@ \m@th}
+
+\def\choose{\atopwithdelims()}
+\def\brack{\atopwithdelims[]}
+\def\brace{\atopwithdelims\{\}}
+
+\def\sqrt{\radical"270370 }
+
+\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}}
+\newbox\rootbox % Box to hold radicand for nth root commands.
+\def\root#1\of{\setbox\rootbox
+ \hbox{$\m@th\scriptscriptstyle{#1}$}\mathpalette\r@@t}
+\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$}\dimen@\ht\z@
+ \advance\dimen@-\dp\z@
+ \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu\box\z@}
+\newif\ifv@
+\newif\ifh@
+\def\vphantom{\v@true\h@false\ph@nt}
+\def\hphantom{\v@false\h@true\ph@nt}
+\def\phantom{\v@true\h@true\ph@nt}
+\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}%
+ \else\let\next\makeph@nt\fi\next}
+\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt}
+\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt}
+\def\finph@nt{\setbox\tw@\null
+ \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi
+ \ifh@ \wd\tw@\wd\z@\fi \box\tw@}
+\def\mathstrut{\vphantom(}
+\def\smash{\relax % \relax, in case this comes first in \halign
+ \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh
+ \fi\next}
+\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh}
+\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh}
+\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}
+
+\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign
+\def\@vereq#1#2{\lower.5\p@\vbox{\lineskiplimit\maxdimen\lineskip-.5\p@
+ \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
+\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt
+ \hbox{$#1\rightharpoonup$}\crcr
+ $#1\leftharpoondown$}}}}
+\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\doteq{\buildrel\textstyle.\over=}
+
+\def\log{\mathop{\rm log}\nolimits}
+\def\lg{\mathop{\rm lg}\nolimits}
+\def\ln{\mathop{\rm ln}\nolimits}
+\def\lim{\mathop{\rm lim}}
+\def\limsup{\mathop{\rm lim\,sup}}
+\def\liminf{\mathop{\rm lim\,inf}}
+\def\sin{\mathop{\rm sin}\nolimits}
+\def\arcsin{\mathop{\rm arcsin}\nolimits}
+\def\sinh{\mathop{\rm sinh}\nolimits}
+\def\cos{\mathop{\rm cos}\nolimits}
+\def\arccos{\mathop{\rm arccos}\nolimits}
+\def\cosh{\mathop{\rm cosh}\nolimits}
+\def\tan{\mathop{\rm tan}\nolimits}
+\def\arctan{\mathop{\rm arctan}\nolimits}
+\def\tanh{\mathop{\rm tanh}\nolimits}
+\def\cot{\mathop{\rm cot}\nolimits}
+\def\coth{\mathop{\rm coth}\nolimits}
+\def\sec{\mathop{\rm sec}\nolimits}
+\def\csc{\mathop{\rm csc}\nolimits}
+\def\max{\mathop{\rm max}}
+\def\min{\mathop{\rm min}}
+\def\sup{\mathop{\rm sup}}
+\def\inf{\mathop{\rm inf}}
+\def\arg{\mathop{\rm arg}\nolimits}
+\def\ker{\mathop{\rm ker}\nolimits}
+\def\dim{\mathop{\rm dim}\nolimits}
+\def\hom{\mathop{\rm hom}\nolimits}
+\def\det{\mathop{\rm det}}
+\def\exp{\mathop{\rm exp}\nolimits}
+\def\Pr{\mathop{\rm Pr}}
+\def\gcd{\mathop{\rm gcd}}
+\def\deg{\mathop{\rm deg}\nolimits}
+
+\def\bmod{\nonscript\mskip-\medmuskip\mkern5mu
+ \mathbin{\rm mod}\penalty900\mkern5mu\nonscript\mskip-\medmuskip}
+\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+ \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr\noalign{\kern-\baselineskip}
+ #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\pmatrix#1{\left(\matrix{#1}\right)}
+\newdimen\p@renwd
+\setbox0=\hbox{\tenex B}
+\p@renwd=\wd0 % width of the big left (
+\def\bordermatrix#1{\begingroup \m@th
+ \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}%
+ \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil
+ &&\quad\hfil$##$\hfil\crcr
+ \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}%
+ #1\crcr\omit\strut\cr}}%
+ \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}%
+ \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne
+ \global\setbox\@ne\vbox{\box\@ne\kern2\p@}%
+ \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}%
+ \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup}
+
+\def\openup{\afterassignment\@penup\dimen@=}
+\def\@penup{\advance\lineskip\dimen@
+ \advance\baselineskip\dimen@
+ \advance\lineskiplimit\dimen@}
+\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th
+ \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
+ \crcr#1\crcr}}\,}
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@
+ \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
+\def\displaylines#1{\displ@y \tabskip\z@skip
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+\def\eqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip\z@skip\crcr
+ #1\crcr}}
+\def\leqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr
+ #1\crcr}}
+
+% Definitions related to output
+
+\message{output routines,}
+
+\countdef\pageno=0
+\pageno=1 % first page is number 1
+\newtoks\headline
+\headline={\hfil} % headline is normally blank
+\newtoks\footline
+\footline={\hss\tenrm\folio\hss}
+ % footline is normally a centered page number in font \tenrm
+\newif\ifr@ggedbottom
+\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue}
+\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom
+\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi}
+\def\nopagenumbers{\footline{\hfil}} % blank out the footline
+\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne
+ \else\global\advance\pageno\@ne \fi} % increase |pageno|
+
+\newinsert\footins
+\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later
+ \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi
+ #1\@sf\vfootnote{#1}}
+\def\vfootnote#1{\insert\footins\bgroup
+ \interlinepenalty\interfootnotelinepenalty
+ \splittopskip\ht\strutbox % top baseline for broken footnotes
+ \splitmaxdepth\dp\strutbox \floatingpenalty\@MM
+ \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip
+ \textindent{#1}\footstrut\futurelet\next\fo@t}
+\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t
+ \else\let\next\f@t\fi \next}
+\def\f@@t{\bgroup\aftergroup\@foot\let\next}
+\def\f@t#1{#1\@foot}
+\def\@foot{\strut\egroup}
+\def\footstrut{\vbox to\splittopskip{}}
+\skip\footins=\bigskipamount % space added when footnote is present
+\count\footins=1000 % footnote magnification factor (1 to 1)
+\dimen\footins=8in % maximum footnotes per page
+
+\newinsert\topins
+\newif\ifp@ge
+\newif\if@mid
+\def\topinsert{\@midfalse\p@gefalse\@ins}
+\def\midinsert{\@midtrue\@ins}
+\def\pageinsert{\@midfalse\p@getrue\@ins}
+\skip\topins=\z@skip % no space added when a topinsert is present
+\count\topins=1000 % magnification factor (1 to 1)
+\dimen\topins=\maxdimen % no limit per page
+\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox
+\def\endinsert{\egroup % finish the \vbox
+ \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@
+ \advance\dimen@\pagetotal \advance\dimen@-\pageshrink
+ \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi
+ \if@mid \bigskip\box\z@\bigbreak
+ \else\insert\topins{\penalty100 % floating insertion
+ \splittopskip\z@skip
+ \splitmaxdepth\maxdimen \floatingpenalty\z@
+ \ifp@ge \dimen@\dp\z@
+ \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
+ \else \box\z@\nobreak\bigskip\fi}\fi\endgroup}
+
+\output{\plainoutput}
+\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}%
+ \advancepageno
+ \ifnum\outputpenalty>-\@MM \else\dosupereject\fi}
+\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}}
+\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
+ \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
+\def\makefootline{\baselineskip24\p@\lineskiplimit\z@\line{\the\footline}}
+\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over
+ \line{}\kern-\topskip\nobreak\vfill\supereject\fi}
+
+\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi
+ \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255
+ \ifvoid\footins\else % footnote info is present
+ \vskip\skip\footins
+ \footnoterule
+ \unvbox\footins\fi
+ \ifr@ggedbottom \kern-\dimen@ \vfil \fi}
+\def\footnoterule{\kern-3\p@
+ \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high
+
+% Hyphenation, miscellaneous macros, and initial values for standard layout
+\message{hyphenation}
+
+\lefthyphenmin=2
+\righthyphenmin=3 % disallow x- or -xx breaks
+\input hyphen
+
+\def\magnification{\afterassignment\m@g\count@}
+\def\m@g{\mag\count@
+ \hsize6.5truein\vsize8.9truein\dimen\footins8truein}
+
+\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@
+ \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne
+ \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne
+ \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode}
+
+\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm
+ \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}}
+
+\normalbaselines\rm % select roman font
+\nonfrenchspacing % punctuation affects the spacing
+\catcode`@=12 % at signs are no longer letters
+
+\def\fmtname{plain}
+\def\fmtversion{3.1415926} % identifies the current format
diff --git a/macros/plain/contrib/zztex/tex/zzart.tex b/macros/plain/contrib/zztex/tex/zzart.tex
new file mode 100644
index 0000000000..52b4081426
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzart.tex
@@ -0,0 +1,611 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Art Facilities
+%
+% Synopsis: This module provides facilities to deal with external art.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 7 June 1991
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Art File Root & Placing Control
+% --- ---- ---- - ------- -------
+
+
+\def \zartroot {}
+\setflag \zplaceart = \true
+
+
+\def \setartroot #1{% {root/}
+ \gdef \zartroot {#1}}
+
+\def \zprependartroot #1#2{% {\name}{filespec}
+ \edef #1{\zartroot#2}}
+
+\def \placeart #1{%
+ \setflag \zplaceart = #1}
+
+% Imported Art
+% -------- ---
+
+
+\defineblock{\art}{\endart}{\false}{}
+
+%~block art Type
+% \abovepenalty = integer % Penalty above block.
+% \aboveskip = glue % Space b/b above block.
+% \belowpenalty = integer % Penalty below block.
+% \belowskip = glue % Space b/b below block.
+% \setflag \cliptobb = flag % Clip art to its bounding box?
+% \hfuzz = dimen % Horizontal fuzz.
+% \hscale = dimen % Horizontal scale (in points).
+% \leftindent = glue % Left indentation.
+% \rightindent = glue % Right indentation.
+% \vscale = dimen % Vertical scale (in points).
+% \vshift = dimen % Vertical shift.
+%~end
+
+\definedimen{\artwidth}{0pt}
+\definedimen{\artheight}{0pt}
+\definedimen{\hscale}{0pt}
+\definedimen{\vscale}{0pt}
+
+
+%~ The format of the *file-info* argument is:
+%~ *file*,*width*,*height*,*scale*[,*gutter*,*file*,...]&/
+%~ The *file* is a file name preceded by |!| or |=|.
+
+\def \art #1#2{% {type}{file-info}
+ \beginblockscope{art}%
+ \global\increment \artdepth
+ \abovepenalty = \breakgood %~default hard
+ \belowpenalty = \breakgood %~default hard
+ \setflag \cliptobb = \false %~default soft
+ \hfuzz = 1pt %~default soft
+ \hscale = 1.0pt %~default hard
+ \vscale = 1.0pt %~default hard
+ \vshift = \mindimen %~default soft
+ \processdesign{\art}{#1}%
+ \global\increment \artnumber
+ \global\artwidth = 0pt
+ \global\artheight = 0pt
+ \artformat{#2}%
+ \endart}
+
+\def \endart {%
+ \global\decrement \artdepth
+ \endblockscope{art}}
+
+\def \artformat #1{% {info}
+ \endgraf
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \noindent \zbldartline 0pt,#1,\zmark \endgraf
+ \prevdepth = 0pt % Nothing better to do.
+ \bbskipbelow{\belowpenalty}{\belowskip}}
+
+\def \zbldartline #1,#2,#3,#4,#5,#6\zmark{% gutter,file,width,height,scale,...,\zmark
+ \zbuildartlineb{#1}{#2}{#3}{#4}{#5}%
+ \zwriteartinfo{#2}{#3}{#4}{#5}%
+ \if \notp{\emptyargp{#6}}\zbldartline #6\zmark \fi}
+
+% Place Art File
+% ----- --- ----
+
+
+\definedimen{\zleftslop}{0pt}
+\definedimen{\zrightslop}{0pt}
+\definedimen{\ztopslop}{0pt}
+\definedimen{\zbottomslop}{0pt}
+\definedimen{\zartwidth}{0pt}
+\definedimen{\zartheight}{0pt}
+\definedimen{\zartscale}{0pt}
+
+
+\def \zbuildartlineb #1#2#3#4#5{% {gutter}{file}{width}{height}{scale}
+ \kern #1\relax
+ \zparseartfile #2,0pt,0pt,0pt,0pt,\zmark
+ \zchkartfile{\zgotart}%
+ \zcalcartdimens{#3}{#4}{#5}%
+ \zbuildartlinec{\zartfile}%
+ \gcalculate \artwidth = {\artwidth,+,#1,+,\zartwidth}%
+ \if \dimgtrp{\zartheight}{\artheight}\global\artheight = \zartheight \fi}
+
+\def \zparseartfile #1,#2,#3,#4,#5,#6\zmark{% spec,left,right,top,bottom\zmark
+ \zparseartspec #1.eps.\zmark
+ \zleftslop = #2%
+ \zrightslop = #3%
+ \ztopslop = #4%
+ \zbottomslop = #5\relax}
+
+\def \zcalcartdimens #1#2#3{% {width}{height}{scale}
+ \if \orp{\andp{\dimzerop{#1}}{\dimzerop{#2}}}
+ {\forceepsbb}%
+ \if \zgotart
+ \zreadepsbb{\zartwidth}{\zartheight}{\zartfile}%
+ \else
+ \zartwidth = 20pc \zartheight = 10pc
+ \fi
+ \else
+ \calculate \zartwidth = {#1,-,\zleftslop,-,\zrightslop}%
+ \calculate \zartheight = {#2,-,\ztopslop,-,\zbottomslop}%
+ \fi
+ \zcalcartscale #3\zmark
+ \calculate \zartwidth = {\zartwidth,S,\zartscale,S,\hscale}%
+ \calculate \zartheight = {\zartheight,S,\zartscale,S,\vscale}%
+ \calculate \zleftslop = {\zleftslop,S,\zartscale,S,\hscale}%
+ \calculate \zbottomslop = {\zbottomslop,S,\zartscale,S,\vscale}%
+ \if \forceepsbb
+ \advance \zleftslop by \zbbxorigin
+ \advance \zbottomslop by \zbbyorigin
+ \fi}
+
+\def \zcalcartscale #1#2\zmark{% scale\zmark
+ \if \codeeqlp{#1}{=}%
+ \if \emptyargp{#2}%
+ \calculate \zartscale = {\hsize,R,\zartwidth}%
+ \else
+ \calculate \zartscale = {#2,R,\zartwidth}%
+ \fi
+ \else
+ \calculate \zartscale = {#1#2pt,/,100}%
+ \fi}
+
+\def \zbuildartlinec #1{% {title}
+ \if \dimeqlp{\vshift}{\mindimen}%
+ \measureascenderheight{\vshift}%
+ \fi
+ \vtop {% % Place art in a vbox.
+ \offinterlineskip
+ \rule{height \vshift width 0pt}% % Force the height of the
+ \kern -\vshift % box to match ascenders.
+ \rule{height 0pt width \zartwidth}% % Force the width of the box.
+ \if \andp{\zplaceart}{\zgotart}%
+ \rule{height 0pt depth \zartheight width 0pt}% % Force its depth.
+ \zplaceartfile
+ \vss
+ \else
+ \vbox to \zartheight{% % Force its depth.
+ \topcornermarks{\zartwidth}{.5pc}{.25pt}%
+ \vss
+ \hbox to \zartwidth {\hss \zannofont #1\hss}%
+ \hbox to \zartwidth {\hss \zannofont
+ \if \notp{\zplaceart}[not placing]\fi
+ \if \notp{\zgotart}[to come]\fi
+ \hss}%
+ \vss
+ \bottomcornermarks{\zartwidth}{.5pc}{.25pt}}%
+ \fi}}
+
+\def \zplaceartfile {%
+ \kern \zbottomslop
+ \moveleft \zleftslop \vbox{%
+ \special{CTM: push}%
+ \special{CTM: scale \thefactor\hscale \space \thefactor\vscale}%
+ \specialplaceepsfile{\zartfile}{\zartscale}{\cliptobb}%
+ \special{CTM: pop}}%
+ \kern -\zbottomslop}
+
+% Duplicates and Missing Art
+% ---------- --- ------- ---
+
+
+% Write an art entry into the cross-reference file.
+
+\def \zwriteartinfo #1#2#3#4{% {file}{width}{height}{scale}
+ \zbeginhidewrite
+ \edef \znext {\noexpand\xref{art}{\noexpand\folio}%
+ {#1}%
+ {#2,#3}
+ {#4}}%
+ \znext
+ \zendhidewrite}
+
+% This macro is invoked by \xref. In copy mode, it checks to make sure
+% that no art file is used twice.
+
+\def \xrefart #1#2#3#4{% {page}{number}{title}{tag}
+ \ifnum \xrefmode=\xrefcopymode
+ \zxrefarta #2,\zmark
+ \fi}
+
+\def \zxrefarta #1#2,#3\zmark{%
+ \if \notp{\orp{\codeeqlp{#1}{!}}{\codeeqlp{#1}{=}}}%
+ \if \definedp{\zart:#1#2}%
+ \warning{dupart}{Art file `#1#2' is used more than once in the book}%
+ \fi
+ \withname\gdef{\zart:#1#2}{}%
+ \fi}
+
+% This macro is invoked at the end of the run.
+
+\def \zmissingartmsg {%
+ \if \posp{\zmissingart}%
+ \remark{Number of missing art files in this run: \number\zmissingart.}%
+ \fi}
+
+% Built-In Art Blocks
+% -------- --- ------
+
+\def \fullpagegraphic #1{% {art-spec}
+ \vsinkfromtrim{-\standardbleed}
+ \smashbox{%
+ \with{\hfuzz=99pc%
+ \leftindent=\if \evenpagep \evenbleedshift \else \oddbleedshift \fi}
+ \art{graphic}{#1}}}
+
+\def \artgraphicdesign {%
+ \aboveskip = \noskip
+ \belowskip = \noskip
+ \setflag \cliptobb = \false
+ \hfuzz = 1pt
+ \leftindent = 0pt
+ \rightindent = 0pt
+ \vshift = 0pt}
+
+% Glyph Definitions
+% ----- -----------
+
+
+% This macro allows the user to define a "glyph," which is an EPS file
+% that is treated like a fancy character. The bounding box must be
+% perfect.
+
+\def \defineglyph #1#2#3{% {\name}{spec,width,height,scale}{raise}
+ \gdef #1{\zglyph #2,#3\zmark}}
+
+\def \zglyph #1,#2,#3,#4,#5\zmark{% spec,width,height,scale,raise\zmark
+ {\zparseartspec #1.eps.\zmark
+ \zchkartfile{\zgotart}%
+ \zartwidth = #2%
+ \zartheight = #3%
+ \tdimena = #4\typesize % \tdimena = final scale in points.
+ \divide \tdimena by 10
+ \calculate \zartwidth = {\zartwidth,P,\thefactor\tdimena}%
+ \calculate \zartheight = {\zartheight,P,\thefactor\tdimena}%
+ \raise #5 \hbox to \zartwidth{%
+ \rule{height \zartheight depth 0pt width 0pt}%
+ \if \zgotart
+ \specialplaceglyph{\zartfile}{\tdimena}{\false}%
+ \fi
+ \hfil}}}
+
+\defineglyph{\acidfree}{!acidfree,2pc,2pc,35}{-1.5pt}
+
+% Panel Label Block
+% ----- ----- -----
+
+
+\defineblock{\panellabel}{\endpanellabel}{\false}{}
+
+%~block panellabel Type
+% \aboveskip = glue % Space b/b above block.
+% \belowskip = glue % Space b/b below block.
+% \bodyfont = {...} % Font for text.
+% \style = {...} % Label style.
+% \vshift = dimen % Vertical shift.
+%~end
+
+\def \panellabel #1#2{% {type}{label-list}
+ \beginblockscope{panellabel}%
+ \global\increment \panellabeldepth
+ \style = {letter in parens}% %~default soft
+ \vshift = 0pt %~default soft
+ \processdesign{\panellabel}{#1}%
+ \global\increment \panellabelnumber
+ \panellabelformat{#2}%
+ \endpanellabel}
+
+\def \endpanellabel {%
+ \global\decrement \panellabeldepth
+ \endblockscope{panellabel}}
+
+\def \panellabelformat #1{% {panel-list}
+ \endgraf
+ \bbskipabove{\breaknever}{\aboveskip}%
+ \the\bodyfont
+ \noindent
+ \zdolabel #1,\zmark
+ \endgraf
+ \bbskipbelow{\breakallowed}{\belowskip}}
+
+\def \zdolabel #1,#2,#3\zmark{% shift,label,...
+ \rlap{%
+ \hspace{#1}%
+ \smash{\lower \vshift \hbox{#2}}}%
+ \if \notp{\emptyargp{#3}}\zdolabel #3\zmark \fi}
+
+% Frames
+% ------
+
+
+\defineblock{\frame}{\endframe}{\false}{}
+
+%~block frame Type
+% \abovepenalty = integer % Penalty above block.
+% \aboveskip = glue % Space b/b above block.
+% \def \backgroundformat ##1{...} % Background formatter.
+% \belowpenalty = integer % Penalty below block.
+% \belowskip = glue % Space b/b below block.
+% \deferredparams = {...} % Deferred parameter calculations.
+% \framecolor = {color} % Color of frame.
+% \framewidths = {left,right,top,bot} % Widths of frame segments.
+% \framegaps = {left,right,top,bot} % Gaps between frame and material.
+% \leftindent = glue % Left indentation of enclosed material.
+% \screencolor = {color} % Background screen color.
+% \width = dimen % Width of enclosed material.
+%~end
+
+% Together, \leftindent and \width specify the position of the enclosed
+% text within the text box, not of the frame itself.
+
+
+\definetoks{\deferredparams}
+\definetoks{\framecolor}
+\definetoks{\framewidths}
+\definetoks{\framegaps}
+\definetoks{\screencolor}
+
+\definecount{\framepage}{0}
+
+\definecount{\zdivframecounter}{0}
+
+\def \frame #1{% {type}
+ \beginblockscope{frame}%
+ \global\increment \framedepth
+ \global\increment \zdivframecounter
+ \whichpage{\framepage}{zE:\the\divisionname-\the\zdivframecounter}%
+ \abovepenalty = \breakgood %~default hard
+ \def \backgroundformat ##1{}% %~default soft
+ \belowpenalty = \breakgood %~default hard
+ \deferredparams = {}% %~default soft
+ \framecolor = {black}% %~default soft
+ \leftindent = 0pt %~default soft
+ \screencolor = {}% %~default soft
+ \width = \naturalwidth %~default soft
+ \processdesign{\frame}{#1}%
+ \global\increment \framenumber
+ \setbox\zboxa = \vtop \bgroup
+ \zpushvcontext}
+
+\def \endframe {%
+ \endgraf
+ \unskip
+ \zpopvcontext
+ \egroup % \vtop
+ \the\deferredparams
+ \setbox\zboxb = \hbox to \width{%
+ \hspace{-\leftindent}\box\zboxa \hss}%
+ \edef \zcolorrule {\noexpand\colorrule{\the\framecolor}}%
+ \def \zarga ##1,##2,##3,##4\zmark{##1\relax}%
+ \def \zargb ##1,##2,##3,##4\zmark{##2\relax}%
+ \def \zargc ##1,##2,##3,##4\zmark{##3\relax}%
+ \def \zargd ##1,##2,##3,##4\zmark{##4\relax}%
+ \tdimenc = \expandafter\zargc\the\framegaps\zmark
+ \advance \tdimenc by \ht\zboxb
+ \advance \tdimenc by \dp\zboxb
+ \advance \tdimenc by \expandafter\zargd\the\framegaps\zmark
+ \setbox\zboxa = \vtop {%
+ \offinterlineskip
+ \measureascenderheight{\tdimena}% % Force the height of the
+ \rule{width 0pt height \tdimena}% % box to match ascenders.
+ \kern -\tdimena
+ \smashbox{\backgroundformat{\tdimenc}}%
+ \if \notp{\emptytoksp{\screencolor}}%
+ \tdimend = \expandafter\zarga\the\framegaps\zmark
+ \advance \tdimend by \wd\zboxb
+ \advance \tdimend by \expandafter\zargb\the\framegaps\zmark
+ \smashbox{%
+%%% \moveright \expandafter\zarga\the\framewidths\zmark \smashbox{%
+ \colorrule{\the\screencolor}{width \tdimend height \tdimenc}}%
+ \fi
+ \zcolorrule{height \expandafter\zargc\the\framewidths\zmark}%
+ \kern -\expandafter\zargc\the\framewidths\zmark
+ \hbox {%
+ \rlap{\zcolorrule{height \tdimenc
+ width \expandafter\zarga\the\framewidths\zmark}}%
+ \hskip \expandafter\zarga\the\framegaps\zmark
+ \vbox {%
+ \vskip \expandafter\zargc\the\framegaps\zmark
+ \box\zboxb
+ \vskip \expandafter\zargd\the\framegaps\zmark}%
+ \hskip \expandafter\zargb\the\framegaps\zmark
+ \llap{\zcolorrule{height \tdimenc
+ width \expandafter\zargb\the\framewidths\zmark}}}%
+ \kern -\expandafter\zargd\the\framewidths\zmark
+ \zcolorrule{height \expandafter\zargd\the\framewidths\zmark}%
+ \tagpageonly{\uniquetag{zE}{\the\zdivframecounter}}}%
+ \advance \leftindent by -\expandafter\zarga\the\framewidths\zmark
+ \advance \leftindent by -\expandafter\zarga\the\framegaps\zmark
+ \frameformat
+ \global\decrement \framedepth
+ \endblockscope{frame}}
+
+\def \frameformat {%
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \hindent{\leftindent} \rlap{\box\zboxa}\par
+ \prevdepth = 0pt % Last thing in box is rule.
+ \bbskipbelow{\belowpenalty}{\belowskip}}
+
+% This macro is invoked at the beginning of each division.
+
+\def \zframedivinit {%
+ \global\zdivframecounter = 0\relax}
+
+% Margin Rules
+% ------ -----
+
+
+\defineblock{\marginrule}{\endmarginrule}{\false}{}
+
+%~block marginrule Type
+% \artspec = {...} % Art spec for graphic above rule.
+% \leftshift = dimen % Horizontal shift for rule in left margin.
+% \position = {...} % Position options.
+% \rightshift = dimen % Horizonal shift for rule in right margin.
+% \rulecolor = {...} % Color of rule.
+% \rulewidth = dimen % Width of rule.
+% \vshift = dimen % Vertical shift for note.
+%~end
+
+\definetoks{\artspec}
+\definedimen{\leftshift}{0pt}
+\definedimen{\rightshift}{0pt}
+
+\definecount{\marginrulepage}{0}
+
+\definecount{\zdivmrcounter}{0}
+\definedimen{\zmrshift}{0pt}
+\definedimen{\zmrprevdepth}{0pt}
+
+\def \marginrule #1#2{% {type}{height,depth}
+ \blockcantbein{\marginrule}{\marginrule}%
+ \beginblockscope{marginrule}%
+ \global\increment \marginruledepth
+ \global\increment \zdivmrcounter
+ \whichpage{\marginrulepage}{zR:\the\divisionname-\the\zdivmrcounter}%
+ \rulecolor = {black} %~default soft
+ \vshift = 0pt %~default soft
+ \processdesign{\marginrule}{#1}%
+ \zparsemrpos{\the\position}%
+ \marginruleformat{#2}%
+ \endmarginrule}
+
+\def \endmarginrule {%
+ \global\decrement \marginruledepth
+ \endblockscope{marginrule}}
+
+\def \marginruleformat #1{% {height,depth}
+ \if \vmodep
+ \zmrprevdepth = \prevdepth
+ \nointerlineskip
+ \else
+ \vadjust
+ \fi
+ \bgroup
+ \topskip = 0pt
+ \moveright \zmrshift \vtop to 0pt{%
+ \vskip \vshift
+ \zmrgraphic
+ \zmrrule #1\zmark
+ \vss
+ \tagpageonly{\uniquetag{zR}{\the\zdivmrcounter}}}%
+ \egroup
+ \if \vmodep \prevdepth = \zmrprevdepth \fi}
+
+% This macro sets up variables that specify the position of a margin rule
+% according to the \position design parameter:
+%
+% \ifevenpage Use next position only on even page.
+% \ifoddpage Use next position only on odd page.
+% \leftmargin Shift note to left margin.
+% \outsidemargin Shift note to outside margin.
+% \rightmargin Shift note to right margin.
+
+\definecount{\zmrhpos}{0}
+
+\def \zparsemrpos #1{% {options...}
+ \global\zmrhpos = 0
+ {\def \ifevenpage ##1{\if \evenp{\marginrulepage}##1\fi}%
+ \def \ifoddpage ##1{\if \oddp{\marginrulepage}##1\fi}%
+ \def \leftmargin {\global\zmrhpos=1\relax}%
+ \def \outsidemargin{\ifevenpage{\leftmargin}\ifoddpage{\rightmargin}}%
+ \def \rightmargin {\global\zmrhpos=2\relax}%
+ #1\relax}%
+ \ifcase \zmrhpos
+ \error{nomrpos}
+ {No horizontal position has been specified for a margin rule}%
+ \or
+ \if \negp{\leftshift}%
+ \zmrshift = \leftshift
+ \else
+ \if \evenp{\marginrulepage}%
+ \calculate \zmrshift = {-\evenlefttextmargin,+,\leftshift}%
+ \else
+ \calculate \zmrshift = {-\oddlefttextmargin,+,\leftshift}%
+ \fi
+ \fi
+ \or
+ \calculate \zmrshift = {\textmeasure,+,\rightshift}%
+ \fi}
+
+\def \zmrgraphic {%
+ \if \emptytoksp{\artspec}%
+ \artheight = 0pt
+ \else
+ \xdef \znext {\noexpand\art{zmarginrule}{\the\artspec}}%
+ \znext
+ \kern -1pt
+ \fi}
+
+\definedimen{\zmrdepth}{0pt}
+
+\def \zmrrule #1,#2\zmark{% height,depth\zmark
+ \calculate \zmrdepth = {#2,-,\artheight}%
+ \setbox \zboxa = \hbox{\vrule width 0pt height #1 depth \zmrdepth}%
+ \vskip -\ht\zboxa
+ \colorrule{\the\rulecolor}{width \rulewidth height #1 depth \zmrdepth}}
+
+\def \artzmarginruledesign {%
+ \aboveskip = \noskip
+ \belowskip = \noskip
+ \setflag \cliptobb = \false
+ \hfuzz = 999pc
+ \leftindent = 0pt
+ \rightindent = 0pt
+ \vshift = \mindimen}
+
+% This macro is invoked at the beginning of each division.
+
+\def \zmrdivinit {%
+ \global\zdivmrcounter = 0\relax}
+
+% Corner Marks
+% ------ -----
+
+
+\def \topcornermarks #1#2#3{% {box-width}{length}{thickness}
+ \hbox to #1{\vrule height #3 depth 0pt width #2 \hss
+ \vrule height #3 depth 0pt width #2}%
+ \nointerlineskip
+ \hbox to #1{\vrule height #2 depth 0pt width #3 \hss
+ \vrule height #2 depth 0pt width #3}}
+
+\def \bottomcornermarks #1#2#3{% {box-width}{length}{thickness}
+ \hbox to #1{\vrule height #2 depth 0pt width #3 \hss
+ \vrule height #2 depth 0pt width #3}%
+ \nointerlineskip
+ \hbox to #1{\vrule height #3 depth 0pt width #2 \hss
+ \vrule height #3 depth 0pt width #2}}
+
+% Utilities
+% ---------
+
+
+\definecount{\zmissingart}{0} % Count of missing art files.
+
+
+% Check that the art file exists and issue remark if not.
+
+\def \zchkartfile #1{% {\flag}
+ \setflag #1= \true
+ \checkfile{\znext}{\zartfile}%
+ \if \notp{\znext}%
+ \remark{Art file `\zartfile' is missing; ignored for now}%
+ \global\increment \zmissingart
+ \setflag #1= \false
+ \fi}
+
+\def \zparseartspec #1#2.#3.#4\zmark{% name.ext.\zmark
+ \def \zartfile {???}% % Why do this?
+ \if \codeeqlp{#1}{!}%
+ \def \zartfile{#2.#3}%
+ \else\if \codeeqlp{#1}{=}%
+ \zprependartroot{\zartfile}{#2.#3}%
+ \else
+ \zprependartroot{\zartfile}{#1#2.#3}%
+ \fi\fi}
diff --git a/macros/plain/contrib/zztex/tex/zzbiblio.tex b/macros/plain/contrib/zztex/tex/zzbiblio.tex
new file mode 100644
index 0000000000..cc834e4109
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzbiblio.tex
@@ -0,0 +1,427 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Bibliography Facility
+%
+% Synopsis: This module provides a new bibliography facility to replace
+% zzbibtex. It is more flexible so that it can handle numeric,
+% key, and author/year citations.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 1 December 2016
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Initialization
+% --------------
+
+
+\def \zbiblioinit {%
+ \if \definedp{\bibliodesign}%
+ \begingroup
+ \bibliodesign
+ \globaldefs = 1
+ \citestyle = \citestyle
+ \endgroup
+ \fi}
+
+% Bibliography Cross-Reference
+% ------------ ---------------
+
+
+% When tags are loaded, define the name \=zB:tag to contain the
+% bibliographic info in this format:
+% folio\zmark key\zmark {author}{year}{full-author}
+
+\def \xrefbib #1#2#3#4{% {folio}{key}{{author}{year}{full-author}}{tag}
+ \ifnum \xrefmode=\xrefloadtagmode
+ \if \definedp{\=zB:#4}\zduptag{#4}\fi
+ \withname\gdef{\=zB:#4}{#1\zmark#2\zmark#3}%
+ \fi}
+
+% This macro loads the cite cross-reference entries and invokes the
+% specified macro for each one.
+
+\def \mapxrefcites #1{% {\macro}
+ {\let \zmapcitemacro = #1\relax
+ \zxloadcomp{\xrefloadcitemode}}}
+
+\def \xrefcite #1#2#3#4{% {page}{}{}{tag}
+ \ifnum \xrefmode=\xrefloadcitemode
+ \zmapcitemacro{#1}{#4}%
+ \fi}
+
+% Biblio Block
+% ------ -----
+
+
+\defineblock{\biblio}{\endbiblio}{\false}{}
+
+%~block biblio
+% \citestyle = integer % Citation style.
+% \setflag \indexcites = boolean % If true, index each cite (not implemented).
+% \setflag \citeself = boolean % If true, \bibitem cites itself (not implemented).
+%~end
+
+\definecount{\citestyle}{-1}
+
+\chardef \citebynumber = 0
+\chardef \citebykey = 1
+\chardef \citebyauthoryear = 2
+
+
+\def \biblio {%
+ \blockcantbein{\biblio}{\biblio}%
+ \blockmustbein{\biblio}{\list}%
+ \beginblockscope{biblio}%
+ \global\increment \bibliodepth
+ \setflag \citeself = \false %~default soft
+ \processdesign{\biblio}{}%
+ \global\increment \biblionumber}
+
+\def \endbiblio {%
+ \endgraf
+ \fakepar % In case biblio is empty.
+ \global\decrement \bibliodepth
+ \endblockscope{biblio}}
+
+% Bibliography Items
+% ------------ -----
+
+
+\definecount{\zbibitemnumber}{0}
+\definetoks{\zbibauthor}
+\definetoks{\zbibyear}
+\definetoks{\zbibfullauthor}
+\definetoks{\bibitemtag} % Tag of current \bibitem.
+
+
+%~ The |\bibitem| command is used in a |\biblio| block to start
+%~ each entry in the bibliography. It takes two arguments; the
+%~ format of the first argument depends on the citation style.
+%~ * Cited by number: |\bibitem{}{*tag*}|
+%~ * Cited by key: |\bibitem{*key*}{*tag*}|
+%~ * Cited by author/year: |\bibitem{*author*;*year*;*full-author*}{*tag*}|
+%~ *.
+%~ In the author/year format, the second semicolon and *full-author* are
+%~ optional.
+
+\def \bibitem #1#2{% {[info]}{tag}
+ \blockmustbein{\bibitem}{\biblio}%
+ \zbibitemnumber = \itemnumber
+ \increment \zbibitemnumber
+ \ifcase \citestyle
+ \edef \zbibkey {\the\zbibitemnumber}%
+ \zbibauthor = {}%
+ \zbibyear = {}%
+ \zbibfullauthor = {}%
+ \or
+ \def \zbibkey {#1}%
+ \zbibauthor = {}%
+ \zbibyear = {}%
+ \zbibfullauthor = {}%
+ \or
+ \def \zbibkey {}%
+ \zparseauthoryear #1;;;\zmark
+ \else
+ \error{invalidcitestyle}{The \string\citestyle parameter is invalid: \the\citestyle}%
+ \fi
+ \bibitemtag = {#2}%
+ \item{\zbibkey}%
+ \if \PDFhyperlinks \PDFmark{T:#2}\fi
+ \if \notp{\emptyargp{#2}}%
+ \edef \znext {%
+ \noexpand\xref{bib}{\noexpand\folio}
+ {\zbibkey}
+ {{\the\zbibauthor}{\the\zbibyear}{\the\zbibfullauthor}}
+ {#2}}%
+ \znext
+ \fi
+%%% \if \indexcites
+%%% \edef \znext {\noexpand\xbiblio1{\the\zbibauthor}}%
+%%% \znext
+%%% \fi
+ \ignorespaces}
+
+\def \zparseauthoryear #1;#2;#3;#4\zmark{%
+ \if \orp{\emptyargp{#1}}{\emptyargp{#2}}%
+ \error{nocitetags}{The author and/or year are missing}%
+ \fi
+ \zbibauthor = {#1}%
+ \zbibyear = {#2}%
+ \zbibfullauthor = {#3}}
+
+% Bibliography Citation Page List
+% ------------ -------- ---- ----
+
+
+\setflag \zcitexrefsloaded = \false
+
+
+%~ If this macro is specified as the |\endpartext| of a bibliography
+%~ |\list|, then each entry in the bibliography will include a list
+%~ of the pages citing that entry. The argument determines whether
+%~ each page is made into a hyperlinked PDF button.
+%~
+%~ In order for the citation information to be available, the
+%~ |\xrefcites| document parameter must be set to 1.
+
+\def \citepagelist #1{% {button?}
+ \if \notp{\zcitexrefsloaded}%
+ \mapxrefcites{\zbibcitelist}%
+ \global\setflag \zcitexrefsloaded = \true
+ \fi
+ \setflag \zbibfirstpage = \true
+ \def \zbibprevpage {}%
+ \withname\maplistlf {\=citetag:\the\bibitemtag}
+ {\zbibcitepage{##1}{#1}}}
+
+\def \zbibcitelist #1#2{% {page}{tag}
+ \if \withname\undefinedp {\=citetag:#2}%
+ \withname\setlist {\=citetag:#2}={}%
+ \fi
+ \withname\appendlf {\=citetag:#2}{#1}}
+
+\def \zbibcitepage #1#2{% {page}{button?}
+ \stringeql{\zsamepage}{#1}{\zbibprevpage}%
+ \if \notp{\zsamepage}%
+ \if \notp{\emptydefp{\zbibprevpage}},\space \fi
+ \if #2%
+ \pagebutton{#1}{#1}%
+ \else
+ #1%
+ \fi
+ \def \zbibprevpage {#1}%
+ \fi}
+
+% Low-Level Citation Commands
+% --------- -------- --------
+
+
+%~ This command produces the key of the bibliography entry specified
+%~ by the *tag*. The command makes sense only for the numbered or
+%~ keyed citation styles.
+
+\def \citekey #1{% {tag} %^citation
+ \if \eqlp{\citestyle}{\citebyauthoryear}%
+ \warning{badcitekey}{The \noexpand\citekey command doesn't make sense
+ when citing by author/year}%
+ \fi
+ \zcitetaginfo{#1}%
+ \zcitetext{#1}{\zcitekey}%
+ \zxrefcite{\true}{#1}}
+%%% \if \indexcites \zciteindex{\zcitekey}\fi}
+
+%~ This command produces the author of the bibliography entry specified
+%~ by the *tag*. The command makes sense only for the author/year
+%~ citation style.
+
+\def \citeauthor #1{% {tag} %^citation
+ \if \neqlp{\citestyle}{\citebyauthoryear}%
+ \warning{badciteauthor}{The \noexpand\citeauthor command only makes sense
+ when citing by author/year}%
+ \fi
+ \zcitetaginfo{#1}%
+ \zcitetext{#1}{\zciteauthor}%
+ \zxrefcite{\true}{#1}}
+
+%~ This command produces the year of the bibliography entry specified
+%~ by the *tag*. The command makes sense only for the author/year
+%~ citation style.
+
+\def \citeyear #1{% {tag} %^citation
+ \if \neqlp{\citestyle}{\citebyauthoryear}%
+ \warning{badciteyear}{The \noexpand\citeyear command only makes sense
+ when citing by author/year}%
+ \fi
+ \zcitetaginfo{#1}%
+ \zcitetext{#1}{\zciteyear}%
+ \zxrefcite{\true}{#1}}
+
+%~ This command produces the full author of the bibliography entry specified
+%~ by the *tag*. The command makes sense only for the author/year
+%~ citation style.
+
+\def \citefullauthor #1{% {tag} %^citation
+ \if \neqlp{\citestyle}{\citebyauthoryear}%
+ \warning{badcitefullauthor}{The \noexpand\citefullauthor command only makes sense
+ when citing by author/year}%
+ \fi
+ \zcitetaginfo{#1}%
+ \zcitetext{#1}{\zcitefullauthor}%
+ \zxrefcite{\true}{#1}}
+
+\def \zcitetaginfo #1{% {tag}
+ \zcitenoinfo
+ \if \definedp{\=zB:#1}%
+ \expandafterthrice\zcitetaginfoa \name{\=zB:#1}%
+ \else
+ \writelog{ZzTeX citation: undefined tag `#1'.}%
+ \zxwriteinfo{\false}{undef-tag}{#1}{}%
+ \global\increment \zuntagrefs
+ \fi}
+
+\def \zcitetaginfoa #1\zmark#2\zmark#3#4#5{% folio\zmark key\zmark
+ % {author}{year}{full-author}
+ \if \eqlp{\citestyle}{\citebyauthoryear}%
+ \def \zciteauthor {#3}%
+ \def \zciteyear {#4}%
+ \def \zcitefullauthor {#5}%
+ \else
+ \def \zcitekey {#2}%
+ \fi}
+
+\def \zcitenoinfo {%
+ \def \zcitekey {???}%
+ \def \zciteauthor {???author???}%
+ \def \zciteyear {???}%
+ \def \zcitefullauthor {???full-author???}}
+
+\def \zcitetext #1#2{% {tag}{text}
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb .5 .22 .24}\fi
+ \if \PDFhyperlinks
+ \tagbutton{#1}{#2}%
+ \else
+ #2%
+ \fi
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi}
+
+\def \zxrefcite #1#2{% {defined?}{tag}
+ \ifcase \xrefcites
+ \relax
+ \or
+ \xref{cite}{\folio}{}{}{#2}%
+ \else
+ \customcitexref{#1}{#2}% {boolean}{tag}
+ \fi}
+
+%%%\def \zciteindex #1{% {\zcitemacro}
+%%% \expandafter\xcite\expandafter1\expandafter{#1}}
+
+% High-Level Citation Commands
+% ---------- -------- --------
+
+
+%~ This high-level citation command produces the key or author/year
+%~ of the bibliography entry specified by the *tag*. The text
+%~ is formatted in the style appropriate for a noun in a sentence.
+%~ There are two formats for the command:
+%~ * |\citenoun{*tag*}| accepts a tag and produces the key or author/year.
+%~ * |\citenoun{*tag*;*info*}| accepts a tag and additional
+%~ information such as a page number or section reference.
+%~ *.
+%~ The format of the text produced is controlled by the |\citenounformat|,
+%~ |\citenouninfoformat|, and |\citepunct| macros in the design file.
+
+\def \citenoun #1{% {tag[;info]} %^citation
+ \expandafter\zsetcitepunc \citepunct
+ \zcitetagsinfo #1;;\zmark
+ \def \zcitenounsep {}%
+ \expandafter\zcitenoun \zcitetags,\zmark}
+
+\def \zcitenoun #1,#2\zmark {% tag,other-tags\zmark
+ \zcitenounsep
+ \edef \zcitenounsep {\zcitesep}%
+ \if \eqlp{\citestyle}{\citebyauthoryear}%
+ \if \emptydefp{\zciteinfo}%
+ \zciteonetag{\citenounformat}#1!!\zmark
+ \else
+ \citenouninfoformat{\citeauthor{#1}}{\citeyear{#1}}{\zciteinfo}%
+ \fi
+ \else
+ \if \emptydefp{\zciteinfo}%
+ \citenounformat{\citekey{#1}}%
+ \else
+ \citenouninfoformat{\citekey{#1}}{\zciteinfo}%
+ \fi
+ \fi
+ \if \notp{\emptyargp{#2}}\zcitenoun #2\zmark \fi}
+
+%~ This high-level citation command produces the key or author/year
+%~ of the bibliography entry specified by the *tag*. The text
+%~ is formatted in the style appropriate for a parenthetical
+%~ citation list. There are two formats for the command:
+%~ * |\citeparen{*tag-list*}| accepts one or more tags separated
+%~ by commas and produces a parenthetical list of keys or author/years.
+%~ * |\citeparen{*tag*;*info*}| accepts a tag and additional
+%~ information such as a page number or section reference.
+%~ *.
+%~ The format of the text produced is controlled by the |\citeparenformat|,
+%~ |\citepareninfoformat|, and |\citepunct| macros in the design file.
+
+\def \citeparen #1{% {tags[;info]} %^citation
+ \expandafter\zsetcitepunc \citepunct
+ \zcitetagsinfo #1;;\zmark
+ \expandafter\zciteparen \zcitetags,\zmark
+ \zcitecfence}
+
+\def \zciteparen #1,#2\zmark {% tag,other-tags\zmark
+ \zciteofence
+ \edef \zciteofence {\zcitesep}%
+ \if \eqlp{\citestyle}{\citebyauthoryear}%
+ \if \emptydefp{\zciteinfo}%
+ \zciteonetag{\citeparenformat}#1!!\zmark
+ \else
+ \citepareninfoformat{\citeauthor{#1}}{\citeyear{#1}}{\zciteinfo}%
+ \fi
+ \else
+ \if \emptydefp{\zciteinfo}%
+ \citeparenformat{\citekey{#1}}%
+ \else
+ \citepareninfoformat{\citekey{#1}}{\zciteinfo}%
+ \fi
+ \fi
+ \if \notp{\emptyargp{#2}}\zciteparen #2\zmark \fi}
+
+%~ This high-level citation command produces the key or author/year
+%~ of the bibliography entry specified by the *tag*. The text
+%~ is formatted in the style appropriate for a citation that is part
+%~ of a surrounding parenthetical sentence.
+%~ There are two formats for the command:
+%~ * |\citeplain{*tag*}| accepts a tag and produces the key or author/year.
+%~ * |\citeplain{*tag*;*info*}| accepts a tag and additional
+%~ information such as a page number or section reference.
+%~ *.
+%~ The format of the text produced is controlled by the |\citeplainformat|
+%~ and |\citeplaininfoformat| macros in the design file.
+
+\def \citeplain #1{% {tag[;info]} %^citation
+ \zcitetagsinfo #1;;\zmark
+ \expandafter\zciteplain \zcitetags,\zmark}
+
+\def \zciteplain #1,#2\zmark {% tag,other-tags\zmark
+ \if \eqlp{\citestyle}{\citebyauthoryear}%
+ \if \emptydefp{\zciteinfo}%
+ \zciteonetag{\citeparenformat}#1!!\zmark
+ \else
+ \citepareninfoformat{\citeauthor{#1}}{\citeyear{#1}}{\zciteinfo}%
+ \fi
+ \else
+ \if \emptydefp{\zciteinfo}%
+ \citeparenformat{\citekey{#1}}%
+ \else
+ \citepareninfoformat{\citekey{#1}}{\zciteinfo}%
+ \fi
+ \fi
+ \if \notp{\emptyargp{#2}}\zciteplain #2\zmark \fi}
+
+\def \zsetcitepunc #1#2#3{%
+ \def \zciteofence {#1}%
+ \def \zcitecfence {#2}%
+ \def \zcitesep {#3}}
+
+\def \zcitetagsinfo #1;#2;#3\zmark {% {tags[;info]}
+ \if \emptyargp{#1}%
+ \warning{nocitetags}{No bibliography entry tags were specified}%
+ \fi
+ \def \zcitetags {#1}%
+ \def \zciteinfo {#2}}
+
+\def \zciteonetag #1#2!#3!#4\zmark {%
+ \if \emptyargp{#2}%
+ \citeyear{#3}%
+ \else
+ #1{\citeauthor{#2}}{\citeyear{#2}}%
+ \fi} \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzbibtex.tex b/macros/plain/contrib/zztex/tex/zzbibtex.tex
new file mode 100644
index 0000000000..a6179133f8
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzbibtex.tex
@@ -0,0 +1,290 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Interface to BibTeX
+%
+% Synopsis: This module provides the definitions necessary for ZzTeX to
+% interface to BibTeX.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 21 July 1992
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Bibliography Preparation
+% ------------ -----------
+
+
+\def \zbiblioinit {}
+
+\ignore
+\setflag \zbiblioing = \false
+
+\def \preparebiblio {%
+ \setflag \zbiblioing = \true}
+
+\def \zbibfinal {%
+ \if \zbiblioing
+ \remark{[Generating auxiliary file for BibTeX.}%
+ {\immediate\openout \zwritea = \jobname.aux\relax
+ \immediate\write \zwritea
+ {\zcomment BibTeX auxiliary file for book `\jobname'.}%
+ \processdesign{\biblio}{}%
+ \immediate\write \zwritea {\string\bibstyle{\the\bibliostyle}}%
+ \immediate\write \zwritea {\string\bibdata{\the\bibliofiles}}%
+ \let \zxmodesave = \xrefmode
+ \let \xrefmode = \xrefloadauxmode
+ \input \jobname.zzc\relax
+ \let \xrefmode = \zxmodesave
+ \immediate\write \zwritea {\zcomment [end]}%
+ \immediate\closeout \zwritea}
+ \remark{Auxiliary file complete.]}%
+ \fi}
+
+\endignore
+
+% Citations
+% ---------
+
+
+%~ This citation command produces the key associated with
+%~ the specified tag. The key is usually the bibliography
+%~ entry number or the author/year combination.&/
+%~ *Note:* Some books do not allow this command to be used.
+
+\def \cite #1{% {tag} %^citation
+ \ensurepar
+ \if \definedp{\=zB:#1}%
+ \zcitetext{#1}{\expandafterthrice\zbibdata \name{\=zB:#1}0}%
+ \else
+ \zuncite{#1}%
+ \fi
+ \zxrefcite{\true}{#1}}
+
+%~ This citation command produces the author associated with
+%~ the specified tag.
+
+\def \citeauthor #1{% {tag} %^citation
+ \ensurepar
+ \if \definedp{\=zB:#1}%
+ \zcitetext{#1}{\expandafterthrice\zbibdata \name{\=zB:#1}1}%
+ \else
+ \zuncite{#1}%
+ \fi
+ \zxrefcite{\true}{#1}}
+
+%~ This citation command produces the year associated with
+%~ the specified tag.
+
+\def \citeyear #1{% {tag} %^citation
+ \ensurepar
+ \if \definedp{\=zB:#1}%
+ \zcitetext{#1}{\expandafterthrice\zbibdata \name{\=zB:#1}2}%
+ \else
+ \zuncite{#1}%
+ \fi
+ \zxrefcite{\true}{#1}}
+
+\def \nocite #1{% {tag}
+ \zxrefcite{\false}{#1}}
+
+\def \zcitetext #1#2{% {tag}{text}
+ \if \PDFhyperlinks
+ \tagbutton{#1}{#2}%
+ \else
+ #2%
+ \fi}
+
+\def \zxrefcite #1#2{%
+ \ifcase \xrefcites
+ \relax
+ \or
+ \xref{cite}{\folio}{}{}{#2}%
+ \else
+ \customcitexref{#1}{#2}% {boolean}{tag}
+ \fi}
+
+\def \zbibdata #1\zmark#2\zmark#3#4#5#6{% folio\zmark xxx\zmark
+ % {label}{author}{year}n
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb .75 .35 0}\fi
+ \ifcase #6 #3\or #4\or #5\fi
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi
+ \if \indexcites \xcite1{#4}\fi}
+
+\def \zuncite #1{%
+ \writelog{ZzTeX citation: undefined tag `#1'.}%
+ \zxwriteinfo{\false}{undef-tag}{#1}{}%
+ \global\increment \zuntagrefs
+ \zbibdata -\zmark-\zmark{???}--0}
+
+% Bibliography Cross-Reference
+% ------------ ---------------
+
+
+% When tags are loaded, define the name \=zB:tag to contain the
+% bibliographic info.
+
+\def \xrefbib #1#2#3#4{% {page}{???}{{label}{author}{year}}{tag}
+ \ifnum \xrefmode=\xrefloadtagmode
+ \if \definedp{\=zB:#4}\zduptag{#4}\fi
+ \withname\gdef{\=zB:#4}{#1\zmark#2\zmark#3}%
+ \fi}
+
+% This macro loads the cite cross-reference entries and invokes the
+% specified macro for each one.
+
+\def \mapxrefcites #1{% {\macro}
+ {\let \zmapcitemacro = #1\relax
+ \zxloadcomp{\xrefloadcitemode}}}
+
+\def \xrefcite #1#2#3#4{% {page}{}{}{tag}
+ \ifnum \xrefmode=\xrefloadcitemode
+ \zmapcitemacro{#1}{#4}%
+ \fi}
+
+% Biblio Block
+% ------ -----
+
+
+\defineblock{\biblio}{\endbiblio}{\false}{}
+
+%~block biblio
+% \bibliofiles = {file,...} % List of biblio database files.
+% \bibliostyle = {name} % Name of biblio style.
+% \setflag \citeself = boolean % If true, \bibitem cites itself.
+%~end
+
+\definetoks{\bibliofiles}
+\definetoks{\bibliostyle}
+
+\definecount{\zbiblionum}{0}
+
+
+\def \biblio {%
+ \blockcantbein{\biblio}{\biblio}%
+ \blockmustbein{\biblio}{\list}%
+ \beginblockscope{biblio}%
+ \global\increment \bibliodepth
+ \setflag \citeself = \false %~default soft
+ \processdesign{\biblio}{}%
+ \global\increment \biblionumber
+ \def \begin ##1##2{}%
+ \def \end ##1{}%
+ \let \bibitem = \zbibitem
+ \let \newblock = \relax
+ \let \em = \it
+ \zbiblionum = 0\relax}
+
+\def \endbiblio {%
+ \endgraf
+ \fakepar % In case biblio is empty.
+ \global\decrement \bibliodepth
+ \endblockscope{biblio}}
+
+% Bibliography Item
+% ------------ ----
+
+
+\definetoks{\zbibtoksa}
+\definetoks{\zbibtoksb}
+\definetoks{\zbibtoksc}
+\definetoks{\bibitemtag} % Tag of current \bibitem.
+
+
+% This supports items of the form `\bibitem[label][author][year]{tag}'.
+
+\def \zbibitem {%
+ \futurelet\znext \zbibitema}
+
+\def \zbibitema {%
+ \ifx \znext[%
+ \let \znext = \zbibitemb
+ \else
+ \increment \zbiblionum
+ % Expand \number\zbiblionum by hand.
+ \edef \znext {\noexpand\zbibitemb[\number\zbiblionum]}%
+ \fi
+ \znext}
+
+\def \zbibitemb[#1]{% [label]
+ \zbibtoksa = {#1}%
+ \futurelet\znext \zbibitemc}
+
+\def \zbibitemc {%
+ \if \tokeqlp{\znext}{[}%
+ \let \znext = \zbibitemd
+ \else
+ \def \znext {\zbibitemd[???]}%
+ \fi
+ \znext}
+
+\def \zbibitemd[#1]{% [author]
+ \zbibtoksb = {#1}%
+ \futurelet\znext \zbibiteme}
+
+\def \zbibiteme {%
+ \if \tokeqlp{\znext}{[}%
+ \let \znext = \zbibitemf
+ \else
+ \def \znext {\zbibitemf[???]}%
+ \fi
+ \znext}
+
+\def \zbibitemf[#1]#2{% [year]{tag}
+ \zbibtoksc = {#1}%
+ \bibitemtag = {#2}%
+ \item{\the\zbibtoksa}%
+ \if \PDFhyperlinks \PDFmark{T:#2}\fi
+ \if \notp{\emptyargp{#2}}%
+ \edef \znext{\noexpand\xref{bib}{\noexpand\folio}
+ {???}
+ {{\the\zbibtoksa}{\the\zbibtoksb}{\the\zbibtoksc}}
+ {#2}}%
+ \znext
+ \if \citeself \nocite{#2}\fi
+ \fi
+ \if \indexcites
+ \edef \znext {\noexpand\xbiblio1{\the\zbibtoksb}}%
+ \znext
+ \fi
+ \ignorespaces}
+
+% Bibliography Citation Page List
+% ------------ -------- ---- ----
+
+
+\setflag \zcitexrefsloaded = \false
+
+
+% If this macro is specified as the \endpartext of a bibliography
+% list, it will append a list of the citation pages to each entry.
+
+\def \citepagelist #1{% {button?}
+ \if \notp{\zcitexrefsloaded}%
+ \mapxrefcites{\zbibcitelist}%
+ \global\setflag \zcitexrefsloaded = \true
+ \fi
+ \setflag \zbibfirstpage = \true
+ \def \zbibprevpage {}%
+ \withname\maplistlf {\=citetag:\the\bibitemtag}
+ {\zbibcitepage{##1}{#1}}}
+
+\def \zbibcitelist #1#2{% {page}{tag}
+ \if \withname\undefinedp {\=citetag:#2}%
+ \withname\setlist {\=citetag:#2}={}%
+ \fi
+ \withname\appendlf {\=citetag:#2}{#1}}
+
+\def \zbibcitepage #1#2{% {page}{button?}
+ \stringeql{\zsamepage}{#1}{\zbibprevpage}%
+ \if \notp{\zsamepage}%
+ \if \notp{\emptydefp{\zbibprevpage}},\space \fi
+ \if #2%
+ \pagebutton{#1}{#1}%
+ \else
+ #1%
+ \fi
+ \def \zbibprevpage {#1}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzblock.tex b/macros/plain/contrib/zztex/tex/zzblock.tex
new file mode 100644
index 0000000000..989bb4363b
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzblock.tex
@@ -0,0 +1,327 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Blocks
+%
+% Synopsis: This module provides facilities for defining and creating
+% element blocks.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 23 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Block Definition
+% ----- ----------
+
+
+\setlist \zblocklist = {}
+
+\def \defineblock #1#2#3#4{% {\name}{\endname}{snap?}{redefine}
+ \if \emptyargp{#4}%
+ \withname\definecount{#1depth}{0}%
+ \withname\definecount{#1number}{0}%
+ \withname\definetoks{#1comptext}%
+ \withname\gdef{#1varinit}{}%
+ \if #3\withname\declaresnapitem{#1number}\fi
+ \append{#1}{\zblocklist}%
+ \fi}
+
+\def \resetinvcontext #1{% {\name}
+ \zdeclareeveryvcontext{\zblockvcontext{#1}}}
+
+\def \zblockvcontext #1{% {\name}
+ \zsavevcontext{\name{#1depth}=\the\name{#1depth}%
+ \name{#1number}=\the\name{#1number}%
+ \name{#1comptext}={\the\name{#1comptext}}}%
+ \global\name{#1depth}= 0\relax
+ \global\name{#1number}= 0\relax}
+
+% Block Utilities
+% ----- ---------
+
+
+\defineskip{\enclosingbaselineskip}{0pt}
+\defineskip{\enclosingleftss}{0pt}
+\definedimen{\enclosingparindent}{0pt}
+\definedimen{\enclosingparrag}{0pt}
+\defineskip{\enclosingparskip}{0pt}
+\defineskip{\enclosingrightss}{0pt}
+
+
+\def \beginblockscope #1{%
+ \begingroup
+ \zpushblock{#1}%
+ \enclosingbaselineskip = \baselineskip
+ \enclosingleftss = \leftskip
+ \tdimena = \leftskip
+ \advance \enclosingleftss by -\tdimena
+ \enclosingparindent = \parindent
+ \enclosingparrag = \parrag
+ \enclosingparskip = \parskip
+ \enclosingrightss = \rightskip
+ \tdimena = \rightskip
+ \advance \enclosingrightss by -\tdimena}
+
+\def \endblockscope #1{%
+ \zpopblock{#1}%
+ \endgroup}
+
+\def \processdesign #1#2{% {\block}{type etc.}
+ \zprocessvariant{#1}%
+ \resetnumber = {}%
+ \if \definedp{#1#2design}%
+ \name{#1#2design}\relax % \relax terminates numbers and such.
+ \else
+ \error{nodesign}{No design has been defined for the `\string#1#2' block}%
+ \fi
+ \zprocesswith
+ {\globaldefs = 1 \the\resetnumber}}
+
+\def \inblockp #1{% {\block-name}
+ \if \posp{\name{#1depth}}\true \else \false \fi}
+
+\def \setcomptext #1{% {\xxxcomptext}
+ \edef \znext {\comptextformat}%
+ #1= \expandafter{\znext}}%
+
+\def \blockmustbein #1#2{% {\inner}{\outer}
+ \if \zerop{\name{#2depth}}%
+ \error{blkmustnest}{A `\string#1' must be nested in a `\string#2'}%
+ \fi}
+
+\def \blockcantbein #1#2{% {\inner}{\outer}
+ \if \posp{\name{#2depth}}%
+ \error{blkcantnest}
+ {A `\string#1' cannot be nested inside a `\string#2'}%
+ \fi}
+
+\def \closeifinblock #1#2{% {\block}{\endblock}
+ \if \inblockp{#1}#2\fi}
+
+% Block Stack
+% ----- -----
+
+
+\setlist \zblockstack = {}
+\setlist \zlinestack = {}
+
+\def \zpushblock #1{%
+ \push{#1}{\zblockstack}%
+ \edef \znext {\noexpand\push{\the\inputlineno}}%
+ \znext{\zlinestack}}
+
+\def \zpopblock #1{%
+ \pop{\zblk}{\zblockstack}%
+ \pop{\zline}{\zlinestack}%
+ \stringeql{\znext}{\zblk}{#1}%
+ \if \notp{\znext}%
+ \error{blkinvnest}{The `\string\end#1' command does not match the
+ `\zblk' block that was started on line \zline}%
+ \fi}
+
+\def \zemptyblockstackp {\emptylistp{\zblockstack}}
+
+% Block Variants
+% ----- --------
+
+
+\def \definevariant #1#2#3{% {\block}{\style}{\modifier0,\modifier1,...}
+ \if \emptyargp{#3}%
+ \error{varmod}{Between 1 and 8 modifier commands must be specified}%
+ \fi
+ \withname\definecount{#2variant}{0}%
+ \withname\xdef{#1varinit}{\name{#1varinit}\name{#2variant}=0}%
+ {\tcounta = 0
+ \zdefvarpre #2#3,\zmark
+ \if \gtrp{\tcounta}{8}%
+ \error{varmod}{Between 1 and 8 modifier commands must be specified}%
+ \fi
+ \ztoksa = \expandaftertwice{\name{\zvarcase\lcromannumeral\tcounta}}%
+ \edef \znext {\global\let \name{#2varcase}=\the\ztoksa}%
+ \znext}}
+
+\def \zdefvarpre #1#2,#3\zmark{% \style\modifier,\modifier,...,\zmark
+ \xdef #2{\noexpand\variant{\name{#1variant}=\the\tcounta}}%
+ \increment \tcounta
+ \if \notp{\emptyargp{#3}}\zdefvarpre #1#3\zmark \fi}
+
+\gdef \zvariant {} % Holds \stylevariant assignments.
+
+\def \variant #1{% {\stylevariant assignment}
+ {\ztoksa = \expandafter{\zvariant}%
+ \ztoksb = {#1}%
+ \xdef \zvariant {\the\ztoksa \the\ztoksb}}%
+ \ignorespaces}
+
+\def \zprocessvariant #1{% {\block}
+ \name{#1varinit}%
+ \zvariant \relax % \relax terminates numbers and such.
+ \gdef \zvariant {}}
+
+\def \varcase #1{% \style
+ \name{#1varcase}#1}
+
+\long\def \zvarcasei #1#2{% \style {var1 code}
+ \ifcase \name{#1variant}#2\else\zbadvar\fi\relax}
+\long\def \zvarcaseii #1#2#3{% \style {var1 code}{var2 code}
+ \ifcase \name{#1variant}#2\or#3\else\zbadvar\fi\relax}
+\long\def \zvarcaseiii #1#2#3#4{%
+ \ifcase \name{#1variant}#2\or#3\or#4\else\zbadvar\fi\relax}
+\long\def \zvarcaseiv #1#2#3#4#5{%
+ \ifcase \name{#1variant}#2\or#3\or#4\or#5\else\zbadvar\fi\relax}
+\long\def \zvarcasev #1#2#3#4#5#6{%
+ \ifcase \name{#1variant}#2\or#3\or#4\or#5\or#6\else\zbadvar\fi\relax}
+\long\def \zvarcasevi #1#2#3#4#5#6#7{%
+ \ifcase \name{#1variant}#2\or#3\or#4\or#5\or#6\or#7\else\zbadvar\fi\relax}
+\long\def \zvarcasevii #1#2#3#4#5#6#7#8{%
+ \ifcase \name{#1variant}#2\or#3\or#4\or#5\or#6\or#7\or#8\else\zbadvar\fi\relax}
+\long\def \zvarcaseviii #1#2#3#4#5#6#7#8#9{%
+ \ifcase\name{#1variant}#2\or#3\or#4\or#5\or#6\or#7\or#8\or#9\else\zbadvar\fi\relax}
+
+\def \setvariant #1{% \modifier
+ #1%
+ \zvariant \relax
+ \gdef \zvariant {}}
+
+\def \zbadvar {%
+ \zzerror{Invalid value for variant}}
+
+% Block Options
+% ----- -------
+
+
+\gdef \zwith {} % Holds \with parameters.
+
+
+%~ The |\with| modifier can be used to modify specific design
+%~ parameters for the following block. It only makes sense
+%~ preceding block commands. Sometimes it is used with parameters
+%~ that are specifically intended for |\with|:
+%~ \with{\itemnumber=4} \list{number}
+%~ Other times it is used with a parameter that needs to be
+%~ changed for one particular block.
+%~ \with{\advance\belowskip by -8pt} \float{figure}
+%~ Again, be careful to use |\with| only on block commands.
+
+\long\def \with #1{% {parameter-assignments} %^modifier
+ {\ztoksa = \expandafter{\zwith}%
+ \ztoksb = {#1}%
+ \xdef \zwith {\the\ztoksa \the\ztoksb}}%
+ \ignorespaces}
+
+\def \zprocesswith {%
+ \zwith \relax % \relax terminates numbers and such.
+ \gdef \zwith {}}
+
+%~ This block modifier forces a page break above the block.
+
+\def \breakabove {% %^modifier
+ \with{\abovepenalty=\breakalways}}
+
+%~ This block modifier forces a page break below the block.
+
+\def \breakbelow {% %^modifier
+ \with{\belowpenalty=\breakalways}}
+
+% Common Design Parameters
+% ------ ------ ----------
+
+
+% These design parameters are used by a variety of ZZTeX's blocks, so
+% they are defined here.
+
+% Integer parameters:
+
+\definecount{\abovepenalty}{0} % Penalty above block.
+\definecount{\authorlevel}{0} % Author ToC entry level.
+\definecount{\belowpenalty}{0} % Penalty below block.
+\definecount{\continue}{0} % Block is continued (bit 0) and/or continuation (bit 1).
+\definecount{\difficulty}{0} % Level of difficulty of the block.
+
+% Flag parameters:
+
+\setflag \allowbreaks = \false % Allow page breaks in block?
+\setflag \allowintoc = \false % Allow section in ToC?
+
+% Dimension parameters:
+
+\definedimen{\height}{0pt} % Height of text.
+\definedimen{\ruleshift}{0pt} % Horizontal shift for rule.
+\definedimen{\ruleheight}{0pt} % Height (thickness) of rule.
+\definedimen{\rulewidth}{0pt} % Width of rule.
+\definedimen{\topadjust}{\mindimen} % Adjustment for head at top of page.
+\definedimen{\vshift}{0pt} % Vertical shift.
+\definedimen{\width}{0pt} % Width of text.
+
+% Skip (glue) parameters:
+
+\defineskip{\aboveskip}{0pt} % Base/base skip above block.
+\defineskip{\belowskip}{0pt} % Base/base skip below block.
+\defineskip{\columngutter}{0pt} % Width of gutter between columns.
+\defineskip{\interrowskip}{0pt} % Extra space between rows.
+\defineskip{\leftindent}{0pt} % Left indentation glue.
+\defineskip{\numbersink}{0pt} % Sinkage to section number, or
+\defineskip{\numberskip}{0pt} % Space b/b to section number.
+\defineskip{\parhang}{0pt} % Hanging indent for paragraph.
+\defineskip{\rightindent}{0pt} % Right indentation glue.
+\defineskip{\ruleskip}{0pt} % Vskip for rule.
+\defineskip{\textsink}{0pt} % Vsink for text.
+\defineskip{\textskip}{0pt} % Base/base skip for text.
+\defineskip{\titlesink}{0pt} % Sinkage to section title, or
+\defineskip{\titleskip}{0pt} % Space b/b to section title.
+
+% Token list parameters:
+
+\definetoks{\authortext} % Part/chapter author text.
+\definetoks{\bodyfont} % Font for body of block.
+\definetoks{\divisions} % List of division names.
+\definetoks{\numberfont} % Font for block number.
+\definetoks{\numberwordfont} % Font for block word like "chapter".
+\definetoks{\openertext} % Part/chapter opener text.
+\definetoks{\position} % Position of the block.
+\definetoks{\resetnumber} % List of sequence numbers to reset.
+\definetoks{\rulecolor} % Color of a rule.
+\definetoks{\runners} % Running head/foot macros.
+\definetoks{\style} % Heading style.
+\definetoks{\textcolor} % Color of text.
+\definetoks{\titlefont} % Font for title.
+
+% Macro parameters:
+
+\def \numberformat #1{} % {code} %~ Formatter for block number.
+\def \paging {} % {code} %~ Page control commands.
+\def \providemark #1{} % {code} %~ Provide marks for the block.
+\def \titleformat {} % {code} %~ Formatter for title.
+
+% The \continue Parameter
+% --- --------- ---------
+
+
+% The \continue parameter is set as follows:
+% 0: neither continued nor continuation
+% 1: continued
+% 2: continuation
+% 3: both continuation and continued
+
+
+\def \continuedp {\oddp{\continue}}
+
+\def \continuationp {\gtrp{\continue}{1}}
+
+\def \zsetcontinue {%
+ \if \andp{\zerop{\continue}}{\continuation}%
+ \continue = 2\relax
+ \fi}
+
+% Break Element
+% ----- -------
+
+
+\long\def \breakelement #1{%
+ \global\setflag \zinpar = {\hmodep}%
+ \if \zinpar \flushendpar \fi
+ #1%
+ \if \zinpar \noindent \ignorespaces \fi} \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzcmmath.tex b/macros/plain/contrib/zztex/tex/zzcmmath.tex
new file mode 100644
index 0000000000..a7c3f9f24b
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzcmmath.tex
@@ -0,0 +1,15 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: Computer Modern math font support
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% Not really much to do.
+
+\setstyleskewchar{\mit}{"7F}
+\setstyleskewchar{\msy}{"30}
+
diff --git a/macros/plain/contrib/zztex/tex/zzcomenc.tex b/macros/plain/contrib/zztex/tex/zzcomenc.tex
new file mode 100644
index 0000000000..4fecdcdfeb
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzcomenc.tex
@@ -0,0 +1,153 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: Redefinitions for Common Encoding
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+% Redefine accents.
+
+\def \"#1{{\accent 8 #1}} %~ Umlaut accent. %^accent
+
+\def \.#1{{\accent 11 #1}} %~ Dot accent. %^accent
+
+\def \H #1{{\accent 12 #1}} %~ Long Hungarian umlaut accent. %^accent
+
+\def \^#1{{\accent 7 #1}} %~ Circumflex accent. %^accent
+
+\def \g #1{% %~ Ogonek accent. %^accent
+ \setbox \zboxa = \hbox{#1}%
+ \if \dimeqlp{\ht\zboxa}{1ex}%
+ \accent 14 #1%
+ \else
+ {\ooalign{\hidewidth \char 14 \hidewidth \cr
+ \unhbox \zboxa}}%
+ \fi}
+
+\def \~#1{{\accent 15 #1}} %~ Tilde accent. %^accent
+
+
+% Redefine standard ASCII characters.
+
+\def \udquote {% %~ Undirected double quote. %^named_char
+ \ensurepar
+ \char "22\relax}
+
+\def \dollar {% %~ Dollar sign. %^named_char
+ \zprehyph{\dollarhyph}%
+ \char "24\relax
+ \zposthyph{\dollarhyph}}
+
+\let \$ = \dollar
+
+\def \less {% %~ Less-than sign. %^named_char
+ \ensurepar
+ \char "3C\relax}
+
+\let \< = \relax
+
+\def \greater {% %~ Greater-than sign. %^named_char
+ \ensurepar
+ \char "3E\relax}
+
+\let \> = \relax
+
+\def \backslash {% %~ Backslash. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmbackslash
+ \else
+ \char "5C\relax
+ \fi}
+
+\let \\ = \backslash
+
+\def \underscore {% %~ Underscore. %^named_char
+ \ensurepar
+ \zprehyph{\underscorehyph}%
+ \char "5F\relax
+ \zposthyph{\underscorehyph}}
+
+\let \_ = \underscore
+
+\def \lbrace {% %~ Left brace. %^named_char
+ \relax
+ \if \mathmodep
+ \zmlbrace
+ \else
+ \char "7B\relax
+ \fi}
+
+\let \{ = \lbrace
+
+\def \verticalbar {% %~ Vertical bar. %^named_char
+ \ensurepar
+ \char "7C\relax}
+
+\def \rbrace {% %~ Right brace. %^named_char
+ \relax
+ \if \mathmodep
+ \zmrbrace
+ \else
+ \char "7D\relax
+ \fi}
+
+\let \} = \rbrace
+
+
+% Define additional special characters.
+
+\def \specialchar #1#2{% {text-char}{math-char}
+ \ensurepar
+ \if \mathmodep
+ \if \emptyargp{#2}%
+ \error{scinmath}{Cannot use that special character in math mode}%
+ \else
+ #2\relax
+ \fi
+ \else
+ #1\relax
+ \fi}
+
+% Decided not to make these two characters pseudo-ligatures.
+
+\def \exclamdown {\specialchar{\char 142}{}} %~ Upside-down exclamation.
+\def \questiondown {\specialchar{\char 143}{}} %~ Upside-down question mark.
+
+\def \bullet {\specialchar{\char 150}{\zmbullet}} %~ Bullet.
+\def \cent {\specialchar{\char 151}{}} %~ Cent sign.
+\let \cents = \cent
+\def \copyright {\specialchar{\char 152}{}} %~ Copyright symbol.
+\def \currency {\specialchar{\char 153}{}} %~ Currency symbol.
+\def \dagger {\specialchar{\char 154}{\zmdagger}} %~ Dagger.
+\def \ddagger {\specialchar{\char 155}{\zmddagger}}%~ Double dagger.
+\def \degree {\specialchar{\char 156}{^\circ}} %~ Degree sign.
+\let \degrees = \degree
+\def \Edh {\specialchar{\char 157}{}} %~ Uppercase Edh.
+\def \edh {\specialchar{\char 158}{}} %~ Lowercase edh.
+\def \euro {\specialchar{\char 159}{}} %~ Euro symbol.
+\def \florin {\specialchar{\char 160}{}} %~ Florin.
+\def \lguill {\specialchar{\char 161}{}} %~ Left guillemot.
+\def \rguill {\specialchar{\char 162}{}} %~ Right guillemot.
+\def \L {\specialchar{\char 163}{}} %~ Uppercase Polish L.
+\def \l {\specialchar{\char 164}{}} %~ Lowercase Polish l.
+\def \minus {\specialchar{\char 165}{}} %~ Minus sign.
+\def \P {\specialchar{\char 166}{}} %~ Paragraph symbol (pilcrow).
+\def \perthousand {\specialchar{\char 167}{}} %~ Per thousand symbol.
+\def \usquote {\specialchar{\char 168}{}} %~ Undirected single quote.
+\def \registered {\specialchar{$^\roman{\char 169}$}{}} %~ Registered symbol.
+\def \S {\specialchar{\char 170}{}} %~ Section sign.
+\def \SS {\specialchar{\char 170\kern -.1em\char 170}{}} %~ Double section sign.
+\def \sterling {\specialchar{\char 171}{}} %~ Pound sterling symbol.
+\def \Thorn {\specialchar{\char 172}{}} %~ Uppercase Thorn.
+\def \thorn {\specialchar{\char 173}{}} %~ Lowercase thorn.
+\def \trademark {\specialchar{$^\roman{\char 174}$}{}} %~ Trademark symbol.
+\def \yen {\specialchar{\char 175}{}} %~ Yen symbol.
+
+% Redefine a few math things.
+
+\definemathchar{\zmdagger}{\classbinop}{\rmfam}{9A}
+\definemathchar{\zmddagger}{\classbinop}{\rmfam}{9B}
diff --git a/macros/plain/contrib/zztex/tex/zzdiv.tex b/macros/plain/contrib/zztex/tex/zzdiv.tex
new file mode 100644
index 0000000000..509fd4910c
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzdiv.tex
@@ -0,0 +1,128 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Division Facilities
+%
+% Synopsis: This module contains the macros to support divisions, which
+% allow a book to be processed in pieces.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 September 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Divisions
+% ---------
+
+
+\def \zdivext {tex}
+
+\definetoks{\divisionname} % Name of current division.
+\definetoks{\zdivreq} % Divisions requested with \setdivisions.
+\zdivreq = {\all}
+\definetoks{\zdivset} % Divisions set.
+\setlist \zdivset = {}
+
+
+%~ This command is used in the book's root file to specify
+%~ the list of divisions that should be processed by ZzTeX.
+%~ All other divisions are not processed. If the command
+%~ does not appear in the root file, all divisions are processed.
+
+\def \setdivisions #1{% {division,...}
+ \if \emptyargp{#1}%
+ \warning{nodivs}{The \noexpand\setdivisions command does not specify any divisions}
+ \else
+ \global\zdivreq = {#1}%
+ \fi}
+
+%~ This command is used in the book's root file to specify the
+%~ name of a book division file (e.g., |chap01|, |appa|). The order
+%~ of these commands determines the order of the divisions.
+
+\def \division #1{% {division}
+ \global\divisionname = {#1}%
+ \edef \znext {\noexpand\inclusionlist\noexpand\zset{#1}{\the\zdivreq}}%
+ \znext
+ \if \zset
+ \remark{Starting division `\the\divisionname'.}%
+ \push{#1}{\zdivset}%
+ \freshpage{\short\floats\any}%
+ \setcolumnnumber{1}%
+ \zxdivinit{#1}{\true}%
+ \zindexdivinit{#1}%
+ \zmndivinit
+ \zpndivinit
+ \zframedivinit
+ \zmrdivinit
+ \zfltdivinit
+ \include{#1.\zdivext}%
+ \endgraf
+ \freshpage{\short\floats\any}%
+ \zortahdivfinal
+ \zindexdivfinal
+ \zxdivfinal{#1}%
+ \else
+ \zxdivinit{#1}{\false}%
+ {\globaldefs = 1 \name{\=zS:#1}}% % Invoke snapshot.
+ \fi
+ \global\divisionname = \expandafter{\jobname}}
+
+% This macro is invoked at the end of the document.
+
+\def \zdivmsg {%
+ \edef \znext {\the\zdivreq}%
+ \edef \znextfirst {\expandafter\zdivmsga \znext\zmark}%
+ \if \tokeqlp{\znext}{\zallname}%
+ \remark{The entire book was processed.}%
+ \else\if \tokeqlp{\znextfirst}{\zallbutname}%
+ \relax
+ \else
+ \commalist{\zreqlist}{\the\zdivreq}%
+ \maplist{\zdivmsgb{##1}}{\zreqlist}%
+ \fi\fi}
+
+\def \zdivmsga #1#2\zmark{#1}
+
+\def \zdivmsgb #1{%
+ \member{\zexists}{#1}{\zdivset}%
+ \if \notp{\zexists}%
+ \warning{divnotexist}{The requested division `#1' does not exist}%
+ \fi}
+
+% Division Snapshots
+% -------- ---------
+
+
+\setlist \zsnaplist = {} % List of registers to be snapshot.
+
+
+\def \declaresnapitem #1{% {\name}
+ \append{#1}{\zsnaplist}}
+
+
+\def \ztakesnap {%
+ \let \zmodesave = \xrefmode
+ \let \xrefmode = \xrefsnapmode
+ \def \znext {}%
+ \maplist{\zsnapone{##1}}{\zsnaplist}%
+ \ztoksa = \expandafter{\znext}%
+ \edef \znext {\noexpand\xref{snap}{\noexpand\folio}{}%
+ {\the\ztoksa}{\the\divisionname}}%
+ \znext
+ \let \xrefmode = \zmodesave}
+
+\def \zsnapone #1{% {\register}
+ \ztoksa = \expandafter{\znext}%
+ \edef \znext {\the\ztoksa \noexpand#1\the#1}}
+
+
+% Store division snapshot information in a special name in the tag namespace.
+
+\def \xrefsnap #1#2#3#4{% {}{}{code}{division}
+ \ifnum \xrefmode=\xrefloadtagmode
+ \if \undefinedp{\=zS:#4}\withname{\gdef}{\=zS:#4}{}\fi
+ \withname\xdef{\=zS:#4}{\name{\=zS:#4}#3}%
+ \fi} \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzdoc.tex b/macros/plain/contrib/zztex/tex/zzdoc.tex
new file mode 100644
index 0000000000..072436a43a
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzdoc.tex
@@ -0,0 +1,500 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Document Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 9 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Loading Design Files
+% ------- ------ -----
+
+
+\def \bookauthor {}
+\def \booktitle {}
+\def \bookpublisher {}
+\def \bookISBN {}
+
+
+\def \loaddesign #1{% {file-list}
+ \zdtinit
+ \zloadinifile
+ \global\divisionname = \expandafter{\jobname}%
+ \setfoliostyle{\arabic}% % Initialize various options that
+ \setsentencespacing{\false}% $ might be set in the design file.
+ \setmathspaces{4mu plus .4mu minus .75mu}
+ {4mu plus .4mu minus .75mu}
+ {4mu plus .4mu minus .75mu}%
+ \protectcitecommands
+ \commalist{\zdeslist}{#1}%
+ \maplist{\zinputdes{##1}}{\zdeslist}%
+ \textsize\rm % In case \documentdesign resets
+ % \normallineskip[limit].
+ \if \DVIWindorules \setflag \DVIWindoinuse = \true \fi %%% Temporary.
+ \if \newbiblio \input zzbiblio \else \input zzbibtex \fi
+ \if \rangep{\newmath}{1}{2}\input zznewmath\relax \fi
+ \if \newrunners \input zzrunner\relax \fi
+ \if \zerop{\tabularversion}%
+ \tabularversion = \if \newtabular 2\else 1\fi\relax
+ \fi
+ \if \neqlp{\tabularversion}{3}\input zztabularv\the\tabularversion\relax \fi
+ \if \newtitleadjustment \input zzttladj\relax \fi}
+
+\def \zinputdes #1{% {design-file}
+ \checkfile{\znext}{#1.zzd}%
+ \if \znext
+ \input #1.zzd\relax
+ \else
+ \error{nodesfile}{The design file `#1.zzd' is missing}
+ \zend
+ \fi
+ \if \orp{\hmodep}{\posp{\pagetotal}}
+ \error{desjunk}
+ {The design file `#1.zzd' has some spurious junk in it}
+ \fi
+ \textsize\rm % So \documentdesign macro can use it.
+ \documentdesign}
+
+\def \announcedesign #1{% {title}
+ \remark{Loading design file `#1'._}}
+
+\def \bookdata #1#2#3#4{% {author}{title}{publisher}{ISBN}
+ \gdef \bookauthor {#1}%
+ \gdef \booktitle {#2}%
+ \gdef \bookpublisher {#3}%
+ \gdef \bookISBN {#4}}
+
+%~ Deprecated in favor of |\bookdata|.
+
+\def \bookinfo #1#2#3{% {author}{title}{publisher}
+ \gdef \bookauthor {#1}%
+ \gdef \booktitle {#2}%
+ \gdef \bookpublisher {#3}}
+
+\def \commonencoding {%
+ \input zzcomenc\relax
+ \global\setflag \zcommonencoding = \true}
+
+\def \protectcitecommands {%
+ \let \cite = \citeleterror
+ \let \citeauthr = \citeleterror
+ \let \citeyear = \citeleterror
+ \let \nocite = \citeleterror}
+
+\def \citeleterror {%
+ \error{citelet}{Cannot use \noexpand\let to define \noexpand\cite commands}}
+
+% Design Alternatives
+% ------ ------------
+
+
+% Design alternatives are deprecated.
+
+\def \designalternative #1#2{% {\name}{choice}
+ \withname\gdef{\=zA:\string#1}{#2}}
+
+\def \definedesignalternative #1#2#3{% {\name}{required?}{choice1,...}
+ \definecount{#1}{-1}%
+ \if \undefinedp{\=zA:\string#1}%
+ \if #2%
+ \error{altreq}{The design alternative `\string#1' must be specified}%
+ \else
+ \zdefalt{#1}#3,\zmark
+ \fi
+ \fi
+ \commalist{\zaltlist}{#3}%
+ \tcounta = -1\relax
+ \maplist{\zcompalt{#1}{##1}}{\zaltlist}%
+ \if \negp{#1}%
+ \error{altinv}{The design alternative `\string#1' is invalid}%
+ \fi}
+
+\def \zdefalt #1#2,#3\zmark{% {\name}choice1,...\zmark
+ \designalternative{#1}{#2}}
+
+\def \zcompalt #1#2{% {\name}{choice}
+ \increment \tcounta
+ \stringeql{\znext}{\name{\=zA:\string#1}}{#2}%
+ \if \znext \global#1 = \tcounta \fi \relax}
+
+\let \altcase = \ifcase
+
+% Document Parameters
+% -------- ----------
+
+
+% The following PDF document information options are available.
+
+\chardef \PDFinfodefault = 0
+\chardef \PDFinfofull = 1
+\chardef \PDFinfocomp = 2
+\chardef \PDFinfonone = 3
+
+
+% Integer parameters:
+
+\adjdemerits = 10000 % Adjacent incompatible lines.
+\binoppenalty = 700 % Line break after binary operator.
+%\brokenpenalty = 0 % See \even and \oddbrokenpenalty.
+\clubpenalty = 500 % Club line at bottom of page.
+\defaulthyphenchar = `\- % Default hyphen character.
+\defaultskewchar = -1 % Default skew character.
+\delimiterfactor = 941 % Math delimiter size factor.
+\displaywidowpenalty = 500 % Widow line above math display.
+\definecount{\dollarhyph}{0} % 0: no hyphenation after dollar signs;
+ % 1: hyphenate after, but nowhere else;
+ % 2: hyphenate after and other places.
+\doublehyphendemerits = 80000 % Consecutive hyphenated lines.
+\errorcontextlines = 8 % Maximum error context line pairs.
+\definecount{\evenbrokenpenalty}{3000} % Column breaks after hyphenated
+ % line, but on same spread.
+\exhyphenpenalty = 0 % Line break after explicit hyphen.
+\finalhyphendemerits = 10000 % Penultimate hyphenated line.
+\hbadness = 1000 % Above which bad hboxes are shown.
+\hyphenpenalty = 50 % Line break after discretionary hyphen.
+\interlinepenalty = 0 % Between lines of a paragraph.
+\language = 0 % Current set of hyphenation rules.
+\lefthyphenmin = 2 % Shortest fragment at beginning of
+ % hyphenated word.
+\linepenalty = 10 % Increment at each line break.
+\definecount{\lineslong}{0} % Number of lines page can go long.
+\definecount{\linesperpage}{0} % Number of lines per page.
+\definecount{\linesshort}{0} % Number of lines page can go short.
+\definecount{\maxbottomcolumnfloats}{1} % Floats at column bottom.
+\definecount{\maxbottompagefloats}{1} % Floats at page bottom.
+\definecount{\maxtopcolumnfloats}{1} % Floats at column top.
+\definecount{\maxtoppagefloats}{1} % Floats at page top.
+\definecount{\mintextpercent}{10} % Percent of page that must have text.
+\newlinechar = -1 % Newline character for \write.
+\definecount{\newmath}{0} % Revision level of math---DEPRECATED.
+\definecount{\oddbrokenpenalty}{10000} % Spread breaks after
+ % hyphenated line.
+\definecount{\PDFinfo}{\PDFinfodefault} % Include document info in final PDF file.
+\pretolerance = 400 % Badness tolerated before hyphenation.
+\relpenalty = 500 % Line break after relation operator.
+\righthyphenmin = 3 % Shortest fragment at end of hypenated word.
+\definecount{\shrinkpercent}{10} % Percentage shrink is of nominal.
+\definecount{\stretchpercent}{25} % Percentage of the maximum stretch.
+\definecount{\tabularversion}{0} % Version of tabular facility.
+\tolerance = \pretolerance % Badness tolerated after hyphenation.
+\tracinglostchars = 1 % Positive to trace lost characters.
+\definecount{\tracingpagemakeup}{0} % Positive to trace page makeup.
+\tracingstats = 1 % Positive to trace memory statistics.
+\uchyph = 1 % Positive to hyphenate Capitalized words.
+\definecount{\underscorehyph}{1} % See \dollarhyph.
+\vbadness = 2000 % Above which bad vboxes are shown.
+\widowpenalty = 10000 % Widow line at top of page.
+\definecount{\xrefcites}{0} % Cross-reference \cite's:
+ % 0: no
+ % 1: simple xref entry
+ % 2: custom xref entry
+
+% Flag Parameters:
+
+\setflag \allowcolor = \true % Allow color specials?
+\setflag \allowreftitle = \false % Allow use of \reftitle?
+\setflag \baselinetoprules = \true % Rules at page top sit on baseline?
+\setflag \DVIWindoinuse = \false % Generate DVIWindo-specific goodies?
+\setflag \DVIWindorules = \false % Display page makeup rules? [deprecated]
+\setflag \forceepsbb = \false % Force reading of EPS bounding box?
+\setflag \indexcites = \false % \cite generates indexing command?
+\setflag \newbiblio = \false % Use new biblio facility?
+\setflag \newdots = \false % Use new \xdots commands?
+\setflag \newrunners = \false % Use new runners scheme?
+\setflag \newtabular = \false % Use new tabular module? [deprecated]
+\setflag \newtitleadjustment = \false % Use new title adjustment scheme?
+\setflag \PDFhyperlinks = \false % Generate PDF hyperlinks?
+\setflag \raggedbottom = \false % Ragged-bottom pages?
+\setflag \risingbottomfloats = \false % Bottom floats rise up on page?
+\setflag \risingfootnotes = \false % Footnotes rise up on page?
+\setflag \topdeltaadjustment = \false % Use \topdelta?
+\setflag \zcommonencoding = \false % Set with \commonencoding command.
+
+% Dimension Parameters:
+
+\boxmaxdepth = \maxdimen % Maximum depth of explicit vboxes.
+\delimitershortfall = 4pt % Maximum math delimiter shortfall.
+\emergencystretch = 4pt % Emergency stretchability of each line.
+\definedimen{\evenbleedshift}{0pt} % Bleed shift for versos.
+\definedimen{\eveninnermargin}{0pt} % Inner margin (gutter) for versos.
+\definedimen{\evenlefttextmargin}{0pt} % Left text margin for versos.
+\definedimen{\evenoutermargin}{0pt} % Outer margin for versos.
+\definedimen{\evenrighttextmargin}{0pt} % Right text margin for versos.
+\definedimen{\footerheight}{0pt} % Height of footer box.
+\definedimen{\headerheight}{0pt} % Height of running head.
+\definedimen{\headmargin}{0in} % Head (top) margin.
+\hfuzz = 0.33pt % Overrun before overfull hbox messages.
+\hoffset = 0pt % Overall horizontal offset.
+\zremovePlaindef \jot
+\definedimen{\jot}{3pt} % Increment for opening up math displays.
+\lineskiplimit = 0pt % Threshold where \lineskip is used
+ % instead of \baselineskip.
+\let \linewidth = \hsize % Alternate name for \hsize.
+\maxdepth = 4pt % Maximum depth of boxes on main pages.
+\zremovePlaindef \normallineskiplimit
+\definedimen{\normallineskiplimit}{0pt} % Normal line skip limit.
+\nulldelimiterspace = 1.2pt % Width of a null delimiter.
+\definedimen{\oddbleedshift}{0pt} % Bleed shift for rectos.
+\definedimen{\oddinnermargin}{0pt} % Inner margin (gutter) for rectos.
+\definedimen{\oddlefttextmargin}{0pt} % Left text margin for rectos.
+\definedimen{\oddoutermargin}{0pt} % Outer margin for rectos.
+\definedimen{\oddrighttextmargin}{0pt} % Right text margin for rectos.
+\overfullrule = 6pt % Width of rule appended to overfull boxes.
+\parindent = 0pt % Width of paragraph indent.
+\definedimen{\parrag}{0pt} % Raggedness of paragraph lines.
+\scriptspace = .25pt % Extra space after a sub/superscript.
+\splitmaxdepth = \maxdimen % Maximum depth of boxes on split pages.
+\definedimen{\standardbleed}{.125in} % Standard bleed required by press.
+\definedimen{\standardindent}{0pt} % Standard indentation amount.
+\definedimen{\textareaheight}{\mindimen}% Height of text area.
+\definedimen{\textmeasure}{0pc} % Width of text area.
+\let \textareawidth = \textmeasure
+\definedimen{\topdelta}{0pt} % \topskip - height(first line).
+\definedimen{\trimheight}{0in} % Trimmed paper height.
+\definedimen{\trimwidth}{0in} % Trimmed paper width.
+\definedimen{\trimplusbleedheight}{0in} % Trim plus bleed top and bottom.
+\definedimen{\trimplusbleedwidth}{0in} % Trim plus bleed both sides.
+\definedimen{\typeareaheight}{\mindimen}% Height of type area.
+\definedimen{\typeareawidth}{0pt} % Width of type area.
+\vfuzz = 0.5pt % Overrun before overfull vbox messages.
+\voffset = 0pt % Overall vertical offset.
+
+% Skip (glue) Parameters:
+
+\leftskip = 0pt % At left end of paragraph lines.
+\lineskip = 0pt % When \baselineskip isn't possible.
+\zremovePlaindef \normalbaselineskip
+\defineskip{\normalbaselineskip}{0pt} % Normal baseline distance.
+\zremovePlaindef \normallineskip
+\defineskip{\normallineskip}{0pt} % Normal line skip limit.
+\parfillskip = 0pt plus 1fil % Additional \rightskip at paragraph end.
+\parskip = 0pt % Above paragraphs.
+\rightskip = 0pt % At right end of lines.
+\spaceskip = 0pt % Between words (if nonzero).
+\splittopskip = 10pt % At top of split pages.
+\defineskip{\standardskip}{0pt} % Standard skip above/below elements.
+\topskip = \mindimen % At top of main pages.
+\xspaceskip = 0pt % Between sentences (if nonzero).
+
+% Muskip (mu glue) Parameters:
+
+\definemuskip{\fracbarhang}{0mu} % Fraction bar overhang.
+\thinmuskip = 0mu % Math space after punctuation.
+\medmuskip = 0mu % Math space around binary operators.
+\thickmuskip = 0mu % Math space around relational operators.
+
+% Token list parameters:
+
+\definetoks{\annotationfont} % Font for annotations (e.g., proof identification).
+\annotationfont = {cmssi10 at 7pt}
+\definetoks{\baselinemultiplier}% Multiplier for baselines.
+\baselinemultiplier = {1}
+\definetoks{\decimalpoint} % Decimal point character.
+\decimalpoint = {.}
+\definetoks{\PDFbuttoncolor} % Color of hyperlinked text.
+\definetoks{\matrixspread} % Baseline multiplier for matrices.
+\matrixspread = {1.0}
+
+% The following parameters are fixed and hidden from the user.
+
+\mathsurround = 0pt % Space around a math formula in text.
+
+% Parameter Calculation
+% --------- -----------
+
+
+\def \calculatetextareaheight #1{% {lines}
+ \relax
+ \if \dimnegp{\topskip}%
+ \error{misstopskip}{The value of \string\topskip must be set}%
+ \fi
+ {\global\linesperpage = #1\relax
+ \tcounta = #1\relax
+ \decrement \tcounta
+ \textareaheight = \the\tcounta\baselineskip
+ \global\advance \textareaheight by \topskip
+ \measurecapheight{\topdelta}%
+ \measureascenderheight{\tdimena}%
+ \if \dimgtrp{\tdimena}{\topdelta}\topdelta = \tdimena \fi
+ \advance \topdelta by -\topskip
+ \global\negate \topdelta}}
+
+\def \calculatetypeareaheight #1#2{% {head-height}{head-b/b}
+ \relax
+ \if \dimnegp{\textareaheight}%
+ \error{misstah}{The value of \string\textareaheight must be set}%
+ \fi
+ {\typeareaheight = \textareaheight
+ \advance \typeareaheight by -\topskip
+ \advance \typeareaheight by #1\relax
+ \advance \typeareaheight by #2\relax
+ \global\advance \typeareaheight by \footerheight
+ \headerheight = #1\relax
+ \advance \headerheight by #2\relax
+ \global\advance \headerheight by -\topskip}}
+
+\def \calculateoffsets #1#2{% {sheet-width}{sheet-height}
+ \relax
+ \if \andp{\dimposp{\trimwidth}}{\dimposp{\trimheight}}%
+ \hoffset = #1\relax
+ \advance \hoffset by -\trimwidth
+ \divide \hoffset by 2
+ \advance \hoffset by -1in
+ \voffset = #2\relax
+ \advance \voffset by -\trimheight
+ \divide \voffset by 2
+ \advance \voffset by -1in\relax
+ \else
+ \error{misstrim}{The values of \string\trimwidth and
+ \string\trimheight must be set}%
+ \fi}
+
+\def \calculatepdfoffsets #1#2#3{% {virtual-width}{virtual-height}{bleeds?}
+ \relax
+ \if \andp{\dimposp{\trimwidth}}{\dimposp{\trimheight}}%
+ \hoffset = -1in
+ \if #3\advance \hoffset by \standardbleed \fi
+ \calculate \voffset = {#2,-,\trimheight,-,1in}%
+ \if #3\advance \voffset by -\standardbleed \fi
+ \else
+ \error{misstrim}{The values of \string\trimwidth and
+ \string\trimheight must be set}%
+ \fi}
+
+\def \setskip #1=#2#3#4{% \parameter = {nominal}{max-stretch}{[shrink]}
+ \tdimena = #2\relax
+ \calculate \tdimenb = {#3,P,\stretchpercent}%
+ \if \emptyargp{#4}%
+ \calculate \tdimenc = {\tdimena,P,\shrinkpercent}%
+ \else
+ \tdimenc = #4\relax
+ \fi
+ #1 = \the\tdimena plus \the\tdimenb minus \the\tdimenc\relax}
+
+\def \fromtrim #1{% \setskip or \register
+ \if \tokeqlp{#1}{\setskip}%
+ \let \znext = \zfromtrima
+ \else
+ \def \zfromtrimreg {#1}%
+ \let \znext = \zfromtrimb
+ \fi
+ \znext}
+
+\def \zfromtrima #1=#2#3#4{%
+ \setskip #1={#2}{#3}{#4}%
+ \advance #1 by -\headmargin}
+
+\def \zfromtrimb {%
+ \afterassignment\zfromtrimc \zfromtrimreg}
+
+\def \zfromtrimc {%
+ \advance \zfromtrimreg by -\headmargin}
+
+% Document Block
+% -------- -----
+
+
+\def \document {%
+ % There is no point to embedding the entire document in a group.
+ % \documentdesign was already invoked by \loaddesign.
+ \zpushblock{document}%
+ \xdef \znext {%
+ \noexpand\definefont \noexpand\zannofont{\the\annotationfont}}
+ \znext
+ \zfontsummary{\false}%
+ \zopentfmlist
+ \zwritePDFinfo
+ \zpageinit
+ \zpushvcontext
+ \setparrag{\parrag}%
+ \zxrefinit
+ \zbiblioinit
+ \zindexinit
+ \zfloatinit
+ \setpagecolumns{}{1}{0pt}%
+ \if \definedp{\documentprolog}\documentprolog \fi}
+
+\def \enddocument {%
+ \endgraf
+ \if \definedp{\documentepilog}\documentepilog \fi
+ \closeanychapter
+ \closeanysection
+ \zpopblock{document}%
+ \freshpage{\short\floats\any}%
+ \zindexfinal
+ \zxreffinal
+%%% \zbibfinal
+ \zmissingartmsg
+ \ztagsummary
+ \zpopvcontext
+ \zlayoutsummary
+ \zfontsummary{\true}%
+ \zwritetfmlist
+ \if \posp{\tracingstats}\zregstats \fi
+ \zfeaturewarns
+ \ztodomsg
+ \zdivmsg
+ \zproofidfile
+ \zend}
+
+\def \zfeaturewarns {%
+ \messagenl{_}%
+ \if \zoverlayset
+ \remark{Overlays are present on each page.}%
+ \fi
+ \zproofident}
+
+\def \zproofident {%
+ \zproofidentline
+ \if \emptytoksp{\zproofid}%
+ \messagenl{| No proof identification.}%
+ \else
+ \messagenl{| \the\zproofid\space\space
+ \number\year/\number\month/\number\day\space
+ \formattime\space\space\space
+ \inicompositor}%
+ \fi
+ \zproofidentline}
+
+\def \zproofidentline {%
+ \messagenl{+-----------------------------------------------------------------------------_}}
+
+% Write PDF Document Information
+% ----- --- -------- -----------
+
+
+\def \zwritePDFinfo {%
+ \ifcase \PDFinfo
+ \relax
+ \or
+ \special{PDF: Title \booktitle}%
+ \special{PDF: Author \bookauthor}%
+ \special{PDF: Subject}%
+ \special{PDF: Keywords Publisher: \bookpublisher,
+ Compositor: \inicompositor}%
+ \or
+ \special{PDF: Title}%
+ \special{PDF: Author}%
+ \special{PDF: Subject}%
+ \special{PDF: Keywords Compositor: \inicompositor}%
+ \or
+ \special{PDF: Title}%
+ \special{PDF: Author}%
+ \special{PDF: Subject}%
+ \special{PDF: Keywords}%
+ \fi}
+
+% Disable \end
+% ------- ----
+
+
+\let \zend = \end
+
+\def \end {%
+ \error{noend}{Do not use the TeX \string\end\space command}}
diff --git a/macros/plain/contrib/zztex/tex/zzerror.tex b/macros/plain/contrib/zztex/tex/zzerror.tex
new file mode 100644
index 0000000000..693451b2c3
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzerror.tex
@@ -0,0 +1,123 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Error Handling
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 13 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Remarks & Errors
+% ------- - ------
+
+
+\def \remark #1{% {text}
+ \messagenl{_ZzTeX: #1_}}
+
+\def \warning #1#2{% {help-id}{text}
+ \zsethelp{#1}%
+ \zerrmsg{warning}{#2}}
+
+\def \error #1#2{% {help-id}{text}
+ \zsethelp{#1}%
+ \zerrmsg{error}{#2}%
+ \remark{Continuing from an error may cause unpredictable results.}}
+
+\def \zzerror #1{% {text}
+ \zerrmsg{internal error}{#1}%
+ \remark{Continuing from an internal error will cause erroneous results.}}
+
+\def \zerrmsg #1#2{% {prefix}{text}
+ {\newlinechar = `\_%
+ \errmessage{ZzTeX #1: #2}}}
+
+%%%\def \zerrcontext #1{%
+%%% \listtop{\znext}{\zblockstack}%
+%%% \writelog{ZzTeX context: #1 \znext\space \the\typesizename
+%%% \the\typestyle \the\typeencoding.}}
+%%%
+%%%\def \context {%
+%%% \zerrcontext{???}%
+%%% \zend}
+
+% To-Do Facility
+% ----- --------
+
+
+\definecount{\ztodocount}{0}
+
+
+%~ The |\todo| command accepts a note that is stored in the composite
+%~ cross-reference file as a reminder of something that needs to
+%~ be done later. ZzExplore can display a list of the outstanding
+%~ to-dos.
+
+\long\def \todo #1{% {note}
+ \zwritetodo{#1}%
+ \ztodo #1\zmark
+ \global\increment \ztodocount}
+
+\long\def \ztodo #1#2\zmark{% {char1}{rest of message}
+ \if \codeeqlp{#1}{!}%
+ {\errorcontextlines = 0
+ \def \znext {#2}%
+ \zerrmsg{to-do}{\expandafter\zdefof \meaning\znext\zmark\space
+ [\the\divisionname]}}%
+ \else\if \codeeqlp{#1}{.}%
+ \def \znext {#2}%
+ \writelog{ZzTeX to-do: \expandafter\zdefof \meaning\znext\zmark\space
+ [\the\divisionname]}%
+ \else\if \codeeqlp{#1}{?}%
+ \def \znext {#2}%
+ \messagenl{_ZzTeX to-do: To come: \expandafter\zdefof \meaning\znext\zmark\space
+ [\the\divisionname]_}%
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb 1 0 0}\fi
+ ???%
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi
+ \else
+ \def \znext {#1#2}%
+ \messagenl{_ZzTeX to-do: \expandafter\zdefof \meaning\znext\zmark\space
+ [\the\divisionname]_}%
+ \fi\fi\fi}
+
+% Write a todo entry into the cross-reference file.
+
+\long\def \zwritetodo #1{% {message}
+ \zbeginhidewrite
+ \def \znext {#1}%
+ \edef \znext {\noexpand\xref{todo}{\noexpand\folio}{}
+ {\expandafter\zdefof \meaning\znext\zmark}
+ {\the\divisionname}}%
+ \znext
+ \zendhidewrite}
+
+% There is nothing to do with each entry in the cross-reference file
+% when it is loaded.
+
+\long\def \xreftodo #1#2#3#4{}
+
+% This macro is invoked at the end of the run.
+
+\def \ztodomsg {%
+ \if \posp{\ztodocount}%
+ \remark{Number of to-do reminders encountered: \the\ztodocount}%
+ \fi}
+
+
+% Help Text
+% ---- ----
+
+
+\def \zsethelp #1{%
+ \if \definedp{\=zH:#1}%
+ \global\errhelp = \expandafterthrice{\name{\=zH:#1}}%
+ \else
+ \global\errhelp = {No additional help is available.}%
+ \fi}
+
+
diff --git a/macros/plain/contrib/zztex/tex/zzfloat.tex b/macros/plain/contrib/zztex/tex/zzfloat.tex
new file mode 100644
index 0000000000..b6e3e08246
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzfloat.tex
@@ -0,0 +1,1164 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Float Facilities
+%
+% Synopsis: This module contains the float and caption blocks, as well as
+% all the code required to support the scheduling of floats.
+%
+% Notes: The broadside capability was implemented by Richard A. Wells and
+% integrated into ZzTeX on 9/7/94.
+%
+% Author: Richard A. Wells & Paul C. Anagnostopoulos
+% Created: 7 March 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Data Structures
+% ---- ----------
+
+
+\definecount{\zfltcount}{0}
+\def \zfloatfreeq {}
+\def \zfloatpendq {}
+
+
+\def \zdeffloat #1#2{% {\float}{\float-box}
+ \definebox{#2}%
+ \zfreefloat{#1}{#2}%
+ \global\increment \zfltcount}
+
+\def \zgetfloat #1{% {\float}
+ \if \emptydefp{\zfloatfreeq}%
+ \error{toomanyflt}
+ {More than `\the\zfltcount' floats remain for page makeup}%
+ \else
+ \pop{#1}{\zfloatfreeq}%
+ \fi}
+
+\def \zfreefloat #1#2{% {\float}{\float-box}
+ \gdef #1{\def \zcurfloatbox {#2}}%
+ \append{#1}{\zfloatfreeq}}
+
+\zdeffloat{\zflta}{\zfltboxa}
+\zdeffloat{\zfltb}{\zfltboxb}
+\zdeffloat{\zfltc}{\zfltboxc}
+\zdeffloat{\zfltd}{\zfltboxd}
+\zdeffloat{\zflte}{\zfltboxe}
+\zdeffloat{\zfltf}{\zfltboxf}
+\zdeffloat{\zfltg}{\zfltboxg}
+\zdeffloat{\zflth}{\zfltboxh}
+\zdeffloat{\zflti}{\zfltboxi}
+\zdeffloat{\zfltj}{\zfltboxj}
+\zdeffloat{\zfltk}{\zfltboxk}
+\zdeffloat{\zfltl}{\zfltboxl}
+\zdeffloat{\zfltm}{\zfltboxm}
+\zdeffloat{\zfltn}{\zfltboxn}
+\zdeffloat{\zflto}{\zfltboxo}
+\zdeffloat{\zfltp}{\zfltboxp}
+\zdeffloat{\zfltq}{\zfltboxq}
+\zdeffloat{\zfltr}{\zfltboxr}
+\zdeffloat{\zflts}{\zfltboxs}
+\zdeffloat{\zfltt}{\zfltboxt}
+\zdeffloat{\zfltu}{\zfltboxu}
+\zdeffloat{\zfltv}{\zfltboxv}
+\zdeffloat{\zfltw}{\zfltboxw}
+\zdeffloat{\zfltx}{\zfltboxx}
+\zdeffloat{\zflty}{\zfltboxy}
+\zdeffloat{\zfltz}{\zfltboxz}
+
+% There is an insert class for each of the two places where floats
+% can go.
+
+\defineinsert{\ztopcolinsert} % Floats at top of column.
+\count\ztopcolinsert = 1000
+\dimen\ztopcolinsert = \maxdimen
+\skip\ztopcolinsert = 0pt
+\defineinsert{\zbotcolinsert} % Floats at bottom of column.
+\count\zbotcolinsert = 1000
+\dimen\zbotcolinsert = \maxdimen
+\skip\zbotcolinsert = 0pt
+
+
+% We need a dimension register to capture box depths.
+
+\definedimen{\zfloatdp}{0pt}
+
+% Float Types
+% ----- -----
+
+
+\setlist \zfloattypelist = {}
+
+
+\def \definefloattype #1#2#3{% {type}{toc-level}{association}
+ \if \emptyargp{#3}%
+ \withname\definecount{\float#1number}{0}%
+ \withname\declaresnapitem{\float#1number}%
+ \else
+ \edef \znext {%
+ \global\withname\let{\float#1number}=\name{\float#3number}}%
+ \znext
+ \fi
+ \withname\gdef{\zflt#1lvl}{#2}%
+ \append{#1}{\zfloattypelist}}
+
+
+\def \resetfloatnumbers {%
+ \maplist{\global\name{\float##1number}=0\relax}{\zfloattypelist}}
+
+
+% Predefined float types (don't forget an index locator for each one).
+
+\definefloattype{algorithm}{101}{}
+\definefloattype{figure}{102}{}
+\definefloattype{table}{103}{}
+\definefloattype{listing}{104}{}
+\definefloattype{sidebar}{105}{}
+
+% Float Block
+% ----- -----
+
+
+\defineblock{\float}{\endfloat}{\false}{}
+
+%~block float Type
+% \aboveskip = glue % Space b/b above float.
+% \def \beginformat {...} % Beginning of float formatter.
+% \belowskip = glue % Space b/b below float.
+% \def \comptextformat {...} % Composite number text formatter.
+% \continue = integer % Continued or continuation.
+% \def \endformat {...} % End of float formatter.
+% \leftindent = dimen % Horizontal fudge for all floats.
+% \pageplacement = {...} % Overriding page placement.
+% \position = {...} % Position (see below).
+% \runners = {style} % Runners for a page of floats.
+% \topfloatfudge = dimen % Vertical fudge for topmost float.
+% \width = dimen % Explicit width for float.
+%~end
+
+\definetoks{\pageplacement}
+\definedimen{\topfloatfudge}{0pt}
+
+% These derived parameters are needed here and by \caption. They may
+% also be useful to the user.
+
+\definecount{\floatpage}{0}
+\definedimen{\floatshift}{0pt}
+\definedimen{\floatwidth}{0pt}
+
+\definecount{\zdivfltcounter}{0} % Count floats in each division.
+\definebox{\zfltbroadbox}
+
+
+% Floats are packaged up in a vbox using \vtop, so that the float box
+% has the same height as the first thing inside. This improves the
+% chances that a float at the top of a page will be positioned correctly.
+
+\def \float #1{% {type}
+ \if \undefinedp{\float#1number}%
+ \error{undefflt}{Float type `#1' has not been defined}%
+ \fi
+ \endgraf
+ \blockcantbein{\float}{\float}%
+ \blockcantbein{\float}{\multicolumn}%
+ \beginblockscope{float}%
+ \global\increment \floatdepth
+ \global\increment \zdivfltcounter
+ \whichpage{\floatpage}{zF:\the\divisionname-\the\zdivfltcounter}%
+ \def \beginformat {}% %~default soft
+ \continue = 0 %~default with
+ \def \comptextformat {}% %~default soft
+ \setflag \continuation = \false % Deprecated
+ \def \endformat {}% %~default soft
+ \leftindent = 0pt %~default soft
+ \pageplacement = {}% %~default with
+ \runners = {normal}% %~default soft
+ \zoldrunners{\normalheader\normalfooter}%
+ \width = \naturalwidth %~default soft
+ \processdesign{\float}{#1}%
+ \zsetcontinue % Handle old \continuation.
+ \if \notp{\continuationp}\global\withname\increment{\float#1number}\fi
+ \global\withname\floatnumber{\float#1number}%
+ \setcomptext{\floatcomptext}%
+ \def \zcurflttype {#1}%
+ \edef \zcurfltlvl {\name{\zflt\zcurflttype lvl}}%
+ \parindent = 0pt
+ \parrag = 0pt
+ \parskip = 0pt
+ \zparsefltpos{\the\position}%
+ \if \notp{\emptytoksp{\pageplacement}}%
+ \zparsefltpagepos{\the\pageplacement}%
+ \fi
+ \if \zfltposhere
+ \penalty \breakallowed % Synchronize main list.
+ \zparsefltpos{\the\position}% % Recalculate global stuff.
+ \if \notp{\emptytoksp{\pageplacement}}
+ \zparsefltpagepos{\the\pageplacement}%
+ \fi
+ \fi
+ \zcalcfltparams
+ \zgetfloat{\zcurfloat}%
+ \zcurfloat
+ \global\setbox \zcurfloatbox = \vtop \bgroup
+ \zpushvcontext
+ \setindentation{0pt}{0pt}%
+ \settextwidth{\floatwidth}%
+ \settaginfo{\the\floatcomptext}{}% % Set tag info without title.
+ \setsubtagnumber{0}%
+ \beginformat}
+
+\def \endfloat {%
+ \endgraf
+ \endformat
+ \global\zfloatdp = \prevdepth
+ \tagpageonly{\uniquetag{zF}{\the\zdivfltcounter}}%
+ \zpopvcontext
+ \egroup % \vtop
+ \expandafter\xdef \zcurfloat {%
+ \def \noexpand\zcurfloatid {\zcurflttype\space \the\floatnumber}%
+ \def \noexpand\zcurfloatbox {\zcurfloatbox}%
+ \zfloatdp = \the\zfloatdp
+ \aboveskip = \the\aboveskip
+ \belowskip = \the\belowskip
+ \leftindent = \the\leftindent
+ \position = {\the\position}%
+ \pageplacement = {\the\pageplacement}%
+ \runners = {\the\runners}%
+ \floatshift = \the\floatshift
+ \topfloatfudge = \the\topfloatfudge}%
+ \expandafter\append \zcurfloat{\zfloatpendq}%
+ \zschedulefloats{\znext}{\false}{\false}%
+ \if \gtrp{\znext}{99}%
+ \zfltpage{\zpenfloatpage}%
+ \fi
+ \global\decrement \floatdepth
+ \endblockscope{float}}
+
+%~ This |\float| modifier forces an alone float.
+
+\def \alonefloat {% %^modifier
+ \with{\pageplacement={\alone}}}
+
+%~ This |\float| modifier forces a bottom float.
+
+\def \bottomfloat {% %^modifier
+ \with{\pageplacement={\bottom}}}
+
+%~ This |\float| modifier forces a broadside float.
+
+\def \broadsidefloat {% %^modifier
+ \with{\pageplacement={\broadside}}}
+
+%~ This |\float| modifier forces a here float.
+
+\def \herefloat {% %^modifier
+ \with{\pageplacement={\here}}}
+
+%~ This |\float| modifier forces a separate float.
+
+\def \separatefloat {% %^modifier
+ \with{\pageplacement={\separate}}}
+
+%~ This |\float| modifier allows the float to occupy the
+%~ running head area. Any running head is deleted.
+
+\def \userharea {% %^modifier
+ \with{\runners={blind}%
+ \advance \topfloatfudge by -\headerheight}}
+
+\def \adjusttopfloatfudge #1{%
+ \global\advance \topfloatfudge by #1\relax}
+
+\def \piggybackfloat {%
+ \edef \znext {\noexpand\global\noexpand\increment
+ \name{\float\zcurflttype number}}%
+ \znext
+ \edef \znext {\floatnumber = \name{\float\zcurflttype number}}%
+ \znext}
+
+% Controlling Floats
+% ----------- ------
+
+
+% This macro is invoked at the beginning of each division.
+
+\def \zfltdivinit {%
+ \global\zdivfltcounter = 0\relax}
+
+
+\setflag \zschedflts = \true
+
+\def \deferfloats #1{% {boolean}
+ \global\setflag \zschedflts = {\notp{#1}}}
+
+
+% Scheduling Tools
+% ---------- -----
+
+
+% These counters keep track of the number of floats scheduled for the
+% current page.
+
+\definecount{\ztopcolfloats}{0} % Number of top column floats.
+\definecount{\zbotcolfloats}{0} % Number of bottom column floats.
+\definecount{\zfloatsinserted}{0} % Total number of floats.
+\definetoks{\zfltrunners} % Runners for first float on page.
+
+% This macro initializes for handling floats on a new page.
+
+\def \zfloatinit {%
+ \global\setflag \zschedflts = \true
+ \global\ztopcolfloats = 0
+ \global\zbotcolfloats = 0
+ \zfltrunners = {}}
+
+% These macros simply hide some of the details to make the \zsched*
+% macros easier to read.
+
+\def \ztallytopfloat {%
+ \if \orp{\notp{\zfltposmargonly}}{\posp{\ztopcolfloats}}%
+ \global\increment \ztopcolfloats
+ \fi}
+
+\def \zforcenewpage{%
+ \global\zfloatsinserted = 101\relax}
+
+\let \zquitscheding = \exitmaplist
+
+\def \zsetfloattall{%
+ \zmakefloatalone
+ \setflag \zfloattall = \true
+ \tracepagemakeup{Float is too tall for column; positioning `alone'.}}
+
+\def \zmakefloatalone{%
+ \setflag \zfltposalone = \true
+ \setflag \zfltposbottom = \false
+ \setflag \zfltposhereonly = \false
+ \setflag \zfltposhere = \false
+ \setflag \zfltposseparate = \false
+ \setflag \zfltpostop = \false}
+
+\def \zmakefloattop{%
+ \setflag \zfltposalone = \false
+ \setflag \zfltposbottom = \false
+ \setflag \zfltposhereonly = \false
+ \setflag \zfltposhere = \false
+ \setflag \zfltposseparate = \false
+ \setflag \zfltpostop = \true}
+
+% Float Scheduler
+% ----- ---------
+
+
+% return-count is a counter passed in by the caller that we should
+% set at the end of \zschedulefloats to indicate how
+% many floats were emitted during this call. A value
+% greater than 99 indicates that a new page should be
+% FORCED (e.g. for alone floats) by the output routine.
+% during-output? is a flag indicating that the caller is
+% part of the output routine.
+% flushing? A flag indicating whether we are flushing floats.
+
+\def \zschedulefloats #1#2#3{% {return-count}{during-output?}{flushing?}
+ \tracepagemakeup{[Scheduling \if #2floats during output%
+ \else float when encountered\fi.}%
+ \tracepagemakeup{Page total: \the\pagetotal; goal: \the\pagegoal.}%
+ % Reset our counter
+ \global\zfloatsinserted = 0
+ \if \zschedflts
+ \if \emptydefp{\zfloatpendq}%
+ \tracepagemakeup{There are no floats to be scheduled.}%
+ \else
+ \endgraf
+ \zinitfloatfit{#2}%
+ {\setflag \zschedfirstseparate = \true
+ \setflag \zschedseparateloop = \false
+ \maplist{\zschedone{#2}{#3}{##1}}{\zfloatpendq}}%
+ \fi
+ \else
+ \tracepagemakeup{Floats are deferred now.}%
+ \fi
+ \tracepagemakeup{Float scheduling complete;
+ floats inserted: \the\zfloatsinserted.]}%
+ \xdef #1{\the\zfloatsinserted}}
+
+
+\def \zschedone #1#2#3{% {during-output?}{flushing?}{\float}
+ #3%
+ \zparsefltpos{\the\position}%
+ \if \notp{\emptytoksp{\pageplacement}}
+ \zparsefltpagepos{\the\pageplacement}%
+ \fi
+ \if #2% % If flushing floats, force float
+ \setflag \zfltposbottom = \false % to a `separate'.
+ \setflag \zfltpostop = \false
+ \setflag \zfltposseparate = \true
+ \fi
+ \tracepagemakeup{Trying to schedule \zcurfloatid;
+ size: \the\ht\zcurfloatbox+\the\dp\zcurfloatbox.}%
+ \if \orp{\andp{\zfltposeven}{\oddpagep}}%
+ {\andp{\zfltposodd}{\evenpagep}}%
+ \tracepagemakeup{Float is deferred until appropriate even/odd page.}%
+ \zquitscheding
+ \else
+ \setflag \zfloatunsched = \true
+ \setflag \zfloattall = \false
+ % The following macros attempt, in order of priority, to schedule
+ % the current float. Each macro may set up state that causes
+ % the subsequent macro(s) to do nothing.
+ \zschedhereonly{#1}%
+ \zschedhere{#1}%
+ \zschedalone{#1}%
+ \zschedbroadside{#1}%
+ \zschedseparate{#1}%
+ \zschedtop{#1}%
+ \zschedbottom{#1}%
+ \if \zfloattall % Schedule as `alone'.
+ \zschedalone{#1}%
+ \fi
+ \if \zfloatunsched
+ \tracepagemakeup{Float could not be scheduled.}%
+ % This exits a \maplist call to \zschedone.
+ \zquitscheding
+ \else
+ % Remove the current float from the queue...
+ \pop{\zcurfloat}{\zfloatpendq}%
+ % ...and free up the associated data structures.
+ \expandaftertwice\zfreefloat \expandafter\zcurfloat\zcurfloatbox
+ \fi
+ \fi}
+
+% Fitting a Float
+% ------- - -----
+
+
+% These registers are used in float fitting. They contain,
+% respectively, the amount of vertical space used up by floats for
+% the current page and the maximum space available for floats.
+
+\definedimen{\zfloatpageused}{0pt}
+\definedimen{\zfloatmaxavail}{0pt}
+
+
+% Macro to initialize the above parameters (called in \zschedulefloats).
+
+\def\zinitfloatfit #1{% {during-output?}
+ \if #1
+ \zfloatpageused = 0pt
+ % Effectively: zfloatmaxavail = (100-mintextpercent) * vsize
+ \calculate \tcounta = {100,-,\mintextpercent}%
+ \calculate \zfloatmaxavail = {\vsize,P,\tcounta}%
+ \else
+ % Effectively: zfloatpageused = max(pagetotal, vsize * mintextpercent)
+ \calculate \zfloatpageused = {\vsize,P,\mintextpercent,X,\pagetotal}%
+ \zfloatmaxavail = \pagegoal
+ \fi}
+
+
+% The spacing above and below a float is fairly complicated.
+% In this table, h is the height of the float, d is the depth.
+%
+% Position Sequence Above Below
+%
+% \alone only \topskip - h + none
+% \topfloatfudge
+% \bottom first \aboveskip - h none
+% rest min(\aboveskip, none
+% \belowskip) - h
+%
+% \separate first \topskip - h + none
+% \topfloatfudge
+% rest min(\aboveskip, none
+% \belowskip) - h
+% \top first \topskip - h + \belowskip - \topskip - d
+% \topfloatfudge
+% rest min(\aboveskip, \belowskip - \topskip - d
+% \belowskip) - h
+
+
+% Here and broadside floats are handled differently, below in \zfitfloathere
+% and \zfitfloatbroadside
+
+\def \zfitfloat #1#2#3#4#5{% {result-flag}{top?}{aboveskip-first}
+ % {aboveskip-rest}{belowskip}
+ {\if \zfltposmargonly
+ \tcounta = 0 % Margin float should act as first one.
+ \else
+ \tcounta = \if #2\ztopcolfloats \else \zbotcolfloats \fi
+ \fi
+ \zskipa = \if \zerop{\tcounta}#3\else #4\fi
+ \advance \zskipa by -\ht\zcurfloatbox
+ \if \andp{#2}{\zerop{\tcounta}}\advance \zskipa by \topfloatfudge \fi
+ \tdimena = \zskipa
+ \advance \tdimena by \ht\zcurfloatbox
+ \advance \tdimena by \dp\zcurfloatbox
+ \tdimenb = #5\advance \tdimena by \tdimenb
+ \tdimenc = \zfloatpageused
+ \if \notp{\zfltposmargonly}\advance \tdimenc by \tdimena \fi
+ \tracepagemakeup{Requires: \the\tdimena;
+ available: \the\zfloatmaxavail;
+ used: \the\zfloatpageused.}%
+ \if \dimlssp{\tdimenc}{\zfloatmaxavail}%
+ \if \andp{\notp{#2}}{\zfltposmargonly}%
+ \insert \zbotcolinsert {%
+ \vbox to 0pt{%
+ \vss
+ \moveright \floatshift \box\zcurfloatbox
+ \vskip -\dp\zcurfloatbox}}%
+ \else
+ \insert \if #2\ztopcolinsert \else \zbotcolinsert \fi {%
+ \vskip \zskipa
+ \moveright \floatshift \box\zcurfloatbox
+ \nobreak
+ \if \zfltposmargonly
+ \vskip \tdimenb
+ \nobreak
+ \vskip -\tdimena
+ \else
+ \vskip #5\relax
+ \fi}%
+ \fi
+ \if \emptytoksp{\zfltrunners}%
+ \global\zfltrunners = \expandafter{\the\runners}%
+ \fi
+ \global\increment \zfloatsinserted
+ \global\zfloatpageused = \tdimenc
+ \global\setflag #1= \true
+ \else
+ \global\setflag #1= \false
+ \fi}}
+
+\def \zfitfloathere #1#2#3{% {result-flag}{aboveskip}{belowskip}
+ {\tdimena = #2\relax
+ \advance \tdimena by \dp\zcurfloatbox
+ \advance \tdimena by #3\relax
+ \tracepagemakeup{Requires: \the\tdimena;
+ page total: \the\pagetotal;
+ page goal: \the\pagegoal.}%
+ \advance \tdimena by \pagetotal
+ \if \dimlssp{\tdimena}{\pagegoal}%
+ \bbskipabove{\breaknever}{#2}%
+ \fakepar
+ \moveright \floatshift \box\zcurfloatbox
+ \prevdepth = \zfloatdp
+ \bbskipbelow{\breakallowed}{#3}%
+ \global\increment \zfloatsinserted
+ \global\setflag #1= \true
+ \else
+ \global\setflag #1= \false
+ \fi}}
+
+\def \zfitfloatbroadside {%
+ {% We know there are no other floats on the the topcolumn when
+ % this is called (by \zschedbroadside only) and we don't have to
+ % worry about fixing up the vertical position at the end of the
+ % page.
+ %
+ % Compute the space required
+ % Start with the topskip
+ \tdimena = \topfloatfudge
+ % Add the *width* (since the box will be rotated)
+ \advance \tdimena by \wd\zcurfloatbox
+ \tracepagemakeup{Requires: \the\tdimena;
+ broadside floats always fit.}%
+ \insert \ztopcolinsert {%
+ % vskip the top float fudge
+ \vskip \topfloatfudge
+ % save the width for unskipping later
+ \tdimenb = \wd\zcurfloatbox
+ % vskip the *width* of the box to do the position translation
+ % that we can't do with PostScript
+ \vskip \tdimenb
+ % Put our hbox in a vbox, so we can "lower" it rather than move
+ % it right (since it will be rotated)
+ \global\setbox\zfltbroadbox = \vbox{%
+ \vskip\floatshift % replaces \moveright in other floats
+ \box\zcurfloatbox}%
+ \rotatebox{\zfltbroadbox}{90}%
+ % Undo vertical skip so that insert doesn't cause additional page
+ \vskip -\tdimenb}%
+ \if \emptytoksp{\zfltrunners}%
+ \global\zfltrunners = \expandafter{\the\runners}%
+ \fi
+ \global\increment \zfloatsinserted
+ \global\zfloatpageused = \tdimena}}
+
+% Individual Schedulers
+% ---------- ----------
+
+
+% This is a temporary register used in calls to \zfitfloat where the
+% fit needs to take into account more than one skip value (such as
+% both the \aboveskip and \belowskip). In that case this dimen is
+% used as a temp to hold the sum of the skip values.
+
+\defineskip{\zfloatabove}{0pt}
+\defineskip{\zfloatbelow}{0pt}
+\definedimen{\zfloatextraskip}{0pt}
+
+
+% This scheduler is called for floats with position `here' and no others.
+
+\def\zschedhereonly #1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposhereonly}%
+ \tracepagemakeup{Float is to be positioned `here' only.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if #1% during output:
+ \tracepagemakeup{Float moved to top of this page.}%
+ \zmakefloattop
+ \else % when encountered:
+ \if \posp{\zbotcolfloats}%
+ \error{hereonlybot}{Cannot position float `here'; already floats
+ at bottom.}%
+ \else\if \dimzerop{\pagetotal}%
+ \tracepagemakeup{Float at top of column: schedule as `top' float.}%
+ \zmakefloattop
+ \else
+ \zfitfloathere{\zfloatfits}{\aboveskip}{\belowskip}%
+ \if \zfloatfits
+ \tracepagemakeup{Float inserted here.}%
+ \setflag \zfloatunsched = \false
+ \else
+ \tracepagemakeup{Float does not fit here.}%
+ \zforcenewpage
+ \zquitscheding
+ \fi
+ \fi\fi
+ \fi
+ \fi
+ \fi}
+
+
+% This scheduler is called for floats with position `here' along with at
+% least one other page position.
+
+\def\zschedhere #1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposhere}%
+ \tracepagemakeup{Float can be positioned `here'.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if #1% during output:
+ \relax
+ \else % when encountered:
+ \if \posp{\zbotcolfloats}%
+ \tracepagemakeup{There are already floats positioned `bottom'.}%
+ \else\if \dimzerop{\pagetotal}%
+ \tracepagemakeup{Float at top of column: schedule as `top' float.}%
+ \zmakefloattop
+ \else
+ \zfitfloathere{\zfloatfits}{\aboveskip}{\belowskip}%
+ \if \zfloatfits
+ \tracepagemakeup{Float inserted here.}%
+ \setflag \zfloatunsched = \false
+ \else
+ \tracepagemakeup{Float does not fit here.}%
+ \fi
+ \fi\fi
+ \fi
+ \fi
+ \fi}
+
+
+\def \zschedalone #1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposalone}%
+ \tracepagemakeup{Float can be positioned `alone'.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if \orp{#1}{\dimzerop{\pagetotal}}%
+ \if \firstcolumnp % building new page
+ \if \zerop{\zfloatsinserted}% no floats on this page, yet
+ \dp\zcurfloatbox = 0pt % Make it fit.
+ \zfitfloat{\zfloatfits}{\true}{\topskip}{999pt}{0pt}%
+ \if \zfloatfits
+ \ztallytopfloat
+ \tracepagemakeup{Inserted on a page by itself.}%
+ \zforcenewpage
+ \setflag \zfloatunsched = \false
+ \zquitscheding
+ \fi
+ \else % wait for next time
+ \tracepagemakeup{Already floats in this column; quit.}%
+ \zquitscheding
+ \fi
+ \else% still in the middle of a page
+ \tracepagemakeup{Not in first column of page; quit.}%
+ \zquitscheding
+ \fi
+ \else % As encountered, and page not empty.
+ \tracepagemakeup{Must wait for new page; quit.}%
+ \zquitscheding
+ \fi
+ \fi
+ \fi}
+
+\def \zschedbroadside #1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposbroadside}%
+ \tracepagemakeup{Float can be positioned `broadside'.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if \orp{#1}{\dimzerop{\pagetotal}}%
+ \if \firstcolumnp % building new page
+ \if \zerop{\zfloatsinserted}% no floats on this page, yet
+ % Broadside floats "always" fit. The output will have to be
+ % inspected.
+ \zfitfloatbroadside
+ \ztallytopfloat
+ \tracepagemakeup{Inserted on a page by itself.}%
+ \zforcenewpage
+ \setflag \zfloatunsched = \false
+ \zquitscheding
+ \else % wait for next time
+ \tracepagemakeup{Already floats on this page; quit.}%
+ \zquitscheding
+ \fi
+ \else% still in the middle of a page
+ \tracepagemakeup{Not in first column of page; quit.}%
+ \zquitscheding
+ \fi
+ \else % As encountered, and page not empty.
+ \tracepagemakeup{Must wait for new page; quit.}%
+ \zquitscheding
+ \fi
+ \fi
+ \fi}
+
+
+\def\zschedseparate #1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposseparate}%
+ \tracepagemakeup{Float can be positioned `separate'.}%
+ % If a separate float is called when encountered, we don't do anything.
+ \if #1% during output
+ \if \firstcolumnp % building a new page
+ \if \zschedfirstseparate
+ \if \zerop{\zfloatsinserted}% no floats on this page, yet
+ \zfloatmaxavail = \vsize % Entire page is available now.
+ \zfitfloat{\zfloatfits}{\true}{\topskip}{999pt}{0pt}%
+ \if \zfloatfits
+ \ztallytopfloat
+ \setflag \zfloatunsched = \false
+ \zforcenewpage % This is a page of separates now.
+ \tracepagemakeup{Inserted at the top of a new page.}%
+ \setflag \zschedfirstseparate = \false
+ \setflag \zschedseparateloop = \true
+ \else
+ \zsetfloattall
+ \fi
+ \else % wait for next time
+ \tracepagemakeup{Page already has other floats on it.}%
+ \zquitscheding
+ \fi
+ \else % Subsequent separates.
+ \zfloatabove = \if \dimlssp{\aboveskip}{\belowskip}\aboveskip
+ \else \belowskip \fi
+ \zfitfloat{\zfloatfits}{\true}{999pt}{\zfloatabove}{0pt}%
+ \if \zfloatfits
+ \ztallytopfloat
+ \setflag \zfloatunsched = \false
+ \tracepagemakeup{Inserted on a page with other separates.}%
+ \else
+ \zquitscheding
+ \tracepagemakeup{Does not fit on this page; start new page.}%
+ \fi
+ \fi
+ \else% still in the middle of a page
+ \tracepagemakeup{Must wait for new page; quit;}%
+ \zquitscheding
+ \fi
+ \else% when encountered
+ \tracepagemakeup{Must wait for new page; quit.}%
+ \zquitscheding
+ \fi
+ \fi}
+
+
+\def\zschedtop#1{% {during-output?}
+ \if \andp{\andp{\zfloatunsched}{\zfltpostop}}
+ {\orp{\notp{\zfltposfollow}}{#1}}%
+ \tracepagemakeup{Float can be positioned `top'.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if \lssp{\ztopcolfloats}{\maxtopcolumnfloats}%
+ \zfloatabove = \if \dimlssp{\aboveskip}{\belowskip}\aboveskip
+ \else \belowskip \fi
+ \advance \zfloatabove by -\belowskip
+ \advance \zfloatabove by \topskip
+ \zfloatbelow = \belowskip
+ \tdimena = \topskip
+ \advance \zfloatbelow by -\tdimena
+ \advance \zfloatbelow by -\zfloatdp
+ \zfitfloat{\zfloatfits}{\true}{\topskip}{\zfloatabove}{\zfloatbelow}%
+ \if \zfloatfits
+ \ztallytopfloat
+ \tracepagemakeup{Inserted at top of column.}%
+ \setflag \zfloatunsched = \false
+ \else
+ \if \andp{#1}{\zerop{\zfloatsinserted}}\zsetfloattall \fi
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def \zschedbottom#1{% {during-output?}
+ \if \andp{\zfloatunsched}{\zfltposbottom}%
+ \tracepagemakeup{Float can be positioned `bottom'.}%
+ \if \zschedseparateloop
+ \tracepagemakeup{Making up a page of separates; quit.}%
+ \zforcenewpage
+ \zquitscheding
+ \else
+ \if \lssp{\zbotcolfloats}{\maxbottomcolumnfloats}%
+ \zfloatbelow = \if \dimlssp{\aboveskip}{\belowskip}\aboveskip
+ \else \belowskip \fi
+ \zfitfloat{\zfloatfits}{\false}{\aboveskip}{\zfloatbelow}{0pt}%
+ \if \zfloatfits
+ \if \notp{\zfltpostopafterbot}%
+ \global\ztopcolfloats = \maxtopcolumnfloats
+ \fi
+ \global\increment \zbotcolfloats
+ \tracepagemakeup{Inserted at bottom of column.}%
+ \setflag \zfloatunsched = \false
+ \else
+ \if \andp{#1}{\zerop{\zfloatsinserted}}\zsetfloattall \fi
+ \fi
+ \fi
+ \fi
+ \fi}
+
+% Captions
+% --------
+
+
+\defineblock{\caption}{\endcaption}{\false}{}
+
+%~block caption Type
+% \aboveskip = glue % Space b/b above caption.
+% \setflag \allowintoc = flag % Allow caption in ToC.
+% \belowskip = glue % Space b/b below caption.
+% \captionfudge = dimen % Fudge for \aboveskip.
+% \def \comptextformat {...} % (No longer used with captions.)
+% \difficulty = integer % Level of difficulty.
+% \leftindent = glue % Left indentation.
+% \legendfont = {...} % Font for optional legend.
+% \def \legendformat ##1{...} % Legend formatter.
+% \numberfont = {...} % Font for float number.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \position = {...} % Position (see below).
+% \rightindent = glue % Right indentation.
+% \style = {...} % Heading style.
+% \titlefont = {...} % Font for caption title.
+% \def \titleformat ##1{...} % Title formatter.
+% \width = dimen % Width of caption text.
+%~end
+
+\definedimen{\captionfudge}{0pt}
+\definetoks{\legendfont}
+
+\definebox{\zcapbox}
+\definedimen{\zcapshift}{0pt}
+
+%~ This marker indicates that the following text is the legend or
+%~ credit for the caption.
+
+\definemarker{\legend}
+
+
+\def \caption #1{% {title with optional \legend}
+ \blockmustbein{\caption}{\float}%
+ \blockcantbein{\caption}{\caption}%
+ \beginblockscope{caption}%
+ \global\increment \captiondepth
+ \captionfudge = 0pt %~default with
+ \def \comptextformat {}% %~default hard
+ \style = {Initial cap/lowercase}% %~default soft
+ \difficulty = 0 %~default with
+ \processdesign{\caption}{\zcurflttype}%
+ \global\increment \captionnumber
+ \if \notp{\emptydefp{\comptextformat}}%
+ \error{capcomptext}{The \string\comptextformat\space parameter is no
+ longer used in captions}
+ \fi
+ \captionformat #1\legend\zmark
+ \if \andp{\allowintoc}{\notp{\continuationp}}\zcaptoc #1\legend\zmark \fi
+ \endcaption
+ \zcaptag #1\legend\zmark}% % Reset tag info with title.
+
+\def \endcaption {%
+ \global\decrement \captiondepth
+ \endblockscope{caption}}
+
+\def \captionformat #1\legend#2\zmark{%
+ \the\numberfont
+ \setbox\zcapbox = \vtop{%
+ \zpushvcontext
+ \setindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{\parrag}%
+ \if \emptyargp{#2}%
+ \titleformat{#1}%
+ \else
+ \let \legend = \relax % So it won't interfere with formatting.
+ \titleformat{#1\the\legendfont \legendformat{#2}}%
+ \fi
+ \endgraf
+ \global\zfloatdp = \prevdepth
+ \zpopvcontext}%
+ \zparsecappos{\the\position}%
+ \zcalccapitems
+ \bbskipabove{\breaknever}{\aboveskip}%
+ \noindent \kern \zcapshift \box\zcapbox \par
+ \prevdepth = \zfloatdp
+ \bbskipbelow{\breaknever}{\belowskip}}
+
+\def \zcaptoc #1\legend#2\zmark{%
+ \tocentry{\the\floatcomptext}{#1}{\zcurfltlvl}}
+
+\def \zcaptag #1\legend#2\zmark{%
+ \settaginfo{\the\floatcomptext}{#1}}
+
+% Position Handling
+% -------- --------
+
+
+% This macro sets up variables that specify the position of a float,
+% according to the \position design parameter:
+%
+% \alone Place float on a page by itself.
+% \anypage Place float on any page.
+% \any (synonym for \anypage)
+% \bottom Place float at the bottom of a page.
+% \broadside Place float broadside (alone, rotated 90 degrees).
+% \evenpage Place float on an even page.
+% \follow Float must follow its position in the text.
+% \here Place float exactly where it appears.
+% \ifevenpage Use next position only on even page.
+% \ifoddpage Use next position only on odd page.
+% \leftmargin Shift float to left margin.
+% \margin Same as \leftmargin.
+% \marginonly Float fits in the margin and does not occupy any
+% vertical space on the page.
+% \nofollow Float need not follow its position in the text.
+% \oddpage Place float on an odd page.
+% \outsidemargin Shift float to outside margin.
+% \rightmargin Shift float to right margin.
+% \separate Place float on a page with floats only.
+% \textarea Leave float at left edge of text area.
+% \text (synonym for \textarea)
+% \top Place float at the top of a page.
+% \topafterbottom Okay to schedule \top float after \bottom.
+
+
+\definecount{\zfltposshift}{0}
+
+
+\def \zparsefltpos #1{% {options...}
+ {\zclearfltpagepos
+ \global\setflag \zfltposmargonly = \false
+ \global\zfltposshift = 0\relax
+ \zsetupfltpageopts
+ \def \ifevenpage ##1{\if \evenp{\floatpage}##1\fi}%
+ \def \ifoddpage ##1{\if \oddp{\floatpage}##1\fi}%
+ \def \leftmargin {\global\zfltposshift=1\relax}%
+ \let \margin = \leftmargin
+ \def \marginonly {\global\setflag\zfltposmargonly=\true}%
+ \def \outsidemargin{\ifevenpage{\leftmargin}\ifoddpage{\rightmargin}}%
+ \def \rightmargin {\global\zfltposshift=2\relax}%
+ \def \textarea {\global\zfltposshift=0\relax}%
+ \let \text = \textarea
+ \global\floatpage = \floatpage
+ #1%
+ \global\setflag \zfltposhereonly = \zfltposhere
+ \global\setflag \zfltposok = \zfltposhere
+ \if \orp{\zfltposalone}
+ {\orp{\zfltposbottom}
+ {\orp{\zfltposbroadside}
+ {\orp{\zfltposseparate}
+ {\zfltpostop}}}}%
+ \global\setflag \zfltposhereonly = \false
+ \global\setflag \zfltposok = \true
+ \fi
+ \if \zfltposhereonly \setflag \zfltposhere = \false \fi
+ \if \notp{\zfltposok}%
+ \warning{nofloatpos}{No page position has been specified for a float}%
+ \global\setflag \zfltposalone = \true
+ \fi}}
+
+\def \zparsefltpagepos #1{% {options...}
+ {\zclearfltpagepos
+ \zsetupfltpageopts
+ #1%
+ \global\setflag \zfltposhereonly = \zfltposhere
+ \if \orp{\zfltposalone}
+ {\orp{\zfltposbottom}{\orp{\zfltposseparate}{\zfltpostop}}}%
+ \global\setflag \zfltposhereonly = \false
+ \fi
+ \if \zfltposhereonly \global\setflag \zfltposhere = \false \fi}}
+
+\def \zclearfltpagepos {%
+ \global\setflag \zfltposalone = \false
+ \global\setflag \zfltposbottom = \false
+ \global\setflag \zfltposbroadside = \false
+ \global\setflag \zfltposeven = \false
+ \global\setflag \zfltposfollow = \false
+ \global\setflag \zfltposhere = \false
+ \global\setflag \zfltposodd = \false
+ \global\setflag \zfltposseparate = \false
+ \global\setflag \zfltpostop = \false
+ \global\setflag \zfltpostopafterbot = \false}
+
+\def \zsetupfltpageopts {%
+ \def \alone {\global\setflag\zfltposalone=\true}%
+ \def \anypage {\global\setflag\zfltposeven=\false
+ \global\setflag\zfltposodd=\false}%
+ \let \any = \anypage
+ \def \bottom {\global\setflag\zfltposbottom=\true}%
+ \def \broadside {\global\setflag\zfltposbroadside=\true}%
+ \def \evenpage {\global\setflag\zfltposeven=\true}%
+ \def \follow {\global\setflag\zfltposfollow=\true}%
+ \def \here {\global\setflag\zfltposhere=\true}%
+ \def \nofollow {\global\setflag\zfltposfollow=\false}%
+ \def \oddpage {\global\setflag\zfltposodd=\true}%
+ \def \separate {\global\setflag\zfltposseparate=\true}%
+ \def \top {\global\setflag\zfltpostop=\true}%
+ \def \topafterbottom {\global\setflag\zfltpostopafterbot=\true}}
+
+\def \zcalcfltparams {%
+ \floatshift = 0pt\relax
+ % Set \floatshift
+ \ifcase \zfltposshift
+ \relax
+ \or
+ \floatshift = \if \evenp{\floatpage}-\evenlefttextmargin
+ \else -\oddlefttextmargin \fi \relax
+ \or
+ \floatshift = \textmeasure
+ \else
+ \zzerror{Invalid value for float `\string\zfltposshift'}%
+ \fi
+ \advance \floatshift by \leftindent
+
+ % Set \floatwidth. Default of \naturalwidth is handled differently
+ % for broadsides than for non-broadsides. If \width not default, use
+ % it without modification.
+
+ \if \dimeqlp{\width}{\naturalwidth}%
+ \if \zfltposbroadside
+ \floatwidth = \textareaheight \relax
+ \else
+ \floatwidth = \textmeasure \relax
+ \ifcase \zfltposshift
+ \relax
+ \or
+ \advance \floatwidth by -\floatshift
+ \or
+ \floatwidth = \if \evenp{\floatpage}\evenrighttextmargin
+ \else \oddrighttextmargin \fi \relax
+ \else
+ \zzerror{Invalid value for float `\string\zfltposshift'}%
+ \fi
+ \fi
+ \else
+ \floatwidth = \width \relax
+ \fi}
+
+
+% This macro sets up variables that specify the position of a caption,
+% according to the \position design parameter:
+%
+% \above Caption is placed above the figure.
+% \below Caption is placed below the figure.
+% \follow Caption follows left edge of float.
+% \ifevenpage Use next position only on even page.
+% \ifoddpage Use next position only on odd page.
+% \leftmargin Force caption in left margin.
+% \margin Same as \leftmargin
+% \outsidemargin Shift caption to outside margin.
+% \rightmargin Force caption in right margin.
+% \rise Caption rises up from bottom of figure.
+% \separate Caption is separate from figure.
+% \sink Caption sinks down from top of figure.
+% \textarea Force caption at left edge of text area.
+% \text (synonym for \textarea)
+% \textarearight Force caption at right edge of text area.
+% \textright (synonym for \textarearight)
+
+
+\definecount{\zcapposshift}{0}
+\definecount{\zcapposvflow}{0}
+
+\def \zparsecappos #1{% {options...}
+ {\global\setflag \zcapposabove = \true
+ \global\zcapposvflow = 0\relax
+ \global\zcapposshift = 0\relax
+ \def \above {\global\setflag\zcapposabove=\true}%
+ \def \below {\global\setflag\zcapposabove=\false}%
+ \def \follow {\global\zcapposshift=4\relax}%
+ \def \ifevenpage ##1{\if \evenp{\floatpage}##1\fi}%
+ \def \ifoddpage ##1{\if \oddp{\floatpage}##1\fi}%
+ \def \leftmargin {\global\zcapposshift=1\relax}%
+ \let \margin = \leftmargin
+ \def \outsidemargin {\ifevenpage{\leftmargin}\ifoddpage{\rightmargin}}%
+ \def \rightmargin {\global\zcapposshift=2\relax}%
+ \def \rise {\global\zcapposvflow=1\relax}%
+ \def \separate {\global\zcapposvflow=0\relax}%
+ \def \sink {\global\zcapposvflow=2\relax}%
+ \def \textarea {\global\zcapposshift=0\relax}%
+ \let \text = \textarea
+ \def \textarearight {\global\zcapposshift=3\relax}%
+ \let \textright = \textarearight
+ #1}}
+
+\def \zcalccapitems {%
+ \ifcase \zcapposshift
+ \zcapshift = 0pt
+ \or
+ \zcapshift = \if \evenp{\floatpage}-\evenlefttextmargin
+ \else -\oddlefttextmargin \fi \relax
+ \or
+ \zcapshift = \textmeasure
+ \or
+ \zcapshift = \textmeasure
+ \advance \zcapshift by -\wd\zcapbox
+ \or
+ \zcapshift = \floatshift
+ \else
+ \zzerror{Invalid value for caption `\string\zcapposshift'}%
+ \fi
+ \advance \zcapshift by -\floatshift
+ % Captions in broadsides *always* follow, i.e. \zcapshift is 0pt
+ \if \zfltposbroadside
+ \zcapshift = 0pt\relax
+ \fi
+ \ifcase \zcapposvflow
+ \relax
+ \or
+ \forcenextbbskip
+ \aboveskip = -\dp\zcapbox
+ \advance \aboveskip by \zfloatdp
+ \advance \aboveskip by \captionfudge
+ \or
+ \advance \belowskip by -\dp\zcapbox
+ \advance \belowskip by -\captionfudge
+ \else
+ \zzerror{Invalid value for caption `\string\zcapposvflow'}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzfont.tex b/macros/plain/contrib/zztex/tex/zzfont.tex
new file mode 100644
index 0000000000..f2b15f3775
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzfont.tex
@@ -0,0 +1,453 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Font Facilities
+%
+% Synopsis: This module contains all the macros necessary to define type
+% sizes, styles, and fonts.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 28 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Baselines & Struts
+% --------- - ------
+
+
+\zremovePlaindef \strutbox
+\definebox{\strutbox} % Strut for current type size.
+
+\def \strut {%
+ \relax
+ \if \mathmodep
+ \copy \strutbox
+ \else
+ \unhcopy \strutbox
+ \fi}
+
+\def \normalbaselines {%
+ \baselineskip = \the\baselinemultiplier\normalbaselineskip
+ \lineskiplimit = \normallineskiplimit
+ \lineskip = \normallineskip}
+
+% Type Style & Size Definition
+% ---- ----- - ---- ----------
+
+
+% The following character set encodings are available. Odd numbers
+% indicate italic; numbers > 20 indicate monospaced.
+
+\chardef \encoderoman = 0 % Roman. %^encoding
+\chardef \encodeitalic = 1 % Italic. %^encoding
+\chardef \encodemathitalic = 3 % Math italic. %^encoding
+\chardef \encodemathsymbol = 4 % Math symbols. %^encoding
+\chardef \encodemathextended = 6 % Math extended symbols. %^encoding
+\chardef \encodematharrow = 8 % Math arrows. %^encoding
+\chardef \encodeother = 10 % Generic. %^encoding
+\chardef \encodemono = 22 % Monospaced. %^encoding
+\chardef \encodemonoitalic = 23 % Monospaced italic. %^encoding
+
+\setlist \zfsizelist = {}
+\setlist \zfstylelist = {}
+
+
+\def \definetypestyle #1#2{% {\name}{\encoding}
+ \append{#1}{\zfstylelist}%
+ \zfwithfam{\zdeffam}{#1}%
+ \zfwithmat{\def}{#1}{\zfl}{}%
+ \zfwithmat{\xdef}{#1}{\zen}{#2}}
+
+\def \definetypesize #1#2{% {\name}{size/baseline}
+ \append{#1}{\zfsizelist}%
+ \zdefsize #1#2/%
+ \zdefstrut #1#2/%
+ \zfbldsize{#1}}
+
+\def \zdefsize #1#2/#3/{% \name size/baseline/
+ \zfwithmat{\xdef}{#1}{\zsz}{#2pt}}
+
+\def \zdefstrut #1#2/#3/{% \name size/baseline/
+ {\calculate \tdimena = {#3pt,P,70}%
+ \tdimenb = #3pt\relax
+ \advance \tdimenb by -\tdimena
+ \zfwithmat{\xdef}{#1}{\zst}{height \the\tdimena\space depth \the\tdimenb}}}
+
+
+% A few useful predicates.
+
+\def \typestylep #1{% {\style}
+ \xtokeqlp{\the\typestyle}{#1}}
+
+\def \italicencodingp {%
+ \oddp{\typeencoding}}
+
+\def \monoencodingp {%
+ \gtrp{\typeencoding}{20}}
+
+% Commands to set font parameters.
+
+\def \setstylefontparam #1#2#3{% {\style}{param}{value}
+ \zfwithmat\maplistlf {#1}{\zfl}{%
+ \zfsetfp{##1}{#2}{#3}}}
+
+\def \setstylehyphenchar #1#2{% {\style}{number}
+ \setstylefontparam{#1}{-2}{#2}}
+
+\def \setstyleskewchar #1#2{% {\style}{number}
+ \setstylefontparam{#1}{-1}{#2}}
+
+\def \zfsetfp #1#2#3{% {font}{param}{value}
+ \if \eqlp{#2}{-2}%
+ \hyphenchar #1=#3\relax
+ \else\if \eqlp{#2}{-1}%
+ \skewchar #1=#3\relax
+ \else
+ \fontdimen#2#1=#3\relax
+ \fi\fi}
+
+% Style Relations
+% ----- ---------
+
+
+\def \definestylerelation #1#2#3{% {\style}{\relation}{\style}
+ \zfwithmat{\gdef}{#1}{#2}{#3}%
+ \gdef #2{\bgroup \zfrelstyle{#2}%
+ \if \italicencodingp \aftergroup \/\fi
+ \let \znext}}
+
+\def \zfrelstyle #1{% {\relation}
+ \if \mathmodep
+ \ztoksa = \expandaftertwice{\zfmat\math#1}%
+ \expandafter\ifx \the\ztoksa\relax
+ \zfnorelstyle{math}{#1}%
+ \fi
+ \else
+ \ztoksa = \expandafterthrice{\expandafter\zfmat\the\typestyle#1}%
+ \expandafter\ifx \the\ztoksa\relax
+ \zfnorelstyle{\the\typestyle}{#1}%
+ \fi
+ \fi
+ \the\ztoksa}
+
+\def \zfnorelstyle #1#2{%
+ \error{norelstyle}
+ {The current `#1' style has no related style for `\string#2'}}
+
+% Font Definition
+% ---- ----------
+
+
+\setlist \ztfmlist = {}%
+
+
+\def \definefont #1#2{% {\name}{tfm at size}
+ \global\font #1 = #2\relax
+ \zregistertfm #2\zmark
+ \if \zcommonencoding
+ \if \andp{\dimposp{\fontdimen7#1}}{\dimlssp{\fontdimen7#1}{.1pt}}%
+ \fontdimen7#1 = \fontdimen2#1\relax % Unlock it.
+ \else\if \dimeqlp{\fontdimen7#1}{\fontdimen2#1}
+ \relax % Already unlocked.
+ \else
+ \error{lockedfont}{The TFM for font `#2' is locked}%
+ \fi\fi
+ \fi}
+
+\def \zregistertfm #1 #2\zmark{% tfm at size\zmark
+ \member{\ztfmreg}{#1}{\ztfmlist}%
+ \if \notp{\ztfmreg}\append{#1}{\ztfmlist}\fi}
+
+\def \fontinterwordspacing #1#2{% {font}{factor}
+ \fontdimen2#1= #2\fontdimen2#1%
+ \fontdimen3#1= #2\fontdimen3#1%
+ \fontdimen4#1= #2\fontdimen4#1%
+ \fontdimen7#1= #2\fontdimen7#1}
+
+% Font Selection
+% ---- ---------
+
+
+\definetoks{\typesizename} % Current type size name.
+\definedimen{\typesize}{0pt} % Current type size in points.
+\definetoks{\typestyle} % Current type style.
+\definecount{\typeencoding}{0} % Current type encoding.
+
+
+% Equal signs and by's have been omitted for the sake of efficiency.
+
+\def \setfont #1#2#3{% {\size}{\style}{\font}
+ \setfontmath{#1}{#2}{#3}{\nullfont}{\nullfont}}
+
+\def \setfontmath #1#2#3#4#5{% {\size}{\style}{\text}{\script}{\scriptscript}
+ \edef \zfam {\zffam{#2}}%
+ \zfwithmat{\xdef}{#1}{#2}{%
+ \textfont \zfam #3%
+ \scriptfont \zfam #4%
+ \scriptscriptfont \zfam #5%
+ \def \noexpand#2{%
+ \typestyle {\noexpand#2}%
+ \typeencoding \zfmat{#2}{\zen}%
+ #3%
+ \fam \zfam}}%
+ \zfbldsize{#1}%
+ \zfaddfont{#2}{#3}%
+ \zfaddfont{#2}{#4}%
+ \zfaddfont{#2}{#5}}
+
+\def \zfbldsize #1{% {\size}
+ {\gdef #1{}
+ \maplist{\zfaddstyle{#1}{##1}}{\zfstylelist}%
+ \ztoksa \expandafter{#1}%
+ \xdef #1{%
+ \typesizename {\noexpand#1}%
+ \typesize \zfmat{#1}{\zsz}%
+ \the\ztoksa
+ \setbox\strutbox \hbox{\vrule \zfmat{#1}{\zst} width 0pt}%
+ \normalbaselineskip \ht\strutbox
+ \advance \normalbaselineskip \dp\strutbox
+ \noexpand\normalbaselines
+ \typestyle {none}\nullfont \fam -1\relax}}}
+
+\def \zfaddstyle #1#2{% {\size}{\style}
+ \ztoksa \expandafter{#1}%
+ \ztoksb \expandaftertwice{\zfmat{#1}{#2}}%
+ \expandafter\ifx \the\ztoksb\relax
+ \xdef #1{\the\ztoksa
+ \noexpand\zclearfam{\zffam{#2}}%
+ \def \noexpand#2{\noexpand\zfundef{\noexpand#1}{\noexpand#2}}}%
+ \else
+ \xdef #1{\the\ztoksa \the\ztoksb}%
+ \fi}
+
+\def \zfaddfont #1#2{% {\style}{font}
+ \zfwithmat{\appendlf}{#1}{\zfl}{#2}}
+
+
+% This macro clears out a family so TeX can't set math in it.
+
+\def \zclearfam #1{% {family}
+ \textfont #1 \nullfont
+ \scriptfont #1 \nullfont
+ \scriptscriptfont #1 \nullfont}
+
+% This macro is called if the user selects a type style that has no font
+% in the current size.
+
+\def \zfundef #1#2{% {\size}{\style}
+ \error{nofontset}
+ {No font has been set for size `\string#1' style `\string#2'}}
+
+% Miscellaneous
+% -------------
+
+
+% The following definition allows the user to write:
+% \withfont{\bf Hi there}
+
+\let \withfont = \relax
+
+% This macro helps with defining math fonts.
+
+\def \definemathfonts #1#2#3#4#5#6{% {prefix}{rm-font}{mit}{msy}{mex}{size}
+ \edef \znext {%
+ \noexpand\definefont{\name{#1rm}}{#2 at #6}%
+ \noexpand\definefont{\name{#1mit}}{#3 at #6}%
+ \noexpand\definefont{\name{#1msy}}{#4 at #6}%
+ \noexpand\definefont{\name{#1mex}}{#5 at #6}}%
+ \znext}
+
+% This macro helps with setting math fonts.
+
+\def \setmathfonts #1#2#3#4{% {\size}{\text}{\script}{\scriptscript}
+ \edef \znext {%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\rm}%
+ {\name{#2rm}}{\name{#3rm}}{\name{#4rm}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\mit}%
+ {\name{#2mit}}{\name{#3mit}}{\name{#4mit}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\msy}%
+ {\name{#2msy}}{\name{#3msy}}{\name{#4msy}}%
+ \noexpand\setfontmath{\noexpand#1}{\noexpand\mex}%
+ {\name{#2mex}}{\name{#2mex}}{\name{#2mex}}}%
+ \znext}
+
+% Measuring Things
+% --------- ------
+
+
+\definebox{\zmeasbox}
+
+
+\def \measureascenderheight #1{% {\dimen}
+ \zsetmeasbox{bdfhijklt}%
+ #1 = \ht\zmeasbox}
+
+\def \measurecapheight #1{% {\dimen}
+ \zsetmeasbox{ABCDEFGHIJKLMNOPQRSTUVWXYZ}%
+ #1 = \ht\zmeasbox}
+
+\def \measuredescenderdepth #1{% {\dimen}
+ \zsetmeasbox{gjpqy}%
+ #1 = \dp\zmeasbox}
+
+\def \measuredigitheight #1{% {\dimen}
+ \zsetmeasbox{0123456789}%
+ #1 = \ht\zmeasbox}
+
+\def \measuredigitwidth #1{% {\dimen}
+ \zsetmeasbox{0}%
+ #1 = \wd\zmeasbox}
+
+\def \measureemwidth #1{% {\dimen}
+ #1 = 1em}
+
+\def \measurespacewidth #1{% {\dimen}
+ #1 = \fontdimen2\font}
+
+\def \measurexheight #1{% {\dimen}
+ #1 = 1ex}
+
+\def \measuretextwidth #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \wd\zmeasbox}
+
+\def \measuretextheight #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \ht\zmeasbox}
+
+\def \measuretextdepth #1#2{% {\dimen}{text}
+ \zsetmeasbox{#2}%
+ #1 = \dp\zmeasbox}
+
+\def \zsetmeasbox #1{\setbox\zmeasbox = \hbox{#1}}
+
+\def \definewidthdimen #1#2{% {\dimen}{text}
+ \definedimen{#1}{0pt}%
+ \measuretextwidth{#1}{#2}}
+
+% Utilities
+% ---------
+
+
+\def \zfmat #1#2{% {\size}{\style}
+ \csname zf\expandafter\discardtok \string#1%
+ \expandafter\discardtok \string#2\endcsname}
+
+\def \zfwithmat #1#2#3{% {\command}{\size}{\style}
+ \expandafter#1\csname zf\expandafter\discardtok \string#2%
+ \expandafter\discardtok \string#3\endcsname}
+
+
+\def \zffam #1{% {\style}
+ \csname \expandafter\discardtok \string#1fam\endcsname}
+
+\def \zfwithfam #1#2{% {\command}{\style}
+ \expandafter#1\csname \expandafter\discardtok \string#2fam\endcsname}
+
+% Built-in Styles
+% -------- ------
+
+
+\zremovePlaindef \itfam
+\zremovePlaindef \bffam
+\zremovePlaindef \ttfam
+
+ % Family Name
+\definetypestyle{\rm}{\encoderoman} % 0 RoMan
+\definetypestyle{\mit}{\encodemathitalic} % 1 Math ITalic
+\definetypestyle{\msy}{\encodemathsymbol} % 2 Math SYmbol
+\definetypestyle{\mex}{\encodemathextended} % 3 Math EXtended symbol
+\definetypestyle{\cal}{\encoderoman} % 4 CALigraphic letters
+\definetypestyle{\bbb}{\encoderoman} % 5 BlackBoard Bold
+\definetypestyle{\it}{\encodeitalic} % 6 ITalic
+\definetypestyle{\bf}{\encoderoman} % 7 Bold Face
+\definetypestyle{\bi}{\encodeitalic} % 8 Bold Italic
+\definetypestyle{\tt}{\encodemono} % 9 monospaced (TypewriTer)
+
+% Note: style \math is reserved for math mode.
+
+\definestylerelation{\math}{\bbbold}{\bbb}
+\definestylerelation{\math}{\bold}{\bf}
+\definestylerelation{\rm}{\bold}{\bf}
+\definestylerelation{\it}{\bold}{\bi}
+\definestylerelation{\math}{\callig}{\cal}
+\definestylerelation{\rm}{\callig}{\cal}
+\definestylerelation{\rm}{\emph}{\it}
+\definestylerelation{\it}{\emph}{\rm}
+\definestylerelation{\bf}{\emph}{\bi}
+\definestylerelation{\bi}{\emph}{\bf}
+\definestylerelation{\math}{\fraktur}{\frk}
+\definestylerelation{\tt}{\meta}{\it}
+\definestylerelation{\math}{\roman}{\rm}
+\definestylerelation{\rm}{\roman}{\rm}
+\definestylerelation{\it}{\roman}{\rm}
+\definestylerelation{\bf}{\roman}{\rm}
+\definestylerelation{\tt}{\roman}{\rm}
+\definestylerelation{\rm}{\smallcaps}{\sc}
+
+% We do not define any sizes or fonts. They just take up memory.
+
+% Doodad Font
+% ------ ----
+
+
+\def \zrequiredoodad #1#2{% {\name}{size}
+ \if \undefinedp{\zfdoodad#2}%
+ \withname\definefont {\zfdoodad#2}{zztexorn at #2}%
+ \fi
+ \edef \znext {\let \noexpand#1\name{\zfdoodad#2}}%
+ \znext}
+
+% Font Style Summary
+% ---- ----- -------
+
+
+{\catcode`\_ = \catactive
+
+\gdef \zfontsummary #1{% {font-list?}
+ {\def _{\space}%
+ \writelog{}%
+ \writelog{Type Styles:}%
+ \writelog{}%
+ \writelog{Name_____Math Family}%
+ \writelog{----_____-----------}%
+ \maplist{\zfsone{##1}}{\zfstylelist}%
+ \if #1%
+ \writelog{}%
+ \maplist{\writelog{ZzTeX: Font used: ##1}}{\ztfmlist}%
+ \fi
+ \writelog{}}}
+
+\gdef \zfsone #1{%
+ \tcounta = \name{#1fam}%
+ \writelog{\string #1______%
+ \if \lssp{\tcounta}{10}%
+ _\number\tcounta
+ \else\if \lssp{\tcounta}{15}%
+ \number\tcounta
+ \else
+ ---%
+ \fi\fi}}
+
+}% \catcode
+
+% TFM List File
+% --- ---- ----
+
+
+\definewrite{\ztfmlistfile}
+
+
+\def \zopentfmlist {%
+ \if \zcommonencoding
+ \immediate\openout \ztfmlistfile = tfmlist.zzz\relax
+ \immediate\write \ztfmlistfile {\jobname}%
+ \fi}
+
+\def \zwritetfmlist {%
+ \if \zcommonencoding
+ \maplist{\immediate\write \ztfmlistfile {##1}}{\ztfmlist}%
+ \immediate\closeout \ztfmlistfile
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzfront.tex b/macros/plain/contrib/zztex/tex/zzfront.tex
new file mode 100644
index 0000000000..f0f281a9fc
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzfront.tex
@@ -0,0 +1,247 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Front Matter Facilities
+%
+% Synopsis: This file provides facilities for typesetting the front
+% matter of a book.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Copyright Page
+% --------- ----
+
+
+\def \copyrightline #1#2{% {year}{publisher}
+ \noindent Copyright \copyright\ #1 by #2\par}
+
+\def \concisecopyrightline #1#2{% {year}{publisher}
+ \noindent \copyright\ #1 by #2\par}
+
+\def \superconcisecopyrightline #1#2{% {year}{publisher}
+ \noindent \copyright\ #1 #2\par}
+
+\def \copyrightnotice {%
+ All rights reserved. No part of this publication may be reproduced,
+ stored in a retrieval system, or transmitted, in any form or by any
+ means, electronic, mechanical, photocopying, recording, or otherwise,
+ without the prior written permission of the publisher.}
+
+
+% We provide a standard text design for the Library of Congress
+% Cataloging-in-Publication data.
+
+\def \textcipdataidesign {%
+ \aboveskip = \noskip
+ \belowskip = \noskip
+ \bodyfont = {}%
+ \setflag \enabletabbing = \false
+ \leftindent = 0pt
+ \parindent = \enclosingparindent
+ \parrag = \enclosingparrag
+ \parskip = 0pt
+ \rightindent = 0pt
+ \setflag \verbatimlines = \true
+ \width = \naturalwidth}
+
+\def \textcipdataiidesign {%
+ \textcipdataidesign}
+
+% Table of Contents Entries
+% ----- -- -------- -------
+
+
+% This macro is used to write a ToC entry in the cross-reference file.
+
+\def \ztocentry #1#2#3#4{% {number}{title}{level}{allow?}
+ {\ztoksa = {#2}%
+ \tcounta = #3\relax
+ \edef \znext {\noexpand\xref{toc}{\noexpand\folio}{#1}{\the\ztoksa}
+ {\the\divisionname,\the\tcounta,%
+ \the\difficulty,\if #41\else 0\fi}}%
+ \znext}}
+
+% This is the public command for writing ToC entries.
+
+\def \tocentry #1#2#3{% {number}{title}{level}
+ \ztocentry{#1}{#2}{#3}{\true}}
+
+% This macro allows the compositor to adjust pages in the ToC.
+
+\setlist \ztocadjlist = {}
+
+\long\def \tocadjustment #1#2#3{% {toc-type}{number}{commands}
+ \append{{#1}{#2}{#3}}{\ztocadjlist}}
+
+% Table of Contents Block
+% ----- -- -------- -----
+
+
+\defineblock{\toc}{\endtoc}{\false}{}
+
+%~block toc Type
+% \abovepenalty = integer % Penalty above text.
+% \aboveskip = glue % Space b/b above text.
+% \belowpenalty = integer % Penalty below text.
+% \belowskip = glue % Space b/b below text.
+% \bodyfont = {\size\style} % Default font for body.
+% \divisions = {...} % List of divisions to include.
+% \foliofont = {\size\style} % Default font for folio.
+% \leftindent = glue % Left indentation.
+% \levels = {...} % List of levels to include.
+% \setflag \minitoc = boolean % Is this a miniToC?
+% \parindent = dimen % Paragraph indentation.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \rightindent = glue % Right indentation.
+% \tocwidtha = dimen % General width a.
+% \tocwidthb = dimen % General width b.
+% \tocwidthc = dimen % General width c.
+% \width = dimen % Line width
+% \xreffile = {...} % Name of composite xref file to use.
+%~end
+
+\definetoks{\foliofont}
+\definetoks{\levels}
+\definedimen{\tocwidtha}{0pt}
+\definedimen{\tocwidthb}{0pt}
+\definedimen{\tocwidthc}{0pt}
+\definetoks{\xreffile}
+
+\definecount{\prevtocprimarylevel}{-1} % Previous level >= 70.
+
+
+\def \toc #1{% {type}
+ \beginblockscope{toc}%
+ \def \ztoctype {#1}%
+ \global\increment \tocdepth
+ \abovepenalty = \breaknever %~default hard
+ \belowpenalty = \breakbest %~default hard
+ \bodyfont = {}% %~default soft
+ \divisions = {\all}% %~default soft
+ \setflag \minitoc = \false %~default soft
+ \tocwidtha = 0pt %~default soft
+ \tocwidthb = 0pt %~default soft
+ \tocwidthc = 0pt %~default soft
+ \xreffile = {}% %~default hard
+ \processdesign{\toc}{#1}%
+ \global\increment \tocnumber
+ \commalist{\zlevlist}{\the\levels}%
+ \the\bodyfont
+ \tocformat
+ \endtoc}
+
+\def \endtoc {%
+ \endgraf
+ \endtocformat
+ \global\decrement \tocdepth
+ \endblockscope{toc}}
+
+\def \tocformat {%
+ \endgraf
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{\parrag}%
+ \zadjtitle = \if \minitoc \zadjtitleminitoc \else \zadjtitletoc \fi
+ % \adjusttitle should adjust appropriate ToC.
+ \def \zadjloc {\toc}%
+ \if \emptytoksp{\xreffile}%
+ \zxloadcomp{\xrefloadtocmode}%
+ \else
+ \zxloadothercomp{\the\xreffile}{\xrefloadtocmode}%
+ \fi}
+
+\def \endtocformat {%
+ \fakepar % In case the ToC is empty.
+ \setlist \ztocadjlist = {}%
+ \bbskipbelowblock{\belowpenalty}{\belowskip}}
+
+
+% The following macro is called for each entry in the cross-reference file.
+% Each entry must NOT be in a group.
+
+\def \xreftoc #1#2#3#4{%
+ \ifnum \xrefmode=\xrefloadtocmode
+ \xreftocb{#1}{#2}{#3}{#4}%
+ \fi}
+
+\definecount{\ztoclevel}{0}
+
+\def \xreftocb #1#2#3#4{% {page}{number}{title}
+ % {division,level,difficulty,allow}
+ \def \znext ##1,##2,##3,##4,##5\zmark{%
+ \ztoksa={##1}\ztoclevel=##2\difficulty=##3\tcounta=##4\relax}%
+ \znext #4,1,\zmark%
+ \if \posp{\tcounta}%
+ \edef \znext {\noexpand\inclusionlist\noexpand\ztoctest
+ {\the\ztoksa}{\the\divisions}}%
+ \znext
+ \if \ztoctest
+ \ztesttoclev{\ztoclevel}%
+ \if \ztoctest
+ \zchktocadj{#2}{#3}%
+ \the\bodyfont
+ \name{\toc\ztoctype\romannumeral\ztoclevel format}{#1}{#2}{#3}%
+ \if \gtrp{\ztoclevel}{69}%
+ \prevtocprimarylevel = \ztoclevel % Save ToC level.
+ \global\authortext = {}% % Clear author text.
+ \fi
+ \fi
+ \fi
+ \fi}
+
+\def \ztesttoclev #1{% {level}
+ \setflag \ztoctest = \false
+ \maplist{\ztesttoca{#1}##1-\zmark}{\zlevlist}}
+
+\def \ztesttoca #1#2-#3\zmark{% {n}low-high\zmark
+ \if \emptyargp{#3}%
+ \setflag \ztoctest = {\eqlp{#1}{#2}}%
+ \else
+ \ztesttocb{#1}{#2}#3%
+ \fi
+ \if \ztoctest \exitmaplist \fi}
+
+\def \ztesttocb #1#2#3-{% {n}{low}high-
+ \setflag \ztoctest = {\andp{\notp{\lssp{#1}{#2}}}
+ {\notp{\gtrp{#1}{#3}}}}}
+
+\long\def \zchktocadj #1#2{% {number}{title}
+ \maplist{\zchktocadjb##1{#1}{#2}}{\ztocadjlist}}
+
+\long\def \zchktocadjb #1#2#3#4#5{% {type}{number}{commands}{number}{title}
+ {\stringeql{\znext}{#1}{\ztoctype}%
+ \if \znext
+ \stringeql{\znext}{#2}{#4}%
+ \if \znext
+ #3\relax
+ \else
+ \def \tempa {#2}% % Don't expand titles.
+ \def \tempb {#5}%
+ \if \tokeqlp{\tempa}{\tempb}%
+ #3\relax
+ \fi
+ \fi
+ \fi}}
+
+\def \bbskipabovetochead #1#2#3#4#5{% {level}{penalty}{skip}{penalty}{skip}
+ \if \eqlp{\prevtocprimarylevel}{#1}%
+ \bbskipabove{#2}{#3}%
+ \else
+ \bbskipabove{#4}{#5}%
+ \fi}
+
+\definetoks{\zdelaytoc}
+
+\def \delaytocformatter #1{%
+ \global\zdelaytoc = \expandafter{\the\zdelaytoc #1}}
+
+\def \dodelayedtocformatter {%
+ \the\zdelaytoc
+ \global\zdelaytoc = {}}
diff --git a/macros/plain/contrib/zztex/tex/zzhelp.tex b/macros/plain/contrib/zztex/tex/zzhelp.tex
new file mode 100644
index 0000000000..6d947fbf6b
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzhelp.tex
@@ -0,0 +1,359 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Help Text
+%
+% Synopsis: This file contains the help text for each error and
+% warning signaled by ZzTeX.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 3 July 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+\long\def \definehelp #1#2{% {help-id}{text}
+ \withname\gdef{\=zH:#1}{#2}}
+
+
+\definehelp{adjheads}{
+ You must eliminate the inter-row space between two adjacent rows_
+ of column heads. This is done with the \closeuprows command.}
+
+\definehelp{altinv}{
+ The design alternative named above was specified with an_
+ invalid value in a \designalternative command.}
+
+\definehelp{altreq}{
+ The design alternative named above must be specifed with a_
+ \designalternative command preceding the \loaddesign in_
+ your root file. There is no default.}
+
+\definehelp{artpos}{
+ The \art command is in the wrong position relative to the_
+ \caption command.}
+
+\definehelp{blkcantnest}{
+ The file contains an occurence of the first block mentioned above_
+ nested inside the second block. This is not allowed.}
+
+\definehelp{blkinvnest}{
+ A command to end a block is not properly associated with the command_
+ to begin the block. For example, an \endtext is matched with a \list._
+ All blocks must be properly nested.}
+
+\definehelp{blkmustend}{
+ The file contains an occurence of the block ending command_
+ mentioned first, but it is not preceded by the block starting_
+ command mentioned second. Each block must have a starting command.}
+
+\definehelp{blkmustnest}{
+ The file contains an occurence of the first block mentioned above,_
+ but it is not nested inside the second block. The first block_
+ must be nested in the second.}
+
+\definehelp{cananchor}{
+ The object anchor specified mentioned above is invalid._
+ Valid anchors are 'a' -- 'h'.}
+
+\definehelp{celldecpt}{
+ The picutre for this decimal-aligned cell did not include a decimal_
+ point, but the number to be typeset does. You must include a_
+ decimal point in the template or remove it from the number.}
+
+\definehelp{citelet}{
+ It appears that you have used \let to define a \citexxx command_
+ in the design file. This done not work; use \def instead.}
+
+\definehelp{desjunk}{
+ The design file named above contains some paragraph (horizontal mode)_
+ text that should not be there.__
+ You probably left a percent sign off a comment.}
+
+\definehelp{divnotexist}{
+ The division specified in the message is not included with a_
+ \division command in the root file.}
+
+\definehelp{dupart}{
+ The art file named above is used more than once in the book.__
+ If a figure really is used more than once, you must copy it with
+ another name and change one of the \art commands.}
+
+\definehelp{dupreg}{
+ The register named above has already been defined with another_
+ \definexxx command.}
+
+\definehelp{divortah}{
+ The \overridetextareaheight command has been used to override the_
+ text area height, but the override crosses from one division to the next.__
+ If you continue from the warning, the override will be cancelled.}
+
+\definehelp{empshape}{
+ The \shapepar command must be specified with at least one pair of_
+ indent/width arguments. You have specified one with no arguments.}
+
+\definehelp{hereonlybot}{
+ ZzTeX cannot position the float `here' because there is already_
+ a float positioned at the bottom of the page. Floats must be_
+ positioned in order.}
+
+\definehelp{invindexlvl}{
+ The level specified in an indexing command must be 1, 2, or 3.}
+
+\definehelp{invoper}{
+ The operator shown above is not valid in the expression argument_
+ of the \calculate command.}
+
+\definehelp{invsubpart}{
+ The subpart argument to \markinfo(upcased) must be 1 or 2._
+ You have specified the invalid subpart number shown above.}
+
+\definehelp{locattr}{
+ The attributes of the index locator are not valid. You must specify_
+ at least one of \page or \text.}
+
+\definehelp{missbb}{
+ The specified art file does not have a bounding box comment, so_
+ ZzTeX cannot determine the size of the art.}
+
+\definehelp{misset}{
+ A tabular column template must begin with \set, so that the column
+ type will be correctly interpreted.}
+
+\definehelp{misstah}{
+ The value of \textareaheight must be established by the document_
+ design macro before \calculatetypeareaheight can be used.__
+ You can set it directly or calculate it with \calculatetextareaheight.}
+
+\definehelp{misstopskip}{
+ The value of \topskip must be established by the document design_
+ macro before \calculatetextareaheight can be used.}
+
+\definehelp{misstrim}{
+ The values of \trimwidth and \trimheight must be established by the_
+ document design macro before \calculateoffsets can be used}
+
+\definehelp{needheads}{
+ The \tabheadrule and \skipbelowcolhead commands require that the_
+ previous row is a row of heads.}
+
+\definehelp{negtabvsp}{
+ A negative \tabvspace will not work; it produces no spacing at all._
+ You must use \tabcloseup.}
+
+\definehelp{noartfile}{
+ You have requested the art file named above for an \art block,_
+ but the file does not exist.__
+ If you continue from this warning, the art space will be framed_
+ with corner marks and contain the name of the missing file.}
+
+\definehelp{nobblfile}{
+ You have requested a bibliography list with the \biblio command,_
+ but there is no bibliography item file.__
+ If you continue from this warning, the bibliography list will not_
+ be typeset. You must first run BibTeX to produce the item file.}
+
+\definehelp{nodesfile}{
+ The design file named above is required for this book, but it_
+ does not exist.__
+ You may have misspelled the name of the design file in the_
+ \loaddesign command. If not, the design file must be created.}
+
+\definehelp{nodesign}{
+ The file contains a use of the block named above, but the_
+ book's design file does not contain a design macro_
+ for the block.__
+ It's possible you have misspelled the name of the block_
+ or its type (if any). If not, a design macro must be_
+ added to the design file.}
+
+\definehelp{nodivs}{
+ The \setdivisions command must specify one or more divisions to set.}
+
+\definehelp{noend}{
+ Do not use the \end command in ZzTeX. The root file is terminated_
+ with the \enddocument command.__
+ If you are trying to end a block, such as a \list block, you must_
+ use the corresponding ending command, such as \endlist.}
+
+\definehelp{nofloatpos}{
+ The \position parameter for a float does not specify any_
+ page positions for the float. The page positions are \alone,_
+ \bottom, \here, \separate, and \top. Without a page_
+ position, the float cannot be placed on the page.__
+ This error could be due to a missing position in the design file._
+ Or, you may have specified the \position parameter in a \with_
+ command on the float block and forgotten to include any of the_
+ page positions.__
+ If you continue, the float will be placed alone on a page. This_
+ message may appear again for the same float.}
+
+\definehelp{nofontset}{
+ The file has requested a font of the size and style mentioned above._
+ No font has been set for this size/style in the book's design file.__
+ You may have misspelled the name of the size or style. If not,_
+ the appropriate font must be established in the design file.}
+
+\definehelp{noheadfoot}{
+ The design file does not contain a definition for the header_
+ or footer format specified in the message. These definitions_
+ must be included in the design file.}
+
+\definehelp{noinclfile}{
+ The file mentioned above has been requested with an \include or_
+ \division command, but it does not exist.__
+ You may have misspelled the name of the file. If not, you must_
+ create it before processing the book again.__
+ If you continue from this error, ZzTeX will prompt you for another_
+ file name.}
+
+\definehelp{nomarks}{
+ The \markinfo command is being used to format a running head_
+ or foot, but no mark information has been provided for the_
+ current page.__
+ This only happens at the beginning of a book, before the first_
+ chapter or quasichapter. You may have set running heads and_
+ feet with \setrunners before the first chapter or quasichapter.}
+
+\definehelp{nomnpos}{
+ The \position parameter for a margin note does not specify any_
+ horizontal position for the float. The positions are \leftmargin,_
+ \rightmargin, and \outsidemargin.}
+
+\definehelp{noreftitle}{
+ The use of the \reftitle command has been disabled in the_
+ design file with the \allowreftitle document parameter.__
+ If you did not intend to use the \reftitle command, you must_
+ remove it from the file. If you need to use it, then modify_
+ the design file appropriately.}
+
+\definehelp{noregsleft}{
+ All of the available registers of the type specified in the_
+ message have been allocated for use, but a request for another_
+ such register has been made.}
+
+\definehelp{norelstyle}{
+ You have requested a type style related to the current style,_
+ but no such relation has been established. For example, the_
+ current style is \tt and you want to emphasize text with the_
+ \emph command, but no style for emphasizing monospaced text_
+ has been established.__
+ Use the \definestylerelation command to establish the appropriate_
+ relationship.}
+
+\definehelp{notaginfo}{
+ A \tag command has been specified in the current block, but_
+ the composite number and title has not been established yet.}
+
+\definehelp{notindexing}{
+ ZzTeX has encountered an indexing command (e.g., \xpage), but_
+ you have not included a \produceindex command in the root file._
+ At least one \produceindex command is required if the files contain_
+ indexing commands.__
+ If you continue from the warning, the index entries will be written_
+ to the log file.}
+
+\definehelp{notps}{
+ The feature show above is only available when you are producing_
+ PostScript output. It requires PostScript capabilities.}
+
+\definehelp{nowith}{
+ The \with modifier is not allowed on the command specified in the_
+ message. You must remove the \with modifier.__
+ If you continue from this warning, the \with will be ignored._
+ If you used \with on an \item command, use it on the \list_
+ command instead (it will apply to the entire list).}
+
+\definehelp{obsolete}{
+ The command named above is obsolete in this version of ZzTeX.}
+
+\definehelp{openblock}{
+ One or more blocks are in progress at the end of a chapter,_
+ appendix, or quasichapter. The names of the blocks are listed_
+ in messages preceding this warning.__
+ The problem is caused by missing \endxxx commands. For example,_
+ you have coded a list but forgotten the \endlist command. You_
+ will probably see the message `(\end occurred inside a group at_
+ level 1)' at the end of the log.}
+
+\definehelp{overortah}{
+ The \overridetextareaheight command has been used to override the_
+ text area height, but a previous override is still in progress.__
+ If you continue from the warning, the first command will be cancelled_
+ and the second one will take effect. However, the height of the current_
+ page may be incorrect.}
+
+\definehelp{pagepar}{
+ A command has been used to request a page break in the middle of_
+ a paragraph.__
+ You must terminate the paragraph before using the command.}
+
+\definehelp{plaintex}{
+ The Plain TeX command shown below cannot be used in ZzTeX.}
+
+\definehelp{scinmath}{
+ You have tried to use a special character that is not available_
+ in math mode.__
+ If you need it, use it in a \text command.}
+
+\definehelp{setminus}{
+ When using the MathTime fonts, it is better to use \setdiff than_
+ \setminus. If you really want to use \setminus, you will need_
+ to define it in the design file.}
+
+\definehelp{spectah}{
+ The design spec's text area height, as specified by \spectextareaheight,_
+ differs from the calculated text area height by more than 3 points._
+ You should contact the designer about this.}
+
+\definehelp{skipab}{
+ A sequence of elements in the book has resulted in a request_
+ for a `skip below an element' followed immediately by a_
+ `skip above an element'. Such a sequence is invalid.__
+ There is probably an error in the design file.}
+
+\definehelp{toomanyflt}{
+ There are more than the specified number of floats pending for_
+ page makeup. A float is pending for makeup when it has been_
+ encountered in a file but not yet placed on a page of the book.__
+ You must reorganize the file so that the floats are more spread_
+ out in the text, this giving ZzTeX an opportunity to place the_
+ floats on pages as soon as they are encountered.}
+
+\definehelp{undefat}{
+ The atsign command sequence specified above has not been defined_
+ in this block. It must be defined before you can use it.__
+ Use the \defineatsigncommand command to define the command.}
+
+\definehelp{undefflt}{
+ The float type specified above has not been defined. It must be_
+ defined before you can use it.__
+ Use the \definefloattype command to define the float.}
+
+\definehelp{unimpl}{
+ The ZzTeX feature mentioned above is not yet implemented.__
+ Please contact Windfall Software if you need the feature.}
+
+\definehelp{lockedfont}{
+ The font specified above is locked, which means it was not correctly_
+ installed with ZzTFM.__
+ Please contact Windfall Software to determine a remedy.}
+
+\definehelp{varmod}{
+ A variant definition must include between 1 and 8 modifier commands.__
+ Modifier commands are specified as a comma-separated list in the third_
+ argument to \definevariant.}
+
+\definehelp{xtran}{
+ An error flag from the XTran H converter is still present in this_
+ file. The flag message is shown in the above error message.__
+ You should fix the error flagged by XTran and remove the flag_
+ message from the source file.}
+
+\definehelp{zztran}{
+ An error flag from the ZzTran converter is still present in this_
+ file. The flag message is shown in the above error message.__
+ You should fix the error flagged by ZzTran and remove the flag_
+ message from the source file.} \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzhmode.tex b/macros/plain/contrib/zztex/tex/zzhmode.tex
new file mode 100644
index 0000000000..8e9553e8ac
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzhmode.tex
@@ -0,0 +1,924 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Horizontal Mode Facilities
+%
+% Synopsis: This module provides various facilities that operate in
+% horizontal mode, within a paragraph. See also ZZHMODEB.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 21 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Starting Paragraphs
+% -------- ----------
+
+
+% The following token register is executed at the beginning of
+% every paragraph.
+
+\definetoks{\everyparagraph}
+\everyparagraph = {}
+
+% This is what we have to do at the beginning of every paragraph:
+
+\everypar = {\requiredeverypar \the\everyparagraph}
+
+% The following command ensures that we are in horizontal mode,
+% without doing anything if we already are.
+
+\def \ensurepar {\unhbox \voidbox}
+
+% The following command fakes up the start of a paragraph while
+% leaving us in vertical mode.
+
+\def \fakepar {%
+ \endgraf
+ \vspace{\parskip}%
+ \requiredeverypar}
+
+% Paragraph Penalties
+% --------- ---------
+
+
+\definecount{\zclubsv}{-100000} % Overridden \clubpenalty.
+\definecount{\zclubct}{1} % Overridden paragraph count.
+
+
+\def \overrideclubpenalty #1{% {penalty}
+ \if \eqlp{\zclubsv}{-100000}\global\zclubsv = \clubpenalty \fi
+ \global\clubpenalty = #1\relax
+ \global\zclubct = \if \vmodep -1\else 0\fi \relax}
+
+\declareeverypar{\zclubpar}
+
+\def \zclubpar {%
+ \ifnum \zclubct=0
+ \global\clubpenalty=\zclubsv
+ \global\zclubsv=-100000\relax
+ \fi
+ \global\advance \zclubct 1\relax}
+
+% Single-Character Commands
+% ---------------- --------
+
+
+% Name Description
+
+% \<space> Control space
+% \! Negative sixth space; negative thin space in math;
+% callout in code
+% \" Dieresis (umlaut) accent
+% \# Pound sign
+% \$ Dollar sign
+% \% Percent sign
+% \& Ampersand
+% \' Acute accent
+% \( (reserved
+% \) for user)
+% \* \discretionary{}{}{}
+% \+ Hair space
+% \, Sixth space; thin space in math
+% \- Discretionary hyphen
+% \. Dot accent
+% \/ Italic correction
+% \0 \phantom{0}
+% \1 -- \9 (reserved for user)
+% \: List element separator
+% \; Third space; thick space in math
+% \< (reserved for user)
+% \= Macron accent; prefix for tag namespace
+% \> (reserved for user)
+% \? (reserved for user)
+% \@ At-sign
+% \H Hungarian umlaut accent
+% \L Polish suppressed L
+% \O Scandinavian O slash
+% \P Paragraph sign (pilcrow)
+% \S Section sign
+% \[ (reserved for user)
+% \\ Backslash
+% \] (reserved for user)
+% \^ Circumflex accent
+% \_ Underscore
+% \` Grave accent
+% \b Bar-under accent
+% \c Cedilla accent
+% \d Dot-under accent
+% \g Ogonek accent
+% \h Small horizontal space
+% \i Dotless i
+% \j Dotless j
+% \l Polish suppressed l
+% \o Scandinavian o slash
+% \r ring accent
+% \t Tie-after accent
+% \u Breve accent
+% \v Hacek accent
+% \x \
+% \y } (reserved for user, for index command abbreviations)
+% \z /
+% \{ Left brace
+% \| Vertical bar; \Vert in math mode
+% \} Right brace
+% \~ Tilde accent
+
+% Characters
+% ----------
+
+
+% These definitions are in alphabetical order.
+
+\def \AA {% %~ Ring A (Angstrom). %^named_char
+ \ensurepar
+ \if \mathmodep
+ \mtext{\AA}%
+ \else
+ \r{A}%
+ \fi}
+
+\def \aa {% %~ Ring a. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \mtext{\aa}%
+ \else
+ \r{a}%
+ \fi}
+
+\chardef \AE = "1D %~ Scandinavian AE.
+
+\chardef \ae = "1A %~ Scandinavian ae.
+
+\chardef \ampersand = `\& %~ Ampersand.
+
+\let \& = \ampersand
+
+\chardef \atsign = `\@ %~ At sign.
+
+\let \@ = \atsign
+
+\def \backslash {% %~ Backslash. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmbackslash
+ \else \if \monoencodingp
+ \char "5C\relax
+ \else
+ \PSbackslash
+ \fi\fi}
+
+\let \\=\backslash
+
+\def \baselinebullet #1{% {size} %~ Bullet set on baseline.
+ \zrequiredoodad{\zdoodadfont}{#1}%
+ \hbox{\zdoodadfont .}}
+
+\def \bullet {% %~ Bullet. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmbullet
+ \else
+ \PSbullet
+ \fi}
+
+\def \cent {% %~ Cent sign. %^named_char
+ \ensurepar
+ \PScent}
+
+\let \cents = \cent
+
+\def \copyright {% %~ Copyright symbol. %^named_char
+ \ensurepar
+ \PScopyright}
+
+\def \cdquote {''} %~ Close double quote. %^named_char
+
+\def \dagger {% %~ Dagger. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmdagger
+ \else
+ \PSdagger
+ \fi}
+
+\def \ddagger {% %~ Double dagger. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmddagger
+ \else
+ \PSddagger
+ \fi}
+
+\def \dollar {% %~ Dollar sign. %^named_char
+ \zprehyph{\dollarhyph}%
+ \if \monoencodingp
+ \char "24\relax
+ \else
+ \PSdollar
+ \fi
+ \zposthyph{\dollarhyph}}
+
+\let \$ = \dollar
+
+\def \ellipsis {% %~ Text ellipsis.
+ \if \mathmodep
+ \ldots
+ \else
+ \unbreakable\thickspace
+ .\unbreakable\thickspace
+ .\unbreakable\thickspace
+ .\thickspace
+ \ignorespaces
+ \fi}
+
+\def \emdash {---} %~ Em dash. %^named_char
+
+\def \endash {--} %~ En dash. %^named_char
+
+\def \greater {% %~ Greater-than sign %^named_char
+ \ensurepar
+ \if \monoencodingp
+ \char "3E\relax
+ \else
+ \PSgreater
+ \fi}
+
+\def \>{% %~ Greater-than sign. %^named_char
+ \relax
+ \if \mathmodep \plainerror \else \greater \fi}
+
+\chardef \hash = `\# %~ Pound sign, hash, octothorpe.
+
+\let \# = \hash
+
+\def \hat {% %~ Hat symbol. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmhat
+ \else
+ \char "5E\relax
+ \fi}
+
+\chardef \i = "10 %~ Dotless i.
+
+\chardef \j = "11 %~ Dotless j.
+
+\def \L {\PSpolishL} %~ Uppercase Polish L. %^named_char
+
+\def \l {\PSpolishl} %~ Lowercase Polish l. %^named_char
+
+% \lbrace and \rbrace cannot start with \ensurepar, because that won't
+% work following a \left or \right command. However, the \relax is required.
+
+\def \lbrace {% %~ Left brace. %^named_char
+ \relax
+ \if \mathmodep
+ \zmlbrace
+ \else \if \monoencodingp
+ \char "7B\relax
+ \else
+ \PSbraceleft
+ \fi\fi}
+
+\let \{ = \lbrace
+
+\def \less {% %~ Less-than sign. %^named_char
+ \ensurepar
+ \if \monoencodingp
+ \char "3C\relax
+ \else
+ \PSless
+ \fi}
+
+\let \< = \less
+
+\chardef \O = "1F %~ Slashed O.
+
+\chardef \o = "1C %~ Slashed o.
+
+\chardef \OE = "1E %~ OE diphthong.
+
+\chardef \oe = "1B %~ oe diphthong.
+
+\def \odquote {``} %~ Open double quote. %^named_char
+
+\def \P {% %~ Paragraph symbol (pilcrow). %^named_char
+ \ensurepar
+ \PSparagraph}
+
+\chardef \percent = `\% %~ Percent sign.
+
+\let \% = \percent
+
+\def \perthousand {% %~ Per thousand symbol. %^named_char
+ \ensurepar
+ \PSperthousand}
+
+\def \prellipsis {% %~ Text ellipsis with no left space.
+ .\unbreakable\thickspace
+ .\unbreakable\thickspace
+ .\thickspace
+ \ignorespaces}
+
+\def \rbrace {% %~ Right brace. %^named_char
+ \relax
+ \if \mathmodep
+ \zmrbrace
+ \else \if \monoencodingp
+ \char "7D\relax
+ \else
+ \PSbraceright
+ \fi\fi}
+
+\let \} = \rbrace
+
+\def \registered {% %~ Registered symbol. %^named_char
+ \ensurepar
+ \PSregistered}
+
+\def \S {% %~ Section sign. %^named_char
+ \ensurepar
+ \PSsection}
+
+\def \SS {% %~ Double section sign. %^named_char
+ \ensurepar
+ \PSsection\PSsection}
+
+\chardef \ss = "19 %~ German eszett.
+
+\def \sterling {% %~ Pound sterling symbol. %^named_char
+ \ensurepar
+ \PSsterling}
+
+\def \tilde {% %~ Tilde. %^named_char
+ \ensurepar
+ \if \mathmodep
+ \zmtilde
+ \else
+ \char "7E\relax
+ \fi}
+
+\def \trademark {% %~ Trademark symbol. %^named_char
+ \ensurepar
+ \PStrademark}
+
+\def \underscore {% %~ Underscore. %^named_char
+ \ensurepar
+ \zprehyph{\underscorehyph}%
+ \if \monoencodingp
+ \char "5F\relax
+ \else
+ \PSunderscore
+ \fi
+ \zposthyph{\underscorehyph}}
+
+\let \_ = \underscore
+
+\def \udquote {% %~ Undirected double quote. %^named_char
+ \ensurepar
+ \if \monoencodingp
+ \char "22\relax
+ \else
+ \PSudquote
+ \fi}
+
+\def \usquote {% %~ Undirected single quote. %^named_char
+ \ensurepar
+ \if \monoencodingp
+ \char "0D\relax
+ \else
+ \PSusquote
+ \fi}
+
+\def \verticalbar {% %~ Vertical bar. %^named_char
+ \ensurepar
+ \if \monoencodingp
+ \char "7C\relax
+ \else
+ \PSbar
+ \fi}
+
+\def \|{% %~ Vertical bar. %^named_char
+ \relax
+ \if \mathmodep \Vert \else \verticalbar \fi}
+
+% Accents
+% -------
+
+
+\def \"#1{{\accent "7F #1}} %~ Umlaut accent. %^accent
+
+\def \'#1{{\accent 19 #1}} %~ Acute accent. %^accent
+
+\def \.#1{{\accent 95 #1}} %~ Dot accent. %^accent
+
+\def \=#1{{\accent 22 #1}} %~ Macron accent. %^accent
+
+\def \^#1{{\accent 94 #1}} %~ Circumflex accent. %^accent
+
+\def \`#1{{\accent 18 #1}} %~ Grave accent. %^accent
+
+\def \~#1{{\accent "7E #1}} %~ Tilde accent. %^accent
+
+\def \b #1{% %~ Bar-under accent. %^accent
+ \ozalign{\relax #1\cr
+ \hidewidth \vbox to .2ex {\hbox{\char 22}\vss}\hidewidth}}
+
+\def \c #1{% %~ Cedilla accent. %^accent
+ \setbox \zboxa = \hbox{#1}%
+ \if \dimeqlp{\ht\zboxa}{1ex}%
+ \accent 24 #1%
+ \else
+ {\ooalign{\hidewidth \char 24 \hidewidth \cr
+ \unhbox \zboxa}}%
+ \fi}
+
+\def \d #1{% %~ Dot-under accent. %^accent
+ \ozalign{\relax #1\cr
+ \hidewidth.\hidewidth}}
+
+\def \g #1{% %~ Ogonek accent. %^accent
+ \setbox \zboxa = \hbox{#1}%
+ \if \dimeqlp{\ht\zboxa}{1ex}%
+ \accent 154 #1%
+ \else
+ {\ooalign{\hidewidth \char 154 \hidewidth \cr
+ \unhbox \zboxa}}%
+ \fi}
+
+\def \H #1{{\accent "7D #1}} %~ Long Hungarian umlaut accent. %^accent
+
+\def \r #1{{\accent "17 #1}} %~ Ring accent. %^accent
+
+\def \t #1{% %~ Tie-after accent. %^accent
+ {\edef \znext {\the\font}\the\textfont1 \accent "7F \znext #1}}
+
+\def \u #1{{\accent 21 #1}} %~ Breve accent. %^accent
+
+\def \v #1{{\accent 20 #1}} %~ Hacek accent. %^accent
+
+% Spaces
+% ------
+
+
+% TeX space primitives include the following:
+%
+% <space> Produce a normal space, obeying \spacefactor.
+% \<space> Produce a normal space as if \spacefactor = 1000.
+
+% Here are a set of "space" commands that produce breakable space:
+
+%~ Specified amount of breakable horizontal space.
+
+\def \hspace #1{\ensurepar \hskip #1\relax}% {amount} %^hspace
+
+%~ Specified amount of unbreakable horizontal space
+%~ measured in tenths of a point.
+
+\def \h #1;{% tenths-points; %^hspace
+ {\tdimena = .1pt
+ \tdimena = #1\tdimena
+ \kern \tdimena}}
+
+\def \fiveemspace {\ensurepar \hskip 5em\relax} %~ Breakable 5 em space. %^hspace
+
+\def \fouremspace {\ensurepar \hskip 4em\relax} %~ Breakable 4 em space. %^hspace
+
+\def \threeemspace {\ensurepar \hskip 3em\relax} %~ Breakable 3 em space. %^hspace
+
+\def \twoemspace {\ensurepar \hskip 2em\relax} %~ Breakable 2 em space. %^hspace
+
+\def \emspace {\ensurepar \hskip 1em\relax} %~ Breakable 1 em space. %^hspace
+
+\def \enspace {\ensurepar \hskip .5em\relax} %~ Breakable 1 en space. %^hspace
+
+\def \digitspace {% %~ Breakable digit space. %^hspace
+ {\measuredigitwidth{\tdimena}%
+ \ensurepar \hskip \tdimena}}
+
+{\catcode`\| = \catactive
+\gdef \digitspacebar {%
+ \catcode`\| = \catactive
+ \def |{\digitspace}}
+}
+
+\def \thirdspace {\ensurepar \hskip .333em\relax} %~ Breakable 1/3 em space. %^hspace
+\let \thickspace = \thirdspace
+\def \negthickspace {\ensurepar \hskip -.333em\relax} %~ Breakable negative 1/3 em space. %^hspace
+
+\def \space { } %~ Normal space.
+\def \^^M{\ } %~ Normal space.
+
+\def \fontspace {\ensurepar \hskip \fontdimen2\font} %~ Breakable font space. %^hspace
+
+\def \visiblespace {% %~ Visible space. %^hspace
+ \ensurepar
+ \hbox {%
+ \measurespacewidth{\tdimena}%
+ \kern .16ex
+ \llap{\rule{width .08ex height .15ex depth .2ex}}%
+ \lower .2ex \hbox{\rule{width \tdimena height .08ex depth 0pt}}%
+ \rlap{\rule{width .08ex height .15ex depth .2ex}}%
+ \kern .16ex}}
+
+\def \fourthspace {\ensurepar \hskip .25em\relax} %~ Breakable 1/4 em space. %^hspace
+
+\def \fifthspace {\ensurepar \hskip .2em\relax} %~ Breakable 1/5 em space. %^hspace
+\let \thinspace = \fifthspace
+\def \negfifthspace {\ensurepar \hskip -.2em\relax} %~ Breakable negative 1/3 em space. %^hspace
+\let \negthinspace = \negfifthspace
+
+\def \sixthspace {\ensurepar \hskip .16667em\relax} %~ Breakable 1/6 em space. %^hspace
+\def \negsixthspace {\ensurepar \hskip -.16667em\relax} %~ Breakable negative 1/6 em space. %^hspace
+
+\def \seventhspace {\ensurepar \hskip .14286em\relax} %~ Breakable 1/7 em space. %^hspace
+\let \hairspace = \seventhspace
+\def \negseventhspace {\ensurepar \hskip -.14286em\relax} %~ Breakable negative 1/7 em space. %^hspace
+
+\def \qqqqquad {\unbreakable\fiveemspace} %~ Unbreakable 5 em space. %^hspace
+\def \qqqquad {\unbreakable\fouremspace} %~ Unbreakable 4 em space. %^hspace
+\def \qqquad {\unbreakable\threeemspace} %~ Unbreakable 3 em space. %^hspace
+\def \qquad {\unbreakable\twoemspace} %~ Unbreakable 2 em space. %^hspace
+\def \quad {\unbreakable\emspace} %~ Unbreakable 1 em space. %^hspace
+\def \nut {\unbreakable\enspace} %~ Unbreakable 1 en space. %^hspace
+
+%~ Unbreakable 1/3 em space.
+
+\def \;{\relax\if \mathmodep \mthickspace \else \unbreakable\thickspace \fi} %^hspace
+
+%~ Unbreakable 1/5 em space.
+
+\def \,{\relax\if \mathmodep \mthinspace \else \unbreakable\thinspace \fi} %^hspace
+
+%~ Unbreakable negative 1/5 em space.
+
+\def \!{\relax\if \mathmodep \mnegthinspace \else \unbreakable\negthinspace\fi} %^hspace
+
+\def \+{\unbreakable\hairspace} %~ Unbreakable 1/7 em space. %^hspace
+
+%~ Specified amount of unbreakable horizontal space
+%~ measured in hundredths of an em.
+
+\def \k #1;{% hundredths-em; %^hspace
+ {\tdimena = .01em
+ \tdimena = #1\tdimena
+ \kern \tdimena}}
+
+%~ This command retains horizontal space at the beginning of a line.
+%~ Such space is normally discarded.
+
+\def \retain {\vrule height 0pt depth 0pt width 0pt\relax} %^hspace
+
+%~ This declaration causes spaces to be "obeyed," so that every space
+%~ in the source is relevent.
+
+\def \obeyspaces {%
+ \catcode`\ =\catactive}
+
+{\obeyspaces
+\global\let =\ %
+}
+
+% Space Factors
+% ----- -------
+
+
+% IniTeX sets the space factor code of uppercase letters to 999 so
+% periods after them will not end sentences. That just gives people
+% one more rule to remember.
+
+ \sfcode`\A=1000 \sfcode`\B=1000 \sfcode`\C=1000 \sfcode`\D=1000
+ \sfcode`\E=1000 \sfcode`\F=1000 \sfcode`\G=1000 \sfcode`\H=1000
+ \sfcode`\I=1000 \sfcode`\J=1000 \sfcode`\K=1000 \sfcode`\L=1000
+ \sfcode`\M=1000 \sfcode`\N=1000 \sfcode`\O=1000 \sfcode`\P=1000
+ \sfcode`\Q=1000 \sfcode`\R=1000 \sfcode`\S=1000 \sfcode`\T=1000
+ \sfcode`\U=1000 \sfcode`\V=1000 \sfcode`\W=1000 \sfcode`\X=1000
+ \sfcode`\Y=1000 \sfcode`\Z=1000
+
+% A few characters should not affect the space factor.
+
+ \sfcode`\'=0
+ \sfcode`\)=0
+ \sfcode`\]=0
+
+
+\def \setsentencespacing #1{% {flag}
+ \if #1%
+ \sfcode`\. = 2250
+ \sfcode`\? = 2250
+ \sfcode`\! = 2250
+ \sfcode`\: = 2000
+ \else
+ \sfcode`\. = 1000
+ \sfcode`\? = 1000
+ \sfcode`\! = 1000
+ \sfcode`\: = 1000
+ \fi
+ \relax}
+
+% Numbers
+% -------
+
+
+\let \lcromannumeral = \romannumeral
+
+%~ This command formats an integer as uppercase Roman numerals.
+
+\def \ucromannumeral #1{% {number}
+ \uppercase\expandafter{\romannumeral#1}}
+
+%~ This command formats an integer as lowercase letters.
+
+\def \lcletter #1{% {number}
+ \ifcase #1%
+ 0\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m\or
+ n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z\else
+ \number#1\fi}
+
+%~ This command formats an integer as uppercase letters.
+
+\def \ucletter #1{% {number}
+ \ifcase #1%
+ 0\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or
+ N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z\else
+ \number#1\fi}
+
+% Lines
+% -----
+
+
+\long\def \line #1{% {text}
+ \if \vmodep
+ {\parfillskip = 0pt
+ \noindent #1\retain \par}%
+ \else
+ \retain #1\tl
+ \fi}
+
+\long\def \leftline #1{\line{#1\hfil}}% {text}
+\long\def \rightline #1{\line{\hfil#1}}% {text}
+\long\def \centerline #1{\line{\hfil#1\hfil}}% {text}
+\long\def \spreadline #1#2{\line{{#1}\hfil{#2}}}% {text1}{text2}
+\long\def \centerspreadline #1#2#3{%
+ \line{\rlap{#1}\hfil #2\hfil \llap{#3}}}% {text1}{text2}{text3}
+
+
+% This declaration causes line breaks to be "obeyed," so that each
+% results in a paragraph end.
+
+{\catcode`\^^M = \catactive%
+\gdef \obeylines {\catcode`\^^M = \active \let ^^M = \par}%
+}
+
+% Line Breaks
+% ---- ------
+
+
+\def \linebreak #1{% {penalty}
+ \penalty #1\relax}
+
+\def \tl {\break}
+
+\def \nl {%
+ \gluevaries{\znlvar}{\leftskip}%
+ \if \znlvar \tl \else \hfil \break \fi}
+
+\def \blankline {\ensurepar \nl}
+
+
+% These commands are used to tie text on one line.
+
+\def ~{\nobreak \ } % Unbreakable space (tie).
+
+\def \tie {\ensurepar \hbox}
+
+% Indentation
+% -----------
+
+
+% Note that this macro just sets \leftskip and \rightskip, and so
+% blows away any \parrag.
+
+\def \setindentation #1#2{% {left}{right}
+ \leftskip = #1\relax
+ \rightskip = #2\relax}
+
+
+\def \alterindentation #1#2{% {left-delta}{right-delta}
+ \leftskip = 1\leftskip
+ \advance \leftskip by #1\relax
+ \rightskip = 1\rightskip
+ \advance \rightskip by #2\relax}
+
+% Text Width
+% ---- -----
+
+
+% This command must be used AFTER the indentation is established with
+% \setindentation or \alterindentation.
+
+\def \settextwidth #1{% {width}
+ \if \dimneqlp{#1}{\naturalwidth}%
+ \hsize = #1\relax
+ \advance \hsize by \leftskip
+ \advance \hsize by \rightskip
+ \fi}
+
+% Paragraph Raggedness
+% --------- ----------
+
+
+% This command must be used AFTER the indentation is established with
+% \setindentation or \alterindentation.
+
+\def \setparrag #1{% {rag-dimen}
+ \gluevaries{\zrsvar}{\rightskip}%
+ \if \notp{\zrsvar}%
+ \tdimena = #1\relax
+ \advance \rightskip by 0pt plus \tdimena\relax
+ \fi}
+
+\zdeclareeveryvcontext{\setindentation{0pt}{0pt}\setparrag{0pt}}
+
+% Paragraph Shapes
+% --------- ------
+
+
+\definecount{\zshparct}{0}
+\definecount{\zshparrep}{0}
+\definedimen{\zshpari}{0pt}
+\definedimen{\zshparw}{0pt}
+
+
+\def \nshapepar #1{% {[*repeat1,]indent1,width1,...}
+ \if \emptyargp{#1}%
+ \error{empshape}{The argument to \string\shapepar cannot be empty}%
+ \fi
+ \gdef \zshpartoks {}%
+ \global\zshparct = 0
+ {\zshapeparc #1,\zmark}%
+ \parshape = \zshparct\zshpartoks\relax}
+
+\def \zshapeparc #1#2,#3\zmark{% [*repeat],indent,...
+ \if \codeeqlp{#1}{*}%
+ \global\zshparrep = #2\relax
+ \def \znext {\zshapepare #3\zmark}%
+ \else
+ \global\zshparrep = 1
+ \def \znext {\zshapepare #1#2,#3\zmark}%
+ \fi
+ \znext}
+
+\def \zshapepare #1,#2,#3\zmark{% indent,width,...
+ \zshapepard #1,\false,\zshpari\zmark
+ \global\zshpari = \tdimena
+ \zshapepard #2,\true,\zshparw\zmark
+ \global\zshparw = \tdimena
+ \loop
+ \if \posp{\zshparrep}%
+ \xdef \zshpartoks {\zshpartoks \space \the\zshpari \space \the\zshparw}%
+ \global\increment \zshparct
+ \global\decrement \zshparrep
+ \repeat
+ \if \emptyargp{#3}%
+ \let \znext = \relax
+ \else
+ \def \znext {\zshapeparc #3\zmark}%
+ \fi
+ \znext}
+
+\def \zshapepard #1#2,#3,#4\zmark{% dimen1 dimen-rest,width?,prev
+ \if \codeeqlp{#1}{+}%
+ \calculate \tdimena = {#4,+,#2}%
+ \else\if \codeeqlp{#1}{-}%
+ \calculate \tdimena = {#4,-,#2}%
+ \else\if \andp{\codeeqlp{#1}{=}}{#3}%
+ \calculate \tdimena = {\hsize,-,\zshpari}%
+ \else
+ \tdimena = #1#2\relax
+ \if \dimeqlp{\tdimena}{\naturalwidth}%
+ \calculate \tdimena = {\hsize,-,\zshpari}%
+ \fi
+ \fi\fi\fi
+ \if #3%
+ %%% Do we want to adjust the width by \leftskip or \rightskip?
+ \fi}
+
+
+%%%\definecount{\zshparct}{0}
+\definedimen{\zshpard}{0pt}
+\definedimen{\zshpare}{0pt}
+
+
+\def \shapepar #1{% {indent1,width1,...}
+ \if \emptyargp{#1}%
+ \error{empshape}{The argument to \string\shapepar cannot be empty}%
+ \fi
+ \gdef \zshpartoks {}%
+ \global\zshparct = 0
+ {\zshapepara #1,\zmark}%
+ \parshape = \zshparct\zshpartoks\relax}
+
+\def \zshapepara #1,#2,#3\zmark{% indent,width,...\zmark
+ \zshpard = #1\relax
+ \xdef \zshpartoks {\zshpartoks \space \the\zshpard}%
+ \zshpare = #2\relax
+ \if \dimeqlp{\zshpare}{\naturalwidth}%
+ \zshpare = \hsize
+ \advance \zshpare by -\zshpard
+ \else
+ \advance \zshpare by \leftskip
+ \advance \zshpare by \rightskip
+ \fi
+ \xdef \zshpartoks {\zshpartoks \space \the\zshpare}%
+ \global\increment \zshparct
+ \if \emptyargp{#3}%
+ \let \znext = \relax
+ \else
+ \def \znext {\zshapepara #3\zmark}%
+ \fi
+ \znext}
+
+
+\def \hangalign #1#2#3{% {indent}{text1}{text2}
+ \endgraf
+ {\setbox \zboxa = \hbox{#2}%
+ \tdimena = \wd\zboxa
+ \advance \tdimena by #1\relax
+ \shapepar{#1,\naturalwidth,\tdimena,\naturalwidth}%
+ \noindent \box\zboxa #3\par}}
+
+\def \hindent #1{% {indent}
+ \noindent \hspace{#1}%
+ \ignorespaces}
+
+% Adjustments
+% -----------
+
+
+%~ This page overrides the number of lines in a paragraph. The argument
+%~ specifies the number of lines and should start with a plus or
+%~ minus sign. TeX does not guarantee the change.
+
+\def \overrideparlength #1{% {lines} %^page_makeup
+ \looseness = #1\relax}
+
+
+%~ This command is used in the middle of a paragraph, on a line by
+%~ itself, to make an adjustment
+%~ between two lines. A typical use is to force a page break:
+%~ \adjustpar{\fullpagebreak}
+%~ There is no need to put a percent sign (|%|) after the command.
+
+\long\def \adjustpar #1{% {command} %^page_makeup
+ \vadjust{#1}%
+ \ignorespaces}
+
+
+% This command is used to adjust the title of a chapter, section, etc.
+% The argument looks like `\loc{commands}\loc{commands}...'
+% where each \loc is:
+% \body To adjust the title in the body of the text.
+% \mark To adjust the title in the mark (running heads and feet).
+% \toc To adjust the title in the table of contents.
+
+\def \zadjloc {\body} % Normally, \adjusttitle should adjust body.
+
+\def \adjusttitle #1{% {\loc{commands}...}
+ {\def \body ##1{}%
+ \def \mark ##1{}%
+ \def \toc ##1{}%
+ \expandafter\let \zadjloc = \zadjtitleb
+ #1}}
+
+\def \zadjtitleb #1{%
+ #1%
+ \def \znext {#1}%
+ \if \tokeqlp{\znext}{\nl}%
+ \let \znext = \ignorespaces
+ \else
+ \let \znext = \relax
+ \fi
+ \znext}
+
+% These macros use \lspspace so they do the right thing while letterspacing.
+
+\def \titlenl {\adjusttitle{\body{\nl}}\lspspace}
+\def \titletl {\adjusttitle{\body{\tl}}\lspspace}
+\def \tocnl {\adjusttitle{\toc{\nl}}\lspspace}
+\def \toctl {\adjusttitle{\toc{\tl}}\lspspace}
+
+
+% These definitions are used by the new title adjustment scheme,
+% but need to be present even when it is not in use.
+
+\chardef \zadjtitlenone = 0
+\chardef \zadjtitlebody = 1
+\chardef \zadjtitlemark = 2
+\chardef \zadjtitletoc = 3
+\chardef \zadjtitleminitoc = 4
+
+\definecount{\zadjtitle}{\zadjtitlebody}
diff --git a/macros/plain/contrib/zztex/tex/zzhmodeb.tex b/macros/plain/contrib/zztex/tex/zzhmodeb.tex
new file mode 100644
index 0000000000..69c92d9c1e
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzhmodeb.tex
@@ -0,0 +1,239 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Horizontal Mode Facilities
+%
+% Synopsis: This module provides various facilities that operate in
+% horizontal mode, within a paragraph. See also ZZHMODE.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 11 January 1994
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Basic Tools
+% ----- -----
+
+
+\def \llap #1{\hbox to 0pt{\hss #1}}% {text}
+\def \rlap #1{\hbox to 0pt{#1\hss}}% {text}
+\def \clap #1{\hbox to 0pt{\hss #1\hss}}% {text}
+
+\def \minhbox to #1#2#3#4{% to width{text}{space-in}{space-out}
+ \measuretextwidth{\tdimena}{#2\hspace{#3}}%
+ \if \dimgtrp{\tdimena}{#1}%
+ {#2}\hspace{#4}%
+ \else
+ \hbox to #1{#2\hfil}%
+ \fi}
+
+% Drop Capitals
+% ---- --------
+
+
+\def \dropcapital #1#2#3{% {height}{lines}{text}
+ \setbox \zboxa = \hbox{#3}%
+ \tdimena = \ht\zboxa
+ \advance \tdimena by -#1\relax
+ \setbox \zboxa = \hbox{\lower \tdimena \box\zboxa}%
+ \dp\zboxa = 0pt
+ \def \zdropshape {0pt,\naturalwidth}%
+ \tcounta = #2\relax
+ \loop
+ \decrement \tcounta
+ \if \posp{\tcounta}%
+ \edef \zdropshape {\zdropshape ,\the\wd\zboxa,\naturalwidth}%
+ \repeat
+ \expandafter\shapepar\expandafter{\zdropshape,0pt,\naturalwidth}%
+ \noindent \box\zboxa}
+
+% Enclosing Text
+% --------- ----
+
+
+\def \enclose #1#2#3{% {thickness}{separation}{text}
+ \ensurepar
+ \hbox{\vrule width #1%
+ \vtop{\vbox{\hrule height #1%
+ \kern #2%
+ \hbox{\kern #2#3\kern #2}}%
+ \kern #2%
+ \hrule height #1}%
+ \vrule width #1}}
+
+\def \colorenclose #1#2#3#4{% {color}{thickness}{separation}{text}
+ \ensurepar
+ \hbox{\color{#1}\vrule width #2 \endcolor
+ \vtop{\vbox{\color{#1}\hrule height #2 \endcolor
+ \kern #3%
+ \hbox{\kern #3#4\kern #3}}%
+ \kern #3%
+ \color{#1}\hrule height #2 \endcolor}%
+ \color{#1}\vrule width #2 \endcolor}}
+
+% Fractions
+% ---------
+
+
+% This macro is specifically designed to work in math mode, too.
+
+\def \piecefraction #1{%
+ \ztfrac #1/}
+
+\def \ztfrac #1/#2/{%
+ \ensurepar
+ {\measuretextwidth{\tdimena}{/}%
+ \raise .5ex \hbox{$\scriptstyle #1$}%
+ \kern -.2\tdimena \raise .3ex \hbox{$\scriptstyle /$}\kern -.2\tdimena%
+ \hbox{$\scriptstyle #2$}}}
+
+\let \textfraction = \piecefraction % For compatibility.
+
+% Leaders
+% -------
+
+
+\def \alignedleaders #1{% {box-or-rule}
+ \leaders #1\hfill}
+
+\def \dotleaders {%
+ \alignedleaders{\hbox to 1em{\hss.\hss}}}
+
+\def \ruleleaders #1{% {rule}
+ \alignedleaders{#1}}
+
+\def \centeredleaders #1{% {box-or-rule}
+ \cleaders #1\hfill}
+
+\def \spreadleaders #1{% {box-or-rule}
+ \xleaders #1\hfill}
+
+% Paragraph Dingbats
+% --------- --------
+
+
+\def \pardingbat #1#2{% {space}{dingbat}
+ {\unskip \unbreakable\hfil \allowbreak
+ \hspace{#1}\retain\unbreakable\hfill
+ #2%
+ \finalhyphendemerits = 0 \par}}
+
+% Rules
+% -----
+
+
+\def \rule #1{% {dimensions}
+ \if \vmodep
+ \hrule #1\relax
+ \else
+ \vrule #1\relax
+ \fi}
+
+\def \colorrule #1#2{% {color}{dimensions}
+ \if \vmodep
+ \color{#1}
+ \nobreak
+ \hrule #2\relax
+ \endcolor
+ \else
+ \color{#1}\vrule #2\relax\endcolor
+ \fi}
+
+\def \slug #1#2{% {width}{height}
+ \rule{height #2 depth 0pt width #1}}
+
+% Shapes
+% ------
+
+
+\def \rectangle #1#2#3#4{% {rise}{width}{height}{thickness}
+ {\tdimena = #2\relax
+ \advance \tdimena by -#4\relax
+ \advance \tdimena by -#4\relax
+ \raise #1 \hbox{%
+ \vrule height #3 depth 0pt width #4\relax
+ \vbox to #3{%
+ \hrule height #4 depth 0pt width \tdimena\relax
+ \vfil
+ \hrule height #4 depth 0pt width \tdimena\relax}%
+ \vrule height #3 depth 0pt width #4}}}
+
+% Underlining & Overstriking
+% ----------- - ------------
+
+
+\def \fakebold #1{% {text}
+ \hbox{\rlap{#1}%
+ \rlap{\lower .009em \hbox{\kern .009em #1}}%
+ \lower .018em \hbox{\kern .018em #1}}}
+
+\def \multiunderline #1#2#3#4#5{% {count}{drop1}{drop2}{thickness}{text}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#5}%
+ \rlap{\lower #2 \hbox{\vrule height #4 depth 0pt width \the\wd\zboxa}}%
+ \tcounta = #1\relax
+ \tdimena = #2\relax
+ \loop
+ \decrement \tcounta
+ \if \posp{\tcounta}%
+ \advance \tdimena by #3\relax
+ \rlap{\lower \tdimena \hbox{\vrule height #4 depth 0pt
+ width \the\wd\zboxa}}%
+ \repeat
+ \box\zboxa}}
+
+\def \overstrike #1#2{% {text1}{text2}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#1}%
+ \setbox\zboxb = \hbox{#2}%
+ \tdimena = \wd\zboxa
+ \advance \tdimena by -\wd\zboxb
+ \divide \tdimena by 2
+ \rlap{\kern \tdimena \box\zboxb}\box\zboxa}}
+
+\def \strikethrough #1{% {text}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#1}%
+ \rlap{\raise .45ex \hbox{\vrule height .1ex depth 0pt
+ width \the\wd\zboxa}}%
+ \box\zboxa}}
+
+\let \zunline = \underline
+
+\def \underline #1{% {text}
+ \relax
+ \if \mathmodep
+ \zunline{#1}%
+ \else
+ \multiunderline{1}{.4ex}{0pt}{.1ex}{#1}%
+ \fi}
+
+% Vertical Centering
+% -------- ---------
+
+
+\def \centeroncapheight #1{% {text}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#1}%
+ \measurecapheight{\tdimena}% % Calculate ht(CAP) - ht(text)
+ \advance \tdimena by -\ht\zboxa % ------------------
+ \divide \tdimena by 2 % 2
+ \raise \tdimena \box\zboxa}}
+
+\def \centerondigitheight #1{% {text}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#1}%
+ \measuredigitheight{\tdimena}% % Calculate ht(123) - ht(text)
+ \advance \tdimena by -\ht\zboxa % ------------------
+ \divide \tdimena by 2 % 2
+ \raise \tdimena \box\zboxa}}
+
+\def \centeronxheight #1{% {text}
+ \ensurepar
+ {\setbox\zboxa = \hbox{#1}%
+ \tdimena = 1ex % Calculate 1ex - ht(text)
+ \advance \tdimena by -\ht\zboxa % --------------
+ \divide \tdimena by 2 % 2
+ \raise \tdimena \box\zboxa}}
diff --git a/macros/plain/contrib/zztex/tex/zzhyper.tex b/macros/plain/contrib/zztex/tex/zzhyper.tex
new file mode 100644
index 0000000000..cf20d36eb2
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzhyper.tex
@@ -0,0 +1,185 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: PDF Hyperlink Facility
+%
+% Synopsis: This module provides facilities for creating PDF hyperlinks
+% in the document.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 12 March 2014
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Control Hyperlinking
+% ------- ------------
+
+
+% If hyperlinking is turned off, then we also clear the button color.
+
+\def \setPDFhyperlinks #1{%
+ \global\setflag \PDFhyperlinks = #1\relax
+ \if \notp{#1}\PDFbuttoncolor = {}\fi}
+
+% Hyperlink Marks
+% --------- -----
+
+
+% This macro generates a hyperlink mark that can be used as the target
+% of a button.
+
+\def \PDFmark #1{%
+ \if \PDFhyperlinks
+ \special{mark: #1}%
+ \if \vmodep \repeatpenalty \fi % In case glue follows \special.
+ \fi}
+
+% Hyperlink Buttons
+% --------- -------
+
+
+\def \pagebutton #1#2{% {folio}{text}
+ \if \PDFhyperlinks
+ \ztextbutton{P:#1}{#2}%
+ \if \emptytoksp{\PDFbuttoncolor}%
+ #2%
+ \else
+ \colortext{\the\PDFbuttoncolor}{#2}%
+ \fi
+ \else
+ #2%
+ \fi}
+
+\def \tagbutton #1#2{% {tag}{text}
+ \if \PDFhyperlinks
+ \ztextbutton{T:#1}{#2}%
+ \if \emptytoksp{\PDFbuttoncolor}%
+ #2%
+ \else
+ \colortext{\the\PDFbuttoncolor}{#2}%
+ \fi
+ \else
+ #2%
+ \fi}
+
+\def \URLbutton #1#2{% {URL}{text}
+ \if \PDFhyperlinks
+ \ztextbutton{#1}{#2}%
+ \if \emptytoksp{\PDFbuttoncolor}%
+ #2%
+ \else
+ \colortext{\the\PDFbuttoncolor}{#2}%
+ \fi
+ \else
+ #2%
+ \fi}
+
+\def \colorbuttontext {%
+ \if \andp{\PDFhyperlinks}{\notp{\emptytoksp{\PDFbuttoncolor}}}%
+ \color{\the\PDFbuttoncolor}%
+ \fi}
+
+\def \endcolorbuttontext {%
+ \if \andp{\PDFhyperlinks}{\notp{\emptytoksp{\PDFbuttoncolor}}}%
+ \endcolor
+ \fi}
+
+% Low-Level Button Macros
+% --------- ------ ------
+
+
+% These low-level macros do not check \PDFhyperlinks.
+
+
+\def \ztextbutton #1#2{% {mark}{text}
+ \measuretextwidth{\tdimena}{#2}%
+ \zwidthbutton{#1}{\tdimena}}
+
+\def \zwidthbutton #1#2{% {mark}{width-expr}
+ \calculate \tdimena = {#2}%
+ \if \hmodep
+ \smash{\lower .5ex \hbox{%
+ \special{button: \number\tdimena\space
+ \number\normalbaselineskip\space #1}}}%
+ \else
+ \special{button: \number\tdimena\space
+ \number\normalbaselineskip\space #1}%
+ \fi}
+
+\def \zURLbutton #1#2{% {url}{text}
+ \measuretextwidth{\tdimena}{#2}%
+ \def \zurltext {#1}%
+ \smash{\lower .5ex \hbox{%
+ \special{button: \number\tdimena\space
+ \number\normalbaselineskip\space
+ \expandafter\zdefof \meaning\zurltext\zmark}}}}
+
+% Email Addresses and URLs
+% ----- --------- --- ----
+
+
+\def \zurlprefix {}
+
+
+\def \urltext #1#2{% {font}{break before .?}{url}
+ \bgroup
+ #1%
+ \setflag \zurldotbreak = #2%
+ \catcode `\& = \catactive
+ \catcode `\. = \catactive
+ \catcode `\/ = \catactive
+ \catcode `\@ = \catactive
+ \catcode `\_ = \catactive
+ \zurltexta}
+
+\def \zurltexta #1{% {url}
+ \zurltextb #1\-\-\zmark}
+
+\def \zurltextb #1\-#2\-#3\zmark{% part1\-part2\-part3\zmark
+ \expandafter\def \expandafter\zfullurl \expandafter{\zurlprefix #1#2}%
+ \zurltextc{#1}%
+ \if \notp{\emptyargp{#2}}%
+ \break
+ \zurltextc{#2#3}%
+ \fi
+ \egroup
+ \gdef \zurlprefix {}}
+
+{\catcode `\& = \catactive
+ \catcode `\. = \catactive
+ \catcode `\/ = \catactive
+ \catcode `\@ = \catactive
+ \catcode `\_ = \catactive
+
+\gdef \zurltextc #1{% {url-text}
+ \def &{\ampersand \discretionary{}{}{}}% % Break after &
+ \let \& = &%
+ \if \zurldotbreak
+ \def .{\discretionary{}{}{}\char"2E }% % Break before .
+ \else
+ \def .{\char"2E \discretionary{}{}{}}% % Break after .
+ \fi
+ \def /{\char"2F \discretionary{}{}{}}% % Break after /
+ \def @{\atsign \discretionary{}{}{}}% % Break after @
+ \let \@ = @%
+ \let _ = \underscore % Set _
+ \let ~ = \tilde % Set ~
+ \def \-{\discretionary{}{}{}}% % No hyphenation
+ \if \PDFhyperlinks
+ \expandafter\zURLbutton \expandafter{\zfullurl}{#1}%
+ \fi
+ \colorbuttontext
+ #1%
+ \endcolorbuttontext}
+
+} % \catcode
+
+% Digital Object Identifiers
+% ------- ------ -----------
+
+
+\def \DOI {% {number}
+ \def \zurlprefix {http://dx.doi.org/}%
+ \ensurepar \url}
diff --git a/macros/plain/contrib/zztex/tex/zzhyph.tex b/macros/plain/contrib/zztex/tex/zzhyph.tex
new file mode 100644
index 0000000000..1aea8d1cd8
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzhyph.tex
@@ -0,0 +1,128 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Hyphenation Facilities
+%
+% Synopsis: This module provides the extra facilities for dealing with
+% hyphenation and related matters.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 6 October 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Hyphenating Words
+% ----------- -----
+
+
+\def \*{%
+ \discretionary{}{}{}}
+
+\def \hyphen{%
+ \nobreak -\zposthyph{2}}
+
+\def \slash {/\zposthyph{1}}
+
+
+% These macros are used in ZZHMODE to allow special characters to hyphenate.
+
+\def \zprehyph #1{% {\parameter}
+ \ifcase #1%
+ \relax
+ \or
+ \relax
+ \else
+ \nobreak
+ \fi}
+
+\def \zposthyph #1{% {\parameter}
+ \ifcase #1%
+ \relax
+ \or
+ \discretionary{}{}{}%
+ \else
+ \penalty \exhyphenpenalty \hskip 0pt\relax
+ \fi}
+
+% Displaying Hyphens
+% ---------- -------
+
+
+\def \showhyphens #1{%
+ \setbox\zboxa = \vbox{%
+ \hsize = \maxdimen
+ \parfillskip = 0pt
+ \pretolerance = -1
+ \tolerance = -1
+ \hbadness = 0pt
+ \showboxdepth = 0
+ \ #1}}
+
+% Hyphenation Exceptions
+% ----------- ----------
+
+
+\hyphenation{%
+ acad-e-my a-mi-no anag-no-sto-pou-los
+ an-a-lyse an-a-lysed an-a-lys-es
+ an-a-lys-ing analy-ses analy-sis a-no-ny-mi-ty
+ ap-pen-dix apple ap-pli-ca-tion ar-chive ar-chiv-ing ar-chiv-ist
+ arity aspect assume asyn-chro-nous asyn-chro-nous-ly
+ au-to-mat-ic au-to-ma-tion au-ton-o-mous
+ back-gam-mon berth-ing bio-che-mist bio-che-mists bio-med-i-cine
+ bio-poly-mer bio-poly-mers bit-map book-reader brows-ers
+ buff-er buff-er-ed buff-er-ing
+ cat-a-stroph-ic chi-ca-go ci-gar cig-a-rette cig-a-rettes
+ co-in-cide co-in-cides
+ co-iso-tro-pic col-umns com-pen-dium cor-vette cor-vettes
+ cross-over crypto-sys-tem crypto-sys-tems cur-vi-linear cy-to-cha-la-sin
+ data-base data-bases data-set data-sets date-stamp de-mon-strate de-mon-strates
+ der-i-va-tion dijk-stra di-lem-ma dis-tinc-tive
+ dump-ling dump-lings
+ eco-nom-ic eco-nom-ics econ-o-mies e-con-o-mist e-con-o-mists ec-ua-dor
+ ei-gen-space ei-gen-spaces elec-tro-dif-fu-sion en-gland
+ en-tre-pre-neur en-tre-pre-neurs en-tre-pre-neur-ship
+ e-pis-te-mol-o-gy e-pis-te-mo-log-i-cal
+ fashion fi-bo-nac-ci frame-work
+ geo-graph-ic ge-om-e-try geo-stro-phic graph-ics
+ he-mo-glo-bin hexa-dec-i-mal horse-rad-ish
+ ide-ol-o-gy ide-ol-o-gies ide-ol-o-gize idiom im-ped-ance im-plic-it
+ keynes-ian
+ leaf-lets li-chen life-style light-weight li-quid-i-ty li-thog-ra-phy lon-gi-tu-di-nal
+ look-ahead
+ ma-caque
+ mac-ro-eco-nom-ic mac-ro-eco-nom-ics mac-ro-eco-nom-ist mac-ro-eco-nom-ists
+ mac-ro-mol-e-cule mac-ro-mol-e-cules
+ man-u-script man-u-scripts mar-gin-al mas-sa-chu-setts
+ me-chan-i-cal me-di-um me-di-ter-ra-ne-an meta-bolic me-tab-o-lism
+ meta-lin-guis-tic met-a-phor met-a-phors met-a-phor-ic met-a-phor-i-cal
+ meth-od-ol-o-gy
+ mic-ro-eco-nom-ic mic-ro-eco-nom-ics mic-ro-eco-nom-ist mic-ro-eco-nom-ists
+ mini-tab mne-mon-ic meth-od-o-log-i-cal mol-ecule mol-ecules
+ mono-chrome mono-pole mono-poles mo-nop-o-ly
+ mono-sac-cha-rides mul-ti-pli-ca-tion mul-ti-pli-ca-tive
+ name-space noisi-ness noisy none-the-less not-with-stand-ing
+ often ol-i-gop-o-ly ol-i-gop-o-list-ic olym-pi-ad olym-pi-ads
+ om-e-lette om-e-lettes
+ op-er-and op-er-ands oper-ator over-view
+ paper pa-rab-o-la par-a-digm para-mag-ne-tic pa-ram-e-trized
+ patho-gen patho-gen-ic patho-gens people pe-ri-od per-suad-ed per-suad-ing
+ phoe-nix pho-neme pho-to-graphs pho-to-mi-cro-graph phys-i-co-chem-i-cal
+ phys-ics piano pic-to-graph pic-to-graph pic-to-graph-ic poly-sac-cha-rides
+ Post-Script pov-er-ty pow-er prayer pre-dimmed pref-er-a-ble pref-er-a-bly
+ pri-meval pro-cess pro-ces-sor pro-cure-ment
+ pro-gram-ma-ble prop-o-si-tion py-thag-o-re-an
+ qua-drat-ic qua-lia
+ ra-tional real-ly rec-tan-gu-lar re-pack-age re-pack-aged rep-er-toire
+ re-start re-start-ed re-start-able
+ sa-li-ent sched-ul-ing sche-nec-ta-dy scoun-drel scoun-drels ser-geant ser-geants
+ sha-pir-o small-talk so-lo-ist spec-tros-co-py stag-horn ste-reo-spe-cif-ic
+ sto-chas-tic syn-chro-nous syn-chro-nous-ly
+ table tem-po-rar-ily theo-rem time-stamp time-stamps to-ma-to
+ un-pre-dict-able uti-li-za-tion
+ water wave-guide wave-guides weap-on weap-ons which-ever white-space wild-life
+ woman women woman-kind
+ xe-rog-ra-phy
+}
diff --git a/macros/plain/contrib/zztex/tex/zzindexv1.tex b/macros/plain/contrib/zztex/tex/zzindexv1.tex
new file mode 100644
index 0000000000..c809d20c9f
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzindexv1.tex
@@ -0,0 +1,379 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Indexing Facilities, version 1
+%
+% Synopsis: This file contains the tools for producing an index.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 20 May 2006
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Index Version
+% ----- -------
+
+
+\def \indexversion #1{%
+ \input zzindexv#1\relax}
+
+% Define Index Locator Types
+% ------ ----- ------- -----
+
+
+% This list contains the definition of each locator. New ones must be
+% added to the end, and any program looking at the definitions must assume
+% that duplicates may exist, and that the last one prevails.
+
+\def \zixloclist {}
+
+
+%~ This command is deprecated in favor of |\definelocator|.
+
+\def \definelocatortype #1#2#3#4#5#6{% {name}{attributes}{precedence}
+ % {beginning-punc}{templates}
+ % {ending-punc}
+ {\setflag \pg = \true
+ \let \page = \relax
+ \def \nopage {\setflag \pg = \false}%
+ \setflag \txt = \false
+ \def \text {\setflag \txt = \true}%
+ \let \notext = \relax
+ #2%
+ \def \bpunc {#4}%
+ \def \temp {#5}%
+ \def \epunc {#6}%
+ \edef \znext {%
+ \noexpand\append{{#1}{\pg}{\txt}{#3}%
+ {\expandafter\zdefof \meaning\bpunc\zmark}%
+ {\expandafter\zdefof \meaning\temp\zmark}%
+ {\expandafter\zdefof \meaning\epunc\zmark}}}%
+ \znext{\zixloclist}%
+ \if \txt
+ \withname\gdef{\x#1}##1##2{\zixindex{#1}{##1}{S}{##2}}%
+ \if \pg
+ \withname\gdef{\x#1begin}##1##2{\zixindex{#1}{##1}{B}{##2}}%
+ \withname\gdef{\x#1end}##1##2{\zixindex{#1}{##1}{E}{##2}}%
+ \fi
+ \else
+ \withname\gdef{\x#1}##1{\zixindex{#1}{##1}{S}{}}%
+ \if \pg
+ \withname\gdef{\x#1begin}##1{\zixindex{#1}{##1}{B}{}}%
+ \withname\gdef{\x#1end}##1{\zixindex{#1}{##1}{E}{}}%
+ \fi
+ \fi}}
+
+
+% This command is deprecated.
+
+\def \defineindexlocator #1#2#3#4#5#6{% {name}{attributes}{precedence}
+ % {punctuation}{single-template}
+ % {range-template}
+}
+
+% Builtin Locator Types
+% ------- ------- -----
+
+
+% Precedences 0--1 and 6--9 are reserved for specific books.
+
+\definelocatortype{term}{\page\notext}{2.3}
+ {, |}{\bold{~P}|\bold{~P--~Q}|, }{. |}
+\definelocatortype{biblio}{\page\notext}{2.5}
+ {, |}{~P|~P--~Q|, }{. |}
+\definelocatortype{cite}{\page\notext}{2.5}
+ {, |}{~P|~P--~Q|, }{. |}
+\definelocatortype{page}{\page\notext}{2.5}
+ {, |}{~P|~P--~Q|, }{. |}
+\definelocatortype{figure}{\page\notext}{2.7}
+ {, |}{~P\+\emph{f}|~P--~Q\+\emph{f}|, }{. |}
+\definelocatortype{glossary}{\page\notext}{2.7}
+ {, |}{~P\+\emph{g}|~P--~Q\+\emph{g}|, }{. |}
+\definelocatortype{note}{\page\notext}{2.8}
+ {, |}{~P\+\emph{n}|~P--~Q\+\emph{n}|, }{. |}
+\definelocatortype{sidebar}{\page\notext}{2.7}
+ {, |}{~P\+\emph{s}|~P--~Q\+\emph{s}|, }{. |}
+\definelocatortype{table}{\page\notext}{2.7}
+ {, |}{~P\+\emph{t}|~P--~Q\+\emph{t}|, }{. |}
+\definelocatortype{see}{\nopage\text}{3}
+ {. |\See\ }{~T||; }{. |}
+\definelocatortype{seealso}{\nopage\text}{4}
+ {. |\Seealso\ }{~T||; }{. |}
+\definelocatortype{consult}{\nopage\text}{5}
+ {. |\Consult\ }{~T||; }{. |}
+
+% Index Preparation File
+% ----- ----------- ----
+
+
+% The \produceindex command must appear before the \document command.
+
+\setflag \zindexing = \false
+
+
+\def \produceindex #1#2{% {type}{prep-file}
+ {\processdesign{\index}{#1}%
+ \immediate\openout \zwritea = #2.zzh\relax
+ \immediate\write \zwritea {root \jobname}%
+ \immediate\write \zwritea {type #1}%
+ \immediate\write \zwritea {divisions {\the\divisions}}%
+ \immediate\write \zwritea {locators {\the\locators}}%
+ \immediate\write \zwritea {\the\indexparams}%
+ \maplist{\immediate\write \zwritea {define-locator ##1}}{\zixloclist}%
+ \immediate\closeout \zwritea}%
+ \global\setflag \zindexing = \true}
+
+% Index File Handling
+% ----- ---- --------
+
+\definewrite{\zixrootfile}
+\definewrite{\zixdivfile}
+\setflag \zixdivopen = \false
+
+
+\def \zindexinit {%
+ \if \zindexing
+ \immediate\openout \zixrootfile = \jobname.zzi\relax
+ \immediate\write \zixrootfile
+ {\zcomment Raw index entry file for book `\jobname'.}%
+ \fi}
+
+\def \zindexfinal {%
+ \if \zindexing
+ \immediate\write \zixrootfile {\zcomment [end]}%
+ \immediate\closeout \zixrootfile
+ \fi}
+
+\def \zindexdivinit #1{% {division}
+ \if \zindexing
+ \immediate\openout \zixdivfile = #1.zzi\relax
+ \immediate\write \zixdivfile
+ {\zcomment Raw index entry file for book `\jobname', division `#1'.}%
+ \global\setflag \zixdivopen = \true
+ \fi}
+
+\def \zindexdivfinal {%
+ \if \zixdivopen
+ \immediate\write \zixdivfile {\zcomment [end]}%
+ \immediate\closeout \zixdivfile
+ \global\setflag \zixdivopen = \false
+ \fi}
+
+% Generate Index Entry
+% -------- ----- -----
+
+
+% This macro is called from the indexing macros generated by
+% \definelocatortype.
+
+\def \zixindex #1#2#3#4{% {locator}{level}{page-code}{text}
+ \tcounta = #2\relax
+ \if \notp{\rangep{\tcounta}{1}{3}}%
+ \error{invindexlvl}{Invalid index level '#2' specified}%
+ \tcounta = 1
+ \fi
+ \name{\zixindex\romannumeral\tcounta}{#1}{#2}{#3}{#4}}
+
+\def \zixindexi #1#2#3#4#5{%
+ \zixindexw{#1}{#2}{#3}{#4}{#5}{}{}{\noexpand\folio}}
+\def \zixindexii #1#2#3#4#5#6{%
+ \zixindexw{#1}{#2}{#3}{#4}{#5}{#6}{}{\noexpand\folio}}
+\def \zixindexiii #1#2#3#4#5#6#7{%
+ \zixindexw{#1}{#2}{#3}{#4}{#5}{#6}{#7}{\noexpand\folio}}
+
+\catcode"B8 = \catother
+
+\gdef \zixindexw #1#2#3#4#5#6#7#8{% {locator}{level}{page-code}{text}
+ % {heading1}{heading2}{heading3}{page}
+ \if \notp{\zindexing}%
+ \warning{notindexing}{An indexing command was encountered,
+ but no \string\produceindex}%
+ \fi
+ \zbeginhidewrite
+ \def \zhdx {#5}%
+ \def \zhdy {#6}%
+ \def \zhdz {#7}%
+ \def \ztxt {#4}%
+ \edef \znext {#1^^b8%
+ #2^^b8%
+ \expandafter\zdefof \meaning\zhdx\zmark^^b8%
+ \expandafter\zdefof \meaning\zhdy\zmark^^b8%
+ \expandafter\zdefof \meaning\zhdz\zmark^^b8%
+ #3^^b8%
+ #8^^b8%
+ \expandafter\zdefof \meaning\ztxt\zmark}%
+ \write \if \zixdivopen \zixdivfile \else \zixrootfile \fi
+ \expandafter{\znext}%
+ \if \vmodep \repeatpenalty \fi % In case glue follows write.
+ \zendhidewrite}
+
+\catcode"B8 = \catinvalid
+
+% Discussion of Index Formatting
+% ---------- -- ----- ----------
+
+
+% An index is formatted inside an index block, which is more or less
+% like a text block. Within the index block are occurences of the
+% \indexentry macro, one for each entry. In addition, the
+% \alphabreak macro can be used to produce breaks preceding the `A'
+% entries, `B' entries, etc.
+%
+% In an index block, parts 4 and 5 of the mark are used to remember
+% index entries so they can be carried forward to subsequent columns
+% or pages. The mark is used as follows:
+%
+% Part Subpart Usage
+% 4 1 Boolean, true if in the midst of a first-level entry.
+% 4 2 The first-level entry text.
+% 5 1 Boolean, true if in the midst of a second-level entry.
+% 5 2 The second-level entry text.
+
+% Index Block
+% ----- -----
+
+
+\defineblock{\index}{\endindex}{\false}{}
+
+%~block index Type
+% \def \alphaformat ##1{...} % Alpha break formatter.
+% \bodyfont = {\size\style} % Body font.
+% \clubpenalty = penalty % Club penalty is often different.
+% \columngutter = glue % Column gutter.
+% \divisions = {...} % Which divisions to include.
+% \leftindent = glue % Left indentation.
+% \locators = {...} % Which locators to include.
+% \indexparams = {...} % Parameters for index generator.
+% \parhang = glue % Paragraph hang.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \position = {...} % Position and number of columns.
+% \rightindent = glue % Right indentation.
+%~end
+
+\definetoks{\locators}
+\definetoks{\indexparams}
+
+\definecount{\previndexlevel}{0}
+\definecount{\zixcols}{0}
+
+
+\def \index #1{% {type}
+ \blockcantbein{\index}{\index}%
+ \beginblockscope{index}%
+ \global\increment \indexdepth
+ \clubpenalty = \breakallowed %~default soft
+ \parskip = 0pt %~default soft
+ \processdesign{\index}{#1}%
+ \global\increment \indexnumber
+ \def \zixtype {#1}%
+ \zixparsepos
+ \indexformat}
+
+\def \indexformat {%
+ \the\bodyfont
+ \alterindentation{\leftindent}{\rightindent}%
+ \setparrag{\parrag}%
+ \setpagecolumns{\zixpageuse}{\the\zixcols}{\columngutter}%
+ \everycolumn = {\zixcarryover}%
+ \begingroup
+ \let \zfullcolumnbreak = \fullcolumnbreak
+ \let \fullcolumnbreak = \indexbreak
+ \let \shortcolumnbreak = \indexbreak
+ \global\previndexlevel = 0\relax}
+
+\def \endindex {%
+ \endgraf % End last entry.
+ \vbox{}% % Force start of column if not already.
+ \endgroup
+ \clearindexmarks
+ \everycolumn = {}%
+ \setpagecolumns{\usetextmeasure}{1}{0pt}%
+ \global\decrement \indexdepth
+ \endblockscope{index}}
+
+\def \zixparsepos {%
+ \zixcols = 1
+ \let \oneup = \relax
+ \def \twoup {\zixcols = 2}%
+ \def \threeup {\zixcols = 3}%
+ \def \zixpageuse {\usetextmeasure}%
+ \let \textarea = \relax
+ \def \typearea {\def \zixpageuse {\usetypewidth}}%
+ \let \leftmargin = \typearea
+ \the\position}
+
+% Index Entries
+% ----- -------
+
+
+\setflag \zixbreak = \false
+
+
+\def \indexentry #1#2#3{% level{heading}{locators}
+ \endgraf
+ \ifcase #1%
+ \or % Level 1 heading:
+ \clearindexmarks
+ \zixmaybebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixtype entryiformat}{#2\setmarkinfo{4}{\true}{#2}}{#3}}%
+%%% \setmarkinfo{4}{\true}{#2}%
+ \or % Level 2 heading:
+ \setmarkinfo{5}{\false}{}%
+ \zixmaybebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixtype entryiiformat}{#2\setmarkinfo{5}{\true}{#2}}{#3}}%
+%%% \setmarkinfo{5}{\true}{#2}%
+ \or % Level 3 heading:
+ \zixmaybebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixtype entryiiiformat}{#2}{#3}}%
+ \fi
+ \global\previndexlevel = #1\relax}
+
+\def \alphabreak #1{% {text}
+ \endgraf
+ \clearindexmarks
+ \zixmaybebreak
+ \alphaformat{#1}%
+ \endgraf}
+
+\def \indexbreak {%
+ \setflag \zixbreak = \true}
+
+\def \clearindexmarks {%
+ \setmarkinfo{4}{\false}{}%
+ \setmarkinfo{5}{\false}{}}
+
+\def \zixmaybebreak {%
+ \if \zixbreak
+ \zfullcolumnbreak
+ \setflag \zixbreak = \false
+ \fi}
+
+
+% This macro is invoked at the beginning of each column to perform
+% any first- and second-level entry carryovers. It only includes
+% carryovers on the first column of versos.
+
+\def \zixcarryover {%
+ \if \andp{\evenpagep}{\firstcolumnp}%
+ {\setflag \znext = {\markinfo{\bottommark}{4}{1}}%
+ \if \znext
+ \hangindent = \parhang \hangafter = 1
+ \name{\index\zixtype carryiformat}{\markinfo{\bottommark}{4}{2}}%
+ \setflag \znext = {\markinfo{\bottommark}{5}{1}}%
+ \if \znext
+ \hangindent = \parhang \hangafter = 1
+ \name{\index\zixtype carryiiformat}{\markinfo{\bottommark}{5}{2}}%
+ \fi
+ \endgraf
+ \tdimena = \zoutputcoldepth % Compensate for depth of
+ \advance \tdimena by -\prevdepth % previous column v. depth
+ \kern \tdimena % of carryover line(s).
+ \fi}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzindexv2.tex b/macros/plain/contrib/zztex/tex/zzindexv2.tex
new file mode 100644
index 0000000000..e17a73102e
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzindexv2.tex
@@ -0,0 +1,448 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Indexing Facilities, version 2
+%
+% Synopsis: This file contains the facilities for generating index
+% parameter files, raw entry files, and for setting the indexes.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 13 June 2013
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Define Index Locators
+% ------ ----- --------
+
+
+% This list contains the definition of each locator. New ones must be
+% added to the end, and any program looking at the definitions must assume
+% that duplicates may exist and that the last one prevails.
+
+\def \zixloclist {}
+
+
+\def \definelocator #1#2#3{% {type}{attributes}{[format-args]}
+ {\setflag \pg = \false
+ \setflag \rng = \false
+ \setflag \txt = \false
+ \def \page {\setflag \pg = \true}%
+ \def \nopage {\setflag \pg = \false}%
+ \def \range {\setflag \pg = \true \setflag \rng = \true}%
+ \def \norange {\setflag \rng = \false}%
+ \def \text {\setflag \txt = \true}%
+ \def \notext {\setflag \txt = \false}%
+ #2%
+ {\def \attr {#2}%
+ \edef \znext {%
+ \noexpand\append{{#1}{\expandafter\zdefof \meaning\attr\zmark}}}%
+ \znext{\zixloclist}}%
+ \if \andp{\pg}{\notp{\txt}}%
+ \withname\gdef{\x#1}##1{\zixindex{#1}{S}{##1}{}}%
+ \if \rng
+ \withname\gdef{\x#1begin}##1{\zixindex{#1}{B}{##1}{}}%
+ \withname\gdef{\x#1end}##1{\zixindex{#1}{E}{##1}{}}%
+ \fi
+ \else\if \txt
+ \withname\gdef{\x#1}##1##2{\zixindex{#1}{S}{##1}{##2}}%
+ \if \rng
+ \withname\gdef{\x#1begin}##1##2{\zixindex{#1}{B}{##1}{##2}}%
+ \withname\gdef{\x#1end}##1##2{\zixindex{#1}{E}{##1}{##2}}%
+ \fi
+ \else
+ \error{locattr}{Invalid index locator attributes}%
+ \fi\fi
+ \if \notp{\emptyargp{#3}}%
+ \definelocatorformat{#1}#3\relax
+ \fi}}
+
+% Define Locator Formats
+% ------ ------- -------
+
+
+% This list contains the definition of each locator format. It works like
+% the locator list above.
+
+\def \zixformatlist {}
+
+\def \definelocatorformat #1#2#3#4{% {name}{rank.order}{level-1-items}{level-2-items}
+ {\def \lvli {#3}%
+ \def \lvlii {#4}%
+ \edef \znext {%
+ \noexpand\append{{#1}{#2}%
+ {\expandafter\zdefof \meaning\lvli\zmark}%
+ {\expandafter\zdefof \meaning\lvlii\zmark}}}%
+ \znext{\zixformatlist}}}
+
+% Builtin Locator Types
+% ------- ------- -----
+
+
+% These locators are built-in for ease of use. Ranks 0, 1, and 5 and higher
+% are reserved for the user. Ranks 10 and higher result in deferred
+% locators.
+
+\definelocator{page}{\page\range}
+ {{2.1}{prefix1:, |tmplt:?P|rtmplt:?P--?Q|sep:, }{}}
+
+\definelocator{figure}{\page\range}
+ {{2.3}{prefix1:, |tmplt:?P\emph{f}|rtmplt:?P--?Q\emph{f}|sep:, }{}}
+
+\definelocator{note}{\page}
+ {{2.5}{prefix1:, |tmplt:?P\emph{n}|sep:, }{}}
+
+\definelocator{table}{\page\range}
+ {{2.7}{prefix1:, |tmplt:?P\emph{t}|rtmplt:?P--?Q\emph{t}|sep:, }{}}
+
+\definelocator{see}{\nopage\text}
+ {{3}{prefix1:. \emph{See} |tmplt:?T|sep:; }{}}
+
+\definelocator{seealso}{\nopage\text}
+ {{4}{prefix1:. \emph{See also} |tmplt:?T|sep:; }{}}
+
+% Generate Indexes
+% -------- -------
+
+
+\def \zixnamelist {}
+\setflag \zindexing = \false
+
+
+\def \generateindex #1{% {name}
+ \append{#1}{\zixnamelist}%
+ \global\setflag \zindexing = \true}
+
+% Index File Handling
+% ----- ---- --------
+
+%\definewrite{\zixrootfile}
+%\definewrite{\zixdivfile}
+\setflag \zixdivopen = \false
+
+
+\def \zindexinit {%
+ \if \zindexing
+ \maplist{\zixwritezzp{##1}}{\zixnamelist}%
+ \immediate\openout \zixrootfile = \jobname.zzi\relax
+ \immediate\write \zixrootfile
+ {\zcomment Raw index entry file for book `\jobname' root.}%
+ \fi}
+
+\def \zindexfinal {%
+ \if \zindexing
+ \immediate\write \zixrootfile {\zcomment [end]}%
+ \immediate\closeout \zixrootfile
+ \fi}
+
+\def \zindexdivinit #1{% {division}
+ \if \zindexing
+ \immediate\openout \zixdivfile = #1.zzi\relax
+ \immediate\write \zixdivfile
+ {\zcomment Raw index entry file for book `\jobname', division `#1'.}%
+ \global\setflag \zixdivopen = \true
+ \fi}
+
+\def \zindexdivfinal {%
+ \if \zixdivopen
+ \immediate\write \zixdivfile {\zcomment [end]}%
+ \immediate\closeout \zixdivfile
+ \global\setflag \zixdivopen = \false
+ \fi}
+
+\def \zixwritezzp #1{% {name}
+ \begingroup
+ \processdesign{\index}{#1}%
+ \immediate\openout \zwritea = #1.zzp\relax
+ \immediate\write \zwritea {root \jobname;}%
+ \immediate\write \zwritea {index #1;}%
+ \immediate\write \zwritea {divisions \the\divisions;}%
+ \maplist{\immediate\write \zwritea {define-locator ##1;}}{\zixloclist}%
+ \maplist{\immediate\write \zwritea {define-format ##1;}}{\zixformatlist}%
+ \immediate\write \zwritea {locators \the\locators;}%
+ \immediate\write \zwritea {\the\indexparams}%
+ \immediate\closeout \zwritea
+ \endgroup}
+
+% Write Raw Index Entry
+% ----- --- ----- -----
+
+
+% This macro is called from the indexing macros defined by
+% \definelocator.
+
+\def \zixindex #1#2#3#4{% {locator}{page-code}{headings}{[text]}
+ \zixindexb {#1}{#2}{#4}#3|||\zmark}
+
+\catcode"B8 = \catother
+
+\def \zixindexb #1#2#3#4|#5|#6|#7\zmark{% {locator}{page-code}{text}
+ % head1|head2|head3|...\zmark
+ \if \zindexing
+ \zbeginhidewrite
+ \def \zhdx {#4}%
+ \def \zhdy {#5}%
+ \def \zhdz {#6}%
+ \def \ztxt {#3}%
+ \edef \znext {#1^^b8%
+ #2^^b8%
+ \noexpand\folio^^b8%
+ \expandafter\zdefof \meaning\zhdx\zmark^^b8%
+ \expandafter\zdefof \meaning\zhdy\zmark^^b8%
+ \expandafter\zdefof \meaning\zhdz\zmark^^b8%
+ \expandafter\zdefof \meaning\ztxt\zmark}%
+ \write \if \zixdivopen \zixdivfile \else \zixrootfile \fi
+ \expandafter{\znext}%
+ \if \vmodep \repeatpenalty \fi % In case glue follows write.
+ \zendhidewrite
+ \fi}
+
+\catcode"B8 = \catinvalid
+
+% Discussion of Index Formatting
+% ---------- -- ----- ----------
+
+
+% An index is formatted inside an index block, which is more or less
+% like a text block. Within the index block are occurences of the
+% \indexentry macro, one for each entry. In addition, the
+% \alphabreak macro can be used to produce breaks preceding the 'A'
+% entries, 'B' entries, etc.
+%
+% In an index block, parts 4 and 5 of the mark are used to remember
+% index headings so they can be carried forward to subsequent columns
+% or pages. The mark is used as follows:
+%
+% Part Subpart Usage
+% 4 1 Boolean, true if in the midst of a first-level entry.
+% 4 2 The first-level entry heading.
+% 5 1 Boolean, true if in the midst of a second-level entry.
+% 5 2 The second-level entry heading.
+
+% Index Block
+% ----- -----
+
+
+\defineblock{\index}{\endindex}{\false}{redefine}
+
+%~block index Type
+% \def \alphaformat ##1{...} % Alphabetic break formatter.
+% \bodyfont = {\size\style} % Body font.
+% \clubpenalty = penalty % Club penalty is often different.
+% \columngutter = glue % Column gutter.
+% \divisions = {...} % Which divisions to include.
+% \leftindent = glue % Left indentation.
+% \locators = {...} % Which locators to include.
+% \indexparams = {...} % Parameters for index generator.
+% \parhang = glue % Paragraph hang.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \position = {...} % Position and number of columns.
+% \rightindent = glue % Right indentation.
+%~end
+
+%\definetoks{\locators}
+%\definetoks{\indexparams}
+
+%\definecount{\previndexlevel}{0}
+%\definecount{\zixcols}{0}
+
+
+\def \index #1{% {type}
+ \blockcantbein{\index}{\index}%
+ \beginblockscope{index}%
+ \global\increment \indexdepth
+ \clubpenalty = \breakallowed %~default soft
+ \parskip = 0pt %~default soft
+ \processdesign{\index}{#1}%
+ \global\increment \indexnumber
+ \def \zixname {#1}%
+ \zixparsepos
+ \indexformat}
+
+\def \indexformat {%
+ \the\bodyfont
+ \alterindentation{\leftindent}{\rightindent}%
+ \setparrag{\parrag}%
+ \setpagecolumns{\zixpageuse}{\the\zixcols}{\columngutter}%
+ \everycolumn = {\zixcarryover}%
+ \begingroup
+ \let \zfullcolumnbreak = \fullcolumnbreak
+ \let \fullcolumnbreak = \zixcolumnbreak
+ \let \shortcolumnbreak = \zixcolumnbreak
+ \global\previndexlevel = 0\relax}
+
+\def \endindex {%
+ \endgraf % End last entry.
+ \vbox{}% % Force start of column if not already.
+ \endgroup
+ \zclearindexmarks
+ \everycolumn = {}%
+ \setpagecolumns{\usetextmeasure}{1}{0pt}%
+ \global\decrement \indexdepth
+ \endblockscope{index}}
+
+\def \zixparsepos {%
+ \zixcols = 1
+ \def \zixpageuse {\usetextmeasure}%
+ \setflag \zixrunin = \false
+ \let \oneup = \relax
+ \let \outline = \relax
+ \def \runin {\setflag \zixrunin = \true}%
+ \def \threeup {\zixcols = 3}%
+ \def \twoup {\zixcols = 2}%
+ \let \usetextmeasure = \relax
+ \let \usetextwidth = \relax
+ \def \usetypewidth {\def \zixpageuse {\usetypewidth}}%
+ \the\position}
+
+% Format Index Entries
+% ------ ----- -------
+
+
+\setflag \zixbreak = \false
+
+
+% This macro formats the main portion of an index entry.
+
+\def \indexentry #1#2#3{% level{heading}{locators}
+ \ifcase #1%
+ \or % Level 1 heading:
+ \endgraf
+ \zclearindexmarks
+ \zixmaybeforcebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixname entryiformat}{#2\setmarkinfo{4}{\true}{#2}}{#3}}%
+ \or % Level 2 heading:
+ \if \notp{\zixrunin}%
+ \endgraf
+ \if \eqlp{\previndexlevel}{1}\vpenalty{\breaknever}\fi
+ \fi
+ \setmarkinfo{5}{\false}{}%
+ \zixmaybeforcebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixname entryiiformat}{#2\setmarkinfo{5}{\true}{#2}}{#3}}%
+ \or % Level 3 heading:
+ \if \notp{\zixrunin}\endgraf \fi
+ \zixmaybeforcebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixname entryiiiformat}{#2}{#3}}%
+ \fi
+ \global\previndexlevel = #1\relax
+ \ignorespaces}
+
+% This macro format any deferred locators.
+
+\def \indexdeferred #1#2{% level{locators}
+ \ifcase #1%
+ \or % Level 1 deferred locators:
+ \if \notp{\zixrunin}\endgraf \fi
+ \setmarkinfo{5}{\false}{}%
+ \zixmaybeforcebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixname deferrediformat}{#2}}%
+ \or % Level 2 deferred locators:
+ \if \notp{\zixrunin}\endgraf \fi
+ \zixmaybeforcebreak
+ \hangindent = \parhang \hangafter = 1
+ {\name{\index\zixname deferrediiformat}{#2}}%
+ \fi
+ \ignorespaces}
+
+\def \alphabreak #1{% {text}
+ \endgraf
+ \zclearindexmarks
+ \zixmaybeforcebreak
+ \alphaformat{#1}%
+ \endgraf}
+
+\def \zclearindexmarks {%
+ \setmarkinfo{4}{\false}{}%
+ \setmarkinfo{5}{\false}{}}
+
+\def \zixcolumnbreak {%
+ \setflag \zixbreak = \true}
+
+\def \zixmaybeforcebreak {%
+ \if \zixbreak
+ \zfullcolumnbreak
+ \setflag \zixbreak = \false
+ \fi}
+
+
+% This macro is invoked at the beginning of each column to perform
+% any first- and second-level entry carryovers. It only includes
+% carryovers on the first column of versos.
+
+\def \zixcarryover {%
+ \if \andp{\evenpagep}{\firstcolumnp}%
+ {\setflag \znext = {\markinfo{\bottommark}{4}{1}}%
+ \if \znext
+ \hangindent = \parhang \hangafter = 1
+ \name{\index\zixname carryoveriformat}{\markinfo{\bottommark}{4}{2}}%
+ \setflag \znext = {\markinfo{\bottommark}{5}{1}}%
+ \if \znext
+ \hangindent = \parhang \hangafter = 1
+ \name{\index\zixname carryoveriiformat}{\markinfo{\bottommark}{5}{2}}%
+ \fi
+ \endgraf
+ \tdimena = \zoutputcoldepth % Compensate for depth of
+ \advance \tdimena by -\prevdepth % previous column v. depth
+ \kern \tdimena % of carryover line(s).
+ \fi}%
+ \fi}
+
+% Built-in Entry Formats
+% -------- ----- -------
+
+
+% These entry formats and carryovers are for a typical outliine style index.
+
+\def \indexoutlineentryiformat #1#2{%
+ \noindent #1#2\par}
+
+\def \indexoutlineentryiiformat #1#2{%
+ \indent #1#2\par}
+
+\def \indexoutlineentryiiiformat #1#2{%
+ \indent\indent #1#2\par}
+
+\def \indexoutlinedeferrediformat #1{%
+ \indent #1\par}
+
+\def \indexoutlinedeferrediiformat #1{%
+ \indent\indent #1\par}
+
+\def \indexoutlinecarryoveriformat #1{%
+ \noindent #1 \tie{\emph{(continued)}}\par}
+
+\def \indexoutlinecarryoveriiformat #1{%
+ \indent #1 \tie{\emph{(continued)}}\par}
+
+% These entry formats and carryovers are for a typical run-in style index.
+
+\setflag \zixplain = \false
+
+\def \indexruninentryiformat #1#2{%
+ \noindent #1#2%
+ \global\setflag \zixplain = {\emptyargp{#2}}%
+ \if \zixplain :\space \fi}
+
+\def \indexruninentryiiformat #1#2{%
+ \if \notp{\zixplain};\space \fi
+ \global\setflag \zixplain = \false
+ #1#2}
+
+\def \indexruninentryiiiformat #1#2{%
+ \error{runiniii}{It makes no sense to have level-3 entries in a run-in index}}
+
+\def \indexrunindeferrediformat #1{%
+ . #1}
+
+\def \indexrunincarryoveriformat #1{%
+ \noindent #1 \tie{\emph{(continued)}}\par}
+
+\def \indexrunincarryoveriiformat #1{%
+ \relax}
diff --git a/macros/plain/contrib/zztex/tex/zzio.tex b/macros/plain/contrib/zztex/tex/zzio.tex
new file mode 100644
index 0000000000..04a3fbbfac
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzio.tex
@@ -0,0 +1,84 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX I/O Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 9 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Terminal & Log I/O
+% -------- - --- ---
+
+% \message writes to the terminal and the log file, without newlines.
+% This macro adds a newline feature:
+
+\def \messagenl #1{% {text}
+ {\newlinechar = `\_%
+ \message{#1}}}
+
+% This macro writes a line to the log file, with a newline at the end.
+
+\def \writelog {\immediate\write -1}
+
+% \ask combines a prompt using \messagenl with a read from the terminal.
+
+\def \ask #1#2{% {\result-macro}{question}
+ {\messagenl{_#2}%
+ \endlinechar = -1
+ \global\read 16 to #1}}
+
+% Including Files
+% --------- -----
+
+
+\def \include #1{% {file}
+ {\checkfile{\zifile}{#1}%
+ \if \zifile
+ \gdef \znext {\input #1\relax}%
+ \else
+ \warning{noinclfile}{File `#1' does not exist}%
+ \ask{\newfile}{Enter a new file name, or a period (.) to skip it.}%
+ \stringeql{\znext}{\newfile}{.}%
+ \if \znext
+ \xdef \znext {}%
+ \else
+ \xdef \znext {\noexpand\include{\newfile}}%
+ \fi
+ \fi}%
+ \znext
+ \endgraf}
+
+\def \zportionid {}
+
+\def \includeportion #1#2{% {file}{portion-id}
+ \gdef \zportionid {#2}%
+ \include{#1}%
+ \gdef \zportionid {}}
+
+\def \portion #1{% {portion-id}
+ \stringeql{\znext}{#1}{\zportionid}%
+ \if \znext}
+
+\let \endportion = \fi
+
+\def \includeifexists #1{% {file}
+ \checkfile{\zifile}{#1}%
+ \if \zifile
+ \input #1\relax
+ \endgraf
+ \fi}
+
+% Utilities
+% ---------
+
+
+\def \checkfile #1#2{% {\result-flag}{file}
+ \openin \zreada #2\relax
+ \setflag #1= {\notp{\eofp{\zreada}}}%
+ \closein \zreada}
diff --git a/macros/plain/contrib/zztex/tex/zzlist.tex b/macros/plain/contrib/zztex/tex/zzlist.tex
new file mode 100644
index 0000000000..197090d153
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzlist.tex
@@ -0,0 +1,163 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX List Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 12 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% List Block
+% ---- -----
+
+
+\defineblock{\list}{\endlist}{\false}{}
+\resetinvcontext{\list}
+
+%~block list Type, Level
+% \abovepenalty = integer % Penalty above list.
+% \aboveskip = glue % Space b/b above list.
+% \setflag \allowitemtag = flag % Allow \tag command on item.
+% \belowpenalty = integer % Penalty below list.
+% \belowskip = glue % Space b/b below list.
+% \bodyfont = {...} % Font for text.
+% \def \endpartext {...} % Text at end of each paragraph.
+% \interitemskip = skip % Extra space between items.
+% \itemnumber = integer % Number of first item.
+% \def \labelformat ##1{...} % Item label formatter.
+% \labelshift = dimen % Horizontal shift of label.
+% \def \labeltext {...} % Label text or \arg if \item{...}.
+% \labelwidth = dimen % Width of label or \naturalwidth.
+% \leftindent = glue % Left indentation.
+% \parindent = glue % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \rightindent = glue % Right indentation.
+% \def \tagcomptext {...} % Composite text for tag, if not label.
+% \width = dimen % Width of text.
+%~end
+
+\defineskip{\interitemskip}{0pt}
+\definedimen{\labelshift}{0pt}
+\definedimen{\labelwidth}{0pt}
+
+\definecount{\nextitemnumber}{0}
+
+
+\def \list #1{% {type}
+ \endgraf
+ \beginblockscope{list}%
+ \global\increment \listdepth
+ \abovepenalty = \breakgood %~default hard
+ \setflag \allowitemtag = \false %~default soft
+ \belowpenalty = \breakgood %~default hard
+ \def \endpartext {}% %~default hard
+ \itemnumber = 1 %~default with
+ \def \tagcomptext {}% %~default soft
+ \processdesign{\list}{#1\romannumeral\listdepth}%
+ \global\increment \listnumber
+ \decrement \itemnumber
+ \listformat
+ \def \par {\endpartext \endgraf}%
+ \settaginfo{}{}} % No tag info so far.
+
+\def \endlist {%
+ \par
+ \futurelet\nexttoken \zendlist}
+
+\def \zendlist {%
+ \closeifinblock{\item}{\enditem}%
+ \endlistformat
+ \if \onep{\listdepth}%
+ \global\nextitemnumber = \itemnumber
+ \global\increment \nextitemnumber
+ \fi
+ \global\decrement \listdepth
+ \endblockscope{list}%
+ \parnext}
+
+\def \listformat {%
+ \the\bodyfont
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{\parrag}%
+ \advance \interitemskip by \baselineskip}
+
+\def \endlistformat{%
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+
+% This macro helps with a list design that involves measuring some text.
+
+\def \setmeasuredlabel #1#2#3{% {extra-indent}{template}{formatter}
+ \def \labelformat ##1{#3}%
+ \measuretextwidth{\labelwidth}{#2}%
+ \labelshift = -\labelwidth
+ \leftindent = \labelwidth
+ \advance \leftindent by #1\relax}
+
+\def \adjustinteritemskip #1{% {amount} %^modifier
+ \with{\advance\interitemskip by #1}}
+
+%~ This modifier on |\list| is used when a list immediately follows
+%~ an |\item| command; that is, when an item is a sublist.
+%~ It eliminates the vertical space above the sublist.
+
+\def \immediatesublist {% %^modifier
+ \with{\abovepenalty = \breaknever
+ \aboveskip = 0pt}}
+
+% Item Block
+% ---- -----
+
+% The \item block is subordinate to the \list block, and thus inherits all
+% of its design parameters from \list.
+
+
+\defineblock{\item}{\enditem}{\false}{}
+
+%~block item
+% \difficulty = integer % Level of difficulty.
+%~end
+
+\def \item {% [{label}]
+ \blockmustbein{\item}{\list}%
+ \closeifinblock{\item}{\enditem}%
+ % Don't bother with block scope.
+ \difficulty = 0 %~default with
+ \zprocesswith % Instead of \processdesign.
+ \increment \itemnumber
+ \bbskipabove{\breakgood}{\interitemskip}%
+ \def \zarg {\arg}%
+ \if \tokeqlp{\labeltext}{\zarg}%
+ \def \znext {\itemformat}%
+ \else
+ \def \znext {\itemformat{\labeltext}}%
+ \fi
+ \znext}
+
+\def \enditem {%
+ \par}
+
+\def \itemformat #1{% {label}
+ \noindent
+ \kern \labelshift
+ \if \dimeqlp{\labelwidth}{\naturalwidth}%
+ {\labelformat{#1}}%
+ \else
+ \hbox to \labelwidth{\labelformat{#1}}%
+ \fi
+ \if \allowitemtag
+ \if \emptydefp{\tagcomptext}%
+ \settaginfo{#1}{???}%
+ \else
+ \settaginfo{\tagcomptext}{???}%
+ \fi
+ \fi
+ \ignorespaces}
diff --git a/macros/plain/contrib/zztex/tex/zzltrspc.tex b/macros/plain/contrib/zztex/tex/zzltrspc.tex
new file mode 100644
index 0000000000..7fcd6e5d72
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzltrspc.tex
@@ -0,0 +1,111 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: Letterspacing Facility
+%
+% Synopsis: This module provides a fairly comprehensive letterspacing
+% facility for ZzTeX.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 10 July 1997
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Letterspacing Commands
+% ------------- --------
+
+
+\defineskip{\zlspamount}{0pt}
+\defineskip{\zlspace}{0pt}
+
+
+\def \letterspace #1#2{% {amount[,space]}{text}
+ {\zlspparse #1,,\zmark
+ \zletterspace{#2}}}
+
+\def \eletterspace #1#2{% {amount[,space]}{text}
+ \edef \znext {\noexpand\letterspace{#1}{#2}}%
+ \znext}
+
+\def \zlspparse #1,#2,#3\zmark{%
+ \zlspamount = #1\relax
+ \if \emptyargp{#2}%
+ \measurespacewidth{\zlspace}%
+ \advance \zlspace by \zlspamount
+ \else
+ \zlspace = #2\relax
+ \fi}
+
+% These commands can be used in letterspaced text, but must do nothing
+% when letterspacing is not in progress.
+
+\let \lsp = \relax
+\let \nolsp = \relax
+\def \lspspace {\space}%
+\def \zlspoff {\relax}%
+\def \lspoff {\zlspoff}%
+\def \zlspon {\relax}%
+\def \lspon {\zlspon}%
+
+% Letterspacing Engine
+% ------------- ------
+
+
+\def \zletterspace #1{% {text}
+ \def \lsp {\nobreak\hskip \zlspamount}%
+ \def \lspspace {\hskip \zlspace}%
+ \def \zzlspoff {\zlspoff}%
+ \def \zzlspon {\zlspon}%
+ \setflag \zlsping = \true
+ \let \zlspprev = \relax
+ \setflag \zlspprevchar = \false
+ \let \zmark = \relax
+ {\zlspa #1\zmark}}
+
+\def \zlspa {\futurelet\zlspcur \zlspb}
+
+\def \zlspb {%
+ \let \znext = \zlspc
+ \if \tokeqlp{\zlspcur}{\zmark}%
+ \let \znext = \relax
+ \else\if \cateqlp{\noexpand\zlspcur}{\zspacetoken}%
+ \if \zlsping \aftergroup\lspspace \else \aftergroup\space \fi
+ \else\if \cateqlp{\noexpand\zlspcur}{\bgroup}%
+ \aftergroup{%
+ \else\if \cateqlp{\noexpand\zlspcur}{\egroup}%
+ \aftergroup}%
+ \else\if \tokeqlp{\zlspcur}{\zzlspoff}%
+ \setflag \zlsping = \false
+ \else\if \tokeqlp{\zlspcur}{\zzlspon}%
+ \setflag \zlsping = \true
+ \else
+ \let \znext = \zlspd
+ \fi\fi\fi\fi\fi\fi
+ \znext}
+
+\def \zlspc {% Discard current token.
+ \let \zlspprev = \zlspcur
+ \setflag \zlspprevchar = \false
+ \afterassignment\zlspa \let\zlspcur = }
+
+\long\def \zlspd #1{% Process current token.
+ \let \zlspprev = \zlspcur
+ \if \cateqlp{\noexpand#1}{\relax}%
+ \setflag \zlspprevchar = \false
+ \aftergroup#1%
+ \else\if \cateqlp{\noexpand#1}{\noexpand~}%
+ \setflag \zlspprevchar = \false
+ \if \zlsping \aftergroup\lspspace \else \aftergroup\space \fi
+ \else\if \orp{\andp{\codeeqlp{\zlspprev}{-}}{\codeeqlp{\zlspcur}{-}}}
+ {\orp{\andp{\codeeqlp{\zlspprev}{`}}{\codeeqlp{\zlspcur}{`}}}
+ {\andp{\codeeqlp{\zlspprev}{'}}{\codeeqlp{\zlspcur}{'}}}}%
+ \setflag \zlspprevchar = \true
+ \aftergroup#1%
+ \else
+ \if \andp{\zlspprevchar}{\zlsping}\aftergroup\lsp \fi
+ \setflag \zlspprevchar = \true
+ \aftergroup#1%
+ \fi\fi\fi
+ \zlspa}
diff --git a/macros/plain/contrib/zztex/tex/zzlucida.tex b/macros/plain/contrib/zztex/tex/zzlucida.tex
new file mode 100644
index 0000000000..6bfc5e5554
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzlucida.tex
@@ -0,0 +1,140 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Lucida Math Font Support
+%
+% Synopsis: This module contains various definitions and redefinitions
+% necessary to use the Lucida math fonts.
+%
+% Note: This module assumes the user is generating PostScript output.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 27 June 1992
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Type Styles
+% ---- ------
+
+\setstyleskewchar{\msy}{"7F}
+\setstyleskewchar{\msy}{"30}
+
+% Redefine Math Characters
+% -------- ---- ----------
+
+
+\zmchar \Gamma \classvarfam \mexfam {D0}
+\zmchar \Delta \classvarfam \mexfam {D1}
+\zmchar \Theta \classvarfam \mexfam {D2}
+\zmchar \Lambda \classvarfam \mexfam {D3}
+\zmchar \Xi \classvarfam \mexfam {D4}
+\zmchar \Pi \classvarfam \mexfam {D5}
+\zmchar \Sigma \classvarfam \mexfam {D6}
+\zmchar \Upsilon \classvarfam \mexfam {D7}
+\zmchar \Phi \classvarfam \mexfam {D8}
+\zmchar \Psi \classvarfam \mexfam {D9}
+\zmchar \Omega \classvarfam \mexfam {DA}
+
+\zmchar {`=} \classrel \msyfam {83}
+\zmchar {`+} \classbinop \msyfam {82}
+
+\definemathdelimiter {`/} \classord \mitfam {3D} \mexfam {0E}
+
+\zmchar {`(} \classopen \mitfam {84}
+\definemathdelimiter {`(} \classord \mitfam {84} \mexfam {00}
+\zmchar {`)} \classclose \mitfam {85}
+\definemathdelimiter {`)} \classord \mitfam {85} \mexfam {01}
+
+\zmchar {`[} \classopen \mitfam {86}
+\definemathdelimiter {`[} \classord \mitfam {86} \mexfam {02}
+\zmchar {`]} \classclose \mitfam {87}
+\definemathdelimiter {`]} \classord \mitfam {87} \mexfam {03}
+
+\zmchar \angle \classord \msyfam {8B}
+\zmchar \bowtie \classrel \mitfam {F6}
+\zmchar \cong \classrel \msyfam {9B}
+\zmchar \doteq \classrel \msyfam {C9}
+\zmchar \models \classrel \msyfam {EE}
+
+ \if \zusemar
+\zmchar \hbar \classord \mitfam {9D}
+\zmchar \hookleftarrow \classrel \marfam {3C}
+\zmchar \hookrightarrow \classrel \marfam {3E}
+\zmchar \leftrightharpoons \classrel \marfam {79}
+\zmchar \mapsto \classrel \marfam {2C}
+\zmchar \neq \classrel \marfam {94}
+\zmchar \rightleftharpoons \classrel \marfam {7A}
+ \fi
+
+% New Math Characters
+% --- ---- ----------
+
+
+ \if \zusemar
+\zmchar \notapprox \classrel \marfam {98}
+\zmchar \notasymp \classrel \marfam {F3}
+\zmchar \notcong \classrel \marfam {99}
+\zmchar \noteq \classrel \marfam {94}
+\zmchar \notequiv \classrel \marfam {95}
+\zmchar \notgeq \classrel \marfam {9D}
+\zmchar \notgreater \classrel \marfam {9B}
+\zmchar \notin \classrel \marfam {1D}
+\zmchar \notleq \classrel \marfam {9C}
+\zmchar \notless \classrel \marfam {9A}
+\zmchar \notmid \classrel \marfam {F6}
+\zmchar \notmodels \classrel \marfam {F9}
+\zmchar \notni \classrel \marfam {1F}
+\zmchar \notparallel \classrel \marfam {F7}
+\zmchar \notprec \classrel \marfam {E5}
+\zmchar \notpreceq \classrel \marfam {E7}
+\zmchar \notsim \classrel \marfam {96}
+\zmchar \notsimeq \classrel \marfam {97}
+\zmchar \notsqsubseteq \classrel \marfam {D4}
+\zmchar \notsqsupseteq \classrel \marfam {D5}
+\zmchar \notsubset \classrel \marfam {C6}
+\zmchar \notsubseteq \classrel \marfam {C8}
+\zmchar \notsucc \classrel \marfam {E6}
+\zmchar \notsucceq \classrel \marfam {E8}
+\zmchar \notsupset \classrel \marfam {C7}
+\zmchar \notsupseteq \classrel \marfam {C9}
+\zmchar \notvdash \classrel \marfam {F8}
+ \fi
+
+% Redefine General Tools
+% -------- ------- -----
+
+
+\def \big #1{{\hbox{$\left#1\vbox to 8.2pt{}\right.\zmnosp$}}}
+\def \Big #1{{\hbox{$\left#1\vbox to 10.8pt{}\right.\zmnosp$}}}
+\def \bigg #1{{\hbox{$\left#1\vbox to 13.42pt{}\right.\zmnosp$}}}
+\def \Bigg #1{{\hbox{$\left#1\vbox to 16.03pt{}\right.\zmnosp$}}}
+\def \biggg #1{{\hbox{$\left#1\vbox to 17.72pt{}\right.\zmnosp$}}}
+\def \Biggg #1{{\hbox{$\left#1\vbox to 21.25pt{}\right.\zmnosp$}}}
+
+\def \bigggl {\mathopen\biggg}
+\def \Bigggl {\mathopen\Biggg}
+\def \bigggr {\mathclose\biggg}
+\def \Bigggr {\mathclose\Biggg}
+
+\def \joinrel {\mathrel{\mkern -4mu}}
+
+\def \mathstrut {\vphantom{f}}
+
+\def \matrix #1{%
+ \null\nonscript\,%
+ \vcenter{\normalbaselines
+ \ialign{\hfil $##$\hfil&& \quad \hfil $##$\hfil \crcr
+ \mathstrut\crcr
+ \noalign{\kern -0.9\baselineskip}%
+ #1\crcr
+ \mathstrut\crcr
+ \noalign{\kern -0.9\baselineskip}}}%
+ \nonscript\,}
+
+\def \zroot #1#2{% {\style}{radicand}
+ \setbox\zboxa = \hbox{$#1\sqrt{#2}$}%
+ \tdimena = \ht\zboxa
+ \advance \tdimena by -\dp\zboxa
+ \mkern 5mu \raise .6\tdimena \copy\zrootbox \mkern -8mu \box\zboxa}
diff --git a/macros/plain/contrib/zztex/tex/zzmath.tex b/macros/plain/contrib/zztex/tex/zzmath.tex
new file mode 100644
index 0000000000..9a39dd2f0b
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmath.tex
@@ -0,0 +1,1919 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities of
+% ZzTeX. All of the Plain TeX math stuff is included.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 14 November 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Math Version
+% ---- -------
+
+
+\definecount{\zmathver}{0}
+
+
+\def \mathversion #1{%
+ \global\zmathver = #1\relax
+ \input zzmathv#1\relax}
+
+% Alternate Math Fonts
+% --------- ---- -----
+
+
+\outer\def \ComputerModernmathfonts {%
+ \input zzcmmath\relax}
+
+\outer\def \Lucidamathfonts #1{% {arrows?}
+ \setflag \zusemar = #1\relax
+ \input zzlucida\relax}
+
+\outer\def \MathTimefonts {%
+ \input zzmtime\relax}
+
+% Spacing
+% -------
+
+
+% Note major uses of each kind of space:
+% thin: around large operators; after punctuation
+% medium: around binary operators
+% thick: around relational operators
+
+\def \setmathspaces #1#2#3{% {thin}{medium}{thick}
+ \global\thinmuskip = #1\relax
+ \global\medmuskip = #2\relax
+ \global\thickmuskip = #3\relax}
+
+\def \mthickspace {\mkern 2\thinmuskip}
+
+\def \mthinspace {\mkern \thinmuskip}
+\def \mnegthinspace {\mkern -\thinmuskip}
+
+\def \mspace #1{\mkern #1\relax}% {mu}
+
+% Math mode \, \; \! are in ZZHMODE.
+
+\def \setTeXmathspaces {%
+ \setmathspaces{3mu}{4mu plus 2mu minus 4mu}{5mu plus 5mu}}
+
+% Character Definition
+% --------- ----------
+
+
+% These are the math character classes:
+
+\chardef \classord = 0 % An ordinary symbol (\alpha). %^math_class
+\chardef \classlargeop = 1 % A large operator (\sum).. %^math_class
+\chardef \classbinop = 2 % A binary operator (+). %^math_class
+\chardef \classrel = 3 % A relation (=). %^math_class
+\chardef \classopen = 4 % An opening fence ([). %^math_class
+\chardef \classclose = 5 % A closing fence (]). %^math_class
+\chardef \classpunc = 6 % A punctuation character (,). %^math_class
+\chardef \classvarfam = 7 % A character that varies with \fam (\Gamma). %^math_class
+\chardef \classactive = 8 % An active character ('). %^math_class
+
+
+\def \definemathaccent #1#2#3#4{% {name}{class}{family}{hex-code}
+ {\zcalcmathcode{#2}{#3}{#4}%
+ \xdef #1{\mathaccent \the\tcounta\relax}}%
+ \ignorespaces}
+
+\def \definemathchar #1#2#3#4{% {name}{class}{family}{hex-code}
+ {\zcalcmathcode{#2}{#3}{#4}%
+ \zdefmathch#1\zmark
+ \if \znext
+ \global\mathcode #1= \tcounta
+ \else
+ \global\mathchardef #1= \tcounta
+ \fi}%
+ \ignorespaces}
+
+\def \definemathdelimiter #1#2#3#4#5#6{% {name}{class}{fam1}{hex1}{fam2}{hex2}
+ {\zcalcmathcode{#2}{#3}{#4}%
+ \multiply \tcounta by 16
+ \advance \tcounta by #5
+ \multiply \tcounta by 256
+ \advance \tcounta by "#6\relax
+ \zdefmathch#1\zmark
+ \if \znext
+ \global\delcode #1= \tcounta
+ \else
+ \xdef #1{\delimiter\the\tcounta\relax}%
+ \fi}%
+ \ignorespaces}
+
+\def \definemathjoinedsymbol #1#2#3#4#5{% {name}{atom}{char1}{char2}{sep}
+ \gdef #1{#2{{#3}\mspace{#5mu}{#4}}}}
+
+\def \definemathlabeledarrow #1#2#3#4{% {name}{atom}{label}{arrow}
+ \gdef #1{#2{\mathop{#4}\limits^{#3}}}}
+
+\def \definemathstackedsymbol #1#2#3#4#5{% {name}{atom}{char1}{char2}{sep}
+ \gdef #1{#2{\mathpalette\zstksym{{#3}{#4}{#5}}}}}
+
+
+\def \zcalcmathcode #1#2#3{% {class}{family}{hex-code}
+ \tcounta = #1
+ \multiply \tcounta by 16
+ \advance \tcounta by #2
+ \multiply \tcounta by 256
+ \advance \tcounta by "#3\relax}
+
+\def \zdefmathch #1#2\zmark{%
+ \setflag\znext = {\if `\noexpand#1\true \else \false \fi}}
+
+\definedimen{\muwidth}{0pt}
+
+\def \zstksym #1#2{% {style}{{char1}{char2}{sep}}
+ \zstksymb #1#2}
+
+\def \zstksymb #1#2#3#4{% {style}{char1}{char2}{sep}
+ \vcenter{\baselineskip = 0pt
+ \lineskiplimit = -\maxdimen
+ \setbox \zboxa = \hbox{$#1\mkern 1mu$}%
+ \muwidth = \wd\zboxa
+ \ialign{\hfil ##\hfil\cr
+ \raise #4\muwidth \hbox{$#1#2$}\cr
+ $#1#3$\cr}}}
+
+% Character Styles
+% --------- ------
+
+
+\definecount{\zmstyfam}{0}
+
+
+\def \setmathdigitstyle #1{% {style}
+ {\tcounta = "\the\classvarfam0
+ \advance \tcounta by \name{#1fam}%
+ \multiply \tcounta by 256
+ \advance \tcounta by `\0%
+ \tcountb = `0
+ \loop
+ \global\mathcode \tcountb = \tcounta
+ \increment \tcounta
+ \increment \tcountb
+ \if \lssp{\tcountb}{`\:}\repeat}}
+
+\def \setmathletterstyle #1{% {\style}
+ {\tcounta = "\the\classvarfam0
+ \advance \tcounta by \name{#1fam}%
+ \multiply \tcounta by 256
+ \advance \tcounta by `\A%
+ \tcountb = `A
+ \loop
+ \global\mathcode \tcountb = \tcounta
+ \increment \tcounta
+ \increment \tcountb
+ \if \lssp{\tcountb}{`\[}\repeat
+ \advance \tcounta by 6
+ \tcountb = `\a
+ \loop
+ \global\mathcode \tcountb = \tcounta
+ \increment \tcounta
+ \increment \tcountb
+ \if \lssp{\tcountb}{`\{}\repeat}%
+ \if \zcommonencoding
+ \def \znext {#1}%
+ \def \zit {\it}%
+ \if \tokeqlp{\znext}{\zit}\setstyleskewchar{#1}{7}\fi
+ \fi}
+
+\def \setmathucgreekstyle #1{% {style}
+ {\zmstyfam = \name{#1fam}%
+\definemathchar \Alpha \classvarfam \rmfam {41}
+\definemathchar \Beta \classvarfam \rmfam {42}
+\definemathchar \Gamma \classvarfam \zmstyfam {00}
+\definemathchar \Delta \classvarfam \zmstyfam {01}
+\definemathchar \Epsilon \classvarfam \rmfam {45}
+\definemathchar \Zeta \classvarfam \rmfam {5A}
+\definemathchar \Eta \classvarfam \rmfam {48}
+\definemathchar \Theta \classvarfam \zmstyfam {02}
+\definemathchar \Iota \classvarfam \rmfam {49}
+\definemathchar \Kappa \classvarfam \rmfam {4B}
+\definemathchar \Lambda \classvarfam \zmstyfam {03}
+\definemathchar \Mu \classvarfam \rmfam {4D}
+\definemathchar \Nu \classvarfam \rmfam {4E}
+\definemathchar \Xi \classvarfam \zmstyfam {04}
+\definemathchar \Omicron \classvarfam \rmfam {4F}
+\definemathchar \Pi \classvarfam \zmstyfam {05}
+\definemathchar \Rho \classvarfam \rmfam {50}
+\definemathchar \Sigma \classvarfam \zmstyfam {06}
+\definemathchar \Tau \classvarfam \rmfam {54}
+\definemathchar \Upsilon \classvarfam \zmstyfam {07}
+\definemathchar \Phi \classvarfam \zmstyfam {08}
+\definemathchar \Chi \classvarfam \rmfam {58}
+\definemathchar \Psi \classvarfam \zmstyfam {09}
+\definemathchar \Omega \classvarfam \zmstyfam {0A}}}
+
+\def \zmtextstyle {\rm}
+\def \zmtextfam {\rmfam}
+
+\def \setmathtextstyle #1{% {style}
+ \gdef \zmtextstyle {#1}%
+ \xdef \zmtextfam {\name{#1fam}}}
+
+\def \zmfunstyle {\rm}
+
+\def \setmathfunctionstyle #1{% {style}
+ \gdef \zmfunstyle {#1}}
+
+\def \zmvarstyle {\it}
+
+\def \setmathmvarstyle #1{% {style}
+ \gdef \zmvarstyle {#1}}
+
+\def \setmathpunctuationstyle #1{% {style}
+ {\zmstyfam = \name{#1fam}%
+ \definemathchar {`.} \classord \zmstyfam {2E}
+ \definemathchar {`,} \classpunc \zmstyfam {2C}
+ \definemathchar {`;} \classpunc \zmstyfam {3B}}}
+
+% Characters
+% ----------
+
+
+\let \zmchar = \definemathchar
+
+
+% Letters:
+
+% INITEX does the following for each letter:
+%
+% \definemathchar{letter}{\classvarfam}{\mit}{xx}
+%
+% This can be changed using the \setmathletterstyle command above.
+
+
+% Figures (digits):
+
+% INITEX does the following for each digit:
+%
+% \definemathchar{digit}{\classvarfam}{\rm}{xx}
+%
+% This can be changed using the \setmathdigitstyle command above.
+
+
+% Uppercase Greek letters:
+
+% This can be changed using the \setmathucgreekstyle command above.
+
+\setmathucgreekstyle{\rm}
+
+
+% Lowercase Greek letters:
+
+\zmchar \alpha \classord \mitfam {0B}
+\zmchar \beta \classord \mitfam {0C}
+\zmchar \gamma \classord \mitfam {0D}
+\zmchar \delta \classord \mitfam {0E}
+\zmchar \epsilon \classord \mitfam {0F}
+\zmchar \zeta \classord \mitfam {10}
+\zmchar \eta \classord \mitfam {11}
+\zmchar \theta \classord \mitfam {12}
+\zmchar \iota \classord \mitfam {13}
+\zmchar \kappa \classord \mitfam {14}
+\zmchar \lambda \classord \mitfam {15}
+\zmchar \mu \classord \mitfam {16}
+\zmchar \nu \classord \mitfam {17}
+\zmchar \xi \classord \mitfam {18}
+\zmchar \omicron \classord \mitfam {6F}
+\zmchar \pi \classord \mitfam {19}
+\zmchar \rho \classord \mitfam {1A}
+\zmchar \sigma \classord \mitfam {1B}
+\zmchar \tau \classord \mitfam {1C}
+\zmchar \upsilon \classord \mitfam {1D}
+\zmchar \phi \classord \mitfam {1E}
+\zmchar \chi \classord \mitfam {1F}
+\zmchar \psi \classord \mitfam {20}
+\zmchar \omega \classord \mitfam {21}
+
+\zmchar \varepsilon \classord \mitfam {22}
+\zmchar \vartheta \classord \mitfam {23}
+\zmchar \varpi \classord \mitfam {24}
+\zmchar \varrho \classord \mitfam {25}
+\zmchar \varsigma \classord \mitfam {26}
+\zmchar \varphi \classord \mitfam {27}
+
+
+% Ordinary symbols:
+
+\zmchar {`.} \classord \rmfam {2E}
+\zmchar {`/} \classord \mitfam {3D}
+\zmchar \zmbackslash \classord \msyfam {6E}
+\zmchar {`|} \classord \msyfam {6A}
+\zmchar \aleph \classord \msyfam {40}
+\zmchar \bot \classord \msyfam {3F}
+\zmchar \clubsuit \classord \msyfam {7C}
+\zmchar \diamondsuit \classord \msyfam {7D}
+\zmchar \ell \classord \mitfam {60}
+\zmchar \emptyset \classord \msyfam {3B}
+\zmchar \exists \classord \msyfam {39}
+\zmchar \flat \classord \mitfam {5B}
+\zmchar \forall \classord \msyfam {38}
+\zmchar \heartsuit \classord \msyfam {7E}
+\zmchar \Im \classord \msyfam {3D}
+\zmchar \imath \classord \mitfam {7B}
+\zmchar \infinity \classord \msyfam {31}
+\let \infty = \infinity
+\zmchar \jmath \classord \mitfam {7C}
+\zmchar \nabla \classord \msyfam {72}
+\zmchar \natural \classord \mitfam {5C}
+\zmchar \neg \classord \msyfam {3A}
+\let \lnot = \neg
+\zmchar \partial \classord \mitfam {40}
+\zmchar \prime \classord \msyfam {30}
+\zmchar \Re \classord \msyfam {3C}
+\zmchar \sharp \classord \mitfam {5D}
+\zmchar \spadesuit \classord \msyfam {7F}
+\zmchar \surd \classord \msyfam {70}
+\zmchar \top \classord \msyfam {3E}
+\zmchar \triangle \classord \msyfam {34}
+\zmchar \wp \classord \mitfam {7D}
+
+
+% Large operations:
+
+\zmchar \bigcap \classlargeop \mexfam {54}
+\zmchar \bigcup \classlargeop \mexfam {53}
+\zmchar \bigodot \classlargeop \mexfam {4A}
+\zmchar \bigoplus \classlargeop \mexfam {4C}
+\zmchar \bigotimes \classlargeop \mexfam {4E}
+\zmchar \bigsqcup \classlargeop \mexfam {46}
+\zmchar \biguplus \classlargeop \mexfam {55}
+\zmchar \bigvee \classlargeop \mexfam {57}
+\zmchar \bigwedge \classlargeop \mexfam {56}
+\zmchar \coprod \classlargeop \mexfam {60}
+\zmchar \intop \classlargeop \mexfam {52}
+\zmchar \ointop \classlargeop \mexfam {48}
+\zmchar \prod \classlargeop \mexfam {51}
+\zmchar \smallint \classlargeop \msyfam {73}
+\zmchar \sum \classlargeop \mexfam {50}
+
+
+% Binary operations:
+
+\zmchar {`*} \classbinop \msyfam {03}
+\zmchar {`+} \classbinop \rmfam {2B}
+\zmchar {`-} \classbinop \msyfam {00}
+\zmchar \amalg \classbinop \msyfam {71}
+\zmchar \ast \classbinop \msyfam {03}
+\zmchar \bigcirc \classbinop \msyfam {0D}
+\zmchar \bigtriangledown \classbinop \msyfam {35}
+\zmchar \bigtriangleup \classbinop \msyfam {34}
+\zmchar \zmbullet \classbinop \msyfam {0F}
+\zmchar \cap \classbinop \msyfam {5C}
+\zmchar \cdot \classbinop \msyfam {01}
+\zmchar \circ \classbinop \msyfam {0E}
+\let \compose = \circ
+\zmchar \cup \classbinop \msyfam {5B}
+\zmchar \zmdagger \classbinop \msyfam {79}
+\zmchar \zmddagger \classbinop \msyfam {7A}
+\zmchar \diamond \classbinop \msyfam {05}
+\zmchar \div \classbinop \msyfam {04}
+\zmchar \mp \classbinop \msyfam {07}
+\zmchar \odot \classbinop \msyfam {0C}
+\zmchar \ominus \classbinop \msyfam {09}
+\zmchar \oplus \classbinop \msyfam {08}
+\zmchar \oslash \classbinop \msyfam {0B}
+\zmchar \otimes \classbinop \msyfam {0A}
+\zmchar \pm \classbinop \msyfam {06}
+\zmchar \setminus \classbinop \msyfam {6E}
+\zmchar \sqcap \classbinop \msyfam {75}
+\zmchar \sqcup \classbinop \msyfam {74}
+\zmchar \star \classbinop \mitfam {3F}
+\zmchar \times \classbinop \msyfam {02}
+\let \cross = \times
+\zmchar \triangleleft \classbinop \mitfam {2F}
+\zmchar \triangleright \classbinop \mitfam {2E}
+\zmchar \uplus \classbinop \msyfam {5D}
+\zmchar \vee \classbinop \msyfam {5F}
+\let \lor = \vee
+\zmchar \wedge \classbinop \msyfam {5E}
+\let \land = \wedge
+\zmchar \wr \classbinop \msyfam {6F}
+
+
+% Relations:
+
+\zmchar {`:} \classrel \rmfam {3A}
+\zmchar {`<} \classrel \mitfam {3C}
+\zmchar {`=} \classrel \rmfam {3D}
+\zmchar {`>} \classrel \mitfam {3E}
+\zmchar \approx \classrel \msyfam {19}
+\zmchar \asymp \classrel \msyfam {10}
+\zmchar \dashv \classrel \msyfam {61}
+\zmchar \equiv \classrel \msyfam {11}
+\zmchar \frown \classrel \mitfam {5F}
+\zmchar \geq \classrel \msyfam {15}
+\let \ge = \geq
+\let \gets = \leftarrow
+\zmchar \gg \classrel \msyfam {1D}
+\zmchar \in \classrel \msyfam {32}
+\zmchar \Leftarrow \classrel \msyfam {28}
+\zmchar \leftarrow \classrel \msyfam {20}
+\zmchar \leftharpoondown \classrel \mitfam {29}
+\zmchar \leftharpoonup \classrel \mitfam {28}
+\zmchar \Leftrightarrow \classrel \msyfam {2C}
+\zmchar \leftrightarrow \classrel \msyfam {24}
+\zmchar \leq \classrel \msyfam {14}
+\let \le = \leq
+\zmchar \lhook \classrel \mitfam {2C}
+\zmchar \ll \classrel \msyfam {1C}
+\zmchar \mapstochar \classrel \msyfam {37}
+\zmchar \mid \classrel \msyfam {6A}
+\let \given = \mid
+\zmchar \nearrow \classrel \msyfam {25}
+\zmchar \ni \classrel \msyfam {33}
+\zmchar \not \classrel \msyfam {36}
+\zmchar \nwarrow \classrel \msyfam {2D}
+\let \owns = \ni
+\zmchar \parallel \classrel \msyfam {6B}
+\zmchar \perp \classrel \msyfam {3F}
+\zmchar \prec \classrel \msyfam {1E}
+\zmchar \preceq \classrel \msyfam {16}
+\zmchar \propto \classrel \msyfam {2F}
+\zmchar \rhook \classrel \mitfam {2D}
+\zmchar \Rightarrow \classrel \msyfam {29}
+\zmchar \rightarrow \classrel \msyfam {21}
+\zmchar \rightharpoondown \classrel \mitfam {2B}
+\zmchar \rightharpoonup \classrel \mitfam {2A}
+\zmchar \searrow \classrel \msyfam {26}
+\zmchar \sim \classrel \msyfam {18}
+\zmchar \simeq \classrel \msyfam {27}
+\zmchar \smile \classrel \mitfam {5E}
+\zmchar \subset \classrel \msyfam {1A}
+\zmchar \subseteq \classrel \msyfam {12}
+\zmchar \succ \classrel \msyfam {1F}
+\zmchar \succeq \classrel \msyfam {17}
+\zmchar \supset \classrel \msyfam {1B}
+\zmchar \supseteq \classrel \msyfam {13}
+\zmchar \swarrow \classrel \msyfam {2E}
+\zmchar \sqsubseteq \classrel \msyfam {76}
+\zmchar \sqsupseteq \classrel \msyfam {77}
+\let \to = \rightarrow
+\zmchar \vdash \classrel \msyfam {60}
+
+
+% Openers:
+
+\zmchar {`(} \classopen \rmfam {28}
+\zmchar {`[} \classopen \rmfam {5B}
+\zmchar {`\{} \classopen \msyfam {66}
+
+
+% Closers:
+
+\zmchar {`!} \classclose \rmfam {21}
+\zmchar {`)} \classclose \rmfam {29}
+\zmchar {`?} \classclose \rmfam {3F}
+\zmchar {`]} \classclose \rmfam {5D}
+\zmchar {`\}} \classclose \msyfam {67}
+
+
+% Punctuation:
+
+\zmchar {`,} \classpunc \rmfam {2C}
+\zmchar {`;} \classpunc \rmfam {3B}
+\zmchar \cdotp \classpunc \msyfam {01}
+\zmchar \maps \classpunc \rmfam {3A}
+\let \colon = \maps
+\zmchar \ldotp \classpunc \mitfam {3A}
+
+
+% Active characters:
+
+\zmchar {` } \classactive \rmfam {00}
+\zmchar {`'} \classactive \rmfam {00}
+
+{\catcode`\' = \catactive
+\gdef '{^\bgroup \zmprima}
+} % \catcode
+
+\def \zmprima {\prime \futurelet\znext \zmprimb}
+\def \zmprimb {%
+ \if \tokeqlp{\znext}{'}%
+ \let \znext = \zmprimc
+ \else \if \tokeqlp{\znext}{^}%
+ \let \znext = \zmprimd
+ \else
+ \let \znext = \egroup
+ \fi\fi
+ \znext}
+\def \zmprimc #1{\zmprima}
+\def \zmprimd #1#2{#2\egroup}
+
+% Delimiters
+% ----------
+
+% IniTeX does the following for each character:
+%
+% \delcode`x = -1
+
+\definemathdelimiter{`(}{\classord}{\rmfam}{28}{\mexfam}{00}
+\definemathdelimiter{`)}{\classord}{\rmfam}{29}{\mexfam}{01}
+\definemathdelimiter{`/}{\classord}{\rmfam}{2F}{\mexfam}{0E}
+\definemathdelimiter{`<}{\classord}{\msyfam}{68}{\mexfam}{0A}
+\definemathdelimiter{`>}{\classord}{\msyfam}{69}{\mexfam}{0B}
+\definemathdelimiter{`[}{\classord}{\rmfam}{5B}{\mexfam}{02}
+\definemathdelimiter{`]}{\classord}{\rmfam}{5D}{\mexfam}{03}
+\definemathdelimiter{`|}{\classord}{\msyfam}{6A}{\mexfam}{0C}
+
+\definemathdelimiter{\Arrowvert}{\classord}{\mexfam}{3D}{\rmfam}{00}
+\definemathdelimiter{\arrowvert}{\classord}{\mexfam}{3C}{\rmfam}{00}
+\definemathdelimiter{\bracevert}{\classord}{\mexfam}{3E}{\rmfam}{00}
+\definemathdelimiter{\Downarrow}{\classrel}{\msyfam}{2B}{\mexfam}{7F}
+\definemathdelimiter{\downarrow}{\classrel}{\msyfam}{23}{\mexfam}{79}
+\definemathdelimiter{\langle}{\classopen}{\msyfam}{68}{\mexfam}{0A}
+\definemathdelimiter{\lceil}{\classopen}{\msyfam}{64}{\mexfam}{06}
+\definemathdelimiter{\lfloor}{\classopen}{\msyfam}{62}{\mexfam}{04}
+\definemathdelimiter{\lgroup}{\classopen}{\rmfam}{00}{\mexfam}{3A}
+\definemathdelimiter{\lmoustache}{\classopen}{\rmfam}{00}{\mexfam}{40}
+\definemathdelimiter{\rangle}{\classclose}{\msyfam}{69}{\mexfam}{0B}
+\definemathdelimiter{\rceil}{\classclose}{\msyfam}{65}{\mexfam}{07}
+\definemathdelimiter{\rfloor}{\classclose}{\msyfam}{63}{\mexfam}{05}
+\definemathdelimiter{\rgroup}{\classclose}{\rmfam}{00}{\mexfam}{3B}
+\definemathdelimiter{\rmoustache}{\classclose}{\rmfam}{00}{\mexfam}{41}
+\definemathdelimiter{\Uparrow}{\classrel}{\msyfam}{2A}{\mexfam}{7E}
+\definemathdelimiter{\uparrow}{\classrel}{\msyfam}{22}{\mexfam}{78}
+\definemathdelimiter{\Updownarrow}{\classrel}{\msyfam}{6D}{\mexfam}{77}
+\definemathdelimiter{\updownarrow}{\classrel}{\msyfam}{6C}{\mexfam}{3F}
+\definemathdelimiter{\Vert}{\classord}{\msyfam}{6B}{\mexfam}{0D}
+\definemathdelimiter{\vert}{\classord}{\msyfam}{6A}{\mexfam}{0C}
+\definemathdelimiter{\zmbackslash}{\classord}{\msyfam}{6E}{\mexfam}{0F}
+\definemathdelimiter{\zmlbrace}{\classopen}{\msyfam}{66}{\mexfam}{08}
+\definemathdelimiter{\zmrbrace}{\classclose}{\msyfam}{67}{\mexfam}{09}
+
+% Accents
+% -------
+
+
+\definemathaccent{\acute}{\classvarfam}{\rmfam}{13}
+\definemathaccent{\bar}{\classvarfam}{\rmfam}{16}
+\definemathaccent{\breve}{\classvarfam}{\rmfam}{15}
+\definemathaccent{\check}{\classvarfam}{\rmfam}{14}
+\definemathaccent{\ddot}{\classvarfam}{\rmfam}{7F}
+\definemathaccent{\dot}{\classvarfam}{\rmfam}{5F}
+\definemathaccent{\grave}{\classvarfam}{\rmfam}{12}
+\definemathaccent{\zmhat}{\classvarfam}{\rmfam}{5E}
+\definemathaccent{\zmtilde}{\classvarfam}{\rmfam}{7E}
+\definemathaccent{\ring}{\classvarfam}{\rmfam}{17}
+\definemathaccent{\widetilde}{\classord}{\mexfam}{65}
+\definemathaccent{\widehat}{\classord}{\mexfam}{62}
+\definemathaccent{\vec}{\classord}{\mitfam}{7E}
+
+\def \widebar #1{% {math} %~ Wide bar accent. %^math_accent
+ \mathpalette\zwidebar{#1}}
+
+\def \zwidebar #1#2{% {style}{math}
+ \rlap{\measuretextwidth{\tdimena}{$#1#2$}%
+ \kern .2\tdimena
+ $\overline{\vphantom{#1#2}\kern .6\tdimena}$}%
+ #2}
+
+% Defined Characters
+% ------- ----------
+
+
+\def \angle {%
+ {\vbox{\ialign{$\scriptstyle##$\cr
+ \not \mathrel{\mkern 14mu}\cr
+ \noalign{\nointerlineskip}%
+ \mkern 2.5mu \leaders \hrule height .34pt \hfill
+ \mkern 2.5mu\cr}}}}
+
+\definemathjoinedsymbol{\bowtie}{\mathrel}{\triangleright}{\triangleleft}{-3}
+
+\definemathstackedsymbol{\cong}{\mathrel}{\sim}{=}{6}
+
+\def \degree {^\circ}
+
+\let \degrees = \degree
+
+\def \defeq{%
+ \mathrel{\mathop{=}\limits^{\mathscriptscriptstyle{\roman{def}}}}}
+
+\definemathstackedsymbol{\Deltaeq}{\mathrel}{\mathscriptscriptstyle{\Delta}}{=}{9}
+
+\definemathstackedsymbol{\doteq}{\mathrel}{.}{=}{9}
+
+\definemathstackedsymbol{\gel}{\mathrel}{\zge}{<}{11}
+
+\definemathstackedsymbol{\zge}{\mathrel}{>}{=}{7.5}
+
+\definemathstackedsymbol{\gl}{\mathrel}{>}{<}{5.5}
+
+\def \hbar {\mathord{h \llap{$\mathchar"16 \mkern 3.5mu$}}}
+
+\definemathjoinedsymbol{\hookleftarrow}{\mathrel}{\leftarrow}{\rhook}{-3}
+
+\definemathjoinedsymbol{\hookrightarrow}{\mathrel}{\lhook}{\rightarrow}{-3}
+
+\def \int {\intop\nolimits}
+
+\def \iint {\zint2}
+
+\def \iiint {\zint3}
+
+\def \iiiint {\zint4}
+
+\def \idotsint {\zint0}
+
+\def \zint #1{%
+ \mkern -9mu \mathchoice{\mkern -5mu}{}{}{}%
+ \mathop{%
+ \mkern 9mu \mathchoice{\mkern 5mu}{}{}{}%
+ \intop
+ \ifcase #1%
+ \mkern -4mu \cdots \mkern -4mu
+ \or \relax \or
+ \zintkern
+ \or
+ \zintkern \intop \zintkern
+ \or
+ \zintkern \intop \zintkern \intop \zintkern
+ \fi}%
+ \intop\nolimits}
+
+\def \zintkern {\mkern -8mu \mathchoice{\mkern -3mu}{}{}{}}
+
+\let \join = \bowtie
+
+\definemathstackedsymbol{\leftrightarrows}{\mathrel}{\leftarrow}{\rightarrow}{6}
+
+\definemathstackedsymbol{\leftrightharpoons}{\mathrel}{\leftharpoonup}{\rightharpoondown}{4}
+
+\definemathstackedsymbol{\ltgt}{\mathrel}{<}{>}{5.5}
+
+\definemathjoinedsymbol{\Longleftarrow}{\mathrel}{\Leftarrow}{\Relbar}{-3}
+
+\definemathjoinedsymbol{\longleftarrow}{\mathrel}{\leftarrow}{\relbar}{-3}
+
+\definemathjoinedsymbol{\Longleftrightarrow}{\mathrel}{\Leftarrow}{\Rightarrow}{-3}
+\let \iff = \Longleftrightarrow
+
+\definemathjoinedsymbol{\longleftrightarrow}{\mathrel}{\leftarrow}{\rightarrow}{-3}
+
+\def \longmapsto {\mapstochar \longrightarrow}
+
+\definemathjoinedsymbol{\Longrightarrow}{\mathrel}{\Relbar}{\Rightarrow}{-3}
+
+\definemathjoinedsymbol{\longrightarrow}{\mathrel}{\relbar}{\rightarrow}{-3}
+
+\definemathjoinedsymbol{\longrightleftarrow}{\mathrel}{\rightarrow}{\leftarrow}{-3}
+
+\def \oint {\ointop\nolimits}
+
+\def \mapsto {\mapstochar \rightarrow}
+
+\definemathjoinedsymbol{\models}{\mathrel}{|}{=}{-3}
+
+\def \neq {\not=}
+\let \ne = \neq
+
+\def \nexists {\mathord{\raise .2ex \hbox{$\not\mkern 1.5mu$}\exists}}
+
+\def \notin {\not\in}
+\let \nin = \notin
+
+\def \nparallel {\mathrel{\not\mkern 2mu\parallel}}
+
+\definemathstackedsymbol{\rightleftarrows}{\mathrel}{\rightarrow}{\leftarrow}{6}
+
+\definemathstackedsymbol{\rightleftharpoons}{\mathrel}{\rightharpoonup}{\leftharpoondown}{4}
+
+\definemathjoinedsymbol{\semijoin}{\mathrel}{\triangleright}{<}{-4}
+
+% Functions
+% ---------
+
+
+\def \definemathfunction #1#2#3{% {\name}{text}{limits}
+ \def #1{\mathop{\zmfunstyle #2}#3}}
+
+\definemathfunction{\ad}{ad}{\nolimits} % adjoint
+\definemathfunction{\Ai}{Ai}{\nolimits} % Airy function
+\definemathfunction{\arccos}{arccos}{\nolimits} % arc cosine
+\definemathfunction{\arccosh}{arccosh}{\nolimits} % hyperbolic arc cosine
+\definemathfunction{\arccot}{arccot}{\nolimits} % arc cotangent
+\definemathfunction{\arcsec}{arcsec}{\nolimits} % arc secant
+\definemathfunction{\arcsin}{arcsin}{\nolimits} % arc sine
+\definemathfunction{\arctan}{arctan}{\nolimits} % arc tangent
+\definemathfunction{\arg}{arg}{\nolimits} % argument
+\definemathfunction{\argmax}{arg\,max}{\displaylimits} % argument maximum
+\definemathfunction{\argmin}{arg\,min}{\displaylimits} % argument maximum
+\definemathfunction{\Bd}{Bd}{\nolimits} % Bound
+\definemathfunction{\cl}{cl}{\nolimits} % closure
+\definemathfunction{\codim}{codim}{\nolimits} % co-dimension
+\definemathfunction{\coker}{coker}{\nolimits} % cokernel
+\definemathfunction{\conj}{conj}{\nolimits} % conjugate
+\definemathfunction{\cos}{cos}{\nolimits} % cosine
+\definemathfunction{\cosec}{cos}{\nolimits} % cosecant
+\definemathfunction{\cosh}{cosh}{\nolimits} % hyperbolic cosine
+\definemathfunction{\cot}{cot}{\nolimits} % cotangent
+\definemathfunction{\coth}{coth}{\nolimits} % hyperbolic cotangent
+\definemathfunction{\csc}{csc}{\nolimits} % cosecant
+\definemathfunction{\csch}{csch}{\nolimits} % hyperbolic cosecant
+\definemathfunction{\curl}{curl}{\nolimits} % curl
+\definemathfunction{\deg}{deg}{\nolimits} % degree
+\definemathfunction{\det}{det}{\displaylimits} % determinant
+\definemathfunction{\diag}{diag}{\nolimits} % diagonal
+\definemathfunction{\dim}{dim}{\nolimits} % dimension
+\definemathfunction{\dist}{dist}{\nolimits} % distance
+\definemathfunction{\erf}{erf}{\nolimits} % error function
+\definemathfunction{\erfc}{erfc}{\nolimits} % error function comp.
+\definemathfunction{\exp}{exp}{\nolimits} % exponential
+\definemathfunction{\gcd}{gcd}{\displaylimits} % greatest common div.
+\definemathfunction{\GL}{GL}{\nolimits} % General Linear
+\definemathfunction{\glb}{glb}{\nolimits} % greatest lower bound
+\definemathfunction{\gr}{gr}{\nolimits} % group
+\definemathfunction{\grad}{grad}{\nolimits} % gradient
+\definemathfunction{\hom}{hom}{\nolimits} % homology
+\definemathfunction{\id}{id}{\nolimits} % identity
+\definemathfunction{\inf}{inf}{\displaylimits} % infinum
+\definemathfunction{\injlim}{inj\,lim}{\displaylimits} % injected limit
+\definemathfunction{\ker}{ker}{\nolimits} % kernel
+\definemathfunction{\lcm}{lcm}{\displaylimits} % least common mult.
+\definemathfunction{\length}{length}{\nolimits} % length
+\definemathfunction{\lg}{lg}{\nolimits} % natural logarithm
+\definemathfunction{\lim}{lim}{\displaylimits} % limit
+\definemathfunction{\liminf}{lim\,inf}{\displaylimits} % limit infinum
+\definemathfunction{\limsup}{lim\,sup}{\displaylimits} % limit supremum
+\definemathfunction{\ln}{ln}{\nolimits} % natural logarithm
+\definemathfunction{\Log}{Log}{\nolimits} % principal logarithm
+\definemathfunction{\log}{log}{\nolimits} % logarithm
+\definemathfunction{\lub}{lub}{\nolimits} % least upper bound
+\definemathfunction{\max}{max}{\displaylimits} % maximum
+\definemathfunction{\min}{min}{\displaylimits} % minimum
+\definemathfunction{\mod}{mod}{\nolimits} % modulus
+\definemathfunction{\Pr}{Pr}{\displaylimits} % Probability
+\definemathfunction{\Prob}{Prob}{\displaylimits} % Probability
+\definemathfunction{\projlim}{proj\,lim}{\displaylimits}% projected limit
+\definemathfunction{\rank}{rank}{\nolimits} % rank
+\definemathfunction{\sec}{sec}{\nolimits} % secant
+\definemathfunction{\sech}{sech}{\nolimits} % hyperbolic secant
+\definemathfunction{\sgn}{sgn}{\nolimits} % sign
+\definemathfunction{\sign}{sign}{\nolimits} % sign
+\definemathfunction{\sin}{sin}{\nolimits} % sine
+\definemathfunction{\sinc}{sinc}{\nolimits} % cardinal sine
+\definemathfunction{\sinh}{sinh}{\nolimits} % hyperbolic sine
+\definemathfunction{\SL}{SL}{\nolimits} % Special Linear
+\definemathfunction{\sup}{sup}{\displaylimits} % supremum
+\definemathfunction{\Szg}{Sz(g)}{\nolimits} % Suzuki group
+\definemathfunction{\tan}{tan}{\nolimits} % tangent
+\definemathfunction{\tanh}{tanh}{\nolimits} % hyperbolic tangent
+\definemathfunction{\tr}{tr}{\nolimits} % trace
+\definemathfunction{\trace}{trace}{\nolimits} % trace
+\definemathfunction{\wstar}{w*}{\nolimits} % weak star
+
+
+% For the occasional one-timer:
+
+\def \mathfunction #1{\mathop{\rm #1}\nolimits}
+
+\let \mfun = \mathfunction
+
+% Display/Text/Script Styles
+% ------------------- ------
+
+
+\def \mathdisplaystyle #1{{\displaystyle #1}}% {subequation}
+\def \mathtextstyle #1{{\textstyle #1}}
+\def \mathscriptstyle #1{{\scriptstyle #1}}
+\def \mathscriptscriptstyle #1{{\scriptscriptstyle #1}}
+
+\def \mathpalette #1#2{% {\macro}{text}
+ \mathchoice{#1\displaystyle{#2}}%
+ {#1\textstyle{#2}}%
+ {#1\scriptstyle{#2}}%
+ {#1\scriptscriptstyle{#2}}}
+
+\def \mtext #1{%
+ {\mathchoice{\hbox{\zmtextstyle #1}}
+ {\hbox{\zmtextstyle #1}}
+ {\hbox{\the\scriptfont\zmtextfam #1}}
+ {\hbox{\the\scriptscriptfont\zmtextfam #1}}}}
+
+\everymath = {\let\text=\mtext}%
+
+% This is specifically designed to work in math or in text.
+
+\def \mvar #1{{\zmvarstyle #1\if \textmodep \/\fi}}% {text}
+
+% General Tools
+% ------- -----
+
+
+\def \aboverule #1{\above #1\relax}% {rule-height}
+
+\def \abs #1{\left|#1\right|}% {expression}
+
+\def \big #1{{\hbox{$\left#1\vbox to 8.5pt{}\right.\zmnosp$}}}
+\def \Big #1{{\hbox{$\left#1\vbox to 11.5pt{}\right.\zmnosp$}}}
+\def \bigg #1{{\hbox{$\left#1\vbox to 14.5pt{}\right.\zmnosp$}}}
+\def \Bigg #1{{\hbox{$\left#1\vbox to 17.5pt{}\right.\zmnosp$}}}
+\def \zmnosp {\nulldelimiterspace = 0pt}
+
+\def \bigl {\mathopen\big}
+\def \Bigl {\mathopen\Big}
+\def \bigm {\mathrel\big}
+\def \Bigm {\mathrel\Big}
+\def \bigr {\mathclose\big}
+\def \Bigr {\mathclose\Big}
+\def \biggl {\mathopen\bigg}
+\def \Biggl {\mathopen\Bigg}
+\def \biggm {\mathrel\bigg}
+\def \Biggm {\mathrel\Bigg}
+\def \biggr {\mathclose\bigg}
+\def \Biggr {\mathclose\Bigg}
+
+\def \binomial #1#2{{{#1} \atopwithdelims() {#2}}}
+
+\let \binom = \binomial
+
+\def \bmod {\mathbin{\rm mod}}
+
+\def \bordermatrix #1{%
+ {\setbox \zboxa = \hbox{\mex B}%
+ \tdimena = \wd\zboxa
+ \setbox \zboxa = \vbox{%
+ \def \cr {\crcr \noalign{\kern 0pt \global\let \cr = \completerow}}%
+ \ialign{$##$\hfil \kern 2pt \kern \tdimena&
+ \thinspace \hfil $##$\hfil&&
+ \quad \hfil $##$\hfil \crcr
+ \omit \strut \hfil \crcr
+ \noalign{\kern -\baselineskip}%
+ #1\crcr
+ \omit \strut \cr}}%
+ \setbox \zboxc = \vbox{%
+ \unvcopy \zboxa \global\setbox \zboxb = \lastbox}%
+ \setbox \zboxc = \hbox{%
+ \unhbox \zboxb \unskip \global\setbox \zboxb = \lastbox}%
+ \setbox \zboxc = \hbox{%
+ $\kern \wd\zboxb \kern -\tdimena \left(\kern -\wd\zboxb
+ \global\setbox \zboxb = \vbox{\box\zboxb \kern 8pt}%
+ \vcenter{\kern -\ht\zboxb \unvbox\zboxa \kern -\baselineskip}\,%
+ \right)$}%
+ \null\;\vbox{\kern \ht\zboxb \box\zboxc}}}
+
+\def \brace {\atopwithdelims\{\}}
+
+\def \bracematrix #1{% {row...}
+ \left\{ \matrix{#1} \right\}}
+
+\def \brack {\atopwithdelims[]}
+
+\def \bracketmatrix #1{% {row...}
+ \left[ \matrix{#1} \right]}
+
+\def \bracketmatrixfl #1{% {row...}
+ \left[ \matrixfl{#1} \right]}
+
+\def \bracketmatrixfr #1{% {row...}
+ \left[ \matrixfr{#1} \right]}
+
+\def \cases #1{% {row...}
+ \left\{ \,%
+ \vcenter{\matrixbaselines
+ \ialign{$##$\hfil&
+ \quad {\rm ##}\hfil \crcr
+ #1\crcr}}%
+ \right.}
+
+% This version of \cases has math in both columns.
+
+\def \mcases #1{% {row...}
+ \left\{ \,%
+ \vcenter{\matrixbaselines
+ \ialign{$##$\hfil&
+ \quad $##$\hfil \crcr
+ #1\crcr}}%
+ \right.}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \if \newdots
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}
+ \hbox{\kern .4em .}
+ \hbox{\kern .8em .}}%
+ \else
+ \mathinner{\mkern 1mu \raise 7pt \vbox{\kern 7pt \hbox{.}}%
+ \mkern 2mu \raise 4pt \hbox{.}%
+ \mkern 2mu \raise 1pt \hbox{.}%
+ \mkern 1mu}%
+ \fi}
+
+\def \detmatrix #1{% {row...}
+ \left| \matrix{#1} \right|}
+
+\def \displayfrac #1#2{% {numerator}{denominator}
+ {\displaystyle \frac{#1}{#2}}}
+
+\def \displaylines #1{% {row...}
+ \openup \jot
+ \global\setflag \zdtop = \true
+ \everycr = {\noalign{\if \zdtop
+ \vskip -\lineskiplimit
+ \vskip \normallineskiplimit
+ \global\setflag \zdtop = \false
+ \else
+ \penalty \interdisplaylinepenalty
+ \fi}}%
+ \halign{\hbox to \displaywidth{$\tabskip = 0pt \everycr = {}%
+ \hfil \displaystyle ##\hfil$}\cr
+ #1\crcr}}
+
+\def \eqalign #1{% {row...}
+ \vcenter{%
+ \ialign{&\mathstrut \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil\cr
+ #1\crcr}}}
+
+\def \equalfill {%
+ $\mathord =\mkern -6mu
+ \cleaders \hbox{$\mkern -2mu \mathord =\mkern -2mu$}\hfill
+ \mkern -6mu \mathord =$}
+
+% All other fraction macros should use \frac.
+
+\def \frac #1#2{% {numerator}{denominator}
+ {{\mskip\fracbarhang #1\mskip\fracbarhang} \over
+ {\mskip\fracbarhang #2\mskip\fracbarhang}}}
+
+\def \fromunder #1{% {math}
+ \mathrel{\mathop{\longleftarrow}\limits^{#1}}}
+
+\def \hphantom {%
+ \setflag \zhphant = \true
+ \setflag \zvphant = \false
+ \zphanta}
+
+\def \joinrel {\mathrel{\mkern -3mu}}
+
+\def \largefrac #1#2{% {numerator}{denominator}
+ {\mathchoice{\mathdisplaystyle{\frac{#1}{#2}}}
+ {\mathdisplaystyle{\frac{#1}{#2}}}
+ {\mathtextstyle{\frac{#1}{#2}}}
+ {\mathscriptstyle{\frac{#1}{#2}}}}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \leftarrowfill {\zleftarrowfill{\textstyle}}
+\def \leftrightarrowfill {\zleftrightarrowfill{\textstyle}}
+\def \rightarrowfill {\zrightarrowfill{\textstyle}}
+\def \Rightarrowfill {\zRightarrowfill{\textstyle}}
+
+\def \zleftarrowfill #1{% {style}
+ \setbox\zboxa = \hbox{$#1-$}%
+ \ht\zboxa = 0pt
+ $#1\mathord\leftarrow \mkern -6mu
+ \cleaders \hbox{$#1\mkern -2mu \copy\zboxa \mkern -2mu$}\hfill
+ \mkern -6mu \box\zboxa$}
+
+\def \zleftrightarrowfill #1{% {style}
+ \setbox\zboxa = \hbox{$#1-$}%
+ \ht\zboxa = 0pt
+ $#1\mathord\leftarrow \mkern -6mu
+ \cleaders \hbox{$#1\mkern -2mu \box\zboxa \mkern -2mu$}\hfill
+ \mkern -6mu \mathord\rightarrow$}
+
+\def \zRightarrowfill #1{% {style}
+ \setbox\zboxa = \hbox{$#1=$}%
+ \ht\zboxa = 0pt
+ $#1\copy\zboxa \mkern -6mu
+ \cleaders \hbox{$#1\mkern -2mu \box\zboxa \mkern -2mu$}\hfill
+ \mkern -6mu \mathord\Rightarrow$}
+
+\def \zrightarrowfill #1{% {style}
+ \setbox\zboxa = \hbox{$#1-$}%
+ \ht\zboxa = 0pt
+ $#1\copy\zboxa \mkern -6mu
+ \cleaders \hbox{$#1\mkern -2mu \box\zboxa \mkern -2mu$}\hfill
+ \mkern -6mu \mathord\rightarrow$}
+
+\let \leqalignno = \eqalignno
+
+\def \mathstrut {\vphantom(}
+
+\def \matrix #1{% {row...}
+ \null\nonscript\,%
+ \vcenter{\matrixbaselines
+ \ialign{\hfil $##$\hfil&& \quad \hfil $##$\hfil \crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}%
+ #1\crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}}}%
+ \nonscript\,}
+
+\let \adjustmatrix = \noalign
+
+\def \matrixfl #1{% {row...}
+ \null\nonscript\,%
+ \vcenter{\matrixbaselines
+ \ialign{$##$\hfil && \quad $##$\hfil \crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}%
+ #1\crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}}}%
+ \nonscript\,}
+
+\def \matrixfr #1{% {row...}
+ \null\nonscript\,%
+ \vcenter{\matrixbaselines
+ \ialign{\hfil $##$&& \quad \hfil $##$\crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}%
+ #1\crcr
+ \mathstrut\crcr
+ \noalign{\kern -\baselineskip}}}%
+ \nonscript\,}
+
+\def \matrixbaselines {%
+ \baselineskip = \the\matrixspread\normalbaselineskip
+ \lineskiplimit = \normallineskiplimit
+ \lineskip = \normallineskip}
+
+\def \ontopof #1#2{{{#1} \atop {#2}}}% {numerator}{denominator}
+
+\def \openup {\afterassignment\zopenup \tdimena=}
+
+\def \zopenup {%
+ \advance \baselineskip by \tdimena
+ \advance \lineskiplimit by \tdimena
+ \advance \lineskip by \tdimena}
+
+\def \overbrace #1{%
+ \mathop{%
+ \vbox{\ialign{##\cr
+ \noalign{\kern 3pt}%
+ \downbracefill\cr
+ \noalign{\kern 3pt \nointerlineskip}%
+ $\hfil \displaystyle{#1}\hfil$\cr}}}\limits}
+
+\def \overleftarrow {\mathpalette\zoverleftarrow}
+\def \overleftrightarrow {\mathpalette\zoverleftrightarrow}
+\def \overRightarrow {\mathpalette\zoverRightarrow}
+\def \overrightarrow {\mathpalette\zoverrightarrow}
+
+\def \zoverleftarrow #1#2{% {style}{math}
+ \vbox{\ialign{##\cr
+ \zleftarrowfill{\scriptscriptstyle}\cr
+ \noalign{\nointerlineskip}%
+ $\hfil #1#2\hfil$\crcr}}}
+
+\def \zoverleftrightarrow #1#2{% {style}{math}
+ \vbox{\ialign{##\cr
+ \zleftrightarrowfill{\scriptscriptstyle}\cr
+ \noalign{\nointerlineskip}%
+ $\hfil #1#2\hfil$\crcr}}}
+
+\def \zoverRightarrow #1#2{% {style}{math}
+ \vbox{\ialign{##\cr
+ \zRightarrowfill{\scriptscriptstyle}\cr
+ \noalign{\nointerlineskip}%
+ $\hfil #1#2\hfil$\crcr}}}
+
+\def \zoverrightarrow #1#2{% {style}{math}
+ \vbox{\ialign{##\cr
+ \zrightarrowfill{\scriptscriptstyle}\cr
+ \noalign{\nointerlineskip}%
+ $\hfil #1#2\hfil$\crcr}}}
+
+\def \overset #1#2{
+ \mathbin{\mathop{#2}\limits^{#1}}}
+
+\def \parenmatrix #1{% {row...}
+ \left( \matrix{#1} \right)}
+
+\let \pmatrix = \parenmatrix
+
+\def \parenmatrixfl #1{% {row...}
+ \left( \matrixfl{#1} \right)}
+
+\def \parenmatrixfr #1{% {row...}
+ \left( \matrixfr{#1} \right)}
+
+\def \phantom {%
+ \setflag \zhphant = \true
+ \setflag \zvphant = \true
+ \zphanta}
+
+\def \zphanta {%
+ \if \mathmodep
+ \def \znext {\mathpalette\zphantb}%
+ \else
+ \let \znext = \zphantc
+ \fi
+ \znext}
+\def \zphantb #1#2{%
+ \setbox \zboxa = \hbox{$#1{#2}$}%
+ \zphantd}
+\def \zphantc #1{%
+ \setbox \zboxa = \hbox{#1}%
+ \zphantd}
+\def \zphantd {%
+ \setbox \zboxb = \hbox{}%
+ \if \zhphant \wd\zboxb = \wd\zboxa \fi
+ \if \zvphant \ht\zboxb = \ht\zboxa \dp\zboxb = \dp\zboxa \fi
+ \box \zboxb}
+
+\def \plainTeXmathdisplay {%
+ \global\everydisplay = {}}
+
+\def \pmod #1{\allowbreak \,({\rm mod}\,#1)}
+
+\def \Relbar {\mathrel =}
+\def \relbar {\mathrel{\smash -}}
+
+\definebox{\zrootbox}
+
+\def \nthroot #1{% {n}
+ \setbox\zrootbox = \hbox{$\scriptscriptstyle{#1}$}%
+ \mathpalette\zroot}
+
+\def \zroot #1#2{% {\style}{radicand}
+ \setbox\zboxa = \hbox{$#1\sqrt{#2}$}%
+ \tdimena = \ht\zboxa
+ \advance \tdimena by -\dp\zboxa
+ \mkern 5mu \raise .6\tdimena \copy\zrootbox \mkern -10mu \box\zboxa}
+
+\def \skew #1#2#3{% {amount}{accent}{char}
+ {\zmuskipa = #1mu
+ \divide \zmuskipa by 2
+ \mkern \zmuskipa
+ #2{\mkern -\zmuskipa{#3}\mkern \zmuskipa}%
+ \mkern -\zmuskipa}{}}
+
+\def \smallfrac #1#2{% {numerator}{denominator}
+ {\mathchoice{\mathtextstyle{\frac{#1}{#2}}}
+ {\mathscriptstyle{\frac{#1}{#2}}}
+ {\mathscriptscriptstyle{\frac{#1}{#2}}}
+ {\mathscriptscriptstyle{\frac{#1}{#2}}}}}
+
+\def \smash {%
+ \relax
+ \if \mathmodep
+ \def \znext {\mathpalette\zsmasha}%
+ \else
+ \let \znext = \zsmashb
+ \fi
+ \znext}
+
+\def \zsmasha #1#2{%
+ \setbox \zboxa = \hbox{$#1{#2}$}%
+ \zsmashc}
+\def \zsmashb #1{%
+ \setbox \zboxa = \hbox{#1}%
+ \zsmashc}
+\def \zsmashc {%
+ \ht\zboxa = 0pt
+ \dp\zboxa = 0pt
+ \box \zboxa}
+
+\def \sqrt {\radical"270370 }
+
+\let \sub = _
+\let \super = ^
+
+\def \Tounder #1{% {math}
+ \mathrel{\mathop{\Longrightarrow}\limits^{#1}}}
+
+\def \tounder #1{% {math}
+ \mathrel{\mathop{\longrightarrow}\limits^{#1}}}
+
+\def \underbrace #1{% {text}
+ \mathop{%
+ \vtop{\ialign{##\cr
+ $\hfil \displaystyle{#1}\hfil$\cr
+ \noalign{\kern 3pt \nointerlineskip}%
+ \upbracefill\cr
+ \noalign{\kern 3pt}}}}\limits}
+
+\def \underset #1#2{
+ \mathbin{\mathop{#2}\limits_{#1}}}
+
+\def \unit #1{% {text}
+ \if \mathmodep
+ {\nonscript\,\mtext{#1}}%
+ \else
+ \,#1%
+ \fi}
+
+\def \vdots {%
+ \if \newdots
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}
+ \hbox{.}
+ \hbox{.}}%
+ \else
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \kern 6pt
+ \hbox{.}
+ \hbox{.}
+ \hbox{.}}%
+ \fi}
+
+\def \vphantom {%
+ \setflag \zhphant = \false
+ \setflag \zvphant = \true
+ \zphanta}
+
+% Block Matrices
+% ----- --------
+
+
+\def \blockmatrix #1{% {rows}
+ \zblockmatrix{\false}{#1}}
+
+\def \blockmatrixvr #1{% {rows}
+ \zblockmatrix{\true}{#1}}
+
+\def \zblockmatrix #1#2{% {verticals?}{rows}
+ \left[
+ \vcenter{%
+ \defineatsigncommand @R{\colrule}%
+ \defineatsigncommand @N{\nocolrule}%
+ \offinterlineskip
+ \tdimena = \ht\strutbox \advance \tdimena by .2ex
+ \tdimenb = \dp\strutbox \advance \tdimenb by .4ex
+ \setbox \strutbox \hbox{\vrule width 0pt height \tdimena depth \tdimenb}%
+ \ialign{\hfil \strut \thirdspace $##$\thirdspace \hfil&&
+ \hspace{.35em}%
+ \vrule \if #1\colrule \else \nocolrule \fi
+ ##\relax
+ \hspace{.35em}&
+ \hfil \strut \thirdspace $##$\thirdspace \hfil\crcr
+ #2\crcr}}%
+ \right]}
+
+\def \rowrule {%
+ \noalign{%
+ \vskip .5ex
+ \hrule height .1ex\relax
+ \vskip .7ex}}
+
+\def \colrule {%
+ width .1ex }
+
+% Math Displays
+% ---- --------
+
+
+\defineblock{\mathdisplay}{\endmathdisplay}{\true}{}
+
+%~block mathdisplay
+% \abovepenalty = integer % Penalty above display.
+% \aboveskip = glue % Visual space above display.
+% \belowpenalty = integer % Penalty below display.
+% \belowskip = glue % Visual space below display.
+% \bodyfont = {...} % Font for display.
+% \def \comptextformat {...} % Composite number text formatter.
+% \diagramdiagarrowstyle = {...} % Style for diagonal arrows in diagrams.
+% \diagramgutter = dimen % Gutter between diagram columns.
+% \diagraminterrowskip = glue % Interrowskip for diagrams.
+% \diagramminarrow = dimen % Minimum length of arrow in diagram.
+% \hfuzz = dimen % Overhang allowed at end of line.
+% \interrowskip = glue % Extra visual space between equations.
+% \leftindent = dimen % Left indentation for \alignleft.
+% \matrixspread = {decimal} % Spread factor for matrices.
+% \def \numberformat {...} % Equation number formatter.
+% \position = {...} % Positioning options.
+% \rightindent = dimen % Right indentation for \alignright.
+% \textcolor = {...} % Color of text.
+%~end
+
+\definetoks{\diagramdiagarrowstyle}
+\definedimen{\diagramgutter}{0pt}
+\defineskip{\diagraminterrowskip}{0pt}
+\definedimen{\diagramminarrow}{0pt}
+
+% Positioning options are:
+% \alignleft Left aligned, with \leftindent.
+% \alignright Right aligned, with \rightindent.
+% \center Centered.
+% \numberleft Equation number on left.
+% \numberright Equation number on right.
+
+% These parameters are calculated:
+
+\definetoks{\mathdisplayeqno} % Text following \eqno marker.
+\definecount{\mathdisplayprevgraf}{-1} % Previous display's ending \prevgraf.
+\definecount{\mathdisplayprevpenalty}{0}% Previous display's \belowpenalty.
+\defineskip{\mathdisplayprevskip}{0pt} % Previous display's \belowskip.
+
+\declareeverypar{\global\mathdisplayprevgraf=-1}
+\zdeclareeveryvcontext{\zsavevcontext{\mathdisplayprevgraf=-1}}
+
+%~ This marker specifies that the following text is the equation number
+%~ for the math display.
+
+\definemarker{\eqno}
+
+
+\everydisplay = {\mathdisplay}
+
+\def \mathdisplay #1$${% equation $$
+ \advance \displayindent by \leftskip
+ \advance \displaywidth by -\leftskip
+ \advance \displaywidth by -\rightskip
+ % \beginblockscope is unnecessary.
+ \global\increment \mathdisplaydepth
+ \abovepenalty = 5000 %~default hard
+ \belowpenalty = \breakallowed %~default hard
+ \hfuzz = 1pt %~default hard
+ \leftindent = 0pt %~default soft
+ \matrixspread = {1.0} %~default soft
+ \rightindent = 0pt %~default soft
+ \textcolor = {}% %~default soft
+ \processdesign{\mathdisplay}{}%
+ % \mathdisplaynumber is incremented by \eqno, if appropriate.
+ \if \eqlp{\prevgraf}{\mathdisplayprevgraf}%
+ \aboveskip = -\belowskip
+ \advance \aboveskip by \interrowskip
+ \fi
+ \let \text = \mtext
+ \zmdparams
+ \settaginfo{}{}% % No tag info so far.
+ \if \notp{\emptytoksp{\textcolor}}\color{\the\textcolor}\fi
+ \mathdisplayformat{#1}%
+ \endmathdisplay}
+
+\def \endmathdisplay {%
+ \global\mathdisplayprevgraf = \prevgraf
+ \global\advance \mathdisplayprevgraf by 3
+ \global\mathdisplayprevpenalty = \belowpenalty
+ \global\mathdisplayprevskip = \belowskip
+ \global\decrement \mathdisplaydepth
+ \if \notp{\emptytoksp{\textcolor}}\endcolor \fi%
+ % \endblockscope is unnecessary.
+ $$}
+
+\definecount{\zmdhpos}{0}
+
+\def \zmdparams {%
+ \abovedisplayskip = \aboveskip
+ \abovedisplayshortskip = \aboveskip
+ \belowdisplayskip = \belowskip
+ \belowdisplayshortskip = \belowskip
+ \predisplaypenalty = \abovepenalty
+ \postdisplaypenalty = \belowpenalty
+ \zmdhpos = 0
+ \let \center = \relax
+ \def \alignleft {\zmdhpos = 1}%
+ \def \alignright {\zmdhpos = 2}%
+ \setflag \zmdnumleft = \false
+ \def \numberleft {\setflag \zmdnumleft = \true}%
+ \let \numberright = \relax
+ \the\position}
+
+\def \mathdisplayformat #1{% {display}
+ \the\bodyfont
+ \zmdparse#1\eqno\eqno\zmark
+ {\lineskiplimit = \maxdimen % Force \interrowskip between
+ \lineskip = \interrowskip % each row of multi-line display.
+ \ifcase \zmdhpos
+ \if \zmdnumleft % Centered display.
+ \hbox to \displaywidth {%
+ \rlap{\hspace{-1\leftskip}\zmdeqno}%
+ \hfil $\displaystyle \zmdeq$\hfil}%
+ \else
+ \hbox to \displaywidth {%
+ \hfil $\displaystyle \zmdeq$\hfil
+ \llap{\zmdeqno\hspace{-1\rightskip}}}%
+ \fi
+ \or
+ \if \zmdnumleft % Left-aligned display.
+ \hbox to \displaywidth {%
+ \hbox to \leftindent{\hspace{-1\leftskip}\zmdeqno\hss}%
+ $\displaystyle \zmdeq$\hfil}%
+ \else
+ \hbox to \displaywidth{%
+ \kern \leftindent $\displaystyle \zmdeq$\hfil
+ \llap{\zmdeqno\hspace{-1\rightskip}}}%
+ \fi
+ \or
+ \if \zmdnumleft % Right-aligned display.
+ \hbox to \displaywidth {%
+ \rlap{\hspace{-1\leftskip}\zmdeqno}%
+ \hfil $\displaystyle \zmdeq$\kern \rightindent}%
+ \else
+ \hbox to \displaywidth{%
+ \hfil $\displaystyle \zmdeq$%
+ \hbox to \rightindent{\hss\zmdeqno\hspace{-1\rightskip}}}%
+ \fi
+ \fi}}
+
+\def \zmdparse #1\eqno#2\eqno#3\zmark{% equation\eqno number\eqno ???\zmark
+ \def \zmdeq {#1}%
+ \if \andp{\emptyargp{#2}}{\emptyargp{#3}}%
+ \let \zmdeqno = \relax
+ \else
+ \def \zmdeqno {\zmdformeqno#2\tag\tag\zmark}%
+ \fi}
+
+% This macro is invoked to format equation numbers in both positions:
+% at the end of the display and at the end of \eqaligned rows.
+
+\def \zmdformeqno #1\tag#2\tag#3\zmark{% number\tag{xxx}\tag ???\zmark
+ \if \emptyargp{#1}%
+ \global\increment \mathdisplaynumber
+ \mathdisplayeqno = \expandafter{\number\mathdisplaynumber}%
+ \setcomptext{\mathdisplaycomptext}%
+ \else
+ \zmdexpliciteqno #1 \zmark
+ \fi
+ \settaginfo{\the\mathdisplaycomptext}{???}%
+ \hbox{\numberformat}%
+ \if \notp{\emptyargp{#3}}\zmdtageqno#2\zmark \fi}
+
+\def \zmdexpliciteqno #1#2 #3\zmark{%
+ \if \codeeqlp{#1}{!}%
+ \mathdisplayeqno = {#2}%
+ \mathdisplaycomptext = {#2}%
+ \else\if \codeeqlp{#1}{+}%
+ \global\increment \mathdisplaynumber
+ \mathdisplayeqno = \expandafter{\number\mathdisplaynumber #2}%
+ \setcomptext{\mathdisplaycomptext}%
+ \else\if \codeeqlp{#1}{,}%
+ \mathdisplayeqno = \expandafter{\number\mathdisplaynumber #2}%
+ \setcomptext{\mathdisplaycomptext}%
+ \else\if \codeeqlp{#1}{:}%
+ \global\increment \mathdisplaynumber
+ \mathdisplayeqno = {#2}%
+ \setcomptext{\mathdisplaycomptext}%
+ \else\if \codeeqlp{#1}{=}%
+ \zmdseteqno #2\zmark
+ \setcomptext{\mathdisplaycomptext}%
+ \else\if \codeeqlp{#1}{>}%
+ \zmdrefeqno #2;;\zmark
+%%% \mathdisplayeqno = {\ref{#2}}%
+%%% \mathdisplaycomptext = {\ref{#2}}%
+ \else
+ \mathdisplayeqno = {#1#2}%
+ \setcomptext{\mathdisplaycomptext}%
+ \fi\fi\fi\fi\fi\fi}
+
+\def \zmdseteqno #1;#2\zmark{%
+ \global\mathdisplaynumber = #1\relax
+ \mathdisplayeqno = \expandafter{\number\mathdisplaynumber #2}}
+
+\def \zmdrefeqno #1;#2;#3\zmark{%
+ \if \emptyargp{#2}%
+ \mathdisplayeqno = {\ref{#1}}%
+ \mathdisplaycomptext = {\ref{#1}}%
+ \else
+ \mathdisplayeqno = {\ref{#1}\,#2}%
+ \mathdisplaycomptext = {\ref{#1}\,#2}%
+ \fi}
+
+\def \zmdtageqno #1#2\zmark{%
+ \def \znext { }%
+ \if \znext#2\tag{#1}\else \tag{#1#2}\fi}
+
+\def \setmathdisplaynumber #1{%
+ \global\mathdisplaynumber = #1\relax
+ \global\decrement \mathdisplaynumber}
+
+%~ This modifier for |$$| is used when the display is the first thing
+%~ after a head, the first thing in a list item, the first thing in
+%~ a float, etc. It eliminates the vertical space above the display.
+
+\def \immediatemathdisplay {% %^modifier
+ \with{\abovepenalty = \breaknever
+ \aboveskip = 0pt}}
+
+% Aligned Equations
+% ------- ---------
+
+
+% This tool can only be used inside a math display.
+
+
+\defineskip{\zeqaltabskip}{0pt}
+\definedimen{\zeqnoshift}{0pt}
+
+\def \eqaligned #1{% {rows...}
+ \vcenter{%
+ \zeqalinit
+ \halign to \tdimena {%
+ \hfil $\displaystyle ##{}$\tabskip = 0pt&
+ $\displaystyle {}##$\hfil \tabskip = \zeqaltabskip&
+ \relax \zeqaleqno ##\zmark% \relax prevents expansion of \zeqaleqno.
+ \tabskip = \if \zmdnumleft \displaywidth \else 0pt \fi \cr
+ #1\crcr}}}
+
+\def \eqalignedpairs #1{% {rows...}
+ \vcenter{%
+ \zeqalinit
+ \halign to \tdimena {%
+ \hfil $\displaystyle ##{}$\tabskip = 0pt&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil \tabskip = \zeqaltabskip&
+ \relax \zeqaleqno ##\zmark% \relax prevents expansion of \zeqaleqno.
+ \tabskip = \if \zmdnumleft \displaywidth \else 0pt \fi \cr
+ #1\crcr}}}
+
+\def \eqalignedtriples #1{% {rows...}
+ \vcenter{%
+ \zeqalinit
+ \halign to \tdimena {%
+ \hfil $\displaystyle ##{}$\tabskip = 0pt&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil \tabskip = \zeqaltabskip&
+ \relax \zeqaleqno ##\zmark% \relax prevents expansion of \zeqaleqno.
+ \tabskip = \if \zmdnumleft \displaywidth \else 0pt \fi \cr
+ #1\crcr}}}
+
+\def \eqalignedquadruples #1{% {rows...}
+ \vcenter{%
+ \zeqalinit
+ \halign to \tdimena {%
+ \hfil $\displaystyle ##{}$\tabskip = 0pt&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil&
+ \hfil $\displaystyle ##{}$&
+ $\displaystyle {}##$\hfil \tabskip = \zeqaltabskip&
+ \relax \zeqaleqno ##\zmark% \relax prevents expansion of \zeqaleqno.
+ \tabskip = \if \zmdnumleft \displaywidth \else 0pt \fi \cr
+ #1\crcr}}}
+
+\def \zeqalinit {%
+ \def \eqno {&\relax}% \relax prevents expansion of stuff after \eqno.
+ \tdimena = \displaywidth
+ \advance \tdimena by -\leftindent
+ \advance \tdimena by -\rightindent
+ \zeqaltabskip = \if \eqlp{\zmdhpos}{2}0pt \else \centerindent \fi
+ \if \zmdnumleft
+ \zeqnoshift = \leftskip \advance \zeqnoshift by \leftindent
+ \else
+ \zeqnoshift = \rightskip \advance \zeqnoshift by \rightindent
+ \fi
+ \tabskip = \if \eqlp{\zmdhpos}{1}0pt \else \centerindent \fi}
+
+\def \zeqaleqno \relax#1\zmark{% \relax [\eqno [text]][\tag]\zmark
+ \if \zmdnumleft
+ \kern -\displaywidth
+ \rlap{\zmdformeqno#1\tag\tag\zmark}%
+ \else
+ \llap{\zmdformeqno#1\tag\tag\zmark \hspace{-\zeqnoshift}}%
+ \fi}
+
+\let \adjustmathdisplay = \noalign
+
+% Diagrams
+% --------
+
+
+% This tool can only be used inside a math display.
+
+
+\def \diagram #1{% {rows...}
+ \zdiagcmds
+ \null\,%
+ \vcenter{%
+ \lineskip = \diagraminterrowskip
+ \lineskiplimit = \lineskip
+ \tabskip = -\diagramgutter
+ \halign{%
+ &\kern \diagramgutter \hfil $\displaystyle ##$\hfil \tabskip = 0pt \cr
+ #1\crcr}}%
+ \,}
+
+\def \zdiagcmds {%
+ \defineatsigncommand @>##1>##2>{\zdiagra{##1}{##2}}%
+ \defineatsigncommand @<##1<##2<{\zdiagla{##1}{##2}}%
+ \defineatsigncommand @X##1X##2X{\zdiaglra{##1}{##2}}%
+ \defineatsigncommand @=##1=##2={\zdiaghb{##1}{##2}}%
+ \defineatsigncommand @V##1V##2V{%
+ \zdiagva{c}{}{\hbox}{\big\downarrow}{##1}{##2}}%
+ \defineatsigncommand @A##1A##2A{%
+ \zdiagva{c}{}{\hbox}{\big\uparrow}{##1}{##2}}%
+ \defineatsigncommand @|##1|##2|{%
+ \zdiagva{c}{}{\hbox}{\big|}{##1}{##2}}%
+ \defineatsigncommand @H##1|##2|{%
+ \zdiagva{c}{}{\hbox}{\big\Vert}{##1}{##2}}%
+ \defineatsigncommand @1##11##21##31{%
+ \zdiagva{##1}{l}{r}{\the\diagramdiagarrowstyle \mathchar "7025}{##2}{##3}}%
+ \defineatsigncommand @3##13##23##33{%
+ \zdiagva{##1}{l}{r}{\the\diagramdiagarrowstyle \mathchar "7026}{##2}{##3}}%
+ \defineatsigncommand @5##15##25##35{%
+ \zdiagva{##1}{r}{l}{\the\diagramdiagarrowstyle \mathchar "702E}{##2}{##3}}%
+ \defineatsigncommand @7##17##27##37{%
+ \zdiagva{##1}{r}{l}{\the\diagramdiagarrowstyle \mathchar "702D}{##2}{##3}}%
+ \defineatsigncommand @"##1"##2"{\zdiagwd{##1}{##2}}}
+
+\def \zdiagra #1#2{%
+ {\setbox \zboxa = \hbox{$\scriptstyle \;{#1}\;\;\;$}%
+ \setbox \zboxb = \hbox{$\scriptstyle \;{#2}\;\;\;$}%
+ \setbox \zboxc = \hbox{$#2$}%
+ \tdimena = \diagramminarrow
+ \if \dimgtrp{\wd\zboxa}{\tdimena}\tdimena = \wd\zboxa \fi
+ \if \dimgtrp{\wd\zboxb}{\tdimena}\tdimena = \wd\zboxb \fi
+ \mathrel{\mathop{\hbox to \tdimena {\rightarrowfill}}%
+ \limits^{#1}\if \dimposp{\wd\zboxc}_{#2}\fi}}}
+
+\def \zdiagla #1#2{%
+ {\setbox \zboxa = \hbox{$\scriptstyle \;\;\;{#1}\;$}%
+ \setbox \zboxb = \hbox{$\scriptstyle \;\;\;{#2}\;$}%
+ \setbox \zboxc = \hbox{$#2$}%
+ \tdimena = \diagramminarrow
+ \if \dimgtrp{\wd\zboxa}{\tdimena}\tdimena = \wd\zboxa \fi
+ \if \dimgtrp{\wd\zboxb}{\tdimena}\tdimena = \wd\zboxb \fi
+ \mathrel{\mathop{\hbox to \tdimena {\leftarrowfill}}%
+ \limits^{#1}\if \dimposp{\wd\zboxc}_{#2}\fi}}}
+
+\def \zdiaglra #1#2{%
+ {\setbox \zboxa = \hbox{$\scriptstyle \;\;\;{#1}\;\;\;$}%
+ \setbox \zboxb = \hbox{$\scriptstyle \;\;\;{#2}\;\;\;$}%
+ \setbox \zboxc = \hbox{$#2$}%
+ \tdimena = \diagramminarrow
+ \if \dimgtrp{\wd\zboxa}{\tdimena}\tdimena = \wd\zboxa \fi
+ \if \dimgtrp{\wd\zboxb}{\tdimena}\tdimena = \wd\zboxb \fi
+ \mathrel{\mathop{\hbox to \tdimena {\leftrightarrowfill}}%
+ \limits^{#1}\if \dimposp{\wd\zboxc}_{#2}\fi}}}
+
+\def \zdiaghb #1#2{%
+ {\setbox \zboxa = \hbox{$\scriptstyle \;{#1}\;$}%
+ \setbox \zboxb = \hbox{$\scriptstyle \;{#2}\;$}%
+ \setbox \zboxc = \hbox{$#2$}%
+ \tdimena = \diagramminarrow
+ \if \dimgtrp{\wd\zboxa}{\tdimena}\tdimena = \wd\zboxa \fi
+ \if \dimgtrp{\wd\zboxb}{\tdimena}\tdimena = \wd\zboxb \fi
+ \mathrel{\mathop{\hbox to \tdimena {\equalfill}}%
+ \limits^{#1}\if \dimposp{\wd\zboxc}_{#2}\fi}}}
+
+\def \zdiagva #1#2#3#4#5#6{% {centering}{h-overlap}{t-overlap}
+ % {arrow}{left-label}{right-label}
+ \if \codeeqlp{#1}{h}%
+ \if \codeeqlp{#2}{l}%
+ \llap{$\scriptstyle{#5}\mkern 2mu{#4}$}%
+ \rlap{$\mkern 2mu \scriptstyle #6$}%
+ \else
+ \llap{$\scriptstyle{#5}\mkern 2mu$}%
+ \rlap{${#4}\mkern 2mu \scriptstyle{#6}$}%
+ \fi
+ \else\if \codeeqlp{#1}{t}%
+ \if \codeeqlp{#3}{l}%
+ \llap{$\scriptstyle{#5}\mkern 2mu{#4}$}
+ \rlap{$\mkern 2mu \scriptstyle #6$}%
+ \else
+ \llap{$\scriptstyle{#5}\mkern 2mu$}
+ \rlap{${#4}\mkern 2mu \scriptstyle #6$}%
+ \fi
+ \else
+ \llap{$\scriptstyle{#5}\mkern 2mu$}{#4}%
+ \rlap{$\mkern 2mu \scriptstyle #6$}%
+ \fi\fi}
+
+\def \zdiagwd #1#2{%
+ \setbox \zboxa = \hbox{$\scriptstyle #2$}%
+ \hbox to \wd\zboxa {\hfil $\scriptstyle #1$\hfil}}
+
+% Enunciation Definition
+% ----------- ----------
+
+
+\setlist \zenuntypelist = {}
+
+
+\def \defineenunciationtype #1#2{% {type}{association}
+ \if \emptyargp{#2}%
+ \if \withname\undefinedp{\enunciation#1number}%
+ \withname\definecount{\enunciation#1number}{0}%
+ \withname\declaresnapitem{\enunciation#1number}%
+ \fi
+ \else
+ \defineenunciationtype{#2}{}%
+ \edef \znext {%
+ \global\withname\let{\enunciation#1number}=\name{\enunciation#2number}}%
+ \znext
+ \fi
+ \append{#1}{\zenuntypelist}}
+
+%~ Use this command to define a new type of enunciation.
+
+\def \defineenunciation #1#2#3{% {type}{association}{design}
+ \defineenunciationtype{#1}{#2}%
+ \withname\def {\enunciation#1design}{#3}}
+
+
+% This is deprecated in favor of \defineenunciation.
+
+\def \defineenunciationtypedesign #1#2#3{% {type}{assocation}{design}
+ \defineenunciationtype{#1}{#2}%
+ \withname\def {\enunciation#1design}{#3}}
+
+\def \resetenunciationnumbers {%
+ \maplist{\global\name{\enunciation##1number}=0\relax}{\zenuntypelist}}
+
+% Enunciation Block
+% ----------- -----
+
+
+\defineblock{\enunciation}{\endenunciation}{\false}{}
+
+%~block enunciation Type
+% \abovepenalty = integer % Penalty above block
+% \aboveskip = glue % Space b/b above block.
+% \setflag \allowclubline = flag % True if club allowed below.
+% \setflag \allownesting = flag % True if blocks can be nested.
+% \attribution = {...} % Attribution text (no longer used).
+% \setflag \attributionarg = flag % True if \enunciation takes attribution argument.
+% \autoqed = {,,,} % Automatic QED at end.
+% \belowpenalty = integer % Penalty below block.
+% \belowskip = glue % Space b/b below block.
+% \bodyfont = {...} % Font for text.
+% \def \comptextformat {...} % Composite number text formatter.
+% \continue = integer % Continued or continuation.
+% \difficulty = integer % Level of difficulty.
+% \def \endformat {...} % End of enunciation formatter.
+% \def \labelformat ##1{...} % Enunciation label formatter.
+% \leftindent = glue % Left indentation.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \rightindent = glue % Right indentation.
+% \width = dimen % Width of text.
+%~end
+
+\definetoks{\attribution}
+\definecount{\attributiontype}{0} % 0: none; 1: attribution; 2: new title
+\definetoks{\autoqed}
+
+\setflag \zautoqeddone = \false
+
+
+\def \enunciation #1{% {type}{optional-attribution}
+ \beginblockscope{enunciation}%
+ \global\increment \enunciationdepth
+ \abovepenalty = \breakgood %~default hard
+ \setflag \allowclubline = \false %~default soft
+ \setflag \allownesting = \false %~default soft
+ \attribution = {}% %~default with
+ \setflag \attributionarg = \false %~default soft
+ \autoqed = {}% %~default soft
+ \belowpenalty = \breakgood %~default hard
+ \continue = 0 %~default with
+ \setflag \continuation = \false % Deprecated
+ \difficulty = 0 %~default with
+ \def \endformat {}% %~default soft
+ \processdesign{\enunciation}{#1}%
+ \zsetcontinue % Handle old \continuation.
+ \if \andp{\notp{\allownesting}}{\gtrp{\enunciationdepth}{1}}%
+ \error{blkcantnest}
+ {An enunciation cannot be nested inside itself}%
+ \fi
+ \if \attributionarg
+ \let \znext = \enunciationarg
+ \else
+ \let \znext = \enunciationb
+ \fi
+ \znext{#1}}
+
+\def \enunciationarg #1#2{% {type}{attribution}
+ \if \notp{\emptyargp{#2}}\attribution = {#2}\fi
+ \enunciationb{#1}}
+
+\def \enunciationb #1{% {type}
+ \attributiontype = 0\relax
+ \global\setflag \zautoqeddone = \false
+ \if \notp{\emptytoksp{\attribution}}%
+ \expandafter\zparseenunattr \the\attribution \zmark
+ \fi
+ \if \notp{\continuationp}%
+ \global\withname\increment{\enunciation#1number}%
+ \fi
+ \global\withname\enunciationnumber{\enunciation#1number}%
+ \setcomptext{\enunciationcomptext}%
+ \enunciationformat
+ \settaginfo{\the\enunciationcomptext}{???}%
+ \ignorespaces}
+
+\def \endenunciation {%
+ \futurelet\nexttoken \zendenunciation}
+
+\def \zendenunciation {%
+ \endenunciationformat
+ \global\decrement \enunciationdepth
+ \endblockscope{enunciation}%
+ \parnext}
+
+\def \enunciationformat {%
+ \endgraf
+ \the\bodyfont
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{\parrag}%
+ \expandafter\labelformat\expandafter{\the\attribution}%
+ \if \notp{\allowclubline}\overrideclubpenalty{\breaknever}\fi}
+
+\def \endenunciationformat{%
+ \if \notp{\zautoqeddone}\the\autoqed \fi
+ \endgraf
+ \endformat
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+%~ This marker indicates that the enunciation title completely
+%~ replaces the default title.
+
+\definemarker{\title}
+
+\def \zparseenunattr #1#2\zmark{%
+ \def \znext {#1}%
+ \def \ztitle {\title}%
+ \if \tokeqlp{\znext}{\ztitle}%
+ \attribution = {#2}%
+ \attributiontype = 2\relax
+ \else
+ \attributiontype = 1\relax
+ \fi}
+
+%~ This command is used in enunciation design macros to select the
+%~ title format based on the |\enunciation| *attribution* argument.
+
+\long\def \attributiontypecase #1#2#3{% {format1}{format2}{format3}
+ \ifcase \attributiontype
+ #1% no attribution
+ \or
+ #2% normal attribution
+ \or
+ #3% title override
+ \fi}%
+
+% QED Definition
+% --- ----------
+
+
+%~ This command defines an end-of-enunciation dingbat for use
+%~ with enunciations.
+
+\def \defineeoedingbat #1#2#3{% {name}{text}{space}
+ \withname\gdef {#1dingbat}{#2}%
+ \gdef #1{\zformateoe{#2}#3\zmark}%
+ \withname\gdef {\no\expandafter\discardtok\string#1}{%
+ \global\setflag \zautoqeddone = \true}}
+
+\def \zformateoe #1#2#3\zmark{%
+ {\def \znext {#2}%
+ \def \zfr {\flushright}%
+ \if \tokeqlp{\znext}{\zfr}%
+ \if \vmodep
+ \rightline{#1}%
+ \else\if \mathmodep
+ \hskip #3{#1}%
+ \else
+ \hskip #3\retain \nobreak \hfill {#1}%
+ \fi\fi
+ \else
+ \if \vmodep
+ \rightline{#1}%
+ \else\if \mathmodep
+ \hskip #2#3{#1}%
+ \else
+ \unskip \hskip #2#3\hskip 0pt plus -1fill \retain \nobreak \hfill {#1}%
+ \fi\fi
+ \fi
+ \global\setflag \zautoqeddone = \true}}
+
+
+%~ This command is deprecated in favor of |\defineeoedingbat|.
+
+\def \defineqed #1#2#3#4{% {\name}{text}{space}{min-space}
+ \withname\gdef {#1dingbat}{#2}%
+ \gdef #1{\zformatqed{#2}{#3}{#4}}%
+ \withname\gdef{\no\expandafter\discardtok\string#1}{%
+ \global\setflag \zautoqeddone = \true}}
+
+\def \zformatqed #1#2#3{% {text}{space}{min-space}
+ {\def \znext {#2}%
+ \def \zfr {\flushright}%
+ \if \tokeqlp{\znext}{\zfr}%
+ \hspace{#3}\retain \nobreak \hfill {#1}%
+ \else
+ \if \vmodep
+ \noindent #1\par
+ \else
+ \hspace{#2}{#1}%
+ \fi
+ \fi
+ \global\setflag \zautoqeddone = \true}}
diff --git a/macros/plain/contrib/zztex/tex/zzmathv3.tex b/macros/plain/contrib/zztex/tex/zzmathv3.tex
new file mode 100644
index 0000000000..a30a797bc2
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmathv3.tex
@@ -0,0 +1,123 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities for "new math"
+% version 3, which supercedes version 2.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 7 June 2003
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Math Spaces
+% ---- ------
+
+
+\setmathspaces{4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}%
+
+% Math Font Selections
+% ---- ---- ----------
+
+
+\outer\def \ComputerModernmathfonts {%
+ \input zzcmmath\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \Lucidamathfonts #1{% {arrows?}
+ \setflag \zusemar = #1\relax
+ \input zzlucida\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \MathTimefonts #1{% {text face is Times?}
+ \input zzmtime\relax
+ \if #1%
+ \setmathpunctuationstyle{\mit}{\rm}%
+ \else
+ \setmathpunctuationstyle{\rm}{\rm}%
+ \fi}
+
+\outer\def \Stonemathfonts {%
+ \setmathpunctuationstyle{\rm}{\rm}}
+
+% Punctuation Style
+% ----------- -----
+
+
+% Here we deal with the style for comma, period, semicolon, and colon.
+% The default punctuation style for all four is \rm.
+
+
+% This macro defines the math characters \zmperiod, \zmcomma,
+% colon, and semicolon to use the specified style.
+% If the style is \mit, then it's different.
+
+\def \setmathpunctuationstyle #1#2{% {\style1}{\style2}
+ {\zmstyfam = \name{#1fam}%
+ \if \eqlp{\zmstyfam}{\mitfam}%
+ \definemathchar {`.} \classord \mitfam {3A}
+ \definemathchar {`,} \classpunc \mitfam {3B}
+ \else
+ \definemathchar {`.} \classactive \rmfam {00}
+ \definemathchar {`,} \classactive \rmfam {00}
+ \definemathchar {\zmperiod} \classord \zmstyfam {2E}
+ \definemathchar {\zmcomma} \classpunc \zmstyfam {2C}
+ \fi
+ \zmstyfam = \name{#2fam}%
+ \definemathchar {`;} \classpunc \zmstyfam {3B}
+ \definemathchar {`:} \classrel \zmstyfam {3A}}}
+
+% When period and comma are active in math, this is what they do.
+
+{
+\catcode `\. = \catactive
+\gdef .{\mathpalette\zmactperiod{}}
+
+\catcode `\, = \catactive
+\gdef ,{\mathpalette\zmactcomma{}}
+}
+
+\def \zmactperiod #1#2{%
+ \mathord{\hbox to .275em{\hfil $#1\zmperiod$\kern .06em\hfil}}}
+
+\def \zmactcomma #1#2{%
+ \mathpunct{\hbox to .331em{\kern .045em $#1\zmcomma$\hfil}}}
+
+% Dot-Related Commands
+% ----------- --------
+
+
+\def \cdotp {\mathpunct{\vcenter{\hbox{$.$}}}}
+
+\def \ldotp {\mathpunct{.}}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{\kern .4em .}%
+ \hbox{\kern .8em .}%
+ \vskip -.25ex}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \vdots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{.}%
+ \hbox{.}%
+ \vskip -.25ex}}
+
+% Colon Commands
+% ----- --------
+
+
+\def \maps {\mathpunct{:}}
+
+\let \colon = \maps
diff --git a/macros/plain/contrib/zztex/tex/zzmathv4.tex b/macros/plain/contrib/zztex/tex/zzmathv4.tex
new file mode 100644
index 0000000000..a5c5a0c411
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmathv4.tex
@@ -0,0 +1,129 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities for "new math"
+% version 4.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 September 2003
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Document Parameters
+% -------- ----------
+
+
+\delimitershortfall = 2pt
+
+% Math Spaces
+% ---- ------
+
+
+\setmathspaces{4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}%
+
+% Math Font Selections
+% ---- ---- ----------
+
+
+\outer\def \ComputerModernmathfonts {%
+ \input zzcmmath\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \Lucidamathfonts #1{% {arrows?}
+ \setflag \zusemar = #1\relax
+ \input zzlucida\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \MathTimefonts #1{% {text face is Times?}
+ \input zzmtime\relax
+ \if #1%
+ \setmathpunctuationstyle{\mit}{\rm}%
+ \else
+ \setmathpunctuationstyle{\rm}{\rm}%
+ \fi}
+
+\outer\def \Stonemathfonts {%
+ \setmathpunctuationstyle{\rm}{\rm}}
+
+% Punctuation Style
+% ----------- -----
+
+
+% Here we deal with the style for comma, period, semicolon, and colon.
+% The default punctuation style for all four is \rm.
+
+
+% This macro defines the math characters \zmperiod, \zmcomma,
+% colon, and semicolon to use the specified style.
+% If the style is \mit, then it's different.
+
+\def \setmathpunctuationstyle #1#2{% {\style1}{\style2}
+ {\zmstyfam = \name{#1fam}%
+ \if \eqlp{\zmstyfam}{\mitfam}%
+ \definemathchar {`.} \classord \mitfam {3A}
+ \definemathchar {`,} \classpunc \mitfam {3B}
+ \else
+ \definemathchar {`.} \classactive \rmfam {00}
+ \definemathchar {`,} \classactive \rmfam {00}
+ \definemathchar {\zmperiod} \classord \zmstyfam {2E}
+ \definemathchar {\zmcomma} \classpunc \zmstyfam {2C}
+ \fi
+ \zmstyfam = \name{#2fam}%
+ \definemathchar {`;} \classpunc \zmstyfam {3B}
+ \definemathchar {`:} \classrel \zmstyfam {3A}}}
+
+% When period and comma are active in math, this is what they do.
+
+{
+\catcode `\. = \catactive
+\gdef .{\mathpalette\zmactperiod{}}
+
+\catcode `\, = \catactive
+\gdef ,{\mathpalette\zmactcomma{}}
+}
+
+\def \zmactperiod #1#2{%
+ \mathord{\hbox to .275em{\hfil $#1\zmperiod$\kern .06em\hfil}}}
+
+\def \zmactcomma #1#2{%
+ \mathpunct{\hbox to .331em{\kern .045em $#1\zmcomma$\hfil}}}
+
+% Dot-Related Commands
+% ----------- --------
+
+
+\def \cdotp {\mathpunct{\vcenter{\hbox{$.$}}}}
+
+\def \ldotp {\mathpunct{.}}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{\kern .4em .}%
+ \hbox{\kern .8em .}%
+ \vskip -.25ex}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \vdots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{.}%
+ \hbox{.}%
+ \vskip -.25ex}}
+
+% Colon Commands
+% ----- --------
+
+
+\def \maps {\mathpunct{:}}
+
+\let \colon = \maps
diff --git a/macros/plain/contrib/zztex/tex/zzmathv5.tex b/macros/plain/contrib/zztex/tex/zzmathv5.tex
new file mode 100644
index 0000000000..e7a8f90b2d
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmathv5.tex
@@ -0,0 +1,129 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities for "new math"
+% version 5.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 September 2003
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Document Parameters
+% -------- ----------
+
+
+\delimitershortfall = 2pt
+
+% Math Spaces
+% ---- ------
+
+
+\setmathspaces{4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}%
+
+% Math Font Selections
+% ---- ---- ----------
+
+
+\outer\def \ComputerModernmathfonts {%
+ \input zzcmmath\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \Lucidamathfonts #1{% {arrows?}
+ \setflag \zusemar = #1\relax
+ \input zzlucida\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \MathTimefonts #1{% {text face is Times?}
+ \input zzmtime\relax
+ \if #1%
+ \setmathpunctuationstyle{\mit}{\rm}%
+ \else
+ \setmathpunctuationstyle{\rm}{\rm}%
+ \fi}
+
+\outer\def \Stonemathfonts {%
+ \setmathpunctuationstyle{\rm}{\rm}}
+
+% Punctuation Style
+% ----------- -----
+
+
+% Here we deal with the style for comma, period, semicolon, and colon.
+% The default punctuation style for all four is \rm.
+
+
+% This macro defines the math characters \zmperiod, \zmcomma,
+% colon, and semicolon to use the specified style.
+% If the style is \mit, then it's different.
+
+\def \setmathpunctuationstyle #1#2{% {\style1}{\style2}
+ {\zmstyfam = \name{#1fam}%
+ \if \eqlp{\zmstyfam}{\mitfam}%
+ \definemathchar {`.} \classord \mitfam {3A}
+ \definemathchar {`,} \classpunc \mitfam {3B}
+ \else
+ \definemathchar {`.} \classactive \rmfam {00}
+ \definemathchar {`,} \classactive \rmfam {00}
+ \definemathchar {\zmperiod} \classord \zmstyfam {2E}
+ \definemathchar {\zmcomma} \classpunc \zmstyfam {2C}
+ \fi
+ \zmstyfam = \name{#2fam}%
+ \definemathchar {`;} \classpunc \zmstyfam {3B}
+ \definemathchar {`:} \classrel \zmstyfam {3A}}}
+
+% When period and comma are active in math, this is what they do.
+
+{
+\catcode `\. = \catactive
+\gdef .{\mathpalette\zmactperiod{}}
+
+\catcode `\, = \catactive
+\gdef ,{\mathpalette\zmactcomma{}}
+}
+
+\def \zmactperiod #1#2{%
+ \mathord{\hbox to .275em{\hfil $#1\zmperiod$\hfil}}}
+
+\def \zmactcomma #1#2{%
+ \mathpunct{\hbox to .331em{\kern .045em $#1\zmcomma$\hfil}}}
+
+% Dot-Related Commands
+% ----------- --------
+
+
+\def \cdotp {\mathpunct{\vcenter{\hbox{$.$}}}}
+
+\def \ldotp {\mathpunct{.}}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{\kern .4em .}%
+ \hbox{\kern .8em .}%
+ \vskip -.25ex}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \vdots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{.}%
+ \hbox{.}%
+ \vskip -.25ex}}
+
+% Colon Commands
+% ----- --------
+
+
+\def \maps {\mathpunct{:}}
+
+\let \colon = \maps
diff --git a/macros/plain/contrib/zztex/tex/zzmathv6.tex b/macros/plain/contrib/zztex/tex/zzmathv6.tex
new file mode 100644
index 0000000000..c47f22ae2d
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmathv6.tex
@@ -0,0 +1,180 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities for "new math"
+% version 5.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 September 2003
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Document Parameters
+% -------- ----------
+
+
+\delimitershortfall = 2pt
+
+% Math Spaces
+% ---- ------
+
+
+\setmathspaces{4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}
+ {4mu plus .25mu minus .5mu}%
+
+% Math Font Selections
+% ---- ---- ----------
+
+
+\outer\def \ComputerModernmathfonts {%
+ \input zzcmmath\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \Lucidamathfonts #1{% {arrows?}
+ \setflag \zusemar = #1\relax
+ \input zzlucida\relax
+ \setmathpunctuationstyle{\mit}{\rm}}
+
+\outer\def \MathTimefonts #1{% {text face is Times?}
+ \input zzmtime\relax
+ \setmathucgreekstyles{\mit}{\boldgreekunavailable}%
+ \if #1%
+ \setmathpunctuationstyle{\mit}{\rm}%
+ \else
+ \setmathpunctuationstyle{\rm}{\rm}%
+ \fi}
+
+\outer\def \Stonemathfonts {%
+ \setmathpunctuationstyle{\rm}{\rm}}
+
+% Greek Letter Style
+% ----- ------ -----
+
+
+\def \zmucgreekstyler {}
+\def \zmucgreekstyleb {}
+
+
+% Note the "s" at the end of the name, versus \setmathucgreekstyle.
+
+\def \setmathucgreekstyles #1#2{% {regular-style}{bold-style}
+ \gdef \zmucgreekstyler {#1}%
+ \gdef \zmucgreekstyleb {#2}%
+\definemathchar \Alpha \classvarfam \rmfam {41}%
+\definemathchar \Beta \classvarfam \rmfam {42}%
+\zdefucgreekchar \Gamma {30}%
+\zdefucgreekchar \Delta {31}%
+\definemathchar \Epsilon \classvarfam \rmfam {45}%
+\definemathchar \Zeta \classvarfam \rmfam {5A}%
+\definemathchar \Eta \classvarfam \rmfam {48}%
+\zdefucgreekchar \Theta {32}%
+\definemathchar \Iota \classvarfam \rmfam {49}%
+\definemathchar \Kappa \classvarfam \rmfam {4B}%
+\zdefucgreekchar \Lambda {33}%
+\definemathchar \Mu \classvarfam \rmfam {4D}%
+\definemathchar \Nu \classvarfam \rmfam {4E}%
+\zdefucgreekchar \Xi {34}%
+\definemathchar \Omicron \classvarfam \rmfam {4F}%
+\zdefucgreekchar \Pi {35}%
+\definemathchar \Rho \classvarfam \rmfam {50}%
+\zdefucgreekchar \Sigma {36}%
+\definemathchar \Tau \classvarfam \rmfam {54}%
+\zdefucgreekchar \Upsilon {37}%
+\zdefucgreekchar \Phi {38}%
+\definemathchar \Chi \classvarfam \rmfam {58}%
+\zdefucgreekchar \Psi {39}%
+\zdefucgreekchar \Omega {7F}}
+
+\def \zdefucgreekchar #1#2{% {\name}{code}
+ \gdef #1{%
+ \if \eqlp{\fam}{-1}%
+ {\zmucgreekstyler \mathchar "70#2}%
+ \else\if \eqlp{\fam}{\bffam}%
+ {\zmucgreekstyleb \mathchar "70#2}%
+ \else
+ \error{invgrkstyle}{The current math family precludes using bold Greek}%
+ \fi\fi}}
+
+% Punctuation Style
+% ----------- -----
+
+
+% Here we deal with the style for comma, period, semicolon, and colon.
+% The default punctuation style for all four is \rm.
+
+
+% This macro defines the math characters \zmperiod, \zmcomma,
+% colon, and semicolon to use the specified style.
+% If the style is \mit, then it's different.
+
+\def \setmathpunctuationstyle #1#2{% {\style1}{\style2}
+ {\zmstyfam = \name{#1fam}%
+ \if \eqlp{\zmstyfam}{\mitfam}%
+ \definemathchar {`.} \classord \mitfam {3A}%
+ \definemathchar {`,} \classpunc \mitfam {3B}%
+ \else
+ \definemathchar {`.} \classactive \rmfam {00}%
+ \definemathchar {`,} \classactive \rmfam {00}%
+ \definemathchar {\zmperiod} \classord \zmstyfam {2E}%
+ \definemathchar {\zmcomma} \classpunc \zmstyfam {2C}%
+ \fi
+ \zmstyfam = \name{#2fam}%
+ \definemathchar {`;} \classpunc \zmstyfam {3B}%
+ \definemathchar {`:} \classrel \zmstyfam {3A}}}
+
+% When period and comma are active in math, this is what they do.
+
+{
+\catcode `\. = \catactive
+\gdef .{\mathpalette\zmactperiod{}}
+
+\catcode `\, = \catactive
+\gdef ,{\mathpalette\zmactcomma{}}
+}
+
+\def \zmactperiod #1#2{%
+ \mathord{\hbox to .275em{\hfil $#1\zmperiod$\hfil}}}
+
+\def \zmactcomma #1#2{%
+ \mathpunct{\hbox to .331em{\kern .045em $#1\zmcomma$\hfil}}}
+
+% Dot-Related Commands
+% ----------- --------
+
+
+\def \cdot {\mathbin{\vcenter{\hbox{$.$}}}}
+
+\def \cdotp {\mathpunct{\vcenter{\hbox{$.$}}}}
+
+\def \ldotp {\mathpunct{.}}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{\kern .4em .}%
+ \hbox{\kern .8em .}%
+ \vskip -.25ex}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \vdots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{.}%
+ \hbox{.}%
+ \vskip -.25ex}}
+
+% Colon Commands
+% ----- --------
+
+
+\def \maps {\mathpunct{:}}
+
+\let \colon = \maps
diff --git a/macros/plain/contrib/zztex/tex/zzmerge.tex b/macros/plain/contrib/zztex/tex/zzmerge.tex
new file mode 100644
index 0000000000..05ef863971
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmerge.tex
@@ -0,0 +1,70 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Merge Print
+%
+% Synopsis: This module provides a simple merge print facility for ZzTeX.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 17 October 2000
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Merge Fields
+% ----- ------
+
+
+\setlist \zmrgfields = {}
+\definecount{\zmrgcount}{0}
+
+\def \mergefields #1{%
+ \commalist{\zmrgfields}{#1}%
+ \zmrgcount = 0
+ \maplist{\increment \zmrgcount
+ \withname\edef {\zmrgfmap:##1}{\the\zmrgcount}}
+ {\zmrgfields}}
+
+% Merge Text
+% ----- ----
+
+
+\definetoks{\zmrgtoks}
+
+\long\def \mergetext #1\endmergetext{%
+ \zmrgtoks = {#1}}
+
+% Merge Print
+% ----- -----
+
+
+\definecount{\zmrgi}{0}
+
+
+\def \mergeprint {%
+ \zmrgi = 0
+ \zmrgprinta}
+
+\def \zmrgprinta #1{%
+ \if \lssp{\zmrgi}{\zmrgcount}%
+ \increment \zmrgi
+ \withname\def {\zmrgvmap:\the\zmrgi}{#1}%
+ \let \znext = \zmrgprinta
+ \else
+ \let \znext = \zmrgprintb
+ \fi
+ \znext}
+
+\def \zmrgprintb {%
+ \freshpage{\short\floats\any}%
+ \the\zmrgtoks}
+
+% Merge a Field
+% ----- - -----
+
+
+\def \merge #1{%
+ \edef \tcounta {\name{\zmrgfmap:#1}}%
+ \edef \znext {\name{\zmrgvmap:\the\tcounta}}%
+ \znext}
diff --git a/macros/plain/contrib/zztex/tex/zzmisc.tex b/macros/plain/contrib/zztex/tex/zzmisc.tex
new file mode 100644
index 0000000000..1813a3f572
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmisc.tex
@@ -0,0 +1,292 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Miscellaneous Facilities
+%
+% Synopsis: This module contains miscellaneous facilities that do not
+% seem to belong in any other file.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 26 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Character Categories
+% --------- ----------
+
+
+% The following list contains characters with category codes other
+% than endofline, ignored, space, letter, other, and invalid:
+
+\setlist \zcatlist = {}
+
+
+\def \establishcatcode #1#2{% {`\c}{\catname}
+ \zdelcat{#1}%
+ \catcode #1 = #2%
+ {\setflag \znext = \true
+ \if \eqlp{#2}{\catendofline}\setflag \znext = \false \fi
+ \if \eqlp{#2}{\catignored}\setflag \znext = \false \fi
+ \if \eqlp{#2}{\catspace}\setflag \znext = \false \fi
+ \if \eqlp{#2}{\catletter}\setflag \znext = \false \fi
+ \if \eqlp{#2}{\catother}\setflag \znext = \false \fi
+ \if \eqlp{#2}{\catinvalid}\setflag \znext = \false \fi
+ \if \znext \append{#1}{\zcatlist}\fi}}
+
+\def \zdelcat #1{%
+ {\setlist \znewcatlist = {}%
+ \maplist{\def \zcata {##1}\def \zcatb{#1}%
+ \if \notp{\tokeqlp{\zcata}{\zcatb}}\append{##1}{\znewcatlist}\fi}%
+ {\zcatlist}%
+ \setlist \zcatlist = \znewcatlist}}
+
+% Initialize the character list:
+
+\establishcatcode{`\^^L}{\catactive}
+\establishcatcode{`\#}{\catparameter}
+\establishcatcode{`\$}{\catmath}
+\establishcatcode{`\&}{\catalign}
+\establishcatcode{`\%}{\catcomment}
+\establishcatcode{`\@}{\catactive}
+\establishcatcode{`\\}{\catescape}
+\establishcatcode{`\^}{\catsuperscript}
+\establishcatcode{`\_}{\catsubscript}
+\establishcatcode{`\{}{\catbegin}
+\establishcatcode{`\}}{\catend}
+\establishcatcode{`\~}{\catactive}
+
+\def \uncatcode #1#2#3{% {allow-commands}{allow-at-commands}{allow-math}
+ \maplist{\catcode##1=\catother}{\zcatlist}%
+ \if #1%
+ \catcode`\\ = \catescape
+ \catcode`\{ = \catbegin
+ \catcode`\} = \catend
+ \fi
+ \if #2%
+ \catcode`\@ = \catactive
+ \fi
+ \if #3%
+ \catcode`\$ = \catmath
+ \catcode`\^ = \catsuperscript
+ \catcode`\_ = \catsubscript
+ \fi}
+
+\def \catcodemath {%
+ \catcode `\ = \catspace
+ \catcode `\$ = \catmath
+ \catcode `\^ = \catsuperscript
+ \catcode `\_ = \catsubscript}
+
+\def \catcoderange #1#2#3{% {first}{last}{\catname}
+ \tcounta = #1\relax
+ \tcountb = #2\relax \increment \tcountb
+ \loop
+ \ifnum \tcounta < \tcountb
+ \catcode \tcounta = #3%
+ \increment \tcounta
+ \repeat}
+
+% Make the upper half of the ASCII characters invalid.
+
+\catcoderange{"80}{"FF}{\catinvalid}
+
+% Conditional Text
+% ----------- ----
+
+
+\let \setif = \if
+\let \endsetif = \fi
+
+\def \ignore {%
+ \if \notp{\zemptyblockstackp}\todo{$\ignore command.}\fi
+ \setif \false}
+
+\let \endignore = \endsetif
+
+% Date & Time
+% ---- - ----
+
+
+% \year, \month, and \day are TeX parameters.
+
+\definecount{\weekday}{0}
+
+% \time is a TeX parameter, the number of minutes since midnight.
+
+\definecount{\hour}{0}
+\definecount{\minute}{0}
+
+
+\def \zdtinit {%
+ \zwdinit
+ \hour = \time
+ \divide \hour by 60
+ \minute = \time
+ \divide \minute by 60
+ \multiply \minute by -60
+ \advance \minute by \time}
+
+\def \zwdinit {%
+ \tcounta = \year
+ \if \lssp{\month}{3}\advance \tcounta by -1 \fi
+ \tcountb = \tcounta
+ \divide \tcountb by 100
+ \tcountc = \tcountb
+ \multiply \tcountc by -100
+ \advance \tcountc by \tcounta
+ \tcounta = \month
+ \if \lssp{\month}{3}\advance \tcounta by 9 \else \advance \tcounta by -3 \fi
+ \multiply \tcountb by 146097
+ \divide \tcountb by 4
+ \multiply \tcountc by 1461
+ \divide \tcountc by 4
+ \advance \tcountb by \tcountc
+ \multiply \tcounta by 153
+ \advance \tcounta by 2
+ \divide \tcounta by 5
+ \advance \tcountb by \tcounta
+ \advance \tcountb by \day
+ \advance \tcountb by -693902
+ \weekday = \tcountb
+ \divide \weekday by 7
+ \multiply \weekday by -7
+ \advance \weekday by \tcountb}
+
+
+\def \formattime {%
+ \number\hour:%
+ \if \lssp{\minute}{10}0\fi
+ \number\minute}
+
+% Fancy Names
+% ----- -----
+
+
+\def \AMSTeX {AMS\TeX}
+
+\def \BibTeX {Bib\TeX}
+
+\def \LaTeX {L\kern-.3em \raise .4ex \hbox{a}\kern-.05em \TeX}
+
+% Hiding Writes
+% ------ ------
+
+
+% These macros help to hide the \write's that are performed by commands
+% like \tag and \xpage.
+
+\definedimen{\zhidewriteskip}{0pt}
+
+\def \zbeginhidewrite {%
+ \zhidewriteskip = \lastskip
+ \begingroup
+ \if \hmodep \edef \zsf {\spacefactor=\the\spacefactor}\fi}
+
+\def \zendhidewrite {%
+ \if \hmodep \zsf \fi
+ \endgroup
+ \if \andp{\hmodep}{\dimposp{\zhidewriteskip}}\ignorespaces \fi}
+
+% Initialization File
+% -------------- ----
+
+
+\def \zloadinifile {%
+ \gdef \inicompositor {???}%
+ \gdef \iniinitials {???}%
+ \gdef \ininame {???}
+ \gdef \iniorganization {(none)}%
+ \checkfile{\zini}{zztex.ini}%
+ \if \zini
+ \writelog{(loading ini file)}%
+ \zloadinifilea
+ \else
+ \writelog{(no ini file)}%
+ \fi}
+
+\def \zloadinifilea {%
+ \begingroup
+ \catcode \endlinechar = \catcomment
+ \catcode `\; = \catcomment
+ \openin \zreada zztex.ini\relax
+ \setflag \zinireg = \false
+ \loop
+ \read \zreada to \zline
+ \if \notp{\emptydefp{\zline}}\expandafter\zloadinifileb \zline\zmark \fi
+ \if \notp{\eofp{\zreada}}\repeat
+ \closein \zreada
+ \endgroup}
+
+\def \zloadinifileb #1#2\zmark {%
+ \if \codeeqlp{#1}{[}%
+ \zloadinifilec #2\zmark
+ \else\if \zinireg
+ \zloadinifiled #1#2\zmark
+ \fi\fi}
+
+\def \zloadinifilec #1]#2\zmark {%
+ \stringeql{\zinireg}{#1}{registration}}
+
+\def \zloadinifiled #1=#2\zmark {%
+ \withname\gdef {\ini#1}{#2}}
+
+% Penalties
+% ---------
+
+
+% The following symbolic penalties should be used everywhere so they
+% can be adjusted without any recoding. The trailing spaces are
+% like \relax but don't screw up \ifnum.
+
+\def \breaknever {10000 } %~ Never break here. %^penalty
+\def \breakworst {500 } %~ Worst place to break. %^penalty
+\def \breakworse {300 } %~ Worse place to break. %^penalty
+\def \breakbad {100 } %~ Bad place to break. %^penalty
+\def \breakallowed {0 } %~ Break allowed here. %^penalty
+\def \breakgood {-100 } %~ Good place to break. %^penalty
+\def \breakbetter {-300 } %~ Better place to break. %^penalty
+\def \breakbest {-500 } %~ Best place to break. %^penalty
+\def \breakalways {-10000 } %~ Always break here. %^penalty
+
+
+\def \allowbreak {\penalty \breakallowed} %~ Allow page break here.
+\def \break {\penalty \breakalways} %~ Force page break here.
+\def \nobreak {\penalty \breaknever} %~ Disallow page break here.
+\let \unbreakable = \nobreak
+
+% Versions
+% --------
+
+
+% I have no idea what my intention was here.
+
+
+\def \defineversion #1#2{% {\name}{status}
+ \if #2%
+ \let \znext = \zletiftrue
+ \else
+ \let \znext = \zletiffalse
+ \fi
+ \withname\let {\end \expandafter\discardtok\string#1} = \fi
+ \znext{#1}}
+
+\def \zletiftrue #1{%
+ \let #1 = \iftrue}
+
+\def \zletiffalse #1{%
+ \let #1 = \iffalse}
+
+
+\defineversion{\ignore}{\false}
+
+% Translator Flags
+% ---------- -----
+
+
+\def \XTran<#1>{%
+ \error{xtran}{XTran flag: #1}}
+
+\def \ZzTran[#1]{%
+ \error{zztran}{ZzTran flag: #1}}
diff --git a/macros/plain/contrib/zztex/tex/zzmtime.tex b/macros/plain/contrib/zztex/tex/zzmtime.tex
new file mode 100644
index 0000000000..fd19871257
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzmtime.tex
@@ -0,0 +1,89 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX MathTime Font Support
+%
+% Synopsis: This module contains various definitions and redefinitions
+% necessary to use the MathTime fonts by The TeXplorators Corp.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 March 1993
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Type Styles
+% ---- ------
+
+\setstyleskewchar{\mit}{"2D}
+
+% Redefine Text Accents
+% -------- ---- -------
+
+
+\def \t #1{% %~ Tie-after accent. %^accent
+ {\edef \znext {\the\font}\the\textfont2 \accent "41 \znext #1}}
+
+% Redefine Math Characters
+% -------- ---- ----------
+
+
+\zmchar \Gamma \classord \mitfam {30}
+\zmchar \Delta \classord \mitfam {31}
+\zmchar \Theta \classord \mitfam {32}
+\zmchar \Lambda \classord \mitfam {33}
+\zmchar \Xi \classord \mitfam {34}
+\zmchar \Pi \classord \mitfam {35}
+\zmchar \Sigma \classord \mitfam {36}
+\zmchar \Upsilon \classord \mitfam {37}
+\zmchar \Phi \classord \mitfam {38}
+\zmchar \Psi \classord \mitfam {39}
+\zmchar \Omega \classord \mitfam {7F}
+
+\zmchar \varkappa \classord \mitfam {7E}
+
+\zmchar {`+} \classbinop \msyfam {43}
+\zmchar \compose \classbinop \msyfam {42}
+\zmchar \capprod \classbinop \msyfam {5A}
+\zmchar \cupprod \classbinop \msyfam {59}
+% Do not define \zmdagger and \zmddagger.
+\zmchar \setdiff \classbinop \msyfam {58}
+
+\zmchar \triangleleft \classbinop \msyfam {47}
+\zmchar \triangleright \classbinop \msyfam {46}
+
+\zmchar {`=} \classrel \msyfam {44}
+
+\zmchar {`(} \classopen \mitfam {2E}
+\definemathdelimiter {`(} \classord \mitfam {2E} \mexfam {00}
+
+\zmchar {`)} \classclose \mitfam {2F}
+\definemathdelimiter {`)} \classord \mitfam {2F} \mexfam {01}
+
+\def \hbar {\mathord{h \llap{$\mathchar"024E \mkern 3.5mu$}}}
+
+\def \acute {\zmtaccent{024B}{7013}} %~ Acute accent. %^math_accent
+\def \bar {\zmtaccent{024E}{7016}} %~ Bar accent. %^math_accent
+\def \breve {\zmtaccent{024D}{7015}} %~ Breve accent. %^math_accent
+\def \check {\zmtaccent{024C}{7014}} %~ Check accent. %^math_accent
+\def \ddot {\zmtaccent{0252}{????}} %~ Double dot accent. %^math_accent
+\def \dot {\zmtaccent{0250}{700B}} %~ Dot accent. %^math_accent
+\def \grave {\zmtaccent{024A}{7012}} %~ Grave accent. %^math_accent
+\def \zmhat {\zmtaccent{024F}{7007}} %~ Hat accent. %^math_accent
+\def \zmtilde {\zmtaccent{0251}{700F}} %~ Tilde accent. %^math_accent
+\def \vec {\mathaccent "0245\relax} %~ Vector accent. %^math_accent
+\def \widebar {\mathaccent "0253\relax} %~ Wide bar accent. %^math_accent
+
+\def \zmtaccent #1#2{%
+ \if \eqlp{\fam}{-1}%
+ \mathaccent "#1\relax
+ \else
+ \mathaccent "#2\relax
+ \fi}
+
+% Redefine General Tools
+% -------- ------- -----
+
+
+\zmchar \Relbar \classrel \msyfam {48}
diff --git a/macros/plain/contrib/zztex/tex/zznewmath.tex b/macros/plain/contrib/zztex/tex/zznewmath.tex
new file mode 100644
index 0000000000..583bb3d63a
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zznewmath.tex
@@ -0,0 +1,93 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Mathematics Facilities
+%
+% Synopsis: This file provides the mathematics facilities for "new math"
+% modes 1 and 2. It is loaded after the design file.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 16 October 2002
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Punctuation
+% -----------
+
+
+\if \eqlp{\newmath}{1}%
+
+\def \ldotp {\hbox to .42em{\hfil.\hfil}}
+
+\else\if \gtrp{\newmath}{1}%
+
+% This macro defines the math characters \zmperiod, \zmcomma,
+% colon, and semicolon to use the specified style.
+% If the style is \mit, then it's different.
+
+\def \setmathpunctuationstyle #1{% {style}
+ {\zmstyfam = \name{#1fam}%
+ \definemathchar {\zmperiod} \classord \zmstyfam {2E}
+ \definemathchar {\zmcomma} \classpunc \zmstyfam {2C}
+ \definemathchar {`;} \classpunc \zmstyfam {3B}
+ \definemathchar {`:} \classrel \zmstyfam {3A}}}
+
+% Now establish \rm as the default punctuation style.
+
+\setmathpunctuationstyle{\rm}
+
+% Period and comma must be active in math.
+
+\definemathchar {`.} \classactive \rmfam {00}
+
+\definemathchar {`,} \classactive \rmfam {00}
+
+% When period and comma are active in math, this is what they do.
+
+{
+\catcode `\. = \catactive
+\gdef .{\mathpalette\zmactperiod{}}
+
+\catcode `\, = \catactive
+\gdef ,{\mathpalette\zmactcomma{}}
+}
+
+\def \zmactperiod #1#2{%
+ \mathord{\hbox to .28em{\hfil $#1\zmperiod$\hfil}}}
+
+\def \zmactcomma #1#2{%
+ \mathpunct{\hbox to .33em{\hfil $#1\zmcomma$\kern .03em\hfil}}}
+
+% Now we can define all the dot-oriented math commands.
+
+\def \cdotp {\mathpunct{\vcenter{\hbox{$.$}}}}
+
+\def \ldotp {\mathpunct{.}}
+
+\def \cdots {\mathinner{\cdotp\cdotp\cdotp}}
+
+\def \ddots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{\kern .4em .}%
+ \hbox{\kern .8em .}%
+ \vskip -.25ex}}
+
+\def \ldots {\mathinner{\ldotp\ldotp\ldotp}}
+
+\def \vdots {%
+ \vbox{\baselineskip = 4pt \lineskiplimit = 0pt
+ \hbox{.}%
+ \hbox{.}%
+ \hbox{.}%
+ \vskip -.25ex}}
+
+% Make \maps and \colon do the right thing.
+
+\def \maps {\mathpunct{:}}
+
+\let \colon = \maps
+
+\fi\fi
diff --git a/macros/plain/contrib/zztex/tex/zznote.tex b/macros/plain/contrib/zztex/tex/zznote.tex
new file mode 100644
index 0000000000..412d46c98a
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zznote.tex
@@ -0,0 +1,522 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Notes Facilities
+%
+% Synopsis: This module defines various blocks that produce "notes", such
+% as footnotes.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 28 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Footnotes
+% ---------
+
+
+\defineblock{\footnote}{\endfootnote}{\true}{}
+
+% The footnote parameters are used at two different times: when the
+% \footnote macro appears, and when the page is output.
+
+% The \referencing parameter takes the following values:
+% 0: Produce neither a reference nor an intro number.
+% 1: Produce an intro number, but no reference.
+% 2: Produce both a reference and an intro number.
+
+%~block footnote
+% \aboveskip = glue % Space b/b above first footnote line.
+% \setflag \abutting = flag % True if note abutts previous one.
+% \bodyfont = {...} % Font for footnote text.
+% \def \comptextformat {...} % Composite number text formatter.
+% \internoteskip = glue % Extra space between footnotes.
+% \leftindent = glue % Left indentation.
+% \height = dimen % Maximum height on page.
+% \interlinepenalty = penalty % Penalty between footnote lines.
+% \def \noteintroformat {...} % Footnote intro formatter.
+% \def \noterefformat {...} % Footnote reference formatter.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \referencing = integer % How the footnote is referenced.
+% \rightindent = glue % Right indentation.
+% \rulecolor = {...} % Color of rule.
+% \rulewidth = dimen % Width of rule.
+% \ruleheight = dimen % Height of rule.
+% \ruleshift = dimen % Horizontal shift of rule.
+% \ruleskip = dimen % Space b/b below rule.
+% \def \spilloverride {...} % Override parameters on spillover.
+% \textcolor = {...} % Color of text.
+%~end
+
+\defineskip{\internoteskip}{0pt}
+\definecount{\referencing}{0}
+
+\defineinsert{\zfninsert}
+
+
+\def \footnote {% {text}
+ \blockcantbein{\footnote}{\footnote}%
+ \beginblockscope{footnote}%
+ \global\increment \footnotedepth
+ \setflag \abutting = \false %~default with
+ \referencing = 2 %~default with
+ \interlinepenalty = \breakworse %~default hard
+ \rulecolor = {black}% %~default soft
+ \ruleshift = 0pt %~default soft
+ \def \spilloverride {}% %~default soft
+ \textcolor = {black}% %~default soft
+ \processdesign{\footnote}{}%
+ \if \posp{\referencing}%
+ \global\increment \footnotenumber
+ \setcomptext{\footnotecomptext}%
+ \else
+ \footnotecomptext = {???}%
+ \fi
+ \settaginfo{\the\footnotecomptext}{???}%
+ \if \andp{\hmodep}{\eqlp{\referencing}{2}}%
+ {\edef \zsf {\spacefactor=\the\spacefactor}%
+ \/%
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb 1 0 1}\fi
+ \noterefformat
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi
+ \zsf}%
+ \fi
+ \footnoteinsert}
+
+\def \footnoteinsert {%
+ \the\bodyfont
+ \global\count\zfninsert = 1000
+ \global\dimen\zfninsert = \height
+ \global\skip\zfninsert = \aboveskip
+ \global\advance \skip\zfninsert by -\internoteskip
+ \global\advance \skip\zfninsert by -\ht\strutbox % of footnote text.
+ \insert \zfninsert \bgroup
+ \zpushvcontext
+ \color{\the\textcolor}%
+ \setindentation{\leftindent}{\rightindent}%
+ \setparrag{\parrag}%
+ \parfillskip = \normalparfillskip
+ \spaceskip = 0pt \xspaceskip = 0pt
+ \splittopskip = \ht\strutbox
+ \advance \splittopskip by \internoteskip
+ \splitmaxdepth = \dp\strutbox
+ \floatingpenalty = 20000\relax % Reference on same page as note.
+ \if \posp{\referencing}%
+ \noteintroformat
+ \else
+ \indent
+ \fi
+ \vbox to \splittopskip{}% % Strut in first line.
+ \bgroup
+ \aftergroup\endfootnote
+ \let \znext} % Eat open brace of footnote text.
+ % Absorb footnote text.
+ % \bgroup matches close brace.
+
+\def \endfootnote {%
+ \if \hmodep \strut \fi % Strut in last line.
+ \endgraf
+ \unskip
+ \endcolor
+ \zpopvcontext
+ \egroup % \insert
+ \global\decrement \footnotedepth
+ \endblockscope{footnote}}
+
+% This macro is invoked by the output routine to format footnotes.
+
+\def \zfootnoteformat #1{% {body-depth}
+ \beginblockscope{footnote}%
+ \ruleshift = 0pt
+ \def \spilloverride {}%
+ % We used to do the \processdesign here, but that does a \processwith
+ % that can end up processing some other block's pending \with. Oops.
+ \footnotedesign \relax % \processdesign{\footnote}{}
+ \if \notp{\emptydefp{\spilloverride}}%
+ \setbox \zboxa = \vtop{\unvcopy \zfninsert}%
+ \if \dimzerop{\ht\zboxa}\spilloverride \fi
+ \fi
+ \vskip \skip\zfninsert
+ \vskip -#1\relax
+ \if \andp{\dimposp{\ruleheight}}{\dimposp{\rulewidth}}%
+ \the\bodyfont
+ \tdimena = \ruleskip
+ \advance \tdimena by -\ht\strutbox
+ \advance \tdimena by -\internoteskip
+ \vskip -\tdimena
+ \vskip -\ruleheight
+ \nointerlineskip
+ \noindent \hspace{\ruleshift}%
+ \color{\the\rulecolor}\rule{height \ruleheight depth 0pt width \rulewidth}%
+ \endcolor\par
+ \vskip \tdimena
+ \fi
+ \unvbox \zfninsert
+ \endblockscope{footnote}}
+
+% Endnote
+% -------
+
+
+\defineblock{\endnote}{\endendnote}{\true}{}
+
+% The endnote parameters are used at two different times: when the
+% \endnote command appears, and when the \endnotes command is used
+% to typeset the notes.
+
+%~block endnote
+% \setflag \abutting = flag % True if note abutts previous one.
+% \def \comptextformat {...} % Composite number text formatter.
+% \endnoteclass = integer % Class of endnote.
+% \def \noterefformat {...} % Footnote reference formatter.
+% \referencing = integer % How the endnote is referenced.
+%~end
+
+\definecount{\endnoteclass}{0}
+\definetoks{\zendtoks}
+
+
+\def \endnote {% {text}
+ \blockcantbein{\endnote}{\endnote}%
+ \beginblockscope{endnote}%
+ \global\increment \endnotedepth
+ \setflag \abutting = \false %~default with
+ \endnoteclass = 0 %~default with
+ \referencing = 2 %~default with
+ \processdesign{\endnote}{}%
+ \global\increment \endnotenumber
+ \setcomptext{\endnotecomptext}%
+ \if \andp{\hmodep}{\eqlp{\referencing}{2}}%
+ {\edef \zsf {\spacefactor = \the\spacefactor}%
+ \/%
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb 1 0 1}\fi
+ \noterefformat
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi
+ \zsf}%
+ \fi
+ \afterassignment \endendnote
+ \zendtoks =}
+
+\def \endendnote {%
+ \edef \zendtext {\the\zendtoks}%
+ \edef \znext {\noexpand\xref{end}{\noexpand\folio}{\the\endnotecomptext}
+ {\expandafter\zdefof \meaning\zendtext\zmark}
+ {\the\divisionname,\the\endnoteclass}}%
+ \znext
+ \global\decrement \endnotedepth
+ \endblockscope{endnote}}
+
+% Endnotes
+% --------
+
+
+\defineblock{\endnotes}{\endendnotes}{\false}{}
+
+%~block endnotes
+% \setflag \abutting = flag % True if note abutts previous one.
+% \def \comptextformat {...} % Composite number text formatter.
+% \endnoteclass = integer % Class of endnote.
+% \def \noterefformat {...} % Footnote reference formatter.
+% \referencing = integer % How the endnote is referenced.
+%~end
+
+\definecount{\endnotepage}{0}
+\definetoks{\zenddivlist}
+\definetoks{\zenddiv}
+\definecount{\zendclass}{0}
+
+\def \endnotes #1{% {division-list}
+ \blockcantbein{\endnotes}{\endnotes}%
+ \blockmustbein{\endnotes}{\list}%
+ \beginblockscope{endnotes}%
+ \global\increment \endnotesdepth
+ \endnoteclass = 0 %~default with
+ \processdesign{\endnote}{}% % Use endnote block's design.
+ \global\increment \endnotesnumber
+ \zenddivlist = {#1}%
+ \zxloadcomp{\xrefloadendmode}%
+ \endendnotes}
+
+\def \endendnotes {%
+ \endgraf
+ \fakepar
+ \setlist \zendadjlist = {}%
+ \global\decrement \endnotesdepth
+ \endblockscope{endnotes}}
+
+% This macro is called for each endnote entry in the cross-reference file.
+
+\long\def \xrefend #1#2#3#4{%
+ \ifnum \xrefmode=\xrefloadendmode
+ \xrefendb{#1}{#2}{#3}{#4}%
+ \fi}
+
+\long\def \xrefendb #1#2#3#4{% {page}{number}{text}{division,class}
+ \def \znext ##1,##2,##3\zmark{%
+ \zenddiv={##1}\zendclass=##2}%
+ \znext #4,0,\zmark \relax
+ \if \eqlp{\zendclass}{\endnoteclass}%
+ \edef \znext {\noexpand\inclusionlist\noexpand\zendtest
+ {\the\zenddiv}{\the\zenddivlist}}%
+ \znext
+ \if \zendtest
+ \setbox \zboxa = \hbox{\zendclass=0#1}%
+ \endnotepage = \if \dimzerop{\wd\zboxa}#1\else 0 \fi
+ \let \xrefmode = \xrefrunmode
+ \zchkendadj{#2}%
+ \item{#2}#3\par
+ \let \xrefmode = \xrefloadendmode
+ \fi
+ \fi}
+
+% This macro allows the compositor to noninvasively adjust pages between
+% endnotes.
+
+\setlist \zendadjlist = {}
+
+\long\def \endnotesadjustment #1#2{% {division.number}{commands}
+ \append{{#1}{#2}}{\zendadjlist}}
+
+\long\def \zchkendadj #1{% {number}
+ \maplist{\zchkendadjb{#1}##1}{\zendadjlist}}
+
+\long\def \zchkendadjb #1#2#3{% {number}{division.number}{commands}
+ \stringeql{\znext}{\the\zenddiv.#1}{#2}%
+ \if \znext #3\relax \fi}
+
+% Margin Notes
+% ------ -----
+
+
+\defineblock{\marginnote}{\endmarginnote}{\true}{}
+
+%~block marginnote Type
+% \def \beginformat {...} % Beginning of text formatter.
+% \bodyfont = {...} % Font for note text.
+% \def \comptextformat {...} % Composite number text formatter.
+% \def \endformat {...} % End of text formatter.
+% \leftindent = glue % Left indentation.
+% \margingutter = dimen % Gutter for note in right margin.
+% \def \noteintroformat {...} % Note intro formatter.
+% \def \noterefformat {...} % Note reference formatter.
+% \parindent = dimen % Paragraph indent.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \position = {...} % Position (see below).
+% \referencing = integer % How the margin note is referenced.
+% \rightindent = glue % Right indentation.
+% \textcolor = {...} % Color of text.
+% \vshift = dimen % Vertical shift for note.
+% \width = dimen % Width of text in box.
+%~end
+
+\definedimen{\margingutter}{0pt}
+\definecount{\marginnotepage}{0}
+
+\definecount{\zdivmncounter}{0}
+\definedimen{\zmnshift}{0pt}
+\definetoks{\zmntoks}
+\definebox{\zmnbox}
+\definedimen{\zmnprevdepth}{0pt}
+
+
+\def \marginnote #1{% {type}
+ \blockcantbein{\marginnote}{\marginnote}%
+ \beginblockscope{marginnote}%
+ \global\increment \marginnotedepth
+ \global\increment \zdivmncounter
+ \whichpage{\marginnotepage}{zM:\the\divisionname-\the\zdivmncounter}%
+ \def \beginformat {}% %~default soft
+ \def \endformat {}% %~default soft
+ \leftindent = 0pt %~default soft
+ \referencing = 0 %~default soft
+ \rightindent = 0pt %~default soft
+ \textcolor = {black}% %~default soft
+ \vshift = 0pt %~default soft
+ \processdesign{\marginnote}{#1}%
+ \zparsemnpos{\the\position}%
+ \if \posp{\referencing}%
+ \global\increment \marginnotenumber
+ \setcomptext{\marginnotecomptext}%
+ \else
+ \marginnotecomptext = {???}%
+ \fi
+ \settaginfo{\the\marginnotecomptext}{???}%
+ \if \andp{\hmodep}{\eqlp{\referencing}{2}}%
+ {\edef \zsf {\spacefactor=\the\spacefactor}%
+ \/%
+ \if \DVIWindoinuse \colorspecial{ifview color push rgb 1 0 1}\fi
+ \noterefformat
+ \if \DVIWindoinuse \colorspecial{ifview color pop}\fi
+ \zsf}%
+ \fi
+ \afterassignment \endmarginnote
+ \zmntoks =}
+
+\def \endmarginnote {%
+ \setbox \zmnbox = \vtop{%
+ \zpushvcontext
+ \color{\the\textcolor}%
+ \the\bodyfont
+ \setindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}
+ \setparrag{\parrag}%
+ \beginformat
+ \if \posp{\referencing}\noteintroformat \fi
+ \the\zmntoks
+ \endgraf
+ \endformat
+ \endcolor
+ \zpopvcontext}%
+ \marginnoteformat
+ \global\decrement \marginnotedepth
+ \endblockscope{marginnote}}
+
+\def \marginnoteformat {%
+ \if \vmodep
+ \zmnprevdepth = \prevdepth
+ \nointerlineskip
+ \else
+ \vadjust
+ \fi
+ \bgroup
+ \moveright \zmnshift \vtop to 0pt{%
+ \vskip \vshift
+ \box \zmnbox
+ \vss
+ \tagpageonly{\uniquetag{zM}{\the\zdivmncounter}}}%
+ \egroup
+ \if \vmodep \prevdepth = \zmnprevdepth \fi}
+
+% This macro sets up variables that specify the position of a margin note
+% according to the \position design parameter:
+%
+% \ifevenpage Use next position only on even page.
+% \ifoddpage Use next position only on odd page.
+% \leftmargin Shift note to left margin.
+% \outsidemargin Shift note to outside margin.
+% \rightmargin Shift note to right margin.
+
+\definecount{\zmnhpos}{0}
+
+\def \zparsemnpos #1{% {options...}
+ \global\zmnhpos = 0
+ {\def \ifevenpage ##1{\if \evenp{\marginnotepage}##1\fi}%
+ \def \ifoddpage ##1{\if \oddp{\marginnotepage}##1\fi}%
+ \def \leftmargin {\global\zmnhpos=1\relax}%
+ \def \outsidemargin{\ifevenpage{\leftmargin}\ifoddpage{\rightmargin}}%
+ \def \rightmargin {\global\zmnhpos=2\relax}%
+ #1\relax}%
+ \ifcase \zmnhpos
+ \error{nomnpos}
+ {No horizontal position has been specified for a margin note}%
+ \or
+ \if \evenp{\marginnotepage}%
+ \zmnshift = -\evenlefttextmargin
+ \else
+ \zmnshift = -\oddlefttextmargin
+ \fi
+ \or
+ \calculate \zmnshift = {\textmeasure,+,\margingutter}%
+ \fi}
+
+% This macro is invoked at the beginning of each division.
+
+\def \zmndivinit {%
+ \global\zdivmncounter = 0\relax}
+
+% Proof Notes
+% ----- -----
+
+
+\defineblock{\proofnote}{\endproofnote}{\true}{}
+
+%~block proofnote
+% \bodyfont = {...} % Font for note text.
+% \evenshift = dimen % Horizontal shift for even pages.
+% \oddshift = dimen % Horizontal shift for odd pages.
+% \textcolor = {...} % Color of note.
+% \vshift = dimen % Vertical shift for note.
+% \width = dimen % Width of note.
+%~end
+
+\definedimen{\evenshift}{0pt}
+\definedimen{\oddshift}{0pt}
+
+\definecount{\zdivpncounter}{0}
+\definecount{\zpnpage}{0}
+
+
+\def \proofnote {% {text}
+ \blockcantbein{\proofnote}{\proofnote}%
+ \beginblockscope{proofnote}%
+ \global\increment \proofnotedepth
+ \global\increment \zdivpncounter
+ \whichpage{\zpnpage}{zP:\the\divisionname-\the\zdivpncounter}%
+ \parindent = 0pt
+ \parskip = 2pt
+ \textcolor = {black}% %~default soft
+ \vshift = 0pt %~default soft
+ \processdesign{\proofnote}{}%
+ \afterassignment \endproofnote
+ \zmntoks =}
+
+\def \endproofnote {%
+ \zcalcpnshift
+ \setbox \zmnbox = \vtop{%
+ \zpushvcontext
+ \color{\the\textcolor}%
+ \the\bodyfont
+ \settextwidth{\width}
+ \setparrag{.4\width}%
+ \def \endpartext {}% % Prevent end-of-paragraph text.
+ \the\zmntoks
+ \endgraf
+ \endcolor
+ \zpopvcontext}%
+ \proofnoteformat
+ \long\edef \znext {\noexpand\todo{.Proof note: \the\zmntoks}}%
+ \znext
+ \global\decrement \proofnotedepth
+ \endblockscope{proofnote}}
+
+\def \proofnoteformat {%
+ \if \vmodep
+ \zmnprevdepth = \prevdepth
+ \nointerlineskip
+ \else
+ \vadjust
+ \fi
+ \bgroup
+ \moveright \zmnshift \vtop to 0pt{%
+ \vskip -\parskip
+ \vskip \vshift
+ \box \zmnbox
+ \vss
+ \tagpageonly{\uniquetag{zP}{\the\zdivpncounter}}}%
+ \egroup
+ \if \vmodep \prevdepth = \zmnprevdepth \fi}
+
+\def \zcalcpnshift {%
+ \if \evenp{\zpnpage}%
+ \if \negp{\evenshift}%
+ \zmnshift = \evenshift
+ \else
+ \calculate \zmnshift = {\textmeasure,+,\evenshift}%
+ \fi
+ \else
+ \if \negp{\oddshift}%
+ \zmnshift = \oddshift
+ \else
+ \calculate \zmnshift = {\textmeasure,+,\oddshift}%
+ \fi
+ \fi}
+
+% This macro is invoked at the beginning of each division.
+
+\def \zpndivinit {%
+ \global\zdivpncounter = 0\relax}
diff --git a/macros/plain/contrib/zztex/tex/zzoverlay.tex b/macros/plain/contrib/zztex/tex/zzoverlay.tex
new file mode 100644
index 0000000000..e957ebd35e
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzoverlay.tex
@@ -0,0 +1,100 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Page Overlay Facilities
+%
+% Synopsis: This file provides the ability to overlay text and rules
+% on each page.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 29 March 2006
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Overlay & Proof Identification
+% ------- - ----- --------------
+
+
+\setflag \zoverlayset = \false
+\definetoks{\zoverlay}
+\zoverlay = {blind}
+\definetoks{\zproofid}
+\zproofid = {}
+
+\def \setpageoverlay #1{% {name}
+ \global\setflag \zoverlayset = \true
+ \global\zoverlay = {#1}}
+
+\def \proofidentification #1{% {text}
+ \zproofid = {#1}}
+
+\def \zproofidfile {%
+ \immediate\openout \zwritea = \jobname.zzq\relax
+ \immediate\write \zwritea {\the\zproofid}%
+ \immediate\closeout \zwritea}
+
+% Builtin Overlays
+% ------- --------
+
+
+\definedimen{\zoverlaythickness}{.4pt}
+
+
+\def \pageoverlayblind {}
+
+\def \pageoverlaytrimbox {%
+ \smashbox{%
+ \vbox to \trimheight{%
+ \topcornermarks{\trimwidth}{.5\trimheight}{\zoverlaythickness}%
+ \vss
+ \bottomcornermarks{\trimwidth}{.5\trimheight}{\zoverlaythickness}}}%
+ \zpagelengthmarks
+ \zslugline}
+
+\def \pageoverlaytrimmarks {%
+ \smashbox{%
+ \vbox to \trimheight{%
+ \topcornermarks{\trimwidth}{.75pc}{\zoverlaythickness}%
+ \vss
+ \bottomcornermarks{\trimwidth}{.75pc}{\zoverlaythickness}}}%
+ \zpagelengthmarks
+ \zslugline}
+
+% Page Length Marks
+% ---- ------ -----
+
+
+\def \zpagelengthmarks {%
+ \smashbox{%
+ \calculate \tdimena = {\headmargin,+,\typeareaheight,-,\footerheight}%
+ \vskip \tdimena
+ \hbox to \trimwidth{%
+ \llap{\vrule height \zoverlaythickness width .75pc}\hfil
+ \rlap{\vrule height \zoverlaythickness width .75pc}}}}
+
+% Slug Line
+% ---- ----
+
+
+\definedimen{\zslugindent}{.25in}
+
+
+\def \zslugline {%
+ \if \notp{\emptytoksp{\zproofid}}%
+ \kern \trimheight
+ \if \dimgtrp{\trimheight}{10.75in}\kern -.25in \fi
+ \kern -8pt
+ \hbox to \trimwidth{%
+ \hspace{\zslugindent}%
+ \zannofont
+ \the\zproofid \quad
+ \number\year/\number\month/\number\day\space \formattime \quad
+ p. \folio \hspace{5pt}%
+ \if \notp{\emptytoksp{\divisionname}}(\the\divisionname)\fi
+ \hfill
+ \inicompositor, \iniinitials \quad
+ \ZzTeX\ \ZzTeXversion
+ \hspace{\zslugindent}}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzpage.tex b/macros/plain/contrib/zztex/tex/zzpage.tex
new file mode 100644
index 0000000000..a666c18094
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzpage.tex
@@ -0,0 +1,908 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Page Facilities
+%
+% Synopsis: This module contains all the user facilities for
+% specifying things about the page layout. It also
+% contains the output routines.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 7 March 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tracing Page Makeup
+% ------- ---- ------
+
+
+\def \tracepagemakeup #1{%
+ \if \posp{\tracingpagemakeup}%
+ \writelog{ZzTeX page \the\pagenumber: #1}%
+ \fi}
+
+% Initialize Page Parameters
+% ---------- ---- ----------
+
+
+% Here we assume that the type area width is the same on both pages.
+
+\def \zpageinit {%
+ \gcalculate \trimplusbleedheight = {\standardbleed,+,\trimheight,+,%
+ \standardbleed}%
+ \gcalculate \trimplusbleedwidth = {\standardbleed,+,\trimwidth,+,%
+ \standardbleed}%
+ \gcalculate \typeareawidth = {\oddlefttextmargin,+,\textmeasure,+,%
+ \oddrighttextmargin}%
+ \gcalculate \evenoutermargin = {\trimwidth,-,\typeareawidth,-,%
+ \eveninnermargin}%
+ \gcalculate \evenbleedshift = {-\evenlefttextmargin,-,\evenoutermargin,-,%
+ \standardbleed}%
+ \gcalculate \oddoutermargin = {\trimwidth,-,\typeareawidth,-,%
+ \oddinnermargin}%
+ \gcalculate \oddbleedshift = {-\oddlefttextmargin,-,\oddinnermargin,-,%
+ \standardbleed}}
+
+% Page Number
+% ---- ------
+
+
+\countdef \pagenumber = 0
+
+\declaresnapitem{\pagenumber}
+
+\def \setpagenumber #1{% {number}
+ \global\pagenumber = #1\relax
+ \setcolumnnumber{1}}
+
+\def \evenpagep {\evenp{\pagenumber}}
+\def \oddpagep {\oddp{\pagenumber}}
+
+\def \folio {}
+
+\def \setfoliostyle #1{% {\style}
+ \ztoksa = \expandaftertwice{\name{#1folio}}%
+ \xdef \folio {\the\ztoksa}}
+
+\def \chapterpagefolio {\the\chaptercomptext-\number\pagenumber}
+\def \arabicfolio {\number\pagenumber}
+\let \decimalfolio = \arabicfolio
+\def \letterfolio {\ucletter\pagenumber}
+\def \partpagefolio {\the\partcomptext-\number\pagenumber}
+\def \romanfolio {\romannumeral\pagenumber}
+
+% Marks
+% -----
+
+
+% These macros hold the five parts of the current mark, each part having
+% three subparts. When a part is saved, the first subpart is expanded and
+% the second and third subparts are not.
+
+\definetoks{\zmarki} \zmarki = {{???}{???}{???}}
+\definetoks{\zmarkii} \zmarkii = {{???}{???}{???}}
+\definetoks{\zmarkiii} \zmarkiii = {{???}{???}{???}}
+\definetoks{\zmarkiv} \zmarkiv = {{???}{???}{???}}
+\definetoks{\zmarkv} \zmarkv = {{???}{???}{???}}
+
+
+\def \setmarkinfothree #1#2#3#4{% {part}{text1}{text2}{text3}
+ {\tcounta = #1\relax
+ \edef \znext {{#2}}%
+ \global\name{\zmark\romannumeral\tcounta} = \expandafter{\znext{#3}{#4}}%
+ \mark{\noexpand\or \the\zmarki \noexpand\or \the\zmarkii
+ \noexpand\or \the\zmarkiii \noexpand\or \the\zmarkiv
+ \noexpand\or \the\zmarkv}}%
+ \if \vmodep \repeatpenalty \fi} % In case glue follows the mark.
+
+\def \setmarkinfo #1#2#3{% {part}{text1}{text2}
+ \setmarkinfothree{#1}{#2}{#3}{???}}
+
+
+\let \firstnewmark = \firstmark
+\let \bottommark = \botmark
+
+\def \markinfo #1#2#3{% {mark}{part}{subpart}
+ \ifcase #3%
+ \relax
+ \or
+ \expandafter\zoneofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \or
+ \expandafter\ztwoofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \or
+ \expandafter\zthreeofthree
+ \ifcase #2\expandafter\relax #1\else {???}{???}{???}\fi
+ \else
+ \error{invsubpart}{The subpart `#3' is invalid}%
+ \fi}
+
+% Page Screen
+% ---- ------
+
+
+\def \fullpagescreen #1{% {color}
+ \if \inbackground
+ \vskip -\standardbleed
+ \moveleft \standardbleed \vbox{%
+ \colorrule{#1}{width \trimplusbleedwidth height \trimplusbleedheight}}%
+ \else
+ \hrule width 0pt
+ \vsinkfromtrim{-\standardbleed}
+ \smashbox{%
+ \colorparrule{#1}
+ {\if \evenp{\pagenumber}\evenbleedshift \else \oddbleedshift \fi}
+ {width \trimplusbleedwidth height 0pt depth \trimplusbleedheight}}%
+ \fi}
+
+% New Headers & Footers Scheme
+% --- ------- - ------- ------
+
+
+% Most of the definitions are in zzrunner.tex, but these need to be in
+% here so they can be used in design files.
+
+
+\def \headerblindformat {}
+
+\def \footerblindformat {}
+
+\def \headercornermarkformat {%
+ \line{\vrule height .5pt depth 0pt width 6pt \hfil
+ \vrule height .5pt depth 0pt width 6pt}%
+ \nointerlineskip
+ \line{\vrule height 6pt depth 0pt width .5pt \hfil
+ \vrule height 6pt depth 0pt width .5pt}%
+ \vfil}
+
+\def \footercornermarkformat {%
+ \vfil
+ \line{\vrule height 6pt depth 0pt width .5pt \hfil
+ \vrule height 6pt depth 0pt width .5pt}%
+ \nointerlineskip
+ \line{\vrule height .5pt width 6pt \hfil
+ \vrule height .5pt width 6pt}}
+
+% Old Headers & Footers Scheme
+% --- ------- - ------- ------
+
+
+\def \zcurheader{\normalheader}
+\def \zcurfooter{\normalfooter}
+
+\setflag \zoverrunners = \false
+\let \zsaveheader = \relax
+\let \zsavefooter = \relax
+
+
+\def \setrunners #1#2{% {header}{footer}
+ \if \zoverrunners
+ \gdef \zsaveheader {#1}%
+ \gdef \zsavefooter {#2}%
+ \else
+ \gdef \zcurheader {#1}%
+ \gdef \zcurfooter {#2}%
+ \fi}
+
+\def \overriderunners #1#2{% {header}{footer}
+ \if \notp{\zoverrunners}%
+ \global\let \zsaveheader = \zcurheader
+ \global\let \zsavefooter = \zcurfooter
+ \global\setflag \zoverrunners = \true
+ \fi
+ \gdef \zcurheader {#1}%
+ \gdef \zcurfooter {#2}}
+
+\def \blindrunners {%
+ \overriderunners{\blindheader}{\blindfooter}}
+
+\def \zsetrunnerstoks #1{% {tokens}
+ \expandafter\overriderunners \the#1}
+
+\def \zoverriderunnerstoks #1{% {tokens}
+ \expandafter\overriderunners \the#1}
+
+% The following macro is used to initialize the \runners parameter.
+
+\def \zoldrunners #1{%
+ \runners = {#1}}
+
+% The following macro is called from the output routine.
+
+\def \znextpagerunners {%
+ \if \zoverrunners
+ \global\let \zcurheader = \zsaveheader
+ \global\let \zcurfooter = \zsavefooter
+ \global\setflag \zoverrunners = \false
+ \fi}
+
+
+% The following macros provide some standard, simple header and footer
+% formats.
+
+\def \blindheader {}
+
+\def \blindfooter {}
+
+\def \cornermarkheader {\headercornermarkformat}
+
+\def \cornermarkfooter {\footercornermarkformat}
+
+% The following header and footer formats are provided by the design.
+% Just in case they are forgotten:
+
+\def \normalheader {%
+ \warning{noheadfoot}{No normal header format has been specified}}
+\def \normalfooter {%
+ \warning{noheadfoot}{No normal footer format has been specified}}
+\def \chapterheader {%
+ \warning{noheadfoot}{No chapter header format has been specified}}
+\def \chapterfooter {%
+ \warning{noheadfoot}{No chapter footer format has been specified}}
+
+% Multiple Columns
+% -------- -------
+
+
+% The following parameters are calculated by the \setpagecolumns command:
+
+\setflag \zdofullbreak = \false % True if doing a full break.
+\setflag \zusetypewidth = \false % True if using type area width.
+
+\definecount{\columncount}{0} % Number of columns on page.
+\definecount{\columnnumber}{0} % Current column number.
+% \hsize
+% \vsize
+
+
+% The \setpagecolumns command accepts the following options:
+%
+% \fullbreak
+% \shortbreak
+% \usetextmeasure
+% \usetextwidth
+% \usetypewidth
+
+\def \setpagecolumns #1#2#3{% {options}{columns}{gutter-width}
+ \endgraf
+ {\def \fullbreak {\global\setflag \zdofullbreak = \true}%
+ \def \shortbreak {\global\setflag \zdofullbreak = \false}%
+ \def \usetextmeasure {\global\setflag \zutw = \false}%
+ \def \usetextwidth {\global\setflag \zutw = \false}%
+ \def \usetypewidth {\global\setflag \zutw = \true}%
+ \global\setflag \zdofullbreak = \false
+ \global\setflag \zutw = \false
+ #1}%
+ \if \andp{\zusetypewidth}{\notp{\zutw}}%
+ \zejectcolpage
+ \else\if \onep{\columncount}%
+ \if \orp{\gtrp{#2}{1}}{\zutw}\penalty \zpenoneton \fi
+ \else\if \neqlp{#2}{\columncount}%
+ \zejectcolpage
+ \fi\fi\fi
+ \global\columncount = #2\relax
+ \global\setflag \zusetypewidth = \zutw
+ \tdimena = \if \zusetypewidth \typeareawidth \else \textmeasure \fi
+ \calculate \tdimenb = {-#3,*,\columncount,+,#3,+,\tdimena,/,\columncount}%
+ \settextwidth{\tdimenb}%
+ \global\hsize = \hsize % Make these two parameters global.
+ \global\parfillskip = \parfillskip
+ \setcolumnnumber{1}%
+ \tracepagemakeup{Columns: \the\columncount; width: \the\hsize; gutter: #3.}}
+
+\def \zejectcolpage {%
+ \if \zdofullbreak
+ \freshpage{\full\floats\any}%
+ \else
+ \freshpage{\short\floats\any}%
+ \fi
+ \global\vsize = \textareaheight} % Needed even if no page eject.
+
+
+\def \setcolumnnumber #1{% {number}
+ \global\columnnumber = #1\relax
+ \if \andp{\oddpagep}{\lastcolumnp}%
+ \global\brokenpenalty = \oddbrokenpenalty
+ \else
+ \global\brokenpenalty = \evenbrokenpenalty
+ \fi}
+
+\def \firstcolumnp {\eqlp{\columnnumber}{1}}
+\def \lastcolumnp {\eqlp{\columnnumber}{\columncount}}
+
+
+%-----------------------------------------------------------------------------
+%
+% This old command is deprecated, although it will work forever.
+
+
+\def \setcolumns #1#2#3{% {count}{gutter-width}{use-type-area}
+ \endgraf
+ \if \andp{\zusetypewidth}{\notp{#3}}%
+ \freshpage{\short\floats\any}%
+ \global\vsize = \textareaheight % Needed even if no page eject.
+ \else \if \eqlp{\columncount}{1}%
+ \if \orp{\gtrp{#1}{1}}{#3}%
+ \penalty \zpenoneton
+ \fi
+ \else \if \neqlp{#1}{\columncount}%
+ \freshpage{\short\floats\any}%
+ \global\vsize = \textareaheight % Needed even if no page eject.
+ \fi\fi\fi
+ \global\columncount = #1\relax
+ \global\setflag \zusetypewidth = #3\relax
+ {\zpageinit
+ \tdimena = #2\relax
+ \multiply \tdimena by \columncount
+ \advance \tdimena by -#2\relax
+ \if \zusetypewidth
+ \advance \tdimena by -\typeareawidth
+ \else
+ \advance \tdimena by -\textmeasure
+ \fi
+ \divide \tdimena by -\columncount
+ \settextwidth{\tdimena}%
+ \global\hsize = \hsize % Make these two parameters global.
+ \global\parfillskip = \parfillskip}%
+ \setcolumnnumber{1}%
+ \tracepagemakeup{Columns: \the\columncount; width: \the\hsize; gutter: #2.}}
+
+% Column Breaks
+% ------ ------
+
+
+\def \columnbreak #1{% {penalty}
+ \penalty #1\relax}
+
+\def \freshcolumn #1{% {options}
+ {\let \zfill = \relax
+ \let \full = \relax \def \short {\def \zfill {\vfill}}%
+ #1\relax%
+ \if \notp{\dimzerop{\lastskip}}\vskip -\lastskip \fi
+ \zfill
+ \penalty \zpenfreshcol}}
+
+\def \fullcolumnbreak {\freshcolumn{\full}}
+\def \shortcolumnbreak {\freshcolumn{\short}}
+
+\def \blankcolumn {%
+ \line{}%
+ \shortcolumnbreak}
+
+% Page Breaks
+% ---- ------
+
+
+%~ This command starts a new page. The options specify the
+%~ exact behavior:
+%~ & |\any|& Start an even or odd page.
+%~ & |\even|& Start an even page.
+%~ & |\floats|& Place all floats before new page.
+%~ & |\full|& Current page is bottomed out.
+%~ & |\nofloats|& No need to place all floats.
+%~ & |\odd|& Start an odd page.
+%~ & |\short|& Run current page short.
+%~ &.
+
+\def \freshpage #1{% {options} %^page_makeup
+ \if \vmodep
+ {\let \zfill = \vfill
+ \let \short = \relax \def \full {\let \zfill = \relax}%
+ \let \zflush = \zpenfreshpage
+ \let \nofloats = \relax \def \floats {\let \zflush = \zpenflushpage}%
+ \let \zpage = \relax
+ \let \any = \relax
+ \def \odd {\def \zpage {\if \evenpagep \blankpage \fi}}%
+ \def \even {\def \zpage {\if \oddpagep \blankpage \fi}}%
+ #1\relax%
+ \if \notp{\dimzerop{\lastskip}}\vskip -\lastskip \fi
+ \zfill
+ \if \notp{\lastcolumnp}%
+ \penalty \zpenfreshcol
+ \if \notp{\lastcolumnp}%
+ \loop
+ \blankcolumn
+ \if \notp{\lastcolumnp}\repeat
+ \fi
+ \line{}%
+ \vfill
+ \fi
+ \penalty \zflush
+ \zpage}%
+ \else
+ \error{pagepar}{Page break requested in the middle of a paragraph}%
+ \fi}
+
+%~ This command starts a new page, bottoming out the current page.
+
+\def \fullpagebreak {\freshpage{\full\nofloats\any}} %^page_makeup
+
+%~ This command starts a new page, leaving the current page short.
+%~ The argument specifies the number of lines short, or, if
+%~ specified as |\asap|, runs the page as short as possible.
+
+\def \shortpagebreak #1{% {lines} %^page_makeup
+ {\def \zarg {#1}\def \zasap {\asap}%
+ \if \tokeqlp{\zarg}{\zasap}%
+ \freshpage{\short\nofloats\any}%
+ \else
+ \kern -\dp\strutbox
+ \kern #1\baselineskip
+ \fullpagebreak
+ \fi}}
+
+\def \blankpage {%
+ \blindrunners
+ \pagehint{(blank)}%
+ \hrule width 0pt
+ \freshpage{\short\nofloats\any}}
+
+\def \blankleaf {%
+ \freshpage{\short\floats\odd}
+ \blankpage
+ \freshpage{\short\even}
+ \blankpage}
+
+% Overriding Text Area Height
+% ---------- ---- ---- ------
+
+
+\definedimen{\zortahsave}{0pt} % Saved normal text area height.
+\definecount{\zortahcount}{0} % Number of overridden pages.
+
+
+%~ This command changes the number of lines on the specified number
+%~ of pages, beginning with the current page. The nominal line count
+%~ is increased or decreased by the specified number of lines,
+%~ which should be coded with a plus or minus sign. A fractional
+%~ number of lines is allowed. It is best to change two pages (a spread)
+%~ with each command.
+
+\def \overridetextareaheight #1#2{% {pages}{lines} %^page_makeup
+ \if \posp{\zortahcount}%
+ \warning{overortah}{Text area height overridden during previous override}%
+ \zresetortah
+ \fi
+ {\global\zortahsave = \textareaheight
+ \global\zortahcount = #1\relax
+ \global\advance \textareaheight by #2\baselineskip
+ \global\vsize = \textareaheight
+ \if \dimneqlp{\pagegoal}{\maxdimen}%
+ \tdimena = \textareaheight
+ \advance \tdimena by -\zortahsave
+ \advance \tdimena by \pagegoal
+ \global\pagegoal = \tdimena
+ \fi}%
+ \tracepagemakeup{Overriding text area height: pages: #1, vsize: \the\vsize,
+ goal: \the\pagegoal.}}
+
+\def \zresetortah {%
+ \global\zortahcount = 0
+ \global\textareaheight = \zortahsave
+ \global\vsize = \textareaheight
+%%% \global\pagegoal = \vsize
+ \tracepagemakeup{Un-overriding text area height: vsize: \the\vsize.}}
+
+\def \zortahdivfinal {%
+ \if \posp{\zortahcount}%
+ \warning{divortah}{Text area height overridden across a division}%
+ \zresetortah
+ \fi}
+
+% Text Margins
+% ---- -------
+
+
+% The following two macros are really bogus, because TeX doesn't
+% always know what page it's on, except in the output routine.
+
+\def \thislefttextmargin {%
+ \if \evenpagep \evenlefttextmargin \else \oddlefttextmargin \fi}
+
+\def \thisrighttextmargin {%
+ \if \evenpagep \evenrighttextmargin \else \oddrighttextmargin \fi}
+
+\definedimen{\typeareashift}{0pt}
+\definecount{\ztaspage}{0}
+
+\def \determinetypeareashift #1{% {page}
+ \global\typeareashift = \if \evenp{#1}-\evenlefttextmargin \else
+ -\oddlefttextmargin \fi}
+
+% Layout Summary
+% ------ -------
+
+
+{\catcode`\_ = \catactive
+
+\gdef \zlayoutsummary {%
+ {\def _{\space}%
+ \writelog{}%
+ \writelog{Layout:}%
+ \writelog{}%
+ \tdimena = .013837\trimwidth
+ \tdimenb = .013837\trimheight
+ \writelog{Trim: \thefactor\tdimena"_x_\thefactor\tdimenb"}%
+ \tdimena = .013837\headmargin
+ \writelog{Head margin: \thefactor\tdimena"}%
+ \tdimena = .083333\typeareawidth
+ \tdimenb = .083333\typeareaheight
+ \writelog{Type area: \thefactor\tdimena pc_x_\thefactor\tdimenb pc}%
+ \tdimena = .013837\eveninnermargin
+ \tdimenb = .013837\oddinnermargin
+ \writelog{Inside margins: even \thefactor\tdimena", odd \thefactor\tdimenb"}%
+ \tdimena = .013837\evenoutermargin
+ \tdimenb = .013837\oddoutermargin
+ \writelog{Outside margins: even \thefactor\tdimena", odd \thefactor\tdimenb"}%
+ \tdimena = .083333\evenlefttextmargin
+ \tdimenb = .083333\oddlefttextmargin
+ \writelog{Left text margins: even \thefactor\tdimena pc,
+ odd \thefactor \tdimenb pc}%
+ \tdimena = .083333\evenrighttextmargin
+ \tdimenb = .083333\oddrighttextmargin
+ \writelog{Right text margins: even \thefactor\tdimena pc,
+ odd \thefactor\tdimenb pc}%
+ \tdimena = .083333\textmeasure
+ \tdimenb = .083333\textareaheight
+ \writelog{Text area: \thefactor\tdimena pc_x_\thefactor\tdimenb pc}%
+ \writelog{Top skip: \the\topskip, delta: \the\topdelta}%
+ \writelog{}}}
+
+}% \catcode
+
+% Debugging
+% ---------
+
+
+\def \zlogoutf {-1} % First page to log.
+\def \zlogoutl {-1} % Last page to log.
+
+
+\def \logoutput #1#2{% {first-page}{last-page}
+ \global\def \zlogoutf {#1}%
+ \global\def \zlogoutl {#2}}
+
+% Output Routine
+% ------ -------
+
+
+% The following definitions are for special penalties that control
+% page makeup:
+
+\def \zpennormal {-10000\relax} % Normal page break.
+\def \zpenoneton {-10001\relax} % Switch from 1 to n columns.
+\def \zpenfreshcol {-10002\relax} % Fresh column.
+\def \zpenfreshpage {-10003\relax} % Fresh page.
+\def \zpenflushpage {-10004\relax} % Fresh page, and flush floats.
+\def \zpenfloatpage {-10005\relax} % Page of floats scheduled.
+
+% We need to put the depth of box 255 in a convenient place.
+
+\definedimen{\zoutputcoldepth}{0pt}
+
+% We must save \mathdisplayprevgraf across the output routine.
+
+\definecount{\zsavemdpg}{0}
+
+% The following boxes hold parts of the page:
+
+\definebox{\zcolbox} % One column's worth.
+\definebox{\zbodybox} % The body, multiple columns' worth.
+\definebox{\zonetonbox} % Stuff preceding 1- to n-column switch.
+\setflag \zonetontype = \false % True if 1-to-n text uses type area width.
+
+% This toks register is invoked at the beginning of every column, so that
+% things like index carryovers can be performed.
+
+\definetoks{\everycolumn}
+\everycolumn = {\relax}
+
+
+\output = {\zoutput}
+
+\def \zoutput {%
+ \if \andp{\notp{\lssp{\pagenumber}{\zlogoutf}}}%
+ {\notp{\gtrp{\pagenumber}{\zlogoutl}}}%
+ \tracingoutput = 1
+ \showboxdepth = 1000 \showboxbreadth = 1000\relax
+ \fi
+ \tracepagemakeup{[Output routine invoked for column \the\columnnumber;
+ penalty: \the\outputpenalty.}%
+ \tracepagemakeup{Vsize: \the\vsize;
+ Box 255: \the\ht255+\the\dp255 \space x \the\wd255.}%
+ \zoutputcoldepth = \dp255\relax
+ \let \zsavewith = \zwith % Save these items across the
+ \let \zsavevariant = \zvariant % output routine in case they
+ \zsavemdpg = \mathdisplayprevgraf % are altered within it.
+ \normalbaselines
+ \let \par = \endgraf
+ \everyparagraph = {}%
+ \spaceskip = 0pt
+ \tcounta = \outputpenalty
+ \if \eqlp{\tcounta}{-'10000000000}\tcounta = \zpenflushpage \fi
+ \if \gtrp{\tcounta}{-10000}\tcounta = -10000\relax \fi
+ \negate \tcounta
+ \advance \tcounta by -10000\relax
+ \ifcase \tcounta
+ \zpagenormal \or
+ \zpageoneton \or
+ \zpagefreshcol \or
+ \zpagefreshpage \or
+ \zpageflushpage \or
+ \zpagefloatpage \else
+ \zzerror{Invalid page break penalty: \the\outputpenalty}%
+ \fi
+ \global\let \zvariant = \zsavevariant
+ \global\let \zwith = \zsavewith
+ \global\mathdisplayprevgraf = \zsavemdpg
+ \tracepagemakeup{Output routine complete.]}}
+
+\def \zpagenormal {%
+ \tracepagemakeup{Process normal column.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\false}%
+ \if \gtrp{\zfloatcount}{99}%
+ \zfltpage{\zpenfloatpage}%
+ \else
+ \zeverycol
+ \fi}
+
+\def \zpageoneton {%
+ \tracepagemakeup{Process 1- to n-column transition.}%
+ \zonetoncolumnbody
+ \global\setflag \zonetontype = \zusetypewidth
+ \global\advance \vsize by -\ht\zonetonbox
+ \global\advance \vsize by -\dp\zonetonbox
+ \tracepagemakeup{Space remaining on page: \the\vsize.}}
+
+\def \zpagefreshcol {%
+ \tracepagemakeup{Process `fresh column' request.}%
+ \zpagenormal}
+
+\def \zpagefreshpage {%
+ \tracepagemakeup{Process `fresh page' request.}%
+ \zpagenormal}
+
+\def \zpageflushpage {%
+ \tracepagemakeup{Process `fresh page, flush floats' request.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\true}%
+ \if \posp{\zfloatcount}%
+ \zfltpage{\zpenflushpage}%
+ \else
+ \zeverycol
+ \fi}
+
+\def \zpagefloatpage {%
+ \tracepagemakeup{Process page of floats.}%
+ \zcolumnsave
+ \if \lastcolumnp
+ \zpagecontents
+ \setcolumnnumber{1}%
+ \else
+ \tcounta = \columnnumber \increment \tcounta
+ \setcolumnnumber{\tcounta}%
+ \fi
+ \zfloatinit
+ \zschedulefloats{\zfloatcount}{\true}{\false}%
+ \if \gtrp{\zfloatcount}{99}%
+ \zfltpage{\zpenfloatpage}%
+ \fi}
+
+\def \zfltpage #1{% {penalty}
+ \if \notp{\emptytoksp{\zfltrunners}}%
+ \zoverriderunnerstoks{\zfltrunners}%
+ \fi
+ {\leftskip = 0pt \rightskip = 0pt
+ \line{}}%
+ \kern -\topskip % Why bother to do this?
+ \nobreak \vfill
+ \penalty #1}
+
+\def \zeverycol {%
+ {\zadjtitle = \zadjtitlemark % \adjusttitle should adjust mark.
+ \def \zadjloc {\mark}%
+ \the\everycolumn}}
+
+% Page Makeup: Column
+% ---- ------- ------
+
+
+\def \zcolumnsave {%
+ \zcolumnbody
+ \if \firstcolumnp
+ \global\setbox \zbodybox = \hbox to \zbodyboxwidth {\box\zcolbox \hss}%
+ \ztoksa = \expandafter{\topmark}%
+ \xdef \topmarki {\the\ztoksa}%
+ \ztoksa = \expandafter{\firstnewmark}%
+ \xdef \firstnewmarki {\the\ztoksa}%
+ \ztoksa = \expandafter{\bottommark}%
+ \xdef \bottommarki {\the\ztoksa}%
+ \else
+ \global\setbox \zbodybox = \hbox to \zbodyboxwidth {%
+ \unhbox\zbodybox \hfill \box\zcolbox}%
+ \fi}
+
+\def \zbodyboxwidth {%
+ \if \zusetypewidth \typeareawidth \else \textmeasure \fi}
+
+\def \zcolumnbody {%
+ \tracepagemakeup{Wrapping up the column; hsize: \the\hsize.}%
+ {\vbadness = 10000\relax
+ \global\setbox \zcolbox = \vbox to \vsize {%
+ \setindentation{0pt}{0pt}%
+ \boxmaxdepth = \maxdepth
+ \if \notp{\voidboxp{\ztopcolinsert}}\unvbox \ztopcolinsert \fi
+ \unvbox 255 % Page built by TeX.
+ \if \risingfootnotes
+ \if \notp{\voidboxp{\zfninsert}}\zfootnoteformat{\zoutputcoldepth}\fi
+ \fi
+ \if \risingbottomfloats
+ \if \notp{\voidboxp{\zbotcolinsert}}\unvbox \zbotcolinsert \fi
+ \fi
+ \if \raggedbottom
+ \kern -\zoutputcoldepth \vfill
+ \fi
+ \if \notp{\risingfootnotes}%
+ \if \notp{\voidboxp{\zfninsert}}\zfootnoteformat{\zoutputcoldepth}\fi
+ \fi
+ \if \notp{\risingbottomfloats}%
+ \if \notp{\voidboxp{\zbotcolinsert}}\unvbox \zbotcolinsert \fi
+ \fi}}}
+
+% This is a special version of \zcolumnbody for the 1- to n-column
+% transition.
+
+\def \zonetoncolumnbody {%
+ \global\setbox \zonetonbox = \vbox{%
+ \setindentation{0pt}{0pt}%
+ \boxmaxdepth = \maxdepth
+ \if \notp{\voidboxp{\ztopcolinsert}}\unvbox \ztopcolinsert \fi
+ \unvbox 255 % Page built by TeX.
+ \vskip \baselineskip
+ \vskip -\topskip
+ % Ignore footnotes.
+ % Ignore bottom style.
+ % Ignore bottom floats.
+ % Don't produce text area bottom rule.
+ }}
+
+% Page Makeup: Page
+% ---- ------- ----
+
+
+\def \zpagecontents {%
+ \tracepagemakeup{Shipping out the final page.}%
+ \shipout \vbox to \trimheight {%
+ \parskip = 0pt \parindent = 0pt
+ \setindentation{0pt}{0pt}%
+ \zpageheadmargin
+ \nointerlineskip
+ \zpagetypearea
+ \vfil
+ \nointerlineskip
+ \zpageoverlay}%
+ \if \posp{\zortahcount}% % If overriding text area height:
+ \global\decrement \zortahcount
+ \if \zerop{\zortahcount}\zresetortah \fi
+ \fi
+ \tcounta = \pagenumber \increment \tcounta
+ \setpagenumber{\tcounta}%
+ \global\vsize = \textareaheight % In case it was reset for this page.
+ \znextpagerunners}
+
+\def \zpagelengthmarks {%
+ \tdimena = \headmargin
+ \advance \tdimena by \typeareaheight
+ \advance \tdimena by -\footerheight
+ \vskip \tdimena
+ \vbox to 0pt{%
+ \hbox to \trimwidth{%
+ \llap{\vrule height .5pt width .75pc}\hfil
+ \rlap{\vrule height .5pt width .75pc}}%
+ \vss}
+ \vskip -\tdimena
+ \nointerlineskip}
+
+\setflag \inbackground = \false
+
+\def \zpageheadmargin {%
+ \vbox to \headmargin {%
+ \hrule height 0pt width \trimwidth
+ \nointerlineskip
+ \smashbox{%
+ \setflag \inbackground = \true
+ \zcurback}%
+ \nointerlineskip
+ \vfil
+ \zmakeuprule{\trimwidth}{.5pt}}}
+
+\def \zpagetypearea {%
+ \if \evenpagep
+ \negate \eveninnermargin
+ \advance \eveninnermargin by \trimwidth
+ \advance \eveninnermargin by -\evenlefttextmargin
+ \advance \eveninnermargin by -\textmeasure
+ \advance \eveninnermargin by -\evenrighttextmargin
+ \fi
+ \moveright \if \oddpagep \oddinnermargin \else \eveninnermargin \fi
+ \vbox to \typeareaheight {%
+ \zadjtitle = \zadjtitlemark % \adjusttitle should adjust mark.
+ \def \zadjloc {\mark}%
+ \zpageheader
+ \nointerlineskip
+ \ztextandmargins
+ \zmakeuprule{\typeareawidth}{.5pt}%
+ \vss % Allows text area height to vary.
+ \vbox to \footerheight{%
+ \vss
+ \zpagefooter}}}
+
+\def \zpageheader {%
+ \vbox to \headerheight {%
+ \hsize = \typeareawidth
+ \zoutputbeginblack
+ \zcurheader
+ \zoutputendblack
+ \vfil
+ \zmakeuprule{\typeareawidth}{.5pt}}}
+
+\def \ztextandmargins {%
+ \hbox to \typeareawidth {%
+ \if \notp{\zusetypewidth}%
+ \hbox to \thislefttextmargin{\hss}%
+ \fi
+ \vbox{%
+ \boxmaxdepth = \maxdepth
+ \if \andp{\zusetypewidth}{\notp{\zonetontype}}%
+ \moveright \thislefttextmargin
+ \fi
+ \box\zonetonbox
+ \nointerlineskip
+ \vbox{\box\zbodybox}}%
+ \hss}}
+
+\def \zpagefooter {%
+ \hsize = \typeareawidth
+ \zoutputbeginblack
+ \zcurfooter
+ \zoutputendblack
+ \if \PDFhyperlinks \PDFmark{P:\folio}\fi}
+
+% This macro invokes the page overlay after positioning to the
+% upper-left corner of the trim.
+
+\def \zpageoverlay {%
+ \vbox to 0pt{%
+ \offinterlineskip
+ \kern -\trimheight
+ \name{\pageoverlay\the\zoverlay}%
+ \vss}}
+
+\def \zmakeuprule #1#2{% {width}{height}
+ \if \DVIWindoinuse
+ \colorspecial{ifview color push rgb 0 1 0}%
+ \tdimena = #1\tcounta = \tdimena
+ \tdimena = #2\tcountb = \tdimena
+ \special{viewrule: \the\tcounta\space \the\tcountb}%
+ \colorspecial{ifview color pop}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zzplain.tex b/macros/plain/contrib/zztex/tex/zzplain.tex
new file mode 100644
index 0000000000..a24aa80139
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzplain.tex
@@ -0,0 +1,71 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% Module: ZzTeX Plain TeX Compatibility
+%
+% Synopsis: This module contains definitions necessary for
+% compatibility with Plain TeX. The only goal is to
+% allow ZzTeX to run on top of Plain TeX.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 24 July 1991
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\if \definedp{\dospecials}
+ \let \znext = \relax
+\else
+ \let \znext = \endinput
+\fi
+\znext
+
+\def \zplainerror {%
+ \error{plaintex}{Cannot use this Plain TeX feature in ZzTeX}}
+
+% Definitions
+% -----------
+
+
+\catcode`\@ = \catletter
+\zremovePlaindef \p@
+\definedimen{\p@}{1pt}
+\zremovePlaindef \z@
+\definedimen{\z@}{0pt}
+\zremovePlaindef \z@skip
+\defineskip{\z@skip}{0pt plus 0pt minus 0pt}
+\catcode`\@ = \catactive
+
+\let \beginsection = \zplainerror
+
+\let \bye = \zplainerror
+
+\let \eject = \zplainerror
+
+\let \leavevmode = \ensurepar
+
+\let \normalbottom = \zplainerror
+
+\let \raggedright = \zplainerror
+
+\let \supereject = \zplainerror
+
+\let \ttraggedright = \zplainerror
+
+% Eliminate Fonts
+% --------- -----
+
+ \tcounta = 0
+ \loop
+ \zclearfam{\tcounta}%
+ \increment \tcounta
+ \if \lssp{\tcounta}{16}\repeat
+
+ \let \rm = \relax
+ \let \mit = \relax
+ \let \it = \relax
+ \let \sl = \undefined \let \slfam = \undefined
+ \let \bf = \relax
+ \let \tt = \relax
diff --git a/macros/plain/contrib/zztex/tex/zzprog.tex b/macros/plain/contrib/zztex/tex/zzprog.tex
new file mode 100644
index 0000000000..10b655bf0c
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzprog.tex
@@ -0,0 +1,228 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZZTeX Programming Constructs
+%
+% Synopsis: This module contains definitions for ZZTeX's programming
+% constructs. These constructs provide various extensions
+% to TeX's sometimes meager repertoire of programming
+% features.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 27 March 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Token Hackery
+% ----- -------
+
+
+% We need a name for a space token.
+
+\def \\{\let \zspacetoken = } \\ % Now \zspacetoken is a space token.
+
+% This macro discards the next token.
+
+\def \discardtok #1{}% token
+
+% This macro removes the `pt' following a dimension.
+
+{\catcode `\p = \catother \catcode `\t = \catother
+
+\gdef \zremovedu #1pt{#1}
+
+} % \catcode
+
+% Using that macro, we can define a macro that "converts" a dimen register
+% into a factor.
+
+\def \thefactor #1{\expandafter\zremovedu \the#1}
+
+% This macro extracts the contents of a macro and returns it as plain text.
+% Usage: \expandafter\zdefof \meaning\macro\zmark
+
+\def \zdefof #1:->#2\zmark{#2}
+
+% Control Sequence Names
+% ------- -------- -----
+
+
+\def \name #1{% {\tokens}
+ \csname \expandafter\discardtok \string#1\endcsname}
+
+\def \withname #1#2{% {\command}{\tokens}
+ \expandafter#1\csname \expandafter\discardtok \string#2\endcsname}
+
+% Macro Expansion
+% ----- ---------
+
+
+\def \expandaftertwice {\expandafter\expandafter\expandafter}
+\def \expandafterthrice {\expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter}
+
+\def \zoneoftwo #1#2{#1}% {first}{second}
+\def \ztwooftwo #1#2{#2}% {first}{second}
+
+\def \zoneofthree #1#2#3{#1}% {first}{second}{third}
+\def \ztwoofthree #1#2#3{#2}% {first}{second}{third}
+\def \zthreeofthree #1#2#3{#3}% {first}{second}{third}
+
+\def \zoneoffour #1#2#3#4{#1}% {first}{second}{third}{fourth}
+\def \ztwooffour #1#2#3#4{#2}% {first}{second}{third}{fourth}
+\def \zthreeoffour #1#2#3#4{#3}% {first}{second}{third}{fourth}
+\def \zfouroffour #1#2#3#4{#4}% {first}{second}{third}{fourth}
+
+% Flags (Booleans)
+% ----- ----------
+
+% The boolean literals \true and \false are appropriate for use with
+% the \if command, which tests the codes of the next two characters.
+
+\def \true {TT}
+\def \false {FL}
+
+\def \setflag #1=#2{\edef #1{#2}}% \flag = boolean
+
+% IF and Predicates
+% -- --- ----------
+
+% A "predicate" is a macro that returns \true or \false as its value.
+% Such values are suitable for use with the \if conditional. For example:
+%
+% \if \oddp{\x} <then-clause> \else <else-clause> \fi
+
+% A predicate can be used with \setflag as follows:
+%
+% \setflag \flag = {<predicate>}
+
+% Here are the predicates for TeX's repertoire of conditional
+% commands. These might be more appropriately interspersed with
+% other definitions in this module, but what the heck.
+% Some additional "obvious" predicates are defined.
+
+
+\def \eqlp #1#2{\ifnum #1 = #2\true \else \false \fi}
+\def \neqlp #1#2{\ifnum #1 = #2\false \else \true \fi}
+\def \lssp #1#2{\ifnum #1 < #2\true \else \false \fi}
+\def \gtrp #1#2{\ifnum #1 > #2\true \else \false \fi}
+\def \zerop #1{\ifnum #1 = 0\true \else \false \fi}
+\def \onep #1{\ifnum #1 = 1\true \else \false \fi}
+\def \posp #1{\ifnum #1 > 0\true \else \false \fi}
+\def \negp #1{\ifnum #1 < 0\true \else \false \fi}
+\def \oddp #1{\ifodd #1\true \else \false \fi}
+\def \evenp #1{\ifodd #1\false \else \true \fi}
+\def \rangep #1#2#3{\if \orp{\lssp{#1}{#2}}{\gtrp{#1}{#3}}\false \else
+ \true \fi}
+\def \tensp #1{\rangep{#1}{10}{19}}
+
+\def \dimeqlp #1#2{\ifdim #1 = #2\true \else \false \fi}
+\def \dimneqlp #1#2{\ifdim #1 = #2\false \else \true \fi}
+\def \dimlssp #1#2{\ifdim #1 < #2\true \else \false \fi}
+\def \dimgtrp #1#2{\ifdim #1 > #2\true \else \false \fi}
+\def \dimzerop #1{\ifdim #1 = 0pt\true \else \false \fi}
+\def \dimposp #1{\ifdim #1 > 0pt\true \else \false \fi}
+\def \dimnegp #1{\ifdim #1 < 0pt\true \else \false \fi}
+
+\def \vmodep {\ifvmode \true \else \false \fi}
+\def \hmodep {\ifhmode \true \else \false \fi}
+\def \mathmodep {\ifmmode \true \else \false \fi}
+\def \textmodep {\ifmmode \false \else \true \fi}
+\def \innermodep {\ifinner \true \else \false \fi}
+
+\long\def \codeeqlp #1#2{\if #1#2\true \else \false \fi}
+
+\long\def \cateqlp #1#2{\ifcat #1#2\true \else \false \fi}
+
+\long\def \tokeqlp #1#2{\ifx #1#2\true \else \false \fi}
+\long\def \xtokeqlp #1#2{\expandafter\ifx #1#2\true \else \false \fi}
+
+\long\def \definedp #1{%
+ \expandafter\ifx \csname \expandafter\discardtok \string#1\endcsname
+ \relax \false \else \true \fi}
+
+\long\def \undefinedp #1{%
+ \expandafter\ifx \csname \expandafter\discardtok \string#1\endcsname
+ \relax \true \else \false \fi}
+\def \zempty {}
+\def \emptydefp #1{\ifx #1\zempty \true \else \false \fi}% {\name}
+
+\let \emptylistp = \emptydefp
+
+\long\def \emptyargp #1{% {#n}
+ \zempargp #1\zempargq\zmark}
+\long\def \zempargp #1#2\zmark{%
+ \ifx #1\zempargq \true \else \false \fi}
+\def \zempargq {\zempargq}
+
+\def \emptytoksp #1{% {\tokenreg}
+ \expandafter\zemptoksp \the#1\zmark}
+
+\long\def \zemptoksp #1\zmark{\emptyargp{#1}}
+
+\def \voidboxp #1{\ifvoid #1\true \else \false \fi}
+\def \hboxp #1{\ifhbox #1\true \else \false \fi}
+\def \vboxp #1{\ifvbox #1\true \else \false \fi}
+
+\def \eofp #1{\ifeof #1\true \else \false \fi}
+
+
+% Flags can also be used as predicates, as in:
+%
+% \if \flaga <then-clause> \else <else-clause> \fi
+
+
+% Now here we have predicates for the common logical operators.
+
+\def \notp #1{\if #1\false \else \true \fi}
+
+\def \andp #1#2{\if #1#2\else \false \fi}% {boolean1}{boolean2}
+
+\def \orp #1#2{\if #1\true \else #2\fi}% {boolean1}{boolean2}
+
+% Pseudo-Predicates
+% -----------------
+
+
+\def \stringeql #1#2#3{% {\return-flag}{string1}{string2}
+ \edef \zstra {#2}%
+ \edef \zstrb {#3}%
+ \edef #1{\ifx \zstra\zstrb \true \else \false \fi}}
+
+
+\def \gluevaries #1#2{% {\return-flag}{glue}
+ \zskipa = #2\relax
+ \tdimena = \zskipa
+ \stringeql{#1}{\the\zskipa}{\the\tdimena}%
+ \edef #1{\if #1\false \else \true \fi}}
+
+% Arithmetic
+% ----------
+
+
+\def \negate #1{\multiply #1 by -1\relax}% {\register}
+
+\def \increment #1{\advance #1 by 1\relax}% {\count}
+
+\def \decrement #1{\advance #1 by -1\relax}% {\count}
+
+% Looping
+% -------
+
+
+\def \loop #1\repeat{% body [actions] \if condition [actions] \repeat
+ \def \zloopbody {#1}%
+ \zloop}
+
+\def \zloop {%
+ \zloopbody
+ %\if condition
+ \let \zloopnext = \zloop
+ \else
+ \let \zloopnext = \relax
+ \fi
+ \zloopnext}
+
+\let \repeat = \fi \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzps.tex b/macros/plain/contrib/zztex/tex/zzps.tex
new file mode 100644
index 0000000000..f90d6e7ab9
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzps.tex
@@ -0,0 +1,251 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX PostScript Facilities
+%
+% Synopsis: This module contains any and all facilities that rely on
+% PostScript output.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 21 January 1994
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Extra Encoded Characters
+% ----- ------- ----------
+
+
+\def \PSbackslash {\char 134\relax}
+\def \PSbar {\char 138\relax}
+\def \PSbullet {\char 142\relax}
+\def \PSbraceleft {\char 137\relax}
+\def \PSbraceright {\char 139\relax}
+\def \PScent {\char 148\relax}
+\def \PScopyright {\char 145\relax}
+\def \PScurrency {\char 149\relax}
+\def \PSdagger {\char 140\relax}
+\def \PSddagger {\char 141\relax}
+\def \PSdollar {\char 131\relax}
+\def \PSgreater {\char 133\relax}
+\def \PSless {\char 132\relax}
+\def \PSordfeminine {\char 155\relax}
+\def \PSordmasculine {\char 156\relax}
+\def \PSparagraph {\char 143\relax}
+\def \PSperthousand {\char 157\relax}
+\def \PSpolishL {\char "A1\relax}
+\def \PSpolishl {\char "A2\relax}
+\def \PSregistered {\char 146\relax}
+\def \PSsection {\char 144\relax}
+\def \PSsterling {\char 158\relax}
+\def \PStrademark {\char 147\relax}
+\def \PSunderscore {\char 136\relax}
+\def \PSudquote {\char 135\relax}
+\def \PSusquote {\char 160\relax}
+\def \PSyen {\char 159\relax}
+
+% Import EPS File
+% ------ --- ----
+
+
+% The illustration \special is compatible with DVIPSONE, and with TeXtures
+% if clip? is false.
+% The scale is interpreted as follows:
+% <= 33.333: normal scale, 1.0 = 100%
+% > 33.333: TeX scale factor, 1000 = 100%
+
+\def \specialimportartfile #1#2#3{% {name}{scale}{clip?}
+ \special{illustration #1 scaled #2
+ \if #3clip\fi}}
+
+% This macro is a better variant of the preceding one. The scale
+% argument is a true scale specified in points.
+
+\def \specialplaceepsfile #1#2#3{% {name}{scale}{clip?}
+ {\tdimena = #2%
+ \if \dimgtrp{\tdimena}{33.333pt}% % Compensate for bizarre
+ \multiply \tdimena by 1000\relax % design of scaled option.
+ \fi
+ \special{illustration #1 scaled \thefactor\tdimena
+ \if #3\space clip\fi}}}
+
+% This macro is used to import an EPS file for a glyph. The scale
+% is specified as a percentage IN POINTS.
+
+\def \specialplaceglyph #1#2#3{% {name}{percentage}{clip?}
+ {\tdimena = #2%
+ \divide \tdimena by 100
+ \special{illustration #1 scaled \thefactor\tdimena
+ \if #3\space clip\fi}}}
+
+% Read EPS Bounding Box
+% ---- --- -------- ---
+
+
+\definedimen{\zbbxorigin}{0pt}
+\definedimen{\zbbyorigin}{0pt}
+
+
+{\catcode`\%=\catother
+\gdef \zpercent {%}
+} % \catcode
+
+\edef \zboundingbox {\zpercent\zpercent BoundingBox}
+\def \zatend {atend}
+\definecount{\zbbstate}{0}
+
+
+\def \zreadepsbb #1#2#3{% {\width}{\height}{file}
+ \def \zbbinfo {}%
+ \begingroup
+ \zsetepscatcodes
+ \openin \zreada #3\relax
+ \zbbstate = 0
+ \loop
+ \read \zreada to \zline
+ \ifeof \zreada
+ \zbbstate = 2
+ \else
+ \expandafter\zcheckbb \zline:.\zmark
+ \fi
+ \ifnum \zbbstate < 2 \repeat
+ \closein \zreada
+ \endgroup
+ \zsetbbsizes{#1}{#2}{#3}}
+
+\def \zsetepscatcodes {%
+ \catcoderange{0}{"1F}{\catcomment}%
+ \catcode `\^^I = \catspace
+ \catcode \endlinechar = \catendofline
+ \uncatcode{\false}{\false}{\false}%
+ \catcode `\: = \catother
+ \catcoderange{"7E}{"FF}{\catcomment}}
+
+\long \def \zcheckbb #1:#2#3\zmark{%
+ \def \znext {#1}%
+ \ifx \znext \zboundingbox
+ \zcheckatend #2#3()\zmark
+ \fi}
+
+\long \def \zcheckatend #1(#2)#3\zmark{%
+ \def \znext {#2}%
+ \ifx \znext \zatend
+ \zbbstate = 1
+ \else
+ \gdef \zbbinfo {#1}%
+ \ifnum \zbbstate = 0 \zbbstate = 2\fi
+ \fi}
+
+\def \zsetbbsizes #1#2#3{%
+ \if \emptydefp{\zbbinfo}%
+ \warning{missbb}{Art file `#3' has no bounding box}%
+ #1 = 20pc #2 = 10pc
+ \else
+ \expandafter \zcalcbb \zbbinfo \zmark{#1}{#2}%
+ \fi}
+
+\def \zcalcbb #1 #2 #3 #4 #5\zmark#6#7{%
+ \calculate #6= {#3pt,-,#1pt,+,1pt}%
+ \calculate #7= {#4pt,-,#2pt,+,1pt}%
+ \global\zbbxorigin = #1pt
+ \global\zbbyorigin = #2pt\relax}
+
+% Rotate Boxes
+% ------ -----
+
+
+\def \rotatebox #1#2{% {\box}{degrees}
+ \special{CTM: push rotate #2}%
+ \box #1%
+ \special{CTM: pop}}
+
+\def \rotatetext #1#2{% {text}{degrees}
+ \setbox \zboxa = \hbox{#1}%
+ \rotatebox{\zboxa}{#2}}
+
+% Colors
+% ------
+
+
+\def \colorspecial #1{%
+ \if \allowcolor
+ \special{#1}%
+ \fi}
+
+% These commands are called in the output routine to make sure that
+% everything added in the output routine is black.
+
+\def \zoutputbeginblack {%
+ \colorspecial{color push gray 0}}
+
+\def \zoutputendblack {%
+ \colorspecial{color pop}}
+
+% Color Block
+% ---- ------
+
+
+\defineblock{\color}{\endcolor}{\false}{}
+
+%~block color Type
+% \colorspec = {...} % Color specifier.
+%~end
+
+\definetoks{\colorspec}
+
+
+\def \color #1{% {type}
+ \beginblockscope{color}%
+ \global\increment \colordepth
+ \processdesign{\color}{#1}%
+ \global\increment \colornumber
+ \colorspecial{color push}%
+ \the\colorspec\zmark
+ \if \vmodep \vpenalty{\breaknever}\fi}
+
+\def \endcolor {%
+ \global\decrement \colordepth
+ \endblockscope{color}%
+ \colorspecial{color pop}}
+
+
+\def \setcolor #1{%
+ \begingroup
+ \processdesign{\color}{#1}%
+ \the\colorspec\zmark
+ \endgroup}
+
+% Color specifiers:
+
+\def \cmykcolor #1 #2 #3 #4\zmark{% c m y k\zmark
+ \colorspecial{color cmyk #1 #2 #3 #4}}
+
+\def \graycolor #1\zmark{% gray\zmark
+ \colorspecial{color gray #1}}
+
+\def \rgbcolor #1 #2 #3\zmark{% r g b\zmark
+ \colorspecial{color rgb #1 #2 #3}}
+
+% Built-in colors:
+
+\def \colorblackdesign {%
+ \colorspec = {\graycolor 0}}
+
+\def \colorwhitedesign {%
+ \colorspec = {\graycolor 1}}
+
+\def \colorproofnotereddesign {%
+ \colorspec = {\rgbcolor .5 0 0}}
+
+% A useful shorthand:
+
+\def \colortext #1#2{% {color}{text}
+ \color{#1}#2\endcolor}
+
+% TeXtures
+% --------
+
+
+\def \TeXtures {%
+ \input zztures\relax}
diff --git a/macros/plain/contrib/zztex/tex/zzreg.tex b/macros/plain/contrib/zztex/tex/zzreg.tex
new file mode 100644
index 0000000000..c50f9e74d8
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzreg.tex
@@ -0,0 +1,437 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Register Facilities
+%
+% Synopsis: This module provides facilities for defining and manipulating
+% TeX registers.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 13 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Register Definition
+% -------- ----------
+
+
+% The following constant specifies the number of the first insert register
+% set. Such a set is composed of a count, dimen, skip, and box.
+
+\chardef \zfirstinsert = 245
+
+% Establish counters to keep track of the most recently allocated
+% registers. The registers are initialized to the first available
+% register.
+
+\count10 = 20 % Count registers.
+\count11 = 0 % Dimen registers.
+\count12 = 0 % Skip registers.
+\count13 = 0 % Muskip registers.
+\count14 = 1 % Box registers (Plain TeX uses box 0).
+\count15 = 0 % Toks registers.
+\count16 = 0 % Read streams.
+\count17 = 0 % Write streams.
+\count18 = 0 % Math families.
+\count19 = \zfirstinsert % Insertion register sets.
+
+
+% There is one macro for each type of register, used to allocate one.
+
+\def \definecount #1#2{% {\name}{initial}
+ \zalloc{\count}{10}{\zfirstinsert}{\countdef}{#1}%
+ #1 = #2}
+
+\def \definedimen #1#2{% {\name}{initial}
+ \zalloc{\dimen}{11}{\zfirstinsert}{\dimendef}{#1}%
+ #1 = #2}
+
+\def \defineskip #1#2{% {\name}{initial}
+ \zalloc{\skip}{12}{\zfirstinsert}{\skipdef}{#1}%
+ #1 = #2}
+
+\def \definemuskip #1#2{% {\name}{initial}
+ \zalloc{\muskip}{13}{255}{\muskipdef}{#1}% Muskip 255 is scratch.
+ #1 = #2}
+
+\def \definebox #1{% {\name}
+ \zalloc{\box}{14}{\zfirstinsert}{\chardef}{#1}}
+
+\def \definetoks #1{% {\name}
+ \zalloc{\toks}{15}{256}{\toksdef}{#1}%
+ #1 = {}}
+
+\def \defineread #1{% {\name}
+ \zalloc{\read}{16}{16}{\chardef}{#1}}
+
+\def \definewrite #1{% {\name}
+ \zalloc{\write}{17}{16}{\chardef}{#1}}
+
+% Families are not defined directly by the user, but via \definetypestyle.
+
+\def \zdeffam #1{% {\name}
+ \if \lssp{\count18}{15}%
+ \zalloc{\fam}{18}{16}{\chardef}{#1}%
+ \else
+ \global\chardef #1=\count18
+ \fi}
+
+\def \defineinsert #1{% {\name}
+ \zalloc{\insert}{19}{255}{\chardef}{#1}} % Registers 255 are scratch.
+
+
+\def \zalloc #1#2#3#4#5{% {type}{counter}{limit}{\def-er}{\name}
+ \if \eqlp{\count#2}{#3}%
+ \error{noregsleft}{All `\string#1' registers have been allocated}%
+ \fi
+ \if \definedp{#5}%
+ \error{dupreg}{The register `\string#5' is already defined}%
+ \fi
+ \global#4 #5=\count#2
+ \global\increment {\count#2}}
+
+% Register Statistics
+% -------- ----------
+
+
+{\catcode`\_ = \catactive
+
+\gdef \zregstats {%
+ {\def _{\space}%
+ \writelog{}%
+ \writelog{Register Statistics:}%
+ \writelog{}%
+ \writelog{Type_____Used / Total}%
+ \writelog{----_____------------}%
+ \zrsone{Count_}{10}{\zfirstinsert}{}%
+ \zrsone{Dimen_}{11}{\zfirstinsert}{}%
+ \zrsone{Skip__}{12}{\zfirstinsert}{}%
+ \zrsone{Muskip}{13}{255}{}%
+ \zrsone{Box___}{14}{\zfirstinsert}{}%
+ \zrsone{Toks__}{15}{256}{}%
+ \zrsone{Read__}{16}{16}{}%
+ \zrsone{Write_}{17}{16}{}%
+ \zrsone{Family}{18}{256}{(15 for math)}%
+ \zrsone{Insert}{19}{255}{(starts at \the\zfirstinsert)}%
+ \writelog{}}}
+
+\gdef \zrsone #1#2#3#4{% {name}{counter}{ex-limit}{comment}
+ \tcounta = #3
+ \advance \tcounta by -1
+ \writelog{#1___\the\count#2 _/_\the\tcounta_#4}}
+
+} % \catcode
+
+% Constant Registers
+% -------- ---------
+
+
+\definecount{\maxcount}{2147483647}
+\definecount{\mincount}{-\maxcount}
+\zremovePlaindef \maxdimen
+\definedimen{\maxdimen}{16383.99999pt}
+\definedimen{\mindimen}{-\maxdimen}
+\definedimen{\naturalwidth}{\mindimen}
+
+\defineskip{\centerindent}{0pt plus 10000pt}
+\let \centering = \centerindent
+
+\defineskip{\normalparfillskip}{0pt plus 1fil}
+
+\definebox{\voidbox} % Permanently void box register.
+
+% Temporary Internal Registers
+% --------- -------- ---------
+
+
+\definecount{\tcounta}{0}
+\definecount{\tcountb}{0}
+\definecount{\tcountc}{0}
+
+\definedimen{\tdimena}{0pt}
+\definedimen{\tdimenb}{0pt}
+\definedimen{\tdimenc}{0pt}
+\definedimen{\tdimend}{0pt}
+
+\defineskip{\zskipa}{0pt}
+\defineskip{\zskipb}{0pt}
+\defineskip{\zskipc}{0pt}
+
+\definemuskip{\zmuskipa}{0mu}
+\definemuskip{\zmuskipb}{0mu}
+\definemuskip{\zmuskipc}{0mu}
+
+\definebox{\zboxa}
+\definebox{\zboxb}
+\definebox{\zboxc}
+
+\definetoks{\ztoksa}
+\definetoks{\ztoksb}
+\definetoks{\ztoksc}
+
+\defineread{\zreada}
+
+\definewrite{\zwritea}
+
+% Manipulating Boxes
+% ------------ -----
+
+
+\def \shiftboxbaseline #1#2{% {\box}{amount}
+ {\tdimena = #2%
+ \tdimenb = \ht#1%
+ \advance \tdimenb by \tdimena
+ \ht#1= \tdimenb
+ \tdimenb = \dp#1%
+ \advance \tdimenb by -\tdimena
+ \dp#1= \tdimenb}}
+
+% Lists
+% -----
+
+
+% These macros support the manipulation of lists in the following format:
+%
+% \:{<element-0>}\:{<element-1>}\: ...
+%
+% All lists are global!
+
+% We need two toks registers, which will be used just for lists.
+
+\definetoks{\zlta}
+\definetoks{\zltb}
+
+
+\def \setlist #1=#2{% \listname = {value}
+ \zlta = \expandafter{#2}%
+ \xdef #1{\the\zlta}}
+
+\long\def \append #1#2{% {item}{\list-name}
+ {\zlta = {\:{#1}}%
+ \zltb = \expandafter{#2}%
+ \xdef #2{\the\zltb\the\zlta}}}
+
+\long\def \appendlf #1#2{% {\list-name}{item}
+ {\zlta = {\:{#2}}%
+ \zltb = \expandafter{#1}%
+ \xdef #1{\the\zltb\the\zlta}}}
+
+\long\def \prepend #1#2{% {item}{\list-name}
+ {\zlta = {\:{#1}}%
+ \zltb = \expandafter{#2}%
+ \xdef #2{\the\zlta\the\zltb}}}
+
+\let \push = \prepend
+
+\def \pop #1#2{% {\return-macro}{\list-name}
+ \expandafter\zpop #2\zmark#1#2}
+
+\long\def \zpop \:#1#2\zmark#3#4{%
+ \def #3{#1}%
+ \gdef #4{#2}}
+
+\def \listtop #1#2{% {\return-macro}{\list-name}
+ \expandafter\zlisttop #2\zmark#1}
+
+\long\def \zlisttop \:#1#2\zmark#3{%
+ \def #3{#1}}
+
+\definecount{\zmapldepth}{0}
+
+\def \maplist #1#2{% {body}{\listname}
+ \increment \zmapldepth
+ \withname\let{\zmapl\romannumeral\zmapldepth}=\:%
+ \long\def \:##1{#1}%
+ #2%
+ \expandafter\let
+ \expandafter\:\csname zmapl\romannumeral\zmapldepth\endcsname
+ \decrement \zmapldepth}
+
+\def \maplistlf #1#2{% {\listname}{body}
+ \increment \zmapldepth
+ \withname\let{\zmapl\romannumeral\zmapldepth}=\:%
+ \long\def \:##1{#2}%
+ #1%
+ \expandafter\let
+ \expandafter\:\csname zmapl\romannumeral\zmapldepth\endcsname
+ \decrement \zmapldepth}
+
+\def \exitmaplist {\def \:##1{}}
+
+\def \listlength #1#2{% {\result-count}{\list}
+ #1= 0
+ \maplist{\increment #1}{#2}}
+
+\def \member #1#2#3{% {\result-flag}{item}{\list}
+ \setflag #1= \false
+ \maplist{\stringeql{#1}{##1}{#2}\if #1\exitmaplist \fi}
+ {#3}}
+
+\def \commalist #1#2{% {\result-name}{comma-list}
+ \setlist #1={}%
+ \expandafter\zcomma #2,\zmark#1}
+
+\def \zcomma #1,#2\zmark#3{%
+ \if \notp{\emptyargp{#1}}\append{#1}{#3}\fi
+ \if \notp{\emptyargp{#2}}%
+ \def \znext {\zcomma #2\zmark#3}%
+ \else
+ \let \znext = \relax
+ \fi
+ \znext}
+
+\def \inclusionlist #1#2#3{% {\result}{item}{inclusion-list}
+ \zincla {#1}{#2}#3\zmark}
+
+\let \all = \relax
+\let \allbut = \relax
+\def \zallname {\all}
+\def \zallbutname {\allbut}
+
+\def \zincla #1#2#3#4\zmark{% {\result}{item}{token1}{tokens...}
+ \def \znext {#3}%
+ \if \tokeqlp{\znext}{\zallname}%
+ \setflag #1= \true
+ \else \if \tokeqlp{\znext}{\zallbutname}%
+ \commalist{\zincllist}{#4}%
+ \member{#1}{#2}{\zincllist}%
+ \setflag #1= {\notp{#1}}%
+ \else
+ \commalist{\zincllist}{#3#4}%
+ \member{#1}{#2}{\zincllist}%
+ \fi\fi}
+
+% New Expression Evaluation
+% --- ---------- ----------
+
+
+% These macros provide a rudimentary expression evaluation facility.
+% The accumulator can be a count, dimen, or skip register. The expression
+% is in the form {operand0,op1,operand1,op2,operand2,...}.
+%
+% WARNING: The \register cannot be used in the expression except possibly
+% as the first operand.
+
+
+\definedimen{\zcalct}{0pt}
+
+
+\def \calculate #1=#2{% \register = {expression}
+ \let \zaccum = #1%
+ \zcalca =,#2,;,,\zmark}
+
+\def \gcalculate #1=#2{% \register = {expression}
+ \let \zaccum = #1%
+ \zcalca =,#2,;,,\zmark
+ \global \zaccum = \zaccum}
+
+\def \zcalca #1,#2,#3\zmark{%
+ \def \znext{\zcalca #3\zmark}%
+ \if #1=\zaccum = #2% % Assignment
+ \else\if #1+\advance \zaccum #2% % Addition
+ \else\if #1-\advance \zaccum -#2% % Subtraction
+ \else\if #1*\multiply \zaccum #2% % Multiplication
+ \else\if #1/\divide \zaccum #2% % Division
+ \else\if #1N\if \dimlssp{#2}{\zaccum}\zaccum = #2\fi % Minimum
+ \else\if #1P\divide \zaccum 100 % Percentage
+ \expandafter\zaccum #2\zaccum
+ \else\if #1R\zcalct = #2% % Ratio
+ \divide \zcalct by 4096
+ \divide \zaccum by \zcalct
+ \multiply \zaccum by 16\relax
+ \else\if #1S\zaccum = \thefactor#2\zaccum % Scale
+ \else\if #1X\if \dimgtrp{#2}{\zaccum}\zaccum = #2\fi % Maximum
+ \else\if #1;\let \znext = \relax % Done
+ \else
+ \error{invoper}{Invalid operator `#1' in expression}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \znext}
+
+% Calculating Values
+% ----------- ------
+
+%%%\defineskip{\zcaccum}{0pt}
+%%%\setflag \zexprpos = \true
+%%%
+%%%\def \calculate #1=#2{% {\reg} = {expression}
+%%% \commalist{\zexprlist}{#2}%
+%%% \zcaccum = 0pt
+%%% \def \zoper {+}%
+%%% \setflag \zexprpos = \true
+%%% \maplist{\zcalc{##1}}{\zexprlist}%
+%%% #1=\zcaccum}
+%%%
+%%%\def \gcalculate #1=#2{% {\reg} = {expression}
+%%% \commalist{\zexprlist}{#2}%
+%%% \zcaccum = 0pt
+%%% \def \zoper {+}%
+%%% \setflag \zexprpos = \true
+%%% \maplist{\zcalc{##1}}{\zexprlist}%
+%%% \global #1=\zcaccum}
+%%%
+%%%\def \zcalc #1{% {token}
+%%% \if \zexprpos
+%%% \zcalcb{#1}%
+%%% \setflag \zexprpos = \false
+%%% \else
+%%% \def \zoper {#1}%
+%%% \setflag \zexprpos = \true
+%%% \fi}
+%%%
+%%%\def \zcalcb #1{% {operand}
+%%% \if \codeeqlp{\zoper}{+}% % Add.
+%%% \advance \zcaccum by #1%
+%%% \else\if \codeeqlp{\zoper}{-}% % Subtract.
+%%% \advance \zcaccum by -#1%
+%%% \else\if \codeeqlp{\zoper}{*}% % Multiply.
+%%% \multiply \zcaccum by #1%
+%%% \else\if \codeeqlp{\zoper}{/}% % Divide.
+%%% \divide \zcaccum by #1%
+%%% \else\if \codeeqlp{\zoper}{P}%
+%%% \divide \zcaccum by 100
+%%% \expandafter \zcaccum #1\zcaccum
+%%% \else\if \codeeqlp{\zoper}{R}% % Compute ratio (in points).
+%%% \zcalct = #1%
+%%% \divide \zcalct by 4096
+%%% \divide \zcaccum by \zcalct
+%%% \multiply \zcaccum by 16\relax
+%%% \else\if \codeeqlp{\zoper}{S}% % Scale (in points).
+%%% \zcaccum = \thefactor#1\zcaccum
+%%% \else
+%%% \error{invoper}{Invalid operator `\zoper' in expression}%
+%%% \fi\fi\fi\fi\fi\fi\fi}
+
+% The Vertical Context
+% --- -------- -------
+
+
+% This is in here because we need registers. Otherwise it would be
+% in ZZTEX.TEX
+
+
+\definecount{\zvcontextdepth}{0}
+
+\definetoks{\zeveryvcontext}
+\global\zeveryvcontext = {}
+
+
+\def \zdeclareeveryvcontext #1{%
+ \global\zeveryvcontext = \expandafter{\the\zeveryvcontext #1}}
+
+\def \zpushvcontext {%
+ \global\increment \zvcontextdepth
+ \withname\gdef{\zvcontextstack\romannumeral\zvcontextdepth}{}%
+ \the\zeveryvcontext}
+
+\def \zpopvcontext {%
+ {\globaldefs = 1\relax
+ \name{\zvcontextstack\romannumeral\zvcontextdepth}}%
+ \global\decrement \zvcontextdepth}
+
+\def \zsavevcontext #1{%
+ {\ztoksa = \expandafterthrice{%
+ \name{\zvcontextstack\romannumeral\zvcontextdepth}}%
+ \withname\xdef{\zvcontextstack\romannumeral\zvcontextdepth}%
+ {\the\ztoksa #1}}}
diff --git a/macros/plain/contrib/zztex/tex/zzrunner.tex b/macros/plain/contrib/zztex/tex/zzrunner.tex
new file mode 100644
index 0000000000..c0427cbddc
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzrunner.tex
@@ -0,0 +1,98 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Running Head/Foot Scheme
+%
+% Synopsis: The new running head/foot scheme is an improvement over the
+% original scheme.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 26 November 1997
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Data Structures
+% ---- ----------
+
+
+\def \zdefrun {normal}
+
+\setlist \zrunlist = {}
+
+\setflag \zoverrun = \false
+
+\def \zcurback {%
+ \if \definedp \backgroundnormalformat \backgroundnormalformat \fi}
+\def \zcurheader {\headernormalformat}
+\def \zcurfooter {\footernormalformat}
+
+% Specify Runners
+% ------- -------
+
+
+%~ This command discards any current runner styles and sets up to use style
+%~ *style1* on the current page, *style2* on the next, *style3* on the one after
+%~ that, and so forth. The last style specified is used as the style for all
+%~ subsequent pages (it becomes the default style). No spaces are allowed in the
+%~ list.
+
+\def \setrunners #1{% {style1,style2,style3,...} %^runners
+ {\if \zoverrun \pop{\zoverstyle}{\zrunlist}\fi
+ \commalist{\zrunlist}{#1}%
+ \maplist{\gdef \zdefrun {##1}}{\zrunlist}%
+ \if \zoverrun \expandafter\overriderunners\expandafter{\zoverstyle}\fi
+ \zsetcurrun}}
+
+%~ This command overrides the style for the current page, using style *style*
+%~ instead. After the current page, runner styles revert to those established
+%~ by the last |\setrunners| command.
+
+\def \overriderunners #1{% {style} %^runners
+ \if \notp{\emptylistp{\zrunlist}}%
+ \pop{\znext}{\zrunlist}%
+ \fi
+ \push{#1}{\zrunlist}%
+ \global\setflag \zoverrun = \true
+ \zsetcurrun}
+
+%~ This command is simply a shorthand for |\overriderunners{blind}|.
+
+\def \blindrunners {% %^runners
+ \overriderunners{blind}}
+
+% Internal Common Macros
+% -------- ------ ------
+
+
+\def \zsetrunnerstoks #1{% {\token-reg}
+ \expandafter\setrunners\expandafter{\the#1}}
+
+\def \zoverriderunnerstoks #1{% {\token-reg}
+ \expandafter\overriderunners\expandafter{\the#1}}
+
+\def \zoldrunners #1{}
+
+% Output Routine Interface
+% ------ ------- ---------
+
+
+\def \zsetcurrun {%
+ \if \emptylistp{\zrunlist}%
+ \edef \znext {\zdefrun}%
+ \else
+ \listtop{\znext}{\zrunlist}%
+ \fi
+ \ztoksa = \expandaftertwice{\name{\background\znext format}}%
+ \xdef \zcurback {%
+ \noexpand\if \noexpand\definedp\the\ztoksa \the\ztoksa \noexpand\fi}%
+ \ztoksa = \expandaftertwice{\name{\header\znext format}}%
+ \xdef \zcurheader {\the\ztoksa}%
+ \ztoksa = \expandaftertwice{\name{\footer\znext format}}%
+ \xdef \zcurfooter {\the\ztoksa}}
+
+\def \znextpagerunners {%
+ \if \notp{\emptylistp{\zrunlist}}\pop{\znext}{\zrunlist}\fi
+ \zsetcurrun
+ \global\setflag \zoverrun = \false}
diff --git a/macros/plain/contrib/zztex/tex/zzsect.tex b/macros/plain/contrib/zztex/tex/zzsect.tex
new file mode 100644
index 0000000000..280d2ecc5b
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzsect.tex
@@ -0,0 +1,806 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Sectioning Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 25 August 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Part and Chapter Texts
+% ---- --- ------- -----
+
+
+\long\def \setauthortext #1{% {text} %^modifier
+ \with{\authortext = {#1}}}
+
+\long\def \setopenertext #1{% {text} %^modifier
+ \with{\openertext = {#1}}}
+
+% Part
+% ----
+
+
+\defineblock{\part}{\endpart}{\true}{}
+
+%~block part
+% \setflag \allowintoc = flag % Allow in ToC?
+% \authortext = {...} % Author needed for opener.
+% \def \comptextformat {...} % Composite number text formatter.
+% \def \paging {...} % Paging before part opener.
+% \def \partformat ##1{...} % Part page formatter.
+% \openertext = {...} % Special text needed for opener.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \runners = {style,...} % Running head/foot styles.
+% \style = {...} % Heading style.
+%~end
+
+\def \part #1{% {title}
+ \closeanychapter
+ \beginblockscope{part}%
+ \global\increment \partdepth
+ \authortext = {}% %~default hard
+ \openertext = {}% %~default hard
+ \runners = {blind,normal}% %~default soft
+ \zoldrunners{\blindheader\blindfooter}%
+ \style = {Caps/lowercase, \noindent} %~default soft
+ \processdesign{\part}{}%
+ \global\increment \partnumber
+ \setcomptext{\partcomptext}%
+ \paging
+ \remark{Starting PART \number\partnumber.}%
+ % Next three things are done first, in case opener is more than one page.
+ \providemark{#1}%
+ \zpartchaptoc{\the\partcomptext}{#1}{80}%
+ \settaginfo{\the\partcomptext}{#1}
+ \zsetrunnerstoks{\runners}%
+ {\partformat{#1}}%
+ \endgraf}
+
+\def \endpart {%
+ \global\decrement \partdepth
+ \endblockscope{part}}
+
+\def \setpartnumber #1{% {number}
+ \global\partnumber = #1\relax
+ \global\decrement \partnumber}
+
+% Quasi-Part
+% ----------
+
+
+\defineblock{\quasipart}{\endquasipart}{\true}{}
+
+%~block quasipart
+% \setflag \allowintoc = flag % Allow in ToC?
+% \openertext = {...} % Special text needed for opener.
+% \def \paging {...} % Paging before part opener.
+% \def \quasipartformat ##1{...} % Part page formatter.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \runners = {style,...} % Running head/foot styles.
+% \style = {...} % Heading style.
+%~end
+
+\def \quasipart #1{% {title}
+ \closeanychapter
+ \beginblockscope{quasipart}%
+ \global\increment \quasipartdepth
+ \openertext = {}% %~default hard
+ \runners = {blind,normal}% %~default soft
+ \zoldrunners{\blindheader\blindfooter}%
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \processdesign{\quasipart}{}%
+ \global\increment \quasipartnumber
+ \paging
+ \def \znext {#1}%
+ \remark{Starting QUASIPART `\expandafter\zdefof \meaning\znext\zmark'.}%
+ % Next three things are done first, in case opener is more than one page.
+ \providemark{#1}%
+ \zpartchaptoc{}{#1}{85}%
+ \settaginfo{}{#1}%
+ \zsetrunnerstoks{\runners}%
+ {\quasipartformat{#1}}%
+ \endgraf}
+%%% \endquasipart}
+
+\def \endquasipart {%
+ \global\decrement \quasipartdepth
+ \endblockscope{quasipart}}
+
+% Chapter
+% -------
+
+\defineblock{\chapter}{\endchapter}{\true}{}
+
+%~block chapter
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \authorlevel = integer % Author ToC entry level.
+% \authortext = {...} % Author text needed for opener.
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Font for number.
+% \numberwordfont = {...} % Font for word like "chapter".
+% \def \numberformat {...} % Number format.
+% \numbersink = glue % Sinkage to number, or
+% \numberskip = glue % Space b/b to number.
+% \openertext = {...} % Special text needed for opener.
+% \def \paging {...} % Initial paging.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \setflag \resetsection = boolean % Reset section number?
+% \runners = {style,...} % Running head/foot styles.
+% \style = {...} % Heading style.
+% \textsink = sinkage % Sinkage to text, or
+% \textskip = skip % Space b/b from rule to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \titlesink = glue % Sinkage to title, or
+% \titleskip = glue % Space b/b from number to title.
+%~end
+
+\def \chapter #1{% {title}
+ \closeanychapter
+ \beginblockscope{chapter}%
+ \global\increment \chapterdepth
+ \authorlevel = 0 %~default hard
+ \authortext = {}% %~default hard
+ \difficulty = 0 %~default with
+ \openertext = {}% %~default hard
+ \setflag \resetsection = \true %~default hard
+ \runners = {chapter,normal}% %~default soft
+ \zoldrunners{\chapterheader\chapterfooter}%
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \processdesign{\chapter}{}%
+ \if \resetsection
+ \global\sectionnumber = 0
+ \global\quasisectionnumber = 0
+ \global\chapterappendixnumber = 0
+ \fi
+ \global\simpleheadnumber = 0
+ \global\increment \chapternumber
+ \setcomptext{\chaptercomptext}%
+ \paging
+ \remark{Starting chapter \if \emptytoksp{\chaptercomptext}'#1'\else
+ \the\chaptercomptext \fi.}%
+ \zsetrunnerstoks{\runners}%
+ \chapterformat{#1}%
+ \deferfloats{\true}%
+ \settaginfo{\the\chaptercomptext}{#1}}
+
+\def \endchapter {%
+ \closeanysection
+ \global\decrement \chapterdepth
+ \endblockscope{chapter}}
+
+\def \chapterformat #1{%
+ {\the\numberfont
+ \zsinkskip{\numbersink}{\breakbest}{\numberskip}%
+ \numberformat\par}%
+ {\the\titlefont
+ \zsinkskip{\titlesink}{\breaknever}{\titleskip}%
+ \titleformat{#1}\par}%
+ \providemark{#1}%
+ \zpartchaptoc{\the\chaptercomptext}{#1}{70}%
+ \zsinkskip{\textsink}{\breaknever}{\textskip}}
+
+\def \setchapternumber #1{% {number}
+ \global\chapternumber = #1\relax
+ \global\decrement \chapternumber}
+
+\def \setappendixnumber #1{% {number}
+ \global\appendixnumber = #1\relax
+ \global\decrement \appendixnumber}
+
+\def \setsectionnumber #1{% {number}
+ \global\sectionnumber = #1\relax
+ \global\decrement \sectionnumber}
+
+% Quasi-Chapter
+% -------------
+
+
+\defineblock{\quasichapter}{\endquasichapter}{\true}{}
+
+%~block quasichapter
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \authorlevel = integer % Author ToC entry level.
+% \authortext = {...} % Author text needed for opener.
+% \openertext = {...} % Special text needed for opener.
+% \def \paging {...} % Initial paging.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \runners = {style,...} % Running head/foot styles.
+% \style = {...} % Heading style.
+% \textsink = sinkage % Sinkage to text, or
+% \textskip = skip % Skip from rule to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \titlesink = glue % Sinkage to title, or
+% \titleskip = glue % Space b/b to title.
+%~end
+
+\def \quasichapter #1{% {title}
+ \closeanychapter
+ \beginblockscope{quasichapter}%
+ \global\increment \quasichapterdepth
+ \authorlevel = 0 %~default hard
+ \authortext = {}% %~default hard
+ \openertext = {}% %~default hard
+ \runners = {chapter,normal}% %~default soft
+ \zoldrunners{\chapterheader\chapterfooter}%
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \processdesign{\quasichapter}{}%
+ \global\increment \quasichapternumber
+ \chaptercomptext = {}%
+ \paging
+ \def \znext {#1}%
+ \remark{Starting quasichapter `\expandafter\zdefof \meaning\znext\zmark'.}%
+ \zsetrunnerstoks{\runners}%
+ \quasichapterformat{#1}%
+ \deferfloats{\true}%
+ \settaginfo{}{#1}}
+
+\def \endquasichapter {%
+ \closeanysection
+ \global\decrement \quasichapterdepth
+ \endblockscope{quasichapter}}
+
+\def \quasichapterformat #1{%
+ {\the\titlefont
+ \zsinkskip{\titlesink}{\breaknever}{\titleskip}%
+ \titleformat{#1}\par}
+ \providemark{#1}%
+ \zpartchaptoc{}{#1}{75}%
+ \zsinkskip{\textsink}{\breaknever}{\textskip}}
+
+% Appendix
+% --------
+
+
+\defineblock{\appendix}{\endappendix}{\true}{}
+
+%~block appendix
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \authortext = {...} % Author text needed for opener.
+% \def \comptextformat {...} % Composite number text formatter.
+% \numberfont = {...} % Font for number.
+% \numberwordfont = {...} % Font for word like "appendix".
+% \def \numberformat {...} % Number format.
+% \numbersink = glue % Sinkage to number, or
+% \numberskip = glue % Space b/b to number.
+% \openertext = {...} % Special text needed for opener.
+% \def \paging {...} % Initial paging.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \setflag \resetsection = boolean % Reset section number?
+% \runners = {style,...} % Running head/foot styles.
+% \style = {...} % Heading style.
+% \textsink = sinkage % Sinkage to text, or
+% \textskip = skip % Space b/b from rule to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \titlesink = glue % Sinkage to title, or
+% \titleskip = glue % Space b/b from number to title.
+%~end
+
+\def \appendix #1{% {title}
+ \closeanychapter
+ \beginblockscope{appendix}%
+ \global\increment \appendixdepth
+ \authortext = {}% %~default hard
+ \openertext = {}% %~default hard
+ \setflag \resetsection = \true %~default hard
+ \runners = {chapter,normal}% %~default soft
+ \zoldrunners{\chapterheader\chapterfooter}%
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \processdesign{\appendix}{}%
+ \if \resetsection
+ \global\sectionnumber = 0
+ \global\quasisectionnumber = 0
+ \global\chapterappendixnumber = 0
+ \fi
+ \global\increment \appendixnumber
+ \setcomptext{\chaptercomptext}% % Not \appendixcomptext!
+ \paging
+ \remark{Starting appendix \the\chaptercomptext.}%
+ \zsetrunnerstoks{\runners}%
+ \appendixformat{#1}%
+ \deferfloats{\true}%
+ \settaginfo{\the\chaptercomptext}{#1}}
+
+\def \endappendix {%
+ \closeanysection
+ \global\decrement \appendixdepth
+ \endblockscope{appendix}}
+
+\def \appendixformat #1{%
+ {\the\numberfont
+ \zsinkskip{\numbersink}{\breakbest}{\numberskip}%
+ \numberformat\par}%
+ {\the\titlefont
+ \zsinkskip{\titlesink}{\breaknever}{\titleskip}%
+ \titleformat{#1}\par}%
+ \providemark{#1}%
+ \zpartchaptoc{\the\chaptercomptext}{#1}{71}%
+ \zsinkskip{\textsink}{\breaknever}{\textskip}}
+
+% Section
+% -------
+
+
+\defineblock{\section}{\endsection}{\true}{}
+
+%~block section
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Number font.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \section #1{% {title}
+ \closeanysection
+ \beginblockscope{section}%
+ \global\increment \sectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\section}{}%
+ \global\subsectionnumber = 0
+ \global\subsubsectionnumber = 0
+ \global\subsubsubsectionnumber = 0
+ \global\increment \sectionnumber
+ \setcomptext{\sectioncomptext}%
+ \sectionformat{#1}%
+ \settaginfo{\the\sectioncomptext}{#1}}
+
+\def \endsection {%
+ \closeanysubsection
+ \global\decrement \sectiondepth
+ \endblockscope{section}}
+
+\def \sectionformat #1{%
+ {\if \emptytoksp{\numberfont}\the\titlefont \else \the\numberfont \fi
+ \zskipabovehead{\breakbest}{\aboveskip}%
+ \titleformat{#1}\par}%
+ \providemark{#1}%
+ \ztocentry{\the\sectioncomptext}{#1}{60}{\allowintoc}%
+ \bbskipabove{\breaknever}{\textskip}%
+ \overrideclubpenalty{\breaknever}}
+
+% Quasi-Section
+% -------------
+
+
+\defineblock{\quasisection}{\endquasisection}{\true}{}
+
+%~block quasisection
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \difficulty = integer % Level of difficulty.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \quasisection #1{% {tile}
+ \closeanysection
+ \beginblockscope{quasisection}%
+ \global\increment \quasisectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\quasisection}{}%
+ \global\increment \quasisectionnumber % In case needed for \tagpageonly.
+ \quasisectionformat{#1}%
+ \settaginfo{}{#1}}
+
+\def \endquasisection {%
+ \closeanysubsection
+ \global\decrement \quasisectiondepth
+ \endblockscope{quasisection}}
+
+\def \quasisectionformat #1{%
+ {\the\titlefont
+ \zskipabovehead{\breakbest}{\aboveskip}%
+ \titleformat{#1}\par}
+ \providemark{#1}%
+ \ztocentry{}{#1}{65}{\allowintoc}%
+ \bbskipabove{\breaknever}{\textskip}%
+ \overrideclubpenalty{\breaknever}}
+
+% Chapter Appendix
+% ------- --------
+
+
+\defineblock{\chapterappendix}{\endchapterappendix}{\true}{}
+
+%~block chapterappendix
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Number font.
+% \def \providemark ##1{...} % Mark provider.
+% \resetnumber = {...} % List of numbers to reset.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \chapterappendix #1{% {title}
+ \closeanysection
+ \beginblockscope{chapterappendix}%
+ \global\increment \chapterappendixdepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\chapterappendix}{}%
+ \global\subsectionnumber = 0
+ \global\subsubsectionnumber = 0
+ \global\subsubsubsectionnumber = 0
+ \global\increment \chapterappendixnumber
+ \setcomptext{\sectioncomptext}% % Not \chapterappendixcomptext!
+ \chapterappendixformat{#1}%
+ \settaginfo{\the\sectioncomptext}{#1}}
+
+\def \endchapterappendix {%
+ \closeanysubsection
+ \global\decrement \chapterappendixdepth
+ \endblockscope{chapterappendix}}
+
+\def \chapterappendixformat #1{%
+ {\if \emptytoksp{\numberfont}\the\titlefont \else \the\numberfont \fi
+ \zskipabovehead{\breakbest}{\aboveskip}%
+ \titleformat{#1}\par}%
+ \providemark{#1}%
+ \ztocentry{\the\sectioncomptext}{#1}{61}{\allowintoc}%
+ \bbskipabove{\breaknever}{\textskip}%
+ \overrideclubpenalty{\breaknever}}
+
+% Subsection
+% ----------
+
+
+\defineblock{\subsection}{\endsubsection}{\false}{}
+
+%~block subsection
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = flag % Allow in ToC?
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Font for number.
+% \def \providemark ##1{...} % Mark provider.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \subsection #1{% {title}
+ \closeanysubsection
+ \beginblockscope{subsection}%
+ \global\increment \subsectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\subsection}{}%
+ \global\subsubsectionnumber = 0
+ \global\subsubsubsectionnumber = 0
+ \global\increment \subsectionnumber
+ \setcomptext{\subsectioncomptext}%
+ \subsectionformat{#1}%
+ \settaginfo{\the\subsectioncomptext}{#1}%
+ \ignorespaces}
+
+\def \endsubsection {%
+ \closeanysubsubsection
+ \global\decrement \subsectiondepth
+ \endblockscope{subsection}}
+
+\def \subsectionformat #1{%
+ {\if \emptytoksp{\numberfont}\the\titlefont \else \the\numberfont \fi
+ \zskipabovehead{\breakbetter}{\aboveskip}%
+ \titleformat{#1}}%
+ \providemark{#1}%
+ \ztocentry{\the\subsectioncomptext}{#1}{50}{\allowintoc}%
+ \if \dimposp{\textskip}%
+ \par
+ \bbskipabove{\breaknever}{\textskip}%
+ \fi
+ \overrideclubpenalty{\breaknever}}
+
+% Quasi-Subsection
+% ----------------
+
+
+\defineblock{\quasisubsection}{\endquasisubsection}{\false}{}
+
+%~block quasisubsection
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \difficulty = integer % Level of difficulty.
+% \def \providemark ##1{...} % Mark provider.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \quasisubsection #1{% {title}
+ \closeanysubsection
+ \beginblockscope{quasisubsection}%
+ \global\increment \quasisubsectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\quasisubsection}{}%
+ \quasisubsectionformat{#1}%
+ \settaginfo{}{#1}%
+ \ignorespaces}
+
+\def \endquasisubsection {%
+ \closeanysubsubsection
+ \global\decrement \quasisubsectiondepth
+ \endblockscope{quasisubsection}}
+
+\def \quasisubsectionformat #1{%
+ {\the\titlefont
+ \zskipabovehead{\breakbetter}{\aboveskip}%
+ \titleformat{#1}}
+ \providemark{#1}%
+ \ztocentry{}{#1}{55}{\allowintoc}%
+ \if \dimposp{\textskip}%
+ \par
+ \bbskipabove{\breaknever}{\textskip}%
+ \fi
+ \overrideclubpenalty{\breaknever}}
+
+% Subsubsection
+% -------------
+
+
+\defineblock{\subsubsection}{\endsubsubsection}{\false}{}
+
+%~block subsubsection
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = flag % Allow in ToC?
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Font for number.
+% \def \providemark ##1{...} % Mark provider.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \subsubsection #1{% {title}
+ \closeanysubsubsection
+ \beginblockscope{subsubsection}%
+ \global\increment \subsubsectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\subsubsection}{}%
+ \global\subsubsubsectionnumber = 0
+ \global\increment \subsubsectionnumber
+ \setcomptext{\subsubsectioncomptext}%
+ \subsubsectionformat{#1}%
+ \settaginfo{\the\subsubsectioncomptext}{#1}%
+ \ignorespaces}
+
+\def \endsubsubsection {%
+ \closeanysubsubsubsection
+ \global\decrement \subsubsectiondepth
+ \endblockscope{subsubsection}}
+
+\def \subsubsectionformat #1{%
+ {\if \emptytoksp{\numberfont}\the\titlefont \else \the\numberfont \fi
+ \zskipabovehead{\breakgood}{\aboveskip}%
+ \titleformat{#1}}%
+ \providemark{#1}%
+ \ztocentry{\the\subsubsectioncomptext}{#1}{40}{\allowintoc}%
+ \if \dimposp{\textskip}%
+ \par
+ \bbskipabove{\breaknever}{\textskip}%
+ \fi
+ \overrideclubpenalty{\breaknever}}
+
+% Subsubsubsection
+% ----------------
+
+
+\defineblock{\subsubsubsection}{\endsubsubsubsection}{\false}{}
+
+%~block subsubsubsection
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowintoc = flag % Allow in ToC?
+% \def \comptextformat {...} % Composite number text formatter.
+% \difficulty = integer % Level of difficulty.
+% \numberfont = {...} % Font for number.
+% \def \providemark ##1{...} % Mark provider.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\def \subsubsubsection #1{% {title}
+ \closeanysubsubsubsection
+ \beginblockscope{subsubsubsection}%
+ \global\increment \subsubsubsectiondepth
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\subsubsubsection}{}%
+ \global\increment \subsubsubsectionnumber
+ \setcomptext{\subsubsubsectioncomptext}%
+ \subsubsubsectionformat{#1}%
+ \settaginfo{\the\subsubsubsectioncomptext}{#1}%
+ \ignorespaces}
+
+\def \endsubsubsubsection {%
+ \global\decrement \subsubsubsectiondepth
+ \endblockscope{subsubsubsection}}
+
+\def \subsubsubsectionformat #1{%
+ {\if \emptytoksp{\numberfont}\the\titlefont \else \the\numberfont \fi
+ \zskipabovehead{\breakgood}{\aboveskip}%
+ \titleformat{#1}}%
+ \providemark{#1}%
+ \ztocentry{\the\subsubsubsectioncomptext}{#1}{30}{\allowintoc}%
+ \if \dimposp{\textskip}%
+ \par
+ \bbskipabove{\breaknever}{\textskip}%
+ \fi
+ \overrideclubpenalty{\breaknever}}
+
+% Simple Head
+% ------ ----
+
+
+\defineblock{\simplehead}{\endsimplehead}{\false}{}
+
+%~block simplehead Type
+% \aboveskip = glue % Space b/b above title.
+% \setflag \allowclubline = flag % True if club allowed below.
+% \setflag \allowintoc = boolean % Allow in ToC?
+% \difficulty = integer % Level of difficulty.
+% \style = {...} % Heading style.
+% \textskip = skip % Skip from title to text.
+% \titlefont = {...} % Title font.
+% \def \titleformat ##1{...} % Title format.
+% \tocentrylevel = integer % ToC entry level number (optional).
+% \topadjust = dimen % Adjust if at top of page.
+%~end
+
+\definecount{\tocentrylevel}{0}
+
+
+\def \simplehead #1#2{% {type}{title}
+ \endgraf
+ \beginblockscope{simplehead}%
+ \global\increment \simpleheaddepth
+ \setflag \allowclubline = \false %~default soft
+ \setflag \allowintoc = \true %~default with
+ \difficulty = 0 %~default with
+ \style = {Caps/lowercase, \noindent}% %~default soft
+ \tocentrylevel = 0 %~default soft
+ \topadjust = \mindimen %~default hard
+ \processdesign{\simplehead}{#1}%
+ \global\increment \simpleheadnumber
+ \simpleheadformat{#2}%
+ \endsimplehead}
+
+\def \endsimplehead {%
+ \global\decrement \simpleheaddepth
+ \endblockscope{simplehead}%
+ \ignorespaces}
+
+\def \simpleheadformat #1{%
+ {\the\titlefont
+ \zskipabovehead{\breakgood}{\aboveskip}%
+ \titleformat{#1}}%
+ \if \dimzerop{\textskip}%
+ \nobreak
+ \else
+ \endgraf
+ \bbskipabove{\breaknever}{\textskip}%
+ \fi
+ \if \posp{\tocentrylevel}%
+ \ztocentry{}{#1}{\tocentrylevel}{\allowintoc}%
+ \fi
+ \if \notp{\allowclubline}\overrideclubpenalty{\breaknever}\fi}
+
+% Useful Utilities
+% ------ ---------
+
+
+\def \chapterorchapterappendixcomptext {%
+ \if \inblockp{\chapterappendix}%
+ \the\sectioncomptext
+ \else
+ \the\chaptercomptext
+ \fi}
+
+\def \textonlyhead {% %^modifier
+ \with{\setflag\allowintoc=\false
+ \def\providemark##1{}}}
+
+\def \closeanychapter {%
+ \closeifinblock{\part}{\endpart}%
+ \closeifinblock{\quasipart}{\endquasipart}%
+ \closeifinblock{\quasichapter}{\endquasichapter}%
+ \closeifinblock{\chapter}{\endchapter}%
+ \closeifinblock{\appendix}{\endappendix}}
+
+\def \closeanysection {%
+ \closeifinblock{\quasisection}{\endquasisection}%
+ \closeifinblock{\section}{\endsection}%
+ \closeifinblock{\chapterappendix}{\endchapterappendix}}
+
+\def \closeanysubsection {%
+ \closeifinblock{\quasisubsection}{\endquasisubsection}%
+ \closeifinblock{\subsection}{\endsubsection}}
+
+\def \closeanysubsubsection {%
+ \closeifinblock{\subsubsection}{\endsubsubsection}}
+
+\def \closeanysubsubsubsection {%
+ \closeifinblock{\subsubsubsection}{\endsubsubsubsection}}
+
+\def \zsinkskip #1#2#3{% {sink}{penalty}{skip}
+ \if \dimposp{#3}%
+ \bbskipabove{#2}{#3}%
+ \else
+ \vsinkfromtypearea{#1}%
+ \fi}
+
+\def \zskipabovehead #1#2{% {penalty}{skip}
+ \bbskipabove{#1}{#2}%
+ \if \dimneqlp{\topadjust}{\mindimen}%
+ \vskip -\topadjust
+ \tdimena = \prevdepth
+ \rule{height 0pt depth 0pt width 0pt}%
+ \prevdepth = \tdimena
+ \penalty \breaknever
+ \vskip \topadjust
+ \fi}
+
+% If the author level is negative, the ToC entry goes before the chapter's
+% entry. Otherwise it goes after the chapter's entry.
+
+\def \zpartchaptoc #1#2#3{%
+ \edef \znext {\noexpand\tocentry{}{\the\authortext}}%
+ \if \andp{\notp{\emptytoksp{\authortext}}}{\negp{\authorlevel}}%
+ \znext{-\authorlevel}%
+ \fi
+ \ztocentry{#1}{#2}{#3}{\allowintoc}%
+ \if \andp{\notp{\emptytoksp{\authortext}}}{\posp{\authorlevel}}%
+ \znext{\authorlevel}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zztabbing.tex b/macros/plain/contrib/zztex/tex/zztabbing.tex
new file mode 100644
index 0000000000..08257a45f4
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztabbing.tex
@@ -0,0 +1,266 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Tabbing Facilities
+%
+% Synopsis: This module contains the definition of the block that is
+% used to format text with tab stops.
+%
+% Authors: Paul C. Anagnostopoulos
+% Created: 27 May 2016
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tabbing Block
+% ------- -----
+
+
+\defineblock{\tabbing}{\endtabbing}{\false}{}
+\resetinvcontext{\tabbing}
+
+%~block tabbing Type
+% \abovepenalty = integer % Penalty above text.
+% \aboveskip = glue % Space b/b above text.
+% \setflag \autocallout = boolean % Automatically number lines?
+% \def \beginformat {...} % Beginning of text formatter.
+% \belowpenalty = integer % Penalty below text.
+% \belowskip = glue % Space b/b below text.
+% \bodyfont = {font} % Body font.
+% \def \calloutformat ##1{...} % Callout formatter.
+% \calloutnumber = integer % Number of first callout.
+% \def \callouttext {...} % Callout text or \arg.
+% \defaulttabwidth = dimen % Default repeating tab width.
+% \def \endformat {...} % End of text formatter.
+% \leftindent = glue % Left indentation.
+% \rightindent = glue % Right indentation.
+% \tabbinggapskip = glue % Standard tabbing gap.
+% \textcolor = {...} % Color of text.
+% \width = dimen % Line width.
+%~end
+
+\defineskip{\tabbinggapskip}{0pt}
+
+\def \tabbing #1{% {type}
+ \blockcantbein{\tabbing}{\tabbing}%
+ \beginblockscope{tabbing}%
+ \global\increment \tabbingdepth
+ \abovepenalty = \breakgood %~default hard
+ \setflag \autocallout = \false %~default soft
+ \def \beginformat {}% %~default soft
+ \belowpenalty = \breakgood %~default hard
+ \calloutnumber = 1 %~default with
+ \def \callouttext {\number\calloutnumber}% %~default soft
+ \defaulttabwidth = \mindimen %~default soft
+ \def \endformat {}% %~default soft
+ \tabbinggapskip = \enclosingbaselineskip %~default soft
+ \textcolor = {}% %~default soft
+ \parindent = 0pt
+ \parrag = 0pt
+ \parskip = 0pt
+ \processdesign{\tabbing}{#1}%
+ \global\increment \tabbingnumber
+ \tabbingformat
+ \def \zarg {\arg}%
+ \if \tokeqlp{\callouttext}{\zarg}%
+ \defineatsigncommand @##{\ztbngatcallout}%
+ \else
+ \defineatsigncommand @##{\ztbngatcallout{\callouttext}}%
+ \fi
+ \if \emptytoksp{\textcolor}% % Must have a group around \ztbnginit.
+ \bgroup
+ \else
+ \color{\the\textcolor}%
+ \fi
+ \ztbnginit
+ \ztbngstartline}
+
+\def \endtabbing {%
+ \ztbngfinal
+ \if \emptytoksp{\textcolor}%
+ \egroup % \tabbing group
+ \else
+ \endcolor
+ \fi
+ \futurelet\nexttoken \zendtabbing}
+
+\def \zendtabbing {%
+ \endtabbingformat
+ \global\decrement \tabbingdepth
+ \endblockscope{tabbing}%
+ \parnext}
+
+\def \tabbingformat {%
+ \endgraf
+ \the\bodyfont
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \beginformat}
+
+\def \endtabbingformat {%
+ \endformat
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+%~ Use this command in between lines in a |\tabbing| block to
+%~ perform a vertical adjustment between those two lines. For example,
+%~
+%~ \adjusttabbing{\fullpagebreak}
+
+\long\def \adjusttabbing #1{% {commands}
+ \ztbngadjust{#1}}
+
+% Initialize and Finalize
+% ---------- --- --------
+
+
+\definecount{\ztbngstopcount}{0}
+\definecount{\ztbngstopindex}{0}
+
+\definebox{\ztbngline}
+\definebox{\ztbngfragment}
+
+
+\def \ztbnginit {%
+ \let \par = \ztbngshouldntbepar
+ \def \nl {\ztbngfinishline{\false}}%
+ \defineatsigncommand @.{\ztbngatsetstop}%
+ \defineatsigncommand @>{\ztbngattab}%
+ \defineatsigncommand @C{\ztbngatclear}%
+ \defineatsigncommand @D{\ztbngatdiscard}%
+ \ztbngsetdefaultstops{\defaulttabwidth}}
+
+\def \ztbngsetdefaultstops #1{% {width}
+ \global\ztbngstopcount = 0
+ \def \ztbngstop {0pt}%
+ \if \dimgtrp{#1}{0pt}%
+ \tdimena = 0pt
+ \loop
+ \global\increment \ztbngstopcount
+ \advance \tdimena by #1\relax
+ \withname\edef {\ztbngstop\romannumeral\ztbngstopcount}{\the\tdimena}%
+ \if \dimlssp{\tdimena}{\hsize}%
+ \repeat
+ \fi}
+
+\def \ztbngfinal {%
+ \ztbngfinishline{\true}}
+
+% Build Lines
+% ----- -----
+
+
+\def \ztbngstartline {%
+ \ztbngstopindex = 0
+ \setbox\ztbngline = \hbox{}%
+ \global\setflag \ztbngdiscardp = \false
+ \settaginfo{\number\calloutnumber}{???title???}%
+ \ztbngstartfragment}
+
+\def \ztbngstartfragment {%
+ \setbox \ztbngfragment = \hbox\bgroup
+ \ignorespaces}
+
+\def \ztbngfinishfragment {%
+ \egroup % \ztbngfragment box
+ \setbox\ztbngline = \hbox{%
+ \unhbox\ztbngline
+ \tdimena = \name{\ztbngstop\romannumeral\ztbngstopindex}%
+ \hskip \tdimena
+ \tdimenb = \hsize
+ \advance \tdimenb by -\tdimena
+ \hbox to \tdimenb{\copy\ztbngfragment \hfil}%
+ \hskip -\tdimenb
+ \hskip -\tdimena}}
+
+\def \ztbngfinishline #1{% {end-of-block?}
+ \ztbngfinishfragment
+ \if \notp{\ztbngdiscardp}%
+ \if \orp{\posp{\ztbngstopindex}}{\dimposp{\wd\ztbngfragment}}%
+ \noindent
+ \if \autocallout
+ \llap{\calloutformat{\the\calloutnumber}}%
+ \increment \calloutnumber
+ \fi
+ \box\ztbngline
+ \endgraf
+ \else\if \notp{#1}%
+ \vspace{\tabbinggapskip}%
+ \fi\fi
+ \fi
+ \if #1\let \znext = \relax \else \let \znext = \ztbngstartline \fi
+ \znext}
+
+% At-sign Commands
+% ------- --------
+
+
+% @#{callout}text...
+
+\def \ztbngatcallout #1{% {callout}
+ \ztbngfinishfragment
+ \if \andp{\zerop{\ztbngstopindex}}{\dimzerop{\wd\ztbngfragment}}
+ \setbox\ztbngfragment = \hbox\bgroup
+ \llap{\calloutformat{#1}}%
+ \ztbngfinishfragment
+ \else
+ \error{badtabcallout}{Callout command (\noexpand@##) must appear
+ at the beginning of the line}%
+ \fi
+ \increment \calloutnumber
+ \ztbngstartfragment}
+
+% text@.more text...
+
+\def \ztbngatsetstop {%
+ \ztbngfinishfragment
+ \tdimena = \name{\ztbngstop\romannumeral\ztbngstopindex}%
+ \advance \tdimena by \wd\ztbngfragment
+ \increment \ztbngstopindex
+ \if \gtrp{\ztbngstopindex}{\ztbngstopcount}%
+ \withname\edef {\ztbngstop\romannumeral\ztbngstopindex}{\the\tdimena}%
+ \increment \ztbngstopcount
+ \else
+ \error{badtabstop}{There is already a tab stop}%
+ \fi
+ \ztbngstartfragment}
+
+% text@>more text...
+
+\def \ztbngattab {%
+ \ztbngfinishfragment
+ \if \lssp{\ztbngstopindex}{\ztbngstopcount}%
+ \increment \ztbngstopindex
+ \else
+ \warning{toomanytabs}{Too many tabs on line; extra tabs ignored}%
+ \fi
+ \ztbngstartfragment}
+
+% @Ctext...\nl
+
+\def \ztbngatclear {%
+ \if \zerop{\ztbngstopindex}%
+ \global\ztbngstopcount = 0\relax
+ \else
+ \error{badtabclear}{Tabs must be cleared at the beginning of the line}%
+ \fi}
+
+% text@D\nl
+
+\def \ztbngatdiscard {%
+ \global\setflag \ztbngdiscardp = \true \relax}
+
+% Adjustment
+% ----------
+
+
+\long\def \ztbngadjust #1{% {commands}
+ \ztbngfinishfragment
+ \if \andp{\zerop{\ztbngstopindex}}{\dimzerop{\wd\ztbngfragment}}
+ #1%
+ \else
+ \error{badtabadjust}{The \noexpand\adjusttabbing command must appear
+ in between lines}%
+ \fi
+ \ztbngstartfragment}
diff --git a/macros/plain/contrib/zztex/tex/zztabularv1.tex b/macros/plain/contrib/zztex/tex/zztabularv1.tex
new file mode 100644
index 0000000000..13fb536ab8
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztabularv1.tex
@@ -0,0 +1,465 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Tabular Facilities
+%
+% Synopsis: This module contains all the facilities for producing
+% tabular material.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tabular Block
+% ------- -----
+
+
+\let \tabularcomptext = \relax
+\let \tabulardepth = \relax
+\let \tabularnumber = \relax
+
+
+\defineblock{\tabular}{\endtabular}{\false}{}
+
+%~obsolete-block tabular Type
+% \abovepenalty = integer
+% \aboveskip = glue
+% \setflag \allowbreaks = boolean
+% \belowpenalty = integer
+% \belowskip = glue
+% \bodyfont = {...}
+% \colheadaboveskip = glue
+% \colheadbelowskip = glue
+% \colheadfont = {...}
+% \colsubheadfont = {...}
+% \columngutter = glue
+% \cutinheadaboveskip = glue
+% \cutinheadbelowskip = glue
+% \cutinheadfont = {...}
+% \interrowskip = glue
+% \leftindent = glue
+% \parhang = dimen
+% \parrag = dimen
+% \rightindent = glue
+% \rulecolwidth = dimen
+% \spannerheadfont = {...}
+% \spannerruleaboveskip = dimen
+% \spannerrulebelowskip = dimen
+% \spannerruleheight = dimen
+% \def \tabnoteformat ##1{...}
+% \tabrulecolor = {color}%
+% \tabruleheight = dimen
+% \width = dimen
+%~end
+
+\defineskip{\colheadaboveskip}{0pt}
+\let \headaboveskip = \colheadaboveskip
+\let \headbelowskip = \colheadbelowskip
+\definetoks{\colsubheadfont}
+\defineskip{\cutinheadaboveskip}{0pt}
+\defineskip{\cutinheadbelowskip}{0pt}
+\definetoks{\cutinheadfont}
+
+
+\definecount{\tabularcolcount}{0} % Number of columns in table.
+\definebox{\rowstrutbox} % Strut for table rows.
+
+
+\def \tabular #1#2{% {type}{template}
+ \endgraf
+ \beginblockscope{tabular}%
+ \global\increment \tabulardepth
+ \abovepenalty = \breakgood %~default hard
+ \belowpenalty = \breakbetter %~default hard
+ \tabrulecolor = {black}% %~default soft
+ \processdesign{\tabular}{#1}%
+ \global\increment \tabularnumber
+ \iffalse{\fi % Must be done with master
+ \tabularcolcount = 0 % counter > 0, to hide inner
+ \ztabcols #2&\zmark % \set and &.
+ \let \set = \span
+ \iffalse}\fi
+ \tabularformat
+ \fakepar
+ \nointerlineskip % We assume this below.
+ \if \notp{\allowbreaks}\vtop \fi \bgroup
+ \offinterlineskip
+ \everycr = {}%
+ \tabskip = \leftskip
+ \halign \if \dimneqlp{\width}{\naturalwidth}to \width \fi \bgroup
+ #2\tabskip = \rightskip \cr}
+
+\def \endtabular {%
+ \crcr
+ \egroup % \halign
+ \if \posp{\prevdepth}\kern -\interrowskip \fi % If last line has strut.
+ \egroup % \vtop
+ \prevdepth = \dp\strutbox % So row strut depth won't shine thru.
+ \futurelet\nexttoken \zendtabular}
+
+\def \zendtabular {%
+ \endtabularformat
+ \global\decrement \tabulardepth
+ \endblockscope{tabular}%
+ \parnext}
+
+\def \tabularformat {%
+ \endgraf
+ \the\bodyfont
+ \tdimena = \dp\strutbox
+ \advance \tdimena by \interrowskip
+ \setbox \rowstrutbox = \hbox{\vrule height \ht\strutbox depth \tdimena
+ width 0pt}%
+ \advance \aboveskip by \baselineskip % Compensate for absence
+ \advance \aboveskip by -\prevdepth % of interlineskip above
+ \advance \aboveskip by -\ht\rowstrutbox % first row of tabular.
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}}
+
+\def \endtabularformat{%
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+\def \ztabcols #1&#2\zmark{%
+ \increment \tabularcolcount
+ \if \notp{\emptyargp{#2}}\ztabcols #2\zmark \fi}
+
+% Template Facilities
+% -------- ----------
+
+
+% The following macros are used to construct the tabular template.
+% They are all used with the \set macro.
+
+\def \centercol {%
+ \hfil ##\rowstrut \hfil \tabskip=\columngutter}
+
+\def \centernumbercol #1{% {template}
+ \hfil \znumcell{#1}{##}\rowstrut \hfil \tabskip=\columngutter}
+
+\let \colgutter = \tabskip
+
+\def \customcol #1#2{% {left}{right}
+ #1\relax##\rowstrut #2\relax \tabskip=\columngutter}
+
+\def \customrulecol #1{% {width}
+ \color{\the\tabrulecolor}%
+ \vrule width #1 ##%
+ \endcolor \tabskip=\columngutter}
+
+\def \emptycol #1{% {width}
+ ##\rowstrut \hspace{#1}\tabskip=\columngutter}
+
+\def \leftcol {%
+ ##\rowstrut \hfil \tabskip=\columngutter}
+
+\def \leftnumbercol #1{% {template}
+ \znumcell{#1}{##}\rowstrut \hfil \tabskip=\columngutter}
+
+\def \parcol #1{% {width}
+ \vtop{\zpushvcontext
+ \zinitparcell{#1}{\parhang}%
+ \strut ##%
+ \if \hmodep \rowstrut \par \fi
+ \zpopvcontext}%
+ \tabskip=\columngutter}
+
+\def \rightcol {%
+ \hfil ##\rowstrut \tabskip=\columngutter}
+
+\def \rightnumbercol #1{% {template}
+ \hfil \znumcell{#1}{##}\rowstrut \tabskip=\columngutter}
+
+\def \rulecol {%
+ \color{\the\tabrulecolor}%
+ \vrule width \rulecolwidth ##%
+ \endcolor \tabskip=\columngutter}
+
+% Cell Facilities
+% ---- ----------
+
+
+% The following macros help with tabular entries (cells).
+
+\def \0{\phantom{0}}
+
+\def \centercell #1{% {text}
+ \omit
+ \hfil #1\rowstrut \hfil}
+
+\def \centerhead #1{% {heading}
+ \centercell{\the\colheadfont #1}}
+
+\def \centernumbercell #1#2{% {template}{text}
+ \omit
+ \hfil \znumcell{#1}{#2}\rowstrut \hfil}
+
+\def \centersubhead #1{% {heading}
+ \centercell{\the\colsubheadfont #1}}
+
+\def \customspannerrule #1#2{% {columns}{height}
+ \multispan{#1}%
+ \rowstrut
+ \ruleleaders{\hrule height #2 depth 0pt}}
+
+\def \customspannerruleabut #1#2{% {columns}{height}
+ \multispan{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}}
+
+\def \cutinhead #1{% {heading}
+ \multispan{\tabularcolcount}%
+ \leftcell{\the\cutinheadfont #1}}
+
+\def \cutinpar #1#2{% {width}{text}
+ \multispan{\tabularcolcount}%
+ \parhang = 0pt \parcell{#1}{#2}}
+
+\zremovePlaindef \hideskip
+\defineskip{\hideskip}{-1000pt plus 1fill}
+
+\def \hidewidth {\hskip \hideskip}
+
+\def \leftcell #1{% {text}
+ \omit
+ #1\rowstrut \hfil}
+
+\def \lefthead #1{% {heading}
+ \leftcell{\the\colheadfont #1}}
+
+\def \leftnumbercell #1#2{% {template}{text}
+ \omit
+ \znumcell{#1}{#2}\rowstrut \hfil}
+
+\def \leftsubhead #1{% {heading}
+ \leftcell{\the\colsubheadfont #1}}
+
+\def \multispan #1{% {columns}
+ \omit
+ \tcounta =#1\relax
+ \loop \ifnum \tcounta > 1 \zspan \repeat
+ \let \omit = \relax % In case the next thing is a \leftcell or whatever.
+ \ignorespaces}
+
+\def \zspan{\span\omit \decrement \tcounta}
+
+\def \nocolrule {%
+ width 0pt }
+
+\def \parcell #1#2{% {width}{text}
+ \omit
+ \vtop{\zpushvcontext
+ \zinitparcell{#1}{\parhang}%
+ \strut #2%
+ \if \hmodep \rowstrut \par \fi
+ \zpopvcontext}}
+
+\def \rightcell #1{% {text}
+ \omit
+ \hfil #1\rowstrut}
+
+\def \righthead #1{% {heading}
+ \rightcell{\the\colheadfont #1}}
+
+\def \rightnumbercell #1#2{% {template}{text}
+ \omit
+ \hfil \znumcell{#1}{#2}\rowstrut}
+
+\def \rightsubhead #1{% {heading}
+ \rightcell{\the\colsubheadfont #1}}
+
+\def \rowstrut {\unhcopy \rowstrutbox}
+
+\def \spannerhead #1#2{% {columns}{heading}
+ \multispan{#1}%
+ \centercell{\the\spannerheadfont #2}}
+
+\def \spannerrule #1{% {columns}
+ \multispan{#1}%
+ \rowstrut
+ \ruleleaders{\hrule height \spannerruleheight depth 0pt}}
+
+\def \spannerruleabut #1{% {columns}
+ \multispan{#1}%
+ \ruleleaders{\hrule height \spannerruleheight depth 0pt}}
+
+\def \spannerruleabutbelow #1{% {columns}
+ \multispan{#1}%
+ \vrule height \ht\rowstrutbox depth 0pt width 0pt\relax
+ \ruleleaders{\hrule height \spannerruleheight depth 0pt}}
+
+\def \tabnote #1{% {note-mark}
+ {\tabnoteformat{#1}}}
+
+\def \znumcell #1#2{% {template}{text}
+ \if \emptyargp{#2}%
+ \relax
+ \else
+ \znumcella{#1}{#2}%
+ \fi}
+
+\def \znumcella #1#2{% {template}{text}
+ {\ztoksa = {}\ztoksb = {}%
+ \setflag \znumpt = \false
+ \znumcellb #1\zmark
+ \setbox\zboxa = \hbox{\the\ztoksa}%
+ \tdimena = \wd\zboxa
+ \setbox\zboxa = \hbox{\the\ztoksb}%
+ \tdimenb = \wd\zboxa
+ \setflag \ztempt = \znumpt
+ \ztoksa = {}\ztoksb = {}%
+ \setflag \znumpt = \false
+ \znumcellb #2\zmark
+ \if \ztempt % Template had a decimal point.
+ \if \znumpt
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \the\decimalpoint
+ \hbox to \tdimenb{\the\ztoksb \hss}%
+ \else
+ \setbox\zboxa = \hbox{\the\decimalpoint}%
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \kern \wd\zboxa \kern \tdimenb
+ \fi
+ \else % Template had no decimal point.
+ \if \znumpt
+ \error{celldecpt}{Tabular template did not specify a decimal point}%
+ \else
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \fi
+ \fi}}
+
+\def \znumcellb #1#2\zmark{% t1 trest \zmark
+ \if \codeeqlp{\noexpand#1}{\the\decimalpoint}%
+ \setflag \znumpt = \true
+ \else
+ \if \znumpt
+ \ztoksb = \expandafter{\the\ztoksb #1}%
+ \else
+ \ztoksa = \expandafter{\the\ztoksa #1}%
+ \fi
+ \fi
+ \if \emptyargp{#2}%
+ \let \znext = \relax
+ \else
+ \def \znext {\znumcellb #2\zmark}%
+ \fi
+ \znext}
+
+% Inter-Row Facilities
+% --------- ----------
+
+
+% The following macros perform various actions in between rows.
+
+\def \adjusttab #1{%
+ \if \notp{\vmodep}%
+ \error{badrowcmd}{The \string\adjusttab command cannot be used in a table row}%
+ \fi
+ \noalign{#1}}
+
+\def \customtabrule #1{% {height}
+ \multispan{\tabularcolcount}%
+ \rowstrut
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height #1 depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \customtabruleabut #1{%
+ \multispan{\tabularcolcount}%
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height #1 depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \customtabruleabutbelow #1{%
+ \multispan{\tabularcolcount}%
+ \vrule height \ht\rowstrutbox depth 0pt width 0pt\relax
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height #1 depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \nointerrowskip {\tabvspace{-\interrowskip}}
+
+\def \skipabovecolhead {%
+ \tabbbskip{\colheadaboveskip}}
+
+\def \skipbelowcolhead {%
+ \tabbbskip{\colheadbelowskip}}
+
+\def \skipabovespannerrule {%
+ \tabbbskip{\spannerruleaboveskip}}
+
+\def \skipbelowspannerrule {%
+ \tabbbskip{\spannerrulebelowskip}}
+
+\def \skipabovecutinhead {%
+ \tabbbskip{\cutinheadaboveskip}}
+
+\def \skipbelowcutinhead {%
+ \tabbbskip{\cutinheadbelowskip}}
+
+\def \tabbbskip #1{% {glue}
+ \adjusttab{\zskipa = #1\relax
+ \advance \zskipa by -\ht\rowstrutbox
+ \advance \zskipa by -\dp\rowstrutbox
+ \vskip \zskipa}}
+
+\def \tabrule {%
+ \multispan{\tabularcolcount}%
+ \rowstrut
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height \tabruleheight depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \tabruleabut {%
+ \multispan{\tabularcolcount}%
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height \tabruleheight depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \tabruleabutbelow {%
+ \multispan{\tabularcolcount}%
+ \vrule height \ht\rowstrutbox depth 0pt width 0pt\relax
+ \color{\the\tabrulecolor}%
+ \ruleleaders{\hrule height \tabruleheight depth 0pt}%
+ \endcolor
+ \cr}
+
+\def \tabvspace #1{\adjusttab{\vskip #1}}% {glue}
+
+% Alignment Utilities
+% --------- ---------
+
+
+\let \completerow = \cr
+
+\def \ialign {\everycr = {}\tabskip = 0pt \halign}
+
+\def \oalign #1{% {row...}
+ \ensurepar
+ \vtop{\baselineskip = 0pt
+ \lineskip = .25ex
+ \ialign{##\cr #1\crcr}}}
+
+\def \ooalign {%
+ \lineskiplimit = -\maxdimen
+ \oalign}
+
+\def \ozalign {%
+ \lineskiplimit = 0pt\relax
+ \oalign}
+
+\def \zinitparcell #1#2{% {width}{hang}
+ \baselineskip = \normalbaselineskip
+ \lineskiplimit = 0pt \lineskip = 0pt
+ \setindentation{0pt}{0pt}%
+ \settextwidth{#1}%
+ \setparrag{\parrag}%
+ \leftskip = #2
+ \parindent = -#2
+ \parfillskip = \normalparfillskip}
diff --git a/macros/plain/contrib/zztex/tex/zztabularv2.tex b/macros/plain/contrib/zztex/tex/zztabularv2.tex
new file mode 100644
index 0000000000..932a42f5d4
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztabularv2.tex
@@ -0,0 +1,512 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Tabular Facilities
+%
+% Synopsis: This module contains all the facilities for producing
+% tabular material. This is the second major version.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 30 April 2001
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tabular Block
+% ------- -----
+
+
+\let \tabularcomptext = \relax
+\let \tabulardepth = \relax
+\let \tabularnumber = \relax
+
+
+\defineblock{\tabular}{\endtabular}{\false}{}
+
+%~obsolete-block tabular Type
+% \abovepenalty = integer
+% \aboveskip = glue
+% \belowpenalty = integer
+% \belowskip = glue
+% \bodyfont = {...}
+% \columngutter = glue
+% \colheadaboveskip = glue
+% \colheadbelowskip = glue
+% \colheadfont = {...}
+% \cutinheadfont = {...}
+% \setflag \hastoprule = \false
+% \interrowskip = glue
+% \leftindent = glue
+% \parhang = dimen
+% \parrag = dimen
+% \rightindent = glue
+% \rulecolwidth = dimen
+% \sectionheadaboveskip = glue
+% \sectionheadbelowskip = glue
+% \sideheadfont = {...}
+% \spannerheadfont = {...}
+% \spannerruleaboveskip = dimen
+% \spannerrulebelowskip = dimen
+% \spannerrulecolor = {color}
+% \spannerruleheight = dimen
+% \style = {...}
+% \tabbottomruleaboveskip = dimen
+% \tabheadrulebelowskip = dimen
+% \def \tabnoteformat ##1{...}
+% \tabrulecolor = {color}
+% \tabruleheight = dimen
+% \width = dimen
+%~end
+
+\defineskip{\colheadaboveskip}{0pt}
+%%%\defineskip{\colheadbelowskip}{0pt}
+%%%\definetoks{\colheadfont}
+\definetoks{\cutinheadfont}
+%%%\definedimen{\rulecolwidth}{0pt}
+\defineskip{\sectionheadaboveskip}{0pt}
+\defineskip{\sectionheadbelowskip}{0pt}
+%%%\definetoks{\sideheadfont}
+%%%\definetoks{\spannerheadfont}
+%%%\defineskip{\spannerruleaboveskip}{0pt}
+%%%\defineskip{\spannerrulebelowskip}{0pt}
+%%%\definetoks{\spannerrulecolor}
+%%%\definedimen{\spannerruleheight}{0pt}
+%%%\definedimen{\tabbottomruleaboveskip}{0pt}
+%%%\definedimen{\tabheadrulebelowskip}{0pt}
+%%%\definetoks{\tabrulecolor}
+%%%\definedimen{\tabruleheight}{0pt}
+
+
+%%%\definecount{\tabcolcount}{0} % Number of columns in table.
+
+\definetoks{\ztabspacetoks} % Special row for vertical spacing.
+%%%\definebox{\zrowstrut} % Strut for table rows.
+%%%\definebox{\zparcelltopstrut} % Strut for first line of par cell.
+%%%\definebox{\zparcellbotstrut} % Strut for last line of par cell.
+
+
+\def \tabular #1#2{% {type}{template}
+ \endgraf
+ \beginblockscope{tabular}%
+ \global\increment \tabulardepth
+ \abovepenalty = \breakgood %~default hard
+ \belowpenalty = \breakbetter %~default hard
+ \setflag \hastoprule = \false %~default soft
+ \parhang = 0pt %~default soft
+ \spannerrulecolor = {black}% %~default soft
+ \style = {top/head/bottom rules}% %~default soft
+ \tabrulecolor = {black}% %~default soft
+ \processdesign{\tabular}{#1}%
+ \global\increment \tabularnumber
+ \iffalse{\fi % Analyze the template with
+ \tabcolcount = 0 % master counter > 0 to hide
+ \ztabspacetoks = {}% % \set and &.
+ \zchecktabcols #2&\zmark
+ \let \set = \span
+ \iffalse}\fi
+ \tabularformat
+ \offinterlineskip
+ \everycr = {}%
+ \defineatsigncommand @A{\adjustcolrule}%
+ \defineatsigncommand @C{\nointerrowskip}%
+ \defineatsigncommand @N{\nocolrule}%
+ \defineatsigncommand @S{\skipabovespannerrule}%
+ \defineatsigncommand @T{\skipbelowspannerrule}%
+ \tabskip = \leftskip
+ \halign \if \dimneqlp{\width}{\naturalwidth}to \width \fi \bgroup
+ #2\tabskip = \rightskip\cr}
+
+\def \endtabular {%
+ \egroup % \halign
+ \if \posp{\prevdepth}% % Does the last line have a strut?
+ \kern -.5\interrowskip % To eliminate row strut depth.
+ \prevdepth = \dp\strutbox
+ \else
+ \prevdepth = \tabruleheight
+ \fi
+ \futurelet\nexttoken \zendtabular}
+
+\def \zendtabular {%
+ \endtabularformat
+ \global\decrement \tabulardepth
+ \endblockscope{tabular}%
+ \parnext}
+
+\def \tabularformat {%
+ \the\bodyfont
+ \calculate \tdimena = {\interrowskip,/,2,+,\ht\strutbox}%
+ \calculate \tdimenb = {\interrowskip,/,2,+,\dp\strutbox}%
+ \setbox \zrowstrut = \hbox{\vrule width 0pt
+ height \tdimena depth \tdimenb}%
+ \setbox \zparcelltopstrut = \hbox{\vrule width 0pt
+ height \tdimena depth 0pt}%
+ \setbox \zparcellbotstrut = \hbox{\vrule width 0pt
+ height 0pt depth \tdimenb}%
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \fakepar % This fakes an empty paragraph
+ \hbox{}% % so the \bbskipabove works.
+ \nobreak
+ \vskip \if \hastoprule -\tabruleheight \else -\ht\zrowstrut \fi
+ \alterindentation{\leftindent}{\rightindent}}
+
+\def \endtabularformat{%
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+\def \zchecktabcols #1#2#3&#4\zmark{%
+ \if \notp{\tokeqlp{#1}{\set}}%
+ \error{misset}{A tabular column template must begin with \string\set}%
+ \fi
+ \if \posp{\tabcolcount}%
+ \ztabspacetoks = \expandafter{\the\ztabspacetoks &}%
+ \fi
+ \if \notp{\tokeqlp{#2}{\rulecol}}%
+ \ztabspacetoks = \expandafter{\the\ztabspacetoks \omit \ztabspacestrut}%
+ \fi
+ \increment \tabcolcount
+ \if \notp{\emptyargp{#4}}\zchecktabcols #4\zmark \fi}
+
+% Template Facilities
+% -------- ----------
+
+
+% The following macros are used to construct the tabular template.
+% They are all used with the \set macro.
+
+\def \centercol {%
+ \hfil ##\rowstrut \hfil \tabskip=\columngutter}
+
+\def \centernumbercol #1{% {template}
+ \hfil \znumcell{#1}{##}\rowstrut \hfil \tabskip=\columngutter}
+
+\let \gutter = \tabskip
+
+\def \customcol #1{% {template}
+ #1\rowstrut \tabskip=\columngutter}
+
+\def \customrulecol #1#2{% {color}{width}
+ \color{#1}%
+ \vrule width #2 ##%
+ \endcolor \tabskip=\columngutter}
+
+\def \emptycol #1{% {width}
+ ##\rowstrut \hspace{#1}\tabskip=\columngutter}
+
+\def \leftcol {%
+ ##\rowstrut \hfil \tabskip=\columngutter}
+
+\def \leftnumbercol #1{% {template}
+ \znumcell{#1}{##}\rowstrut \hfil \tabskip=\columngutter}
+
+\def \parcol #1{% {width}
+ \vtop{\zpushvcontext
+ \zinitparcell{#1}{\parhang}%
+ \unhcopy \zparcelltopstrut ##%
+ \if \hmodep \unhcopy \zparcellbotstrut \par \fi
+ \zpopvcontext}%
+ \tabskip=\columngutter}
+
+\def \rightcol {%
+ \hfil ##\rowstrut \tabskip=\columngutter}
+
+\def \rightnumbercol #1{% {template}
+ \hfil \znumcell{#1}{##}\rowstrut \tabskip=\columngutter}
+
+\def \rulecol {%
+ \color{\the\tabrulecolor}%
+ \vrule width \rulecolwidth ##%
+ \endcolor \tabskip=\columngutter}
+
+% Cell Facilities
+% ---- ----------
+
+
+% The following macros help with tabular entries (cells).
+
+\def \0{\phantom{0}}
+
+\def \centercell #1{% {text}
+ \omit
+ \hfil #1\rowstrut \hfil}
+
+\def \centerhead #1{% {heading}
+ \centercell{\the\colheadfont #1}}
+
+\def \centernumbercell #1#2{% {template}{text}
+ \omit
+ \hfil \znumcell{#1}{#2}\rowstrut \hfil}
+
+\def \cutinhead #1{% {heading}
+ \skipabovetabsection
+ \multispan{\tabcolcount}%
+ \leftcell{\the\cutinheadfont #1}\cr
+ \skipbelowtabsection}
+
+\zremovePlaindef \hideskip
+\defineskip{\hideskip}{-1000pt plus 1fill}
+
+\def \hidewidth {\hskip \hideskip}
+
+\def \leftcell #1{% {text}
+ \omit
+ #1\rowstrut \hfil}
+
+\def \lefthead #1{% {heading}
+ \leftcell{\the\colheadfont #1}}
+
+\def \leftnumbercell #1#2{% {template}{text}
+ \omit
+ \znumcell{#1}{#2}\rowstrut \hfil}
+
+\def \multispan #1{% {columns}
+ \omit
+ \tcounta = #1%
+ \loop \ifnum \tcounta > 1 \zspan \repeat
+ \let \omit = \relax % In case the next thing is a \leftcell or whatever.
+ \ignorespaces}
+
+\def \zspan {\span\omit \decrement \tcounta}
+
+\def \parcell #1#2{% {width}{text}
+ \omit
+ \vtop{\zpushvcontext
+ \zinitparcell{#1}{\parhang}%
+ \unhcopy \zparcelltopstrut #2%
+ \if \hmodep \unhcopy \zparcellbotstrut \par \fi
+ \zpopvcontext}}
+
+\def \rightcell #1{% {text}
+ \omit
+ \hfil #1\rowstrut}
+
+\def \righthead #1{% {heading}
+ \rightcell{\the\colheadfont #1}}
+
+\def \rightnumbercell #1#2{% {template}{text}
+ \omit
+ \hfil \znumcell{#1}{#2}\rowstrut}
+
+\def \rowstrut {%
+ \unhcopy \zrowstrut}
+
+\def \sidehead #1{% {heading}
+ \leftcell{\the\sideheadfont #1}}
+
+\def \spannerhead #1#2{% {columns}{heading}
+ \multispan{#1}%
+ \centercell{\the\spannerheadfont #2}}
+
+\def \tabnote #1{% {note-mark}
+ {\tabnoteformat{#1}}}
+
+\def \znumcell #1#2{% {template}{text}
+ \if \emptyargp{#2}%
+ \relax
+ \else
+ \znumcella{#1}{#2}%
+ \fi}
+
+\def \znumcella #1#2{% {template}{text}
+ {\ztoksa = {}\ztoksb = {}%
+ \setflag \znumpt = \false
+ \znumcellb #1\zmark
+ \setbox\zboxa = \hbox{\the\ztoksa}%
+ \tdimena = \wd\zboxa
+ \setbox\zboxa = \hbox{\the\ztoksb}%
+ \tdimenb = \wd\zboxa
+ \setflag \ztempt = \znumpt
+ \ztoksa = {}\ztoksb = {}%
+ \setflag \znumpt = \false
+ \znumcellb #2\zmark
+ \if \ztempt % Template had a decimal point.
+ \if \znumpt
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \the\decimalpoint
+ \hbox to \tdimenb{\the\ztoksb \hss}%
+ \else
+ \setbox\zboxa = \hbox{\the\decimalpoint}%
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \kern \wd\zboxa \kern \tdimenb
+ \fi
+ \else % Template had no decimal point.
+ \if \znumpt
+ \error{celldecpt}{Tabular template did not specify a decimal point}%
+ \else
+ \hbox to \tdimena{\hss \the\ztoksa}%
+ \fi
+ \fi}}
+
+\def \znumcellb #1#2\zmark{% t1 trest \zmark
+ \if \codeeqlp{\noexpand#1}{\the\decimalpoint}%
+ \setflag \znumpt = \true
+ \else
+ \if \znumpt
+ \ztoksb = \expandafter{\the\ztoksb #1}%
+ \else
+ \ztoksa = \expandafter{\the\ztoksa #1}%
+ \fi
+ \fi
+ \if \emptyargp{#2}%
+ \let \znext = \relax
+ \else
+ \def \znext {\znumcellb #2\zmark}%
+ \fi
+ \znext}
+
+% Rule Facilities
+% ---- ----------
+
+
+\def \adjustcolrule #1,#2,#3;{% width,height,depth;
+ \if \notp{\emptyargp{#1}}width #1pt\fi
+ \if \notp{\emptyargp{#2}}height #2pt\fi
+ \if \notp{\emptyargp{#3}}depth #3pt\fi\relax}
+
+\def \custompartialtabrule #1#2#3{% {color}{thickness}{columns}
+ \multispan{#3}%
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor}
+
+\def \customspannerrule #1#2#3{% {color}{thickness}{columns}
+ \multispan{#3}%
+ \rowstrut
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor}
+
+\def \customtabrule #1#2{% {color}{thickness}
+ \multispan{\tabcolcount}%
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor\cr}
+
+\def \nocolrule {%
+ width 0pt }
+
+\def \partialtabrule #1{% {columns}
+ \custompartialtabrule{\the\tabrulecolor}{\tabruleheight}{#1}}
+
+\def \spannerrule #1{% {columns}
+ \customspannerrule{\the\spannerrulecolor}{\spannerruleheight}{#1}}
+
+\def \tabbottomrule {%
+ \tabbbskipaboverule{\tabbottomruleaboveskip}%
+ \tabrule}
+
+\def \tabheadrule {%
+ \tabbbskipaboverule{\colheadbelowskip}%
+ \tabrule
+ \tabbbskipbelowrule{\tabheadrulebelowskip}}
+
+\def \tabrule {%
+ \customtabrule{\the\tabrulecolor}{\tabruleheight}}
+
+\def \tabtoprule {%
+ \tabrule
+ \tabbbskipbelowrule{\colheadaboveskip}}
+
+% Spacing Facilities
+% ------- ----------
+
+
+\definedimen{\zskipamount}{0pt}
+
+
+\def \nointerrowskip {%
+ \tabvspace{-\interrowskip}}
+
+\def \skipabovecolhead {%
+ \tabbbskip{\colheadaboveskip}}
+
+\def \skipbelowcolhead {%
+ \tabbbskip{\colheadbelowskip}}
+
+\def \skipabovespannerrule {%
+ \tabbbskip{\spannerruleaboveskip}}
+
+\def \skipbelowspannerrule {%
+ \tabbbskip{\spannerrulebelowskip}}
+
+\def \skipabovetabsection {%
+ \tabbbskip{\sectionheadaboveskip}}
+
+\def \skipbelowtabsection {%
+ \tabbbskip{\sectionheadbelowskip}}
+
+\def \tabbbskip #1{%
+ \noalign{%
+ \calculate \zskipamount = {#1,-,\dp\zrowstrut,-,\ht\zrowstrut}%
+ \ztabvspace{\zskipamount}}%
+ \the\ztabspacetoks\cr}
+
+\def \tabbbskipaboverule #1{%
+ \noalign{%
+ \calculate \zskipamount = {#1,-,\dp\zrowstrut,-,\tabruleheight}%
+ \ztabvspace{\zskipamount}}%
+ \the\ztabspacetoks\cr}
+
+\def \tabbbskipbelowrule #1{%
+ \noalign{%
+ \calculate \zskipamount = {#1,-,\ht\zrowstrut,-,\tabruleheight}%
+ \ztabvspace{\zskipamount}}%
+ \the\ztabspacetoks\cr}
+
+\def \tabvspace #1{%
+ \noalign{\ztabvspace{#1}}%
+ \the\ztabspacetoks\cr}
+
+\def \ztabvspace #1{%
+ \if \dimnegp{#1}%
+ \vskip #1\relax
+ \global\zskipamount = 0pt
+ \else
+ \global\zskipamount = #1%
+ \fi}
+
+\def \ztabspacestrut {%
+ \vrule width 0pt height 0pt depth \zskipamount\relax}
+
+% Inter-Row Facilities
+% --------- ----------
+
+
+\def \adjusttab #1{%
+ \if \notp{\vmodep}%
+ \error{badrowcmd}{The \string\adjusttab command cannot be used
+ in a table row}%
+ \fi
+ \noalign{#1}}
+
+
+% Utilities
+% ---------
+
+
+\let \completerow = \cr
+
+\def \ialign {\everycr = {}\tabskip = 0pt \halign}
+
+\def \oalign #1{% {row...}
+ \ensurepar
+ \vtop{\baselineskip = 0pt
+ \lineskip = .25ex
+ \ialign{##\cr #1\crcr}}}
+
+\def \ooalign {%
+ \lineskiplimit = -\maxdimen
+ \oalign}
+
+\def \ozalign {%
+ \lineskiplimit = 0pt\relax
+ \oalign}
+
+\def \zinitparcell #1#2{% {width}{hang}
+ \baselineskip = \normalbaselineskip
+ \lineskiplimit = 0pt \lineskip = 0pt
+ \setindentation{0pt}{0pt}%
+ \settextwidth{#1}%
+ \setparrag{\parrag}%
+ \leftskip = #2
+ \parindent = -#2
+ \parfillskip = \normalparfillskip}
diff --git a/macros/plain/contrib/zztex/tex/zztabularv3.tex b/macros/plain/contrib/zztex/tex/zztabularv3.tex
new file mode 100644
index 0000000000..c7035daa73
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztabularv3.tex
@@ -0,0 +1,771 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Tabular Facilities, version 3
+%
+% Synopsis: This module contains all the facilities for producing
+% tabular material. This is the third major version.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 4 June 2004
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tabular Block
+% ------- -----
+
+
+\defineblock{\tabular}{\endtabular}{\false}{}
+
+%~block tabular Type
+% \abovepenalty = integer % Penalty above text.
+% \aboveskip = glue % Space b/b above text.
+% \belowpenalty = integer % Penalty below text.
+% \belowskip = glue % Space b/b below text.
+% \bodyfont = {font} % Body font.
+% \columngutter = glue % Width of column gutter.
+% \colheadbelowskip = dimen % Space b/b below column heads.
+% \colheadcolor = {color} % Color of Column heads.
+% \colheadfont = {font} % Column head font.
+% \interrowskip = dimen % Extra space between rows.
+% \leftindent = glue % Left indentation.
+% \parhang = dimen % Paragraph column hang.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = skip % Paragraph skip.
+% \rightindent = glue % Right indentation.
+% \rulecolcolor = {color} % Color of table rules.
+% \rulecolwidth = dimen % Width of column rules.
+% \sideheadaboveskip = dimen % Space b/b above side heads.
+% \sideheadbelowskip = dimen % Space b/b below side heads.
+% \sideheadcolor = {color} % Color of side heads.
+% \sideheadfont = {font} % Side head font.
+% \spannerheadcolor = {color} % Color of spanner heads.
+% \spannerheadfont = {font} % Spanner head font.
+% \spannerruleaboveskip = dimen % Space b/b above spanner rules.
+% \spannerrulebelowskip = dimen % Space b/b below spanner rules.
+% \spannerrulecolor = {color} % Color of spanner rules.
+% \spannerruleheight = dimen % Spanner rule thickness.
+% \style = {...} % Style description.
+% \tabbottomruleaboveskip = dimen % Space b/b above bottom rules.
+% \tabheadrulebelowskip = dimen % Space b/b below head rules.
+% \def \tabnoteformat ##1{...} % Format of table note references.
+% \tabrulecolor = {color} % Color of table rules.
+% \tabruleheight = dimen % Table rule thickness.
+% \tabtoprulebelowskip = dimen % Space b/b below top rules.
+% \width = dimen % Width of tabular material.
+%~end
+
+\defineskip{\colheadbelowskip}{0pt}
+\definetoks{\colheadcolor}
+\definetoks{\colheadfont}
+\definetoks{\rulecolcolor}
+\definedimen{\rulecolwidth}{0pt}
+\definedimen{\sideheadaboveskip}{0pt}
+\definedimen{\sideheadbelowskip}{0pt}
+\definetoks{\sideheadcolor}
+\definetoks{\sideheadfont}
+\definetoks{\spannerheadcolor}
+\definetoks{\spannerheadfont}
+\definedimen{\spannerruleaboveskip}{0pt}
+\definedimen{\spannerrulebelowskip}{0pt}
+\definetoks{\spannerrulecolor}
+\definedimen{\spannerruleheight}{0pt}
+\definedimen{\tabbottomruleaboveskip}{0pt}
+\definedimen{\tabheadrulebelowskip}{0pt}
+\definetoks{\tabrulecolor}
+\definedimen{\tabruleheight}{0pt}
+\definedimen{\tabtoprulebelowskip}{0pt}
+
+
+\def \tabular #1#2{% {type}{template}
+ \endgraf
+ \beginblockscope{tabular}%
+ \global\increment \tabulardepth
+ \abovepenalty = \breakgood %~default hard
+ \belowpenalty = \breakbetter %~default hard
+ \processdesign{\tabular}{#1}%
+ \global\increment \tabularnumber
+ \zsetuptabular{#2}%
+ \tabularformat
+ \defineatsigncommand @A{\adjustcolrule}%
+ \defineatsigncommand @C{\closeuprows}%
+ \defineatsigncommand @N{\nocolrule}%
+ \defineatsigncommand @S{\skipabovespannerrule}%
+ \defineatsigncommand @T{\skipbelowspannerrule}%
+ \offinterlineskip
+ \nobreak
+ \tabskip=\leftskip
+ \halign \if \dimneqlp{\width}{\naturalwidth}to \width \fi \bgroup
+ \span\the\zpreamble \tabskip=\rightskip \cr}
+
+\def \endtabular {%
+ \crcr
+ \egroup % \halign
+ \if \posp{\prevdepth}% % Does the last line have a strut?
+ \kern -.5\interrowskip % Yes, eliminate extra depth from
+ \prevdepth = \dp\strutbox % \interrowskip.
+ \else
+ \prevdepth = \tabruleheight % No, compensate for bottom rule.
+ \fi
+ \futurelet\nexttoken \zendtabular}
+
+\def \zendtabular {%
+ \endtabularformat
+ \global\decrement \tabulardepth
+ \endblockscope{tabular}%
+ \parnext}
+
+\def \tabularformat {%
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \fakepar % This empty paragraph allows
+ \hbox{}% % the \bbskipabove to work.
+ \kern
+ \if \dimzerop{\tabtoprulebelowskip}-\ht\zrowstrut \else -\tabruleheight \fi
+ \alterindentation{\leftindent}{\rightindent}}
+
+\def \endtabularformat{%
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+\def \adjustcolumngutter #1{% {amount} %^tabular
+ \with{\advance\columngutter by #1}}
+
+\def \adjustinterrowskip #1{% {amount} %^tabular
+ \with{\advance\interrowskip by #1}}
+
+% Set Up Tabular
+% --- -- -------
+
+
+\definecount{\tabcolcount}{0} % Number of columns in table.
+\definetoks{\zpreamble} % Preamble for \halign.
+\definetoks{\ztabspacerow} % Special row for vertical spacing.
+\definebox{\zrowstrut} % Strut for table rows.
+\definebox{\zparcelltopstrut} % Strut for first line of par cell.
+\definebox{\zparcellbotstrut} % Strut for last line of par cell.
+
+\def \zsetuptabular #1{% {template}
+ \zanaltemplate{#1}%
+ \the\bodyfont
+ \calculate \tdimena = {\interrowskip,/,2,+,\ht\strutbox}%
+ \calculate \tdimenb = {\interrowskip,/,2,+,\dp\strutbox}%
+ \setbox \zrowstrut = \hbox{\vrule width 0pt
+ height \tdimena depth \tdimenb}%
+ \setbox \zparcelltopstrut = \hbox{\vrule width 0pt
+ height \tdimena depth 0pt}%
+ \setbox \zparcellbotstrut = \hbox{\vrule width 0pt
+ height 0pt depth \tdimenb}%
+ \global\zprevrowclass = \zrcpream
+ \global\zcurrowclass = \zrcpream
+ \gdef \zcolrulegate {}%
+ \global\setflag \zcolrulesenabled = \false
+ \everycr = {\noalign{\ztabcr}}}
+
+% Analyze Template
+% ------- --------
+
+
+\defineskip{\zpendgutter}{0pt}
+
+
+\def \zanaltemplate #1{% {template}
+ \setbox\zboxa = \hbox{%
+ \defineatsigncommand @!{\zcustomrulecol}%
+ \defineatsigncommand @>{\zgutterspec}%
+ \defineatsigncommand @c{\zcentercol}%
+ \defineatsigncommand @C{\zcenternumbercol}%
+ \defineatsigncommand @e{\zemptycol}%
+ \defineatsigncommand @l{\zleftcol}%
+ \defineatsigncommand @L{\zleftnumbercol}%
+ \defineatsigncommand @p{\zparcol}%
+ \defineatsigncommand @r{\zrightcol}%
+ \defineatsigncommand @R{\zrightnumbercol}%
+ \defineatsigncommand @s{\zspecialcol}%
+ \defineatsigncommand @|{\zrulecol}%
+ \global\tabcolcount = 0
+ \global\zpreamble = {}%
+ \global\ztabspacerow = {}%
+ #1}%
+ \tabcolcount = \tabcolcount
+ \zpreamble = \zpreamble
+ \ztabspacerow = \ztabspacerow}
+
+\def \zcentercol {%
+ \zstartcol{\false}%
+ \zappendpreamble{\hfil ##\rowstrut \hfil}}
+
+\def \zcenternumbercol #1{%
+ \zstartcol{\false}%
+ \zmeasuredanumber #1..\zmark
+ \edef \znext {%
+ \noexpand\zappendpreamble{%
+ \hfil \noexpand\zsetnumbercell{\the\tdimena}{\the\tdimenb}{####}\hfil}}%
+ \znext}
+
+\def \zcustomrulecol #1#2{% {color}{width}
+ \if \dimeqlp{\zpendgutter}{\mindimen}\zpendgutter = .5\columngutter \fi
+ \zstartcol{\true}%
+ \zappendpreamble{\zsetcolrule{#1}{#2}{##}}%
+ \zpendgutter = .5\columngutter}
+
+\def \zemptycol #1{% {width}
+ \zstartcol{\false}%
+ \zappendpreamble{##\rowstrut \hspace{#1}}}
+
+\def \zgutterspec #1{% {width}
+ \zparsegutterspec #1*\zmark}
+
+\def \zparsegutterspec #1*#2\zmark{%
+ \zpendgutter = #1\relax
+ \if \notp{\emptyargp{#2}}%
+ \advance \zpendgutter by \columngutter
+ \advance \zpendgutter by -1\columngutter
+ \fi}
+
+\def \zleftcol {%
+ \zstartcol{\false}%
+ \zappendpreamble{##\rowstrut \hfil}}
+
+\def \zleftnumbercol #1{%
+ \zstartcol{\false}%
+ \zmeasuredanumber #1..\zmark
+ \edef \znext {%
+ \noexpand\zappendpreamble{%
+ \noexpand\zsetnumbercell{\the\tdimena}{\the\tdimenb}{####}\hfil}}%
+ \znext}
+
+\def \zparcol #1{% {width}
+ \zstartcol{\false}%
+ \zappendpreamble{\zsetparcol{#1}{##}}}
+
+\def \zrightcol {%
+ \zstartcol{\false}%
+ \zappendpreamble{\hfil ##\rowstrut}}
+
+\def \zrightnumbercol #1{%
+ \zstartcol{\false}%
+ \zmeasuredanumber #1..\zmark
+ \edef \znext {%
+ \noexpand\zappendpreamble{%
+ \hfil \noexpand\zsetnumbercell{\the\tdimena}{\the\tdimenb}{####}}}%
+ \znext}
+
+\def \zrulecol {%
+ \if \dimeqlp{\zpendgutter}{\mindimen}\zpendgutter = .5\columngutter\relax \fi
+ \zstartcol{\true}%
+ \zappendpreamble{\zsetcolrule{}{}{##}}%
+ \zpendgutter = .5\columngutter\relax}
+
+\def \zspecialcol #1{% {template}
+ \zstartcol{\false}%
+ \zappendpreamble{#1\rowstrut}}
+
+\def \zstartcol #1{% {rule-column?}
+ \if \posp{\tabcolcount}%
+ \if \dimeqlp{\zpendgutter}{\mindimen}\zpendgutter = \columngutter \fi
+ \edef \znext {\noexpand\zappendpreamble{\tabskip=\the\zpendgutter &}}%
+ \znext
+ \global\ztabspacerow = \expandafter{\the\ztabspacerow &}%
+ \fi
+ \global\increment \tabcolcount
+ \if \notp{#1}%
+ \global\ztabspacerow = \expandafter{\the\ztabspacerow
+ \omit \copy \ztabvspacebox}%
+ \fi
+ \zpendgutter = \mindimen}
+
+\def \zappendpreamble #1{% {preamble stuff}
+ \global\zpreamble = \expandafter{\the\zpreamble #1}}
+
+% Preamble Helpers
+% -------- -------
+
+
+\def \zmeasuredanumber #1.#2.#3\zmark{%
+ \measuretextwidth{\tdimena}{#1}%
+ \measuretextwidth{\tdimenb}{.#2}%
+ \if \andp{\emptyargp{#2}}{\emptyargp{#3}}\tdimenb = 0pt\fi}
+
+\def \zsetcolrule #1#2#3{% {color}{width}{adjustment}
+ \if \emptyargp{#1}\color{\the\tabrulecolor}\else \color{#1}\fi
+ \vrule width \if \emptyargp{#2}\rulecolwidth \else #2\fi
+ \zcolrulegate #3%
+ \endcolor}
+
+\def \zsetnumbercell #1#2#3{% {pre-width}{post-width}{text}
+ \gdef \zcellstyle {}%
+ \zsplitdanumber #3..\zmark
+ \if \dimzerop{#2}%
+ \if \emptytoksp{\ztoksb}%
+ \hbox to #1{\hfil \the\ztoksa}%
+ \else
+ \error{celldecpt}{Template picture did not include a decimal point}%
+ \fi
+ \else
+ \hbox to #1{\hfil \the\ztoksa}%
+ \hbox to #2{\zcellstyle \the\ztoksb \hfil}%
+ \fi
+ \rowstrut}
+
+\long\def \zsetparcol #1#2{% {width}{text}
+ \vtop{%
+ \zpushvcontext
+ \baselineskip = \normalbaselineskip
+ \lineskiplimit = 0pt \lineskip = 0pt
+%%% \setindentation{0pt}{0pt}%
+ \settextwidth{#1}%
+ \setparrag{\parrag}%
+ \leftskip = \parhang
+ \parindent = -\parhang
+ \parfillskip = \normalparfillskip
+ \unhcopy \zparcelltopstrut
+ #2%
+ \if \hmodep \unhcopy \zparcellbotstrut \par \fi
+ \zpopvcontext}}
+
+\def \zsplitdanumber #1.#2.#3\zmark{%
+ \ztoksa = {#1}%
+ \ztoksb = {.#2}%
+ \if \andp{\emptyargp{#2}}{\emptyargp{#3}}\ztoksb = {}\fi}
+
+% Row Class
+% --- -----
+
+
+\definecount{\zprevrowclass}{0}
+\definecount{\zcurrowclass}{0}
+
+\chardef \zrcpream = 0
+\chardef \zrcdata = 1
+\chardef \zrchead = 2
+\chardef \zrcrule = 3
+\chardef \zrcvspace = 4
+\chardef \zrcbbskip = 5
+
+\def \zsetrowclass #1{%
+ \if \gtrp{#1}{\zcurrowclass}\global\zcurrowclass = #1\relax \fi}
+
+\def \ztabcr {%
+ \global\zprevrowclass = \zcurrowclass
+ \global\zcurrowclass = \zrcdata
+ \global\setflag \zcolrulesenabled = \false}
+
+% Cell Facilities
+% ---- ----------
+
+
+%~ This command produces a phantom zero, which is useful for aligning
+%~ numbers when decimal-aligned columns are not being used.
+
+\def \0{\phantom{0}} %^tabular
+
+\zremovePlaindef \hideskip
+\defineskip{\hideskip}{-1000pt plus 1fill}
+
+%~ This command "hides" the width of the cell from the column width calculation
+%~ process. The cell does not participate in determining the widest cell of
+%~ the column. If the cell is wider than the calculated column width, it will
+%~ stick into the left or right column gutter, depending on the position of the
+%~ |\hidewidth| command.
+
+\def \hidewidth {\hskip \hideskip} %^tabular
+
+%~ This command discards the templates for the specified number of columns and
+%~ creates one cell that spans them all. The content of the cell is specified
+%~ immediately following the command. This spanning cell has no template, so
+%~ you must include all the required commands in the cell text. This is usually done
+%~ using one of the cell override commands such as |\leftcell|.
+
+\def \multispan #1{% {columns} %^tabular
+ \omit
+ \tcounta = #1%
+ \loop \ifnum \tcounta > 1 \zspan \repeat
+ \let \omit = \relax % In case the next thing is a \leftcell or whatever.
+ \ignorespaces}
+
+\def \zspan {\span\omit \decrement \tcounta}
+
+\def \rowstrut {%
+ \unhcopy \zrowstrut}
+
+\def \zcellstyle {}
+
+\def \setcellstyle #1{%
+ #1%
+ \gdef \zcellstyle {#1}%
+ \ignorespaces}
+
+%~ This command sets a table note reference, usually a lowercase
+%~ letter. The format of the reference is determined by the design.
+
+\def \tabnote #1{% {note-mark} %^tabular
+ {\tabnoteformat{#1}}}
+
+% Cell Overrides
+% ---- ---------
+
+
+%~ This command overrides the template for the column and sets
+%~ a centered cell. It must appear immediately after the
+%~ ampersand (|&&|) that begins the cell.
+
+\def \centercell #1{% {text} %^tabular
+ \omit
+ \hfil #1\rowstrut \hfil}
+
+%~ This command overrides the template for the column and sets
+%~ a flush left cell. It must appear immediately after the
+%~ ampersand (|&&|) that begins the cell.
+
+\def \leftcell #1{% {text} %^tabular
+ \omit
+ #1\rowstrut \hfil}
+
+%~ This command overrides the template for the column and sets
+%~ a paragraph cell. It must appear immediately after the
+%~ ampersand (|&&|) that begins the cell.
+
+\def \parcell #1#2{% {width}{text} %^tabular
+ \omit
+ \zsetparcol{#1}{#2}}
+
+%~ This command overrides the template for the column and sets
+%~ a flush right cell. It must appear immediately after the
+%~ ampersand (|&&|) that begins the cell.
+
+\def \rightcell #1{% {text} %^tabular
+ \omit
+ \hfil #1\rowstrut}
+
+% Column Heads
+% ------ -----
+
+
+%~ This column head command produces a centered head.
+
+\def \centerhead #1{% {heading} %^tabular
+ \centercell{%
+ \the\colheadfont \colortext{\the\colheadcolor}{#1}%
+ \zchkadjheads}}
+
+%~ This column head command produces a flush left head.
+
+\def \lefthead #1{% {heading} %^tabular
+ \leftcell{%
+ \the\colheadfont \colortext{\the\colheadcolor}{#1}%
+ \zchkadjheads}}
+
+%~ This column head command produces a flush right head.
+
+\def \righthead #1{% {heading} %^tabular
+ \rightcell{%
+ \the\colheadfont \colortext{\the\colheadcolor}{#1}%
+ \zchkadjheads}}
+
+%~ This command produces a spanner head that spans the specified
+%~ number of columns.
+
+\def \spannerhead #1#2{% {columns}{heading} %^tabular
+ \multispan{#1}%
+ \centercell{\the\spannerheadfont \colortext{\the\spannerheadcolor}{#2}}%
+ \zsetrowclass{\zrchead}}
+
+\def \zchkadjheads {%
+ \if \andp{\eqlp{\zprevrowclass}{\zrchead}}{\posp{\interrowskip}}%
+ \warning{adjheads}{Two adjacent rows of heads need to be closed up}%
+ \global\zprevrowclass = \zrcdata
+ \fi
+ \zsetrowclass{\zrchead}}
+
+% Side Heads
+% ---- -----
+
+%~ This command is a shorthand for producing a cut-in head that spans the
+%~ entire width of the table. It is equivalent to:
+%~
+%~ | \skipabovesidehead
+%~ | \sidehead{*all-columns*}{*heading*}\cr
+%~ | \skipbelowsidehead
+
+\def \cutinhead #1{% {heading} %^tabular
+ \skipabovesidehead
+ \sidehead{\tabcolcount}{#1}\cr
+ \skipbelowsidehead}
+
+%~ This command produces a side head that spans the specified number of
+%~ columns. It is similar to |\spannerhead|. It is almost always the case that a
+%~ |\sidehead| row should be preceded by a |\skipabovesidehead| and followed by a
+%~ |\skipbelowsidehead|.
+
+\def \sidehead #1#2{% {columns}{heading} %^tabular
+ \multispan{#1}%
+ \leftcell{\the\sideheadfont \colortext{\the\sideheadcolor}{#2}}}
+
+% Vertical Spacing
+% -------- -------
+
+
+%~ This command eliminates the inter-row space between two rows. It must be
+%~ used between two consective rows of table heads. Shorthand: |@C|.
+
+\def \closeuprows {% %^tabular
+ \tabvspace{-\interrowskip}}
+
+%~ This command adds extra space between column heads and the first data row.
+%~ It must be used in tables that do not have head rules.
+
+\def \skipbelowcolhead {% %^tabular
+ \zchkbelowhead
+ \tabbbskip{\colheadbelowskip}}
+
+%~ This command produces the appropriate vertical space above
+%~ a spanner rule. Shorthand: |@S|. See also |\skipbelowspannerrule|.
+
+\def \skipabovespannerrule {% %^tabular
+ \tabbbskip{\spannerruleaboveskip}}
+
+%~ This command produces the appropriate vertical space below
+%~ a spanner rule. Shorthand: |@T|. See also |\skipabovespannerrule|.
+
+\def \skipbelowspannerrule {% %^tabular
+ \tabbbskip{\spannerrulebelowskip}}
+
+%~ This command produces the appropriate vertical space above
+%~ a side head. See also |\skipbelowsidehead|.
+
+\def \skipabovesidehead {% %^tabular
+ \tabbbskip{\sideheadaboveskip}}
+
+%~ This command produces the appropriate vertical space below
+%~ a side head. See also |\skiabovewsidehead|.
+
+\def \skipbelowsidehead {% %^tabular
+ \tabbbskip{\sideheadbelowskip}}
+
+%~ This command produces extra vertical space so that the base-to-base space
+%~ between the preceding and following rows is as specified.
+
+\def \tabbbskip #1{% {amount} %^tabular
+ \ztabbbskip{#1,-,\dp\zrowstrut,-,\ht\zrowstrut}%
+ \the\ztabspacerow\cr}
+
+%~ This command produces extra vertical space between a row and a rule.
+%~ It must be used instead of |\tabbbskip| to obtain the desired results when
+%~ spacing above horizontal rules. See also |\tabbbskipbelowrule|.
+
+\def \tabbbskipaboverule #1{% {amount} %^tabular
+ \noalign{\nobreak}%
+ \ztabbbskip{#1,-,\dp\zrowstrut,-,\tabruleheight}%
+ \noalign{\if \zcolrulesenabled \zsuppresscolrules \fi}%
+ \the\ztabspacerow \if \zcolrulesenabled \zallowcolrules \fi\cr
+ \noalign{\nobreak}}
+
+%~ This command produces extra vertical space between a rule and a row.
+%~ It must be used instead of |\tabbbskip| to obtain the desired results when
+%~ spacing below horizontal rules. See also |\tabbbskipaboverule|.
+
+\def \tabbbskipbelowrule #1{% {amount} %^tabular
+ \ztabbbskip{#1,-,\ht\zrowstrut}%
+ \the\ztabspacerow\cr}
+
+%~ This command produces the specified amount of extra vertical space
+%~ between two rows of the table.
+
+\def \tabvspace #1{% {amount} %^tabular
+ \noalign{%
+ \zsetrowclass{\zrcvspace}%
+ \zsetvspacebox{#1}}%
+ \the\ztabspacerow\cr}
+
+\def \ztabbbskip #1{%
+ \noalign{%
+ \zsetrowclass{\zrcbbskip}%
+ \if \eqlp{\zprevrowclass}{\zrcbbskip}%
+ \tdimena = 0pt\relax
+ \else
+ \calculate \tdimena = {#1}%
+ \fi
+ \zsetvspacebox{\tdimena}}}
+
+\definebox{\ztabvspacebox}
+\setbox \ztabvspacebox = \hbox{}%
+
+\def \zsetvspacebox #1{%
+ \if \dimnegp{#1}%
+ \vskip #1\relax
+ \dp\ztabvspacebox = 0pt
+ \else
+ \dp\ztabvspacebox = #1\relax
+ \fi}
+
+\def \zchkbelowhead {%
+ \noalign{%
+ \if \neqlp{\zprevrowclass}{\zrchead}%
+ \warning{needheads}{The previous row should be a row of column heads}%
+ \fi}}
+
+% Horizontal Rules
+% ---------- -----
+
+
+%~ This command produces a custom version of the partial table rule
+%~ (|\partialtabrule|). The color and thickness of the rules is specified
+%~ explicitly.
+
+\def \custompartialtabrule #1#2#3{% {color}{thickness}{columns} %^tabular
+ \multispan{#3}%
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor}
+
+%~ This command produces a custom version of the table spanner rule
+%~ (|\spannerrule|). The color and thickness of the rules is specified
+%~ explicitly.
+
+\def \customspannerrule #1#2#3{% {color}{thickness}{columns} %^tabular
+ \multispan{#3}%
+ \rowstrut
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor}
+
+%~ This command produces a custom version of the table rule
+%~ (|\tabrule|). The color and thickness of the rules is specified
+%~ explicitly.
+
+\def \customtabrule #1#2{% {color}{thickness} %^tabular
+ \multispan{\tabcolcount}%
+ \color{#1}%
+ \ruleleaders{\hrule height #2 depth 0pt}%
+ \endcolor\cr}
+
+%~ This command produces a table rule across the specified number of columns.
+%~ It is similar to |\spannerrule| but sets a rule of the same thickness
+%~ as |\tabrule|.
+
+\def \partialtabrule #1{% {columns} %^tabular
+ \custompartialtabrule{\the\tabrulecolor}{\tabruleheight}{#1}}
+
+%~ This command produces a spanner rule across the specified number of columns.
+%~ The color and thickness of the rule are determined by the design. A row with
+%~ spanner rules is usually preceded and followed by |\skipabovespannerrule| and
+%~ |\skipbelowspannerrule|.
+
+\def \spannerrule #1{% {columns} %^tabular
+ \customspannerrule{\the\spannerrulecolor}{\spannerruleheight}{#1}}
+
+%~ This command produces the standard bottom rule in a table. Which rules are
+%~ required is specified in the |\style| parameter of the |\tabular| design.
+%~ This command is not followed by |\cr|.
+
+\def \tabbottomrule {% %^tabular
+ \tabbbskipaboverule{\tabbottomruleaboveskip}%
+ \tabrule}
+
+%~ This command produces the standard head rule in a table. Which rules are
+%~ required is specified in the |\style| parameter of the |\tabular| design.
+%~ This command is not followed by |\cr|.
+
+\def \tabheadrule {% %^tabular
+ \zchkbelowhead
+ \tabbbskipaboverule{\colheadbelowskip}%
+ \tabrule
+ \tabbbskipbelowrule{\tabheadrulebelowskip}}
+
+%~ This command produces a table rule across the entire width of the table. The
+%~ color and thickness of the rule are determined by the design. This command
+%~ is not followed by |\cr|.
+
+\def \tabrule {% %^tabular
+ \customtabrule{\the\tabrulecolor}{\tabruleheight}}
+
+%~ This command produces the standard top rule in a table. Which rules are
+%~ required is specified in the |\style| parameter of the |\tabular| design.
+%~ This command is not followed by |\cr|.
+
+\def \tabtoprule {% %^tabular
+ \tabrule
+ \noalign{\nobreak}%
+ \tabbbskipbelowrule{\tabtoprulebelowskip}}
+
+% Vertical Rules
+% -------- -----
+
+
+%~ This command is used in the normally empty cell corresponding to a vertical
+%~ rule column. It adjusts the width, height, and/or depth of the rule in that
+%~ cell. To adjust one of those dimensions, specify the new dimension in
+%~ points, without the usual |pt|, in the appropriate argument position.
+%~ Omitted dimensions will have their standard values. You must specify both
+%~ commas and the semicolon. Shorthand: |@A*width*,*height*,*depth*;|
+
+\def \adjustcolrule #1,#2,#3;{% width,height,depth; %^tabular
+ \if \notp{\emptyargp{#1}}width #1pt\fi
+ \if \notp{\emptyargp{#2}}height #2pt\fi
+ \if \notp{\emptyargp{#3}}depth #3pt\fi\relax}
+
+%~ This command can be used between rows of a table to allow all vertical
+%~ rules. This is typically done after the column head portion of a table. If
+%~ |\allowcolrules| appears just before |\tabheadrule|, it is deferred until
+%~ after the vertical space above the horizontal rule, so that the vertical
+%~ rules recommence precisely at the horizontal rule. See also
+%~ |\suppresscolrules|.
+
+\def \allowcolrules {% %^tabular
+ \noalign{%
+ \zallowcolrules
+ \global\setflag \zcolrulesenabled = \true}}
+
+\def \zallowcolrules {%
+ \gdef \zcolrulegate {}}
+
+%~ This command can be used between rows of a table to suppress all vertical
+%~ rules. This is typically done for the column head portion of a table.
+%~ See also |\allowcolrules|.
+
+\def \suppresscolrules {% %^tabular
+ \noalign{\zsuppresscolrules}}
+
+\def \zsuppresscolrules {%
+ \gdef \zcolrulegate {\nocolrule}}
+
+%~ This command is used in the normally empty cell corresponding to a vertical
+%~ rule column. It suppresses the vertical rule in that cell. Shorthand: |@N|.
+
+\def \nocolrule {% %^tabular
+ width 0pt }
+
+% Inter-Row Facilities
+% --------- ----------
+
+
+%~ This command can be used between rows of a table to insert vertical material
+%~ that is independent of the rows themselves. It is rarely needed.
+
+\def \adjusttabular #1{% {commands} %^tabular
+ \noalign{#1}}
+
+\let \adjusttab = \adjusttabular
+
+% Low-Level Alignment Facilities
+% --------- --------- ----------
+
+
+\let \completerow = \cr
+
+\def \ialign {\everycr = {}\tabskip=0pt \halign}
+
+\def \oalign #1{% {row...}
+ \ensurepar
+ \vtop{\baselineskip = 0pt
+ \lineskip = .25ex
+ \ialign{##\cr #1\crcr}}}
+
+\def \ooalign {%
+ \lineskiplimit = -\maxdimen
+ \oalign}
+
+\def \ozalign {%
+ \lineskiplimit = 0pt\relax
+ \oalign}
diff --git a/macros/plain/contrib/zztex/tex/zztag.tex b/macros/plain/contrib/zztex/tex/zztag.tex
new file mode 100644
index 0000000000..32154dd8c4
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztag.tex
@@ -0,0 +1,269 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Tag Facilities
+%
+% Synopsis: This module contains the definitions necessary to implement
+% tags and references to them.
+%
+% Note: Tag names beginning with `zX:' are reserved for ZzTeX:
+%
+% zA: design alternative choices (obsolete)
+% zB: bibliographic tags
+% zE: frame page numbers
+% zF: float page numbers
+% zH: help text
+% zM: margin note page numbers
+% zP: proof note page numbers
+% zR: margin rule page numbers
+% zS: snapshot information
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 19 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Tag Definition
+% --- ----------
+
+
+\definetoks{\taginfonumber}
+\taginfonumber = {???}
+\definetoks{\taginfotitle}
+\taginfotitle = {???}
+\definecount{\zmistags}{0}
+
+
+% The number is fully expanded, while the title is not expanded.
+% Then we make sure they are never expanded again.
+
+\def \settaginfo #1#2{% {number}{title}
+ \edef \znext {\taginfonumber = {#1}}%
+ \znext
+ \taginfotitle = {#2}}
+
+\def \tag #1{% {name}
+ \if \emptytoksp{\taginfonumber}%
+ \warning{notaginfo}{ZzTeX reference: Misplaced tag '#1'}%
+ \global\increment \zmistags
+ \fi
+ \zbeginhidewrite
+ \edef \znext {\noexpand\xref{tag}{\noexpand\folio}%
+ {\the\taginfonumber}%
+ {\the\taginfotitle}
+ {#1}}%
+ \znext
+ \if \PDFhyperlinks \PDFmark{T:#1}\fi
+ \zendhidewrite}
+
+\def \tagwith #1#2{% {name}{reference-text}
+ \zbeginhidewrite
+ \edef \znext {\noexpand\xref{tag}{\noexpand\folio}%
+ {#2}%
+ {???notitle???}
+ {#1}}%
+ \znext
+ \if \PDFhyperlinks \PDFmark{T:#1}\fi
+ \zendhidewrite}
+
+% This is a special command when you just want to know the page number.
+
+\def \tagpageonly #1{% {name}
+ \zbeginhidewrite
+ \edef \znext {\noexpand\xref{tag}{\noexpand\folio}%
+ {???nonumber???}%
+ {???notitle???}
+ {#1}}%
+ \znext
+ \if \PDFhyperlinks \PDFmark{T:#1}\fi
+ \zendhidewrite}
+
+\def \uniquetag #1#2{% {prefix}{counter}
+ #1:\the\divisionname-#2}
+
+% Subtag Definition
+% ------ ----------
+
+
+\definecount{\subtagnumber}{0}
+
+
+\def \setsubtagnumber #1{% {integer}
+ \subtagnumber = #1\relax}
+
+\def \subtag #1#2{% {name}{subnumber}
+ \zparsesubnumber #2???\zmark
+ \tagwith{#1}{\zsubtagtext}}
+
+\def \zparsesubnumber #1?#2?#3?#4\zmark{%
+ \if \emptyargp{#2}%
+ \edef \zsubtagtext {\the\taginfonumber #1}%
+ \else
+ \increment \subtagnumber
+ \edef \zsubtagtext {\the\taginfonumber #1#2\subtagnumber#3}%
+ \fi}
+
+% Tag Reference
+% --- ---------
+
+
+% This counter keeps track of the number of undefined tag references.
+
+\definecount{\zuntagrefs}{0}
+
+
+\def \refnumber #1{% {tag-name}
+ \zbeginrefhilight
+ \if \definedp{\=#1}%
+ \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark1}%
+ \else
+ \zuntag{#1}{???}%
+ \fi
+ \zendrefhilight}
+
+\let \ref = \refnumber % Because it's so common.
+
+\def \refpage #1{% {tag-name}
+ \zbeginrefhilight
+ \if \definedp{\=#1}%
+ \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark0}%
+ \else
+ \zuntag{#1}{???}%
+ \fi
+ \zendrefhilight}
+
+\def \reftitle #1{% {tag-name}
+ \zbeginrefhilight
+ \if \notp{\allowreftitle}%
+ \warning{noreftitle}{Use of \string\reftitle is not allowed}%
+ ???not allowed???%
+ \else \if \definedp{\=#1}%
+ {\zadjtitle = \zadjtitlenone
+ \zreftext{#1}{\expandafterthrice\ztagdata \name{\=#1}\zmark2}}%
+ \else
+ \zuntag{#1}{???title???}%
+ \fi\fi
+ \zendrefhilight}
+
+\def \zbeginrefhilight {%
+ \if \DVIWindoinuse
+ \colorspecial{ifview color push rgb 1 0 .25}% % Color the reference.
+ \fi}
+
+\def \zendrefhilight {%
+ \if \DVIWindoinuse
+ \colorspecial{ifview color pop}% % Done with color.
+ \fi}
+
+\def \zreftext #1#2{% {tag}{text}
+ \if \PDFhyperlinks
+ \tagbutton{#1}{#2}%
+ \else
+ #2%
+ \fi}
+
+\def \ztagdata #1\zmark#2\zmark#3\zmark#4{%
+ \ifcase #4 #1\or #2\or #3\fi} % Space after #4 is critical!
+
+\def \zuntag #1#2{% {tag}{what-to-set}
+ \writelog{ZzTeX reference: Undefined tag `#1'.}%
+ \zxwriteinfo{\false}{undef-tag}{#1}{}%
+ \global\increment \zuntagrefs
+ #2}
+
+% Determining the Page
+% ----------- --- ----
+
+
+% This command allows us to use the tag facility to determine which page
+% a particular element is on, in case the design of the element depends
+% on whether it is on a recto or verso.
+
+\def \whichpage #1#2{% {\count-reg}{tag-name}
+ \def \zreg {#1}%
+ \if \definedp{\=#2}%
+ \edef \zpg {\expandafterthrice\ztagdata \name{\=#2}\zmark0}%
+ \expandafter\zwhichpagea \zpg--\zmark
+ \else
+ \zuntag{#2}{\relax}%
+ #1=\pagenumber
+ \fi\relax}
+
+\def \zwhichpagea #1-#2-#3\zmark{%
+ \if \emptyargp{#2}%
+ \zwhichpageb #1\zmark
+ \else
+ \zwhichpageb #2\zmark
+ \fi}
+
+\def \zwhichpageb #1\zmark{%
+ \setbox \zboxa=\hbox{\zreg=0#1}%
+ \if \dimzerop{\wd\zboxa}%
+ \zreg=#1%
+ \else
+ \zreg=\pagenumber
+ \fi}
+
+% Tag Cross-Reference
+% --- ---------------
+
+
+% These counters keep track of the number of duplicate tags, and the
+% number of tags that have changed since the previous run.
+
+\definecount{\zduptags}{0}
+\definecount{\zchangedtags}{0}
+
+
+% Define the macro \=tag to contain the page, number, and title.
+% However, use of the title is controlled by \allowreftitle.
+
+\def \xreftag #1#2#3#4{% {page}{number}{title}{tag}
+ \ifnum \xrefmode=\xrefloadtagmode
+ \if \definedp{\=#4}\zduptag{#4}\fi
+ \xreftagdef{#1}{#2}{#3}{\=#4}%
+ \else\ifnum \xrefmode=\xrefcopymode
+ \xreftagchk{#1}{#2}{#3}{\=#4}%
+ \fi\fi}
+
+\def \xreftagdef #1#2#3#4{% {page}{number}{title}{\name}
+ \if \allowreftitle
+ \withname\gdef{#4}{#1\zmark#2\zmark#3}%
+ \else
+ \withname\gdef{#4}{#1\zmark#2\zmark}%
+ \fi}
+
+\def \xreftagchk #1#2#3#4{% {page}{number}{title}{\name}
+ \xreftagdef{#1}{#2}{#3}{\zxrefchk}%
+ \expandaftertwice\ifx \name{#4}\zxrefchk
+ \else
+ \global\increment \zchangedtags
+ \fi}
+
+\def \zduptag #1{% {tag}
+ \writelog{ZzTeX reference: Duplicate tag `#1'.}%
+ \global\increment \zduptags}
+
+% Tag Cross-Reference Summary
+% --- --------------- -------
+
+
+\def \ztagsummary {%
+ \if \posp{\zuntagrefs}%
+ \remark{Number of undefined tags in this run: \number\zuntagrefs.}%
+ \fi
+ \if \posp{\zduptags}%
+ \remark{Number of duplicate tags in this run: \number\zduptags._%
+ \space\space\space\space\space\space\space Eliminate duplicates %
+ and reprocess the book twice.}%
+ \fi
+ \if \posp{\zmistags}%
+ \remark{Number of misplaced tags in this run: \number\zmistags.}%
+ \fi
+ \if \posp{\zchangedtags}%
+ \remark{Number of tags changed since previous run: \number\zchangedtags._%
+ \space\space\space\space\space\space\space Reprocess the book %
+ to obtain correct cross-references.}%
+ \fi}
diff --git a/macros/plain/contrib/zztex/tex/zztex.tex b/macros/plain/contrib/zztex/tex/zztex.tex
new file mode 100644
index 0000000000..203affbfac
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztex.tex
@@ -0,0 +1,196 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Main Module
+%
+% Synopsis: This is the main module of ZzTeX. It sets up character
+% categories and loads all the other modules.
+%
+% Note: ZzTeX assumes the use of DVIPSONE, the PostScript DVI program
+% from Y&Y.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 27 March 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% If ZzTeX is already loaded, quit immediately.
+
+\ifx \ZzTeX\zzzundefinedzzz \else \message{... using format}\endinput \fi
+
+% Character Categories
+% --------- ----------
+
+
+% Character INITEX ZzTeX Notes
+%
+% NUL ignored invalid Ignored in Plain TeX.
+% TAB invalid Space in Plain TeX.
+% FORMFEED active: \par
+% RETURN end of line end of line
+% space space space
+% # parameter
+% $ math shift
+% & alignment tab
+% % comment comment
+% @ other active: command
+% letters letter letter
+% \ escape escape
+% ^ superscript
+% _ subscript
+% { begin group
+% } end group
+% ~ active: tie
+% DELETE invalid invalid
+% others other invalid
+
+
+\chardef \catescape = 0 % Escape character (\). %^catcode
+\chardef \catbegin = 1 % Begin group ({). %^catcode
+\chardef \catend = 2 % End group (}). %^catcode
+\chardef \catmath = 3 % Math mode ($). %^catcode
+\chardef \catalign = 4 % Alignment tab (&). %^catcode
+\chardef \catendofline = 5 % End of line. %^catcode
+\chardef \catparameter = 6 % Parameter (#). %^catcode
+\chardef \catsuperscript = 7 % Superscript (^). %^catcode
+\chardef \catsubscript = 8 % Subscript (_). %^catcode
+\chardef \catignored = 9 % Ignored character. %^catcode
+\chardef \catspace = 10 % Space. %^catcode
+\chardef \catletter = 11 % Letter. %^catcode
+\chardef \catother = 12 % Other. %^catcode
+\chardef \catactive = 13 % Active character (tilde). %^catcode
+\chardef \catcomment = 14 % Comment (percent). %^catcode
+\chardef \catinvalid = 15 % Invalid character. %^catcode
+\chardef \catcsname = 16
+
+\catcode`\^ = \catsuperscript
+\catcode`\^^@ = \catinvalid
+\catcode`\^^I = \catinvalid
+\catcode`\^^L = \catactive
+\catcode`\^^M = \catendofline
+\catcode`\ = \catspace
+\catcode`\# = \catparameter
+\catcode`\$ = \catmath
+\catcode`\& = \catalign
+\catcode`\% = \catcomment
+\catcode`\@ = \catactive
+\catcode`\\ = \catescape
+\catcode`\_ = \catsubscript
+\catcode`\{ = \catbegin
+\catcode`\} = \catend
+\catcode`\~ = \catactive
+\catcode`\^^? = \catinvalid
+
+% Characters "80--"FF are catcoded as invalid in zzmisc.
+
+\outer \def ^^L{\par}
+
+% Atsign Commands
+% ------ --------
+
+
+% At-sign commands are reserved for extended commands within blocks.
+% \defineatsigncommand makes a local definition!
+
+
+\def \defineatsigncommand @#1{% char args {body}
+ \withname\def{\zat#1}}
+
+\def @#1{% char
+ %%%\relax % Stops \omit search in an alignment cell.
+ \if \undefinedp{\zat#1}%
+ \error{undefat}{The atsign command `\string@#1' is not defined
+ in this block}%
+ \fi
+ \name{\zat#1}}
+
+% Markers
+% -------
+
+
+% This command does nothing, but it provides a name on which to
+% hang a comment for ZzExplore.
+
+\def \definemarker #1{% {marker-name}
+ }
+
+% Paragraph Programs
+% --------- --------
+
+
+% We maintain a list of little programs that must be executed
+% at the beginning of every paragraph. A program is declared
+% with `\declareeverypar'. The programs are executed with
+% `\requiredeverypar'.
+
+\def \everyparlist {}
+
+\def \declareeverypar #1{% {code}
+ \append{#1}{\everyparlist}}
+
+\def \requiredeverypar {%
+ \maplist{##1}{\everyparlist}}
+
+% Modules
+% -------
+
+
+\def \zremovePlaindef #1{%
+ \let #1= \relax}
+
+\input zzprog % Must be first.
+\input zzreg % Must be second.
+\input zzerror
+\input zzhelp
+\input zzio
+\input zzfont
+\input zzvmode
+\input zzhmode
+\input zzhmodeb
+\input zzhyph
+\input zzltrspc
+\input zzblock
+\input zzxref
+\input zzdoc
+\input zzdiv
+\input zzpage
+\input zzoverlay
+\input zzindexv1 % Must precede body files.
+\input zzsect
+\input zztext
+\input zztabbing
+\input zznote
+\input zzlist
+\input zztabularv3
+\input zzfloat
+\input zzart
+\input zztag
+\input zzmath
+\input zzfront
+\input zzps
+\input zzhyper
+\input zzmisc % Must be next to last.
+\input zzplain % Must be last.
+
+% Identification
+% --------------
+
+
+\def \TeX {T\kern-.1667em \lower .55ex \hbox{E}\kern-.1em X}
+\def \ZzTeX {Z\kern -.02em z\kern -.05em \TeX}
+
+\input zzver\relax
+
+\everyjob = {\messagenl{__Welcome to ZzTeX version \ZzTeXversion__}}
+
+\def \fmtname {ZzTeX}
+\edef \fmtversion {\ZzTeXversion}
+
+
+\messagenl{__Welcome to ZzTeX version \ZzTeXversion__}
+
+\if \orp{\hmodep}{\posp{\pagetotal}}
+ \zzerror{Spurious paragraph text appears in the ZzTeX files}%
+\fi
diff --git a/macros/plain/contrib/zztex/tex/zztext.tex b/macros/plain/contrib/zztex/tex/zztext.tex
new file mode 100644
index 0000000000..8e37133039
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztext.tex
@@ -0,0 +1,935 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX General Text Facilities
+%
+% Synopsis: This module contains definitions for blocks that are used to
+% format text.
+%
+% Notes: The tabbing facility was implemented by Richard A. Wells and
+% integrated into ZzTeX on 8/16/94.
+%
+% Authors: Paul C. Anagnostopoulos and Richard A. Wells
+% Created: 14 March 1990
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Text Block
+% ---- -----
+
+
+\defineblock{\text}{\endtext}{\false}{}
+\resetinvcontext{\text}
+
+%~block text Type, Level
+% \abovepenalty = integer % Penalty above text.
+% \aboveskip = glue % Space b/b above text.
+% \def \beginformat {...} % Beginning of text formatter.
+% \belowpenalty = integer % Penalty below text.
+% \belowskip = glue % Space b/b below text.
+% \bodyfont = {font} % Body font.
+% \def \calloutformat ##1{...} % Callout formatter.
+% \calloutnumber = integer % Number of first callout.
+% \def \callouttext {...} % Callout text or \arg.
+% \defaulttabwidth = dimen % Default repeating tab width.
+% \setflag \enabletabbing = flag % Enable tabbing commands.
+% \def \endformat {...} % End of text formatter.
+% \leftindent = glue % Left indentation.
+% \parindent = dimen % Paragraph indentation.
+% \parrag = dimen % Paragraph raggedness.
+% \parskip = glue % Paragraph skip.
+% \rightindent = glue % Right indentation.
+% \textcolor = {...} % Color of text.
+% \setflag \verbatimlines = flag % Treat line breaks verbatim.
+% \width = dimen % Line width.
+%~end
+
+\definecount{\calloutnumber}{0}
+\setflag \enabletabbing = \false
+\definedimen{\defaulttabwidth}{0pt}
+\setflag \verbatimlines = \false
+
+
+\def \text #1{% {type}
+ \beginblockscope{text}%
+ \global\increment \textdepth
+ \abovepenalty = \breakgood %~default hard
+ \def \beginformat {}% %~default soft
+ \belowpenalty = \breakgood %~default hard
+ \calloutnumber = 1 %~default with
+ \def \callouttext {\number\calloutnumber}% %~default soft
+ \defaulttabwidth = \mindimen %~default soft
+ \setflag \enabletabbing = \false %~default soft
+ \def \endformat {}% %~default soft
+ \textcolor = {}% %~default soft
+ \setflag \verbatimlines = \false %~default soft
+ \processdesign{\text}{#1\romannumeral\textdepth}%
+ \global\increment \textnumber
+ \textformat
+ \def \zarg {\arg}%
+ \if \tokeqlp{\callouttext}{\zarg}%
+ \defineatsigncommand @##{\ztextcoformat}%
+ \else
+ \defineatsigncommand @##{\ztextcoformat{\callouttext}}%
+ \fi
+ \if \emptytoksp{\textcolor}%
+ \bgroup
+ \else
+ \color{\the\textcolor}%
+ \fi
+ \if \enabletabbing \ztabinittabbing \fi
+ \if \verbatimlines \obeylines \fi
+ \if \enabletabbing \ztabstarttabbing \fi}
+
+\def \endtext {%
+ % Must really be \par, not \endgraf, because might be redefined
+ % for tabbing.
+ \if \notp{\verbatimlines}%
+ % In \verbatimlines the line preceding \endtext{...} will put
+ % out a final \par, but if not we have to do it here.
+ \par
+ \fi
+ \if \enabletabbing \ztabfinaltabbing \fi
+ \if \emptytoksp{\textcolor}%
+ \egroup
+ \else
+ \endcolor
+ \fi
+ \futurelet\nexttoken \zendtext}
+
+\def \zendtext {%
+ \endtextformat
+ \global\decrement \textdepth
+ \endblockscope{text}%
+ \parnext}
+
+\def \textformat {%
+ \endgraf
+ \the\bodyfont
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{\parrag}%
+ \beginformat}
+
+\def \endtextformat {%
+ \endformat
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}}
+
+\def \ztextcoformat #1{% {text}
+ \calloutformat{#1}%
+ \global\increment \calloutnumber}
+
+% Tabbing Commands
+% ------- --------
+
+% These commands are available in a text block if \enabletabbing is turned on.
+
+
+% \ztabinitalizetabbing
+% - Redefines \par
+% - Defines the @ commands for tabbing. (The real work is done in the
+% in the \ztabcmd* macros, defined below.)
+% - Initializes variables
+
+\def \ztabinittabbing {%
+ % Redefine \par to ship out the tabbed line, \endgraf it and start a
+ % new tabbed line
+ \let \par = \ztabpar
+ % Define tabbing commands
+ \def \adjusttabbing ##1{\ztabadjusttabbing{##1}}%
+ \defineatsigncommand @.{\ztabcmdset}%
+ \defineatsigncommand @>{\ztabcmdforwards}%
+ \defineatsigncommand @+{\ztabcmdindent}%
+ \defineatsigncommand @-{\ztabcmdoutdent}%
+ \defineatsigncommand @D{\ztabcmddiscard}%
+ \defineatsigncommand @C{\ztabcmdclear}%
+ \defineatsigncommand @E##1{\ztabcmdevery{##1}}%
+ % Initialize variables
+ \if \verbatimlines
+ % The line with \text{...} will put out the first \par, so we
+ % want to skip it.
+ \ztabdiscardtrue
+ \else
+ \ztabdiscardfalse
+ \fi
+ \global\ztabindentlevel=0\relax
+ % Clear all tab stops
+ \ztabcmdclear}
+
+\def \ztabparfinishpreviousline {%
+ % Set state checked by \ztabendtabcell
+ \ztabatnltrue
+ % End last tab cell with \ztabnltrue
+ \ztabendtabcell
+ \egroup% closes inner group started below in \ztabmaketabbedline
+ \egroup% closes outer group started below in \ztabmaketabbedline
+ % Unless discarding, deposit the line and remove the last box
+ \if \notp{\ztabdiscardp}%
+ \unvbox\zboxa\lastbox
+ \else
+ % Clear discarding flag
+ \ztabdiscardfalse
+ \fi
+ \endgroup% closes outermost group started by \ztabmaketabbedline
+ % We should be back in vertical mode now.
+ %
+ % Reset \ztabsbox. The new value is the set of tbd boxes
+ % followed by the done boxes. If not all of the tbd boxes were
+ % used this should result in the same set of boxes as the
+ % previous value of \ztabsbox. However, if the tbd boxes were used up
+ % then the done boxes may contain additional boxes built on the fly.
+ \setbox\ztabsbox\hbox{\unhbox\ztabstbdbox\unhbox\ztabsdonebox}}
+
+\def \ztabparstartnextline {%
+ \ztabmaketabbedline}
+
+\def \ztabpar {% macro used instead of \par in tabbing
+ \ztabparfinishpreviousline
+ \endgraf
+ \ztabparstartnextline}
+
+\def \ztabstarttabbing {%
+ \ztabparstartnextline}
+
+\def \ztabfinaltabbing {%
+ % Discard and finish last tabbed line started by last \ztabpar
+ \ztabdiscardtrue
+ \ztabparfinishpreviousline}
+
+
+
+% Variables shared by \ztab* macros
+
+% Counts and dimens for building tab boxes
+\definecount{\ztabindentlevel}{0}
+\definecount{\ztabindentcounter}{0}
+\definedimen{\ztabcolwidth}{0pt}
+\definedimen{\ztabtabpos}{0pt}
+\definedimen{\ztabdimenii}{0pt}
+
+% Conditionals
+% atnlp: are we at a \nl in tab processing?
+\def \ztabatnlfalse {\global\setflag \ztabatnlp=\false}%
+\def \ztabatnltrue {\global\setflag \ztabatnlp=\true}%
+% discardp: are we discarding this line's output?
+\def \ztabdiscardfalse {\global\setflag \ztabdiscardp=\false}%
+\def \ztabdiscardtrue {\global\setflag \ztabdiscardp=\true}%
+% settingp: are we setting?
+\def \ztabsettingfalse {\global\setflag \ztabsettingp=\false}%
+\def \ztabsettingtrue {\global\setflag \ztabsettingp=\true}%
+% tabbingp: are we tabbing?
+\def \ztabtabbingfalse {\global\setflag \ztabtabbingp=\false}%
+\def \ztabtabbingtrue {\global\setflag \ztabtabbingp=\true}%
+
+
+% Boxes to hold the tabs
+\definebox{\ztabsbox}% hbox of hboxes for each tab column
+\definebox{\ztabstbdbox}% hbox of hbox tab columns still "to be done"
+\definebox{\ztabsdonebox}% hbox of hbox tab columns already done
+\definebox{\ztabsindentbox}% hbox of indents
+
+
+% The macros that implement the tabbing commands. \ztabcmd* are the
+% top-level macros called by the @ commands. Other \ztab* macros are
+% helpers.
+
+\def \ztabcmdset {%
+ % Set state checked by \ztabendtabcell
+ \ztabsettingtrue
+ % End the current cell with \ztabsettingtrue
+ \ztabendtabcell
+ % Start the next cell
+ \ztabbegintabcell\noindent\ignorespaces}%
+
+\def \ztabcmdforwards {%
+ % Set state checked by \ztabendtabcell
+ \ztabtabbingtrue
+ % End the current cell with \ztabsettingtrue
+ \ztabendtabcell
+ % Start the next cell
+ \ztabbegintabcell\noindent\ignorespaces}%
+
+\def \ztabcmdindent {\global\increment \ztabindentlevel\relax}%
+
+
+\def \ztabcmdoutdent {%
+ \global\decrement \ztabindentlevel\relax
+ \if \negp{\ztabindentlevel}%
+ \zzerror{Attempt to tab dedent (with \string@-) to left of left margin}%
+ \fi}
+
+\def \ztabcmddiscard {%
+ \ztabdiscardtrue}%
+
+\def \ztabcmdclear {% {boolean: initialization}
+ % First clear all boxes
+ \ztabcleartabboxes
+ % Surprise! Clearing tabs might actually set them, if \defaulttabwidth
+ % has been set in the design
+ \if \neqlp{\defaulttabwidth}{\mindimen}%
+ \ztabcmdevery{\defaulttabwidth}%
+ \else
+ % Must clear indent level since we've cleared all tabs (note that
+ % we intentionally leave indent level alone if there is a
+ % \defaulttabwidth!)
+ \global\ztabindentlevel=0\relax
+ \fi\ignorespaces}%
+
+\def \ztabcmdevery #1{%
+ % First clear all tabs
+ \ztabcleartabboxes
+ % Set new tab columns of the specified width into \ztabsbox
+ \ztabsettabs{#1}%
+ % Re-init the boxes used by \ztabmaketabbedline
+ \ztabinittabboxes{\true}% Flag indicates this is a re-init
+ \ignorespaces}
+
+
+% Implementation of the above commands
+
+
+\def \ztabinittabboxes #1{% Init the tab boxes {boolean: re-init}
+ % First copy \ztabsbox into \ztabstbdbox and clear \ztabsdonebox
+ \global\setbox\ztabstbdbox\copy\ztabsbox
+ \global\setbox\ztabsdonebox\null
+ % Put all of the indent boxes that might be built into an hbox
+ % which we will emit later, but just before processing cells
+ \global\setbox\ztabsindentbox\hbox%
+ \bgroup%
+ % Initialize counter for loop
+ \ztabindentcounter=0\relax
+ % Iterate \ztabindentlevel times, moving tabboxes from \ztabstbdbox to
+ % \ztabsdone, maybe emitting hboxes per indent
+ \if \lssp{\ztabindentcounter}{\ztabindentlevel}%
+ \loop
+ \increment \ztabindentcounter\relax% increment loop counter
+ % Pull \lastbox off of \ztabstbdbox
+ \global\setbox\ztabstbdbox\hbox{%
+ \unhbox\ztabstbdbox
+ \global\setbox\zboxb\lastbox}%
+ \ifvoid\zboxb
+ % This is a problem. Not allowed to indent past set tabs.
+ \zzerror{Attempt to tab indent (with \string@+, [\the\ztabindentlevel]) past set tabs}%
+ \else
+ % Nothing wrong with the box: push it on \ztabsdonebox
+ % and maybe emit it
+ \global\setbox\ztabsdonebox\hbox{\copy\zboxb\unhbox\ztabsdonebox}%
+ \if \notp{#1}% Not re-initializing
+ \box\zboxb
+ \fi
+ \fi
+ % Loop test
+ \if \lssp{\ztabindentcounter}{\ztabindentlevel}\repeat
+ \fi
+ % End hbox
+ \egroup}
+
+\def \ztabcleartabboxes {% Clear the tab boxes and indent level
+ \setbox\ztabsbox\null
+ \global\setbox\ztabstbdbox\null
+ \global\setbox\ztabsdonebox\null}
+
+\def \ztabsettabs #1{% Deposit tab stops of a specified width in \ztabsbox
+ \ztabcolwidth=#1\relax
+ \ztabtabpos=0pt\relax
+ % Loop while \ztabtabpos is less than \hsize, setting another tab
+ \loop
+ \ztabsetanother
+ \if \dimlssp{\ztabtabpos}{\hsize}\repeat}
+
+\def \ztabsetanother {% Helper for \ztabsettabs, immediately preceding
+ % Advance the counter
+ \advance \ztabtabpos by \ztabcolwidth
+ % Set another tab by "pushing" another hbox into the \ztabsbox hbox
+ % followed by its old set of hboxes
+ \setbox\ztabsbox\hbox{\hbox to\ztabcolwidth{}\unhbox\ztabsbox}}
+
+\def \ztabmaketabbedline {% Build a line of tabbed text
+ % Start outermost group that redefines \nl
+ \begingroup
+ % Inittab boxes (this also builds \ztabsindentbox)
+ \ztabinittabboxes{\false}% Flag indicates NOT a re-init
+ % \nl is a synonym for modified \par
+ \let\nl=\par
+ % \zboxa will contain the entire tabbed line in a vbox.
+ % (It is unvboxed in \nl and may be discarded if a @D is encountered.)
+ \setbox\zboxa\vbox%
+ % start outer group closed by \nl that holds state of \ztabatnlp
+ \bgroup%
+ % don't want to indent a tabbed line
+ \noindent
+ % Init conditionals
+ \ztabatnlfalse
+ \ztabsettingfalse
+ \ztabtabbingfalse
+ % start inner group closed by \nl that surrounds set of tabboxes
+ % and uses \zboxc as an hbox for the current cell.
+ \bgroup%
+ % emit indentation box
+ \box\ztabsindentbox
+ % start the first cell
+ \ztabbegintabcell}
+ % material for a cell will follow here and be ended by
+ % either a @ command or \nl, all of which will deposit
+ % \ztabendtabcell. The @ commands will begin another tab cell and
+ % \nl will also finish all of the groups started by
+ % \ztabmaketabbedline and put out the line.
+
+\def \ztabbegintabcell {%
+ % \zboxc contains an hbox as the current cell of tabbed material.
+ % (It is deposited at the end of \ztabendtabcell.)
+ \setbox\zboxc\hbox%
+ \bgroup% opens group closed in \ztabendtabcell
+ \ignorespaces}
+
+\def \ztabendtabcell {%
+ \if \ztabatnlp
+ % Processing last cell in this row. Close group opened in
+ % \ztabbegintabcell w/o bothering to re-set tabboxes.
+ \egroup
+ \else
+ % Close this cell's group (opened in \ztabbegintabcell) with \hss,
+ % since this is not the last cell.
+ \hss\egroup
+ % "Pop" current tabbox from \ztabstbdbox, measure it, deposit tabbed
+ % material into properly sized box and then "push" tabbox onto \ztabsdonebox
+ % "Pop" from the end of \ztabstbdbox using \lastbox into \zboxb
+ \global\setbox\ztabstbdbox\hbox{%
+ \unhbox\ztabstbdbox
+ \global\setbox\zboxb\lastbox}%
+ % Process the current tabbox
+ \ifvoid\zboxb
+ \if \ztabtabbingp
+ \zzerror{Attempt to tab (with \string@>) past set tabs}%
+ \else
+ % The current tabbox is void, so we set it to a box that is the
+ % natural width of \zboxc (which contains the cell material).
+ \global\setbox\zboxb\hbox to\wd\zboxc{}%
+ \fi
+ \else
+ \if \ztabsettingp
+ % Re-set previously stored tabbox to natural width of the cell (\zboxc)
+ \global\setbox\zboxb\hbox to\wd\zboxc{}%
+ \fi
+ % Re-deposit the cell material into \zboxc using the width of the
+ % current tabbox.
+ \setbox\zboxc\hbox to\wd\zboxb{\unhbox\zboxc}%
+ \fi
+ % "Push" the current tabbox measure onto the \ztabsdonebox set of boxes.
+ % (Note that this might have come from \ztabstbdbox or been measured from
+ % \zboxc if there were no more tabboxes, so this is where an "on-the-fly"
+ % tab is added to \ztabsdone, which will later be copied back into
+ % \ztabsbox for the next line.)
+ \global\setbox\ztabsdonebox\hbox{\box\zboxb\unhbox\ztabsdonebox}%
+ \fi
+ % Clear conditional variables
+ \ztabsettingfalse
+ \ztabtabbingfalse
+ % emit box for this cell
+ \box\zboxc}
+
+\def \ztabadjusttabbing #1{% {vertical-mode material}
+ % Close and discard currently open tabbed line (empty, but started
+ % by end of previous line).
+ \ztabcmddiscard
+ \ztabparfinishpreviousline
+ % Insert vertical material
+ #1\relax
+ % If in verbatimlines must set this line to be discarded by
+ % the newline which ends the \adjusttabbing{...} line, which will also
+ % start the next line.
+ \if \verbatimlines
+ \ztabdiscardtrue
+ \fi
+ % Start next tabbed line
+ \ztabparstartnextline}
+
+% Builtin Text Blocks
+% ------- ---- ------
+
+% The following text block formats text in a completely normal fashion.
+% It can be used with \with to make small changes to the text format.
+
+\def \textnormalidesign {%
+ \calculate \aboveskip = {\enclosingbaselineskip,+,\enclosingparskip}%
+ \belowskip = \aboveskip
+ \bodyfont = {}%
+ \leftindent = \enclosingleftss
+ \parindent = \enclosingparindent
+ \parrag = \enclosingparrag
+ \parskip = \enclosingparskip
+ \rightindent = \enclosingrightss
+ \setflag \verbatimlines = \false
+ \width = \naturalwidth}
+
+\def \textnormaliidesign {%
+ \textnormalidesign}
+\def \textnormaliiidesign {%
+ \textnormalidesign}
+\def \textnormalivdesign {%
+ \textnormalidesign}
+
+\def \setflushingleft {%
+ \leftindent = 0pt
+ \parfillskip = \normalparfillskip
+ \parindent = 0pt
+ \rightindent = 0pt
+ \width = \naturalwidth}
+
+
+% This text block centers text relative to the current left and right
+% indentation.
+
+\def \textcenteridesign {%
+ \textnormalidesign
+ \setcentering}
+
+\def \textcenteriidesign {%
+ \textcenteridesign}
+\def \textcenteriiidesign {%
+ \textcenteridesign}
+\def \textcenterivdesign {%
+ \textcenteridesign}
+
+\def \setcentering {%
+ \leftindent = \centerindent
+ \parfillskip = 0pt
+ \parindent = 0pt
+ \rightindent = \centerindent
+ \width = \naturalwidth}
+
+
+% This text block positions text flush right.
+
+\def \textflushrightidesign {%
+ \textnormalidesign
+ \setflushingright}
+
+\def \textflushrightiidesign {%
+ \textflushrightidesign}
+\def \textflushrightiiidesign {%
+ \textflushrightidesign}
+\def \textflushrightivdesign {%
+ \textflushrightidesign}
+
+\def \setflushingright {%
+ \leftindent = \centerindent
+ \parfillskip = 0pt
+ \parindent = 0pt
+ \rightindent = 0pt
+ \width = \naturalwidth}
+
+% This text block squares off the last line of paragraphs.
+
+\def \textflushendidesign {%
+ \textnormalidesign
+ \parfillskip = 0pt}
+
+\def \textflushendiidesign {%
+ \textflushendidesign}
+\def \textflushendiiidesign {%
+ \textflushendidesign}
+\def \textflushendivdesign {%
+ \textflushendidesign}
+
+\def \flushendpar {%
+ \zskipa = \parfillskip
+ \parfillskip = 0pt
+ \par
+ \parfillskip = \zskipa}
+
+% This text block sets text in the full type width.
+
+\def \texttypeareaidesign {%
+ \textnormalidesign
+ \leftindent = -\oddlefttextmargin
+ \width = \typeareawidth}
+
+\def \texttypeareaiidesign {%
+ \texttypeareaidesign}
+
+% This command centers a single line or sets multiple lines in block format.
+
+\def \centerorblockpar #1#2{% {width}{text}
+ \measuretextwidth{\tdimena}{#2}%
+ \if \dimlssp{\tdimena}{#1}%
+ \centerline{#2}%
+ \else
+ \noindent #2\par
+ \fi}
+
+% Code Block
+% ---- -----
+
+
+\defineblock{\code}{\endcode}{\false}{}
+
+%~block code Type
+% \abovepenalty = integer % Penalty above code.
+% \aboveskip = glue % Space b/b above code.
+% \setflag \allowbreaks = boolean % Page breaks allowed?
+% \setflag \allowatsigncommands = boolean % Allow at-sign commands.
+% \setflag \allowcallouttag = boolean % Allow \tag for callout numbers.
+% \setflag \allowTeXcommands = boolean % Allow commands with \ { }
+% \setflag \allowTeXmath = boolean % Allow math with $ _ ^
+% \setflag \autocallout = boolean % Automatically number lines?
+% \def \beginformat {...} % Beginning of code formatter.
+% \belowpenalty = integer % Penalty below code.
+% \belowskip = glue % Space b/b below code.
+% \bodyfont = {...} % Font for text.
+% \def \calloutformat ##1{...} % Callout formatter.
+% \calloutnumber = integer % Number of first callout.
+% \def \callouttext {...} % Callout text or \arg.
+% \codegapskip = glue % Standard code gap (see \codegap).
+% \def \endformat {...} % End of code formatter.
+% \hfuzz = dimen % Amount text can exceed \hsize.
+% \indentcolumns = integer % Standard indentation amount.
+% \leftindent = glue % Left indentation.
+% \metafont = {font} % Font for metasyntactic names.
+% \rightindent = glue % Right indentation.
+% \textcolor = {...} % Color of text.
+% \setflag \verbatimchars = flag % Take all characters verbatim?
+% \setflag \verbatimspaces = flag % Take all spaces verbatim?
+% \width = dimen % Width of code.
+%~end
+
+\defineskip{\codegapskip}{0pt}
+\definecount{\indentcolumns}{0}
+\definetoks{\metafont}
+
+\definecount{\codelinenumber}{0}
+
+\definecount{\zcodehyph}{0} % To remember hyphen character.
+
+\def \code #1{% {type}
+ \blockcantbein{\code}{\code}%
+ \beginblockscope{code}%
+ \global\increment \codedepth
+ \abovepenalty = \breakgood %~default hard
+ \setflag \allowatsigncommands = \false %~default soft
+ \setflag \allowcallouttag = \false %~default soft
+ \setflag \allowTeXcommands = \true %~default soft
+ \setflag \allowTeXmath = \false %~default soft
+ \setflag \autocallout = \false %~default soft
+ \def \beginformat {}% %~default soft
+ \belowpenalty = \breakbetter %~default hard
+ \calloutnumber = 1 %~default with
+ \def \callouttext {\number\calloutnumber}% %~default soft
+ \codegapskip = \mindimen %~default soft
+ \def \endformat {}% %~default soft
+ \indentcolumns = 3 %~default soft
+ \textcolor = {}% %~default soft
+ \setflag \verbatimchars = \true %~default soft
+ \setflag \verbatimspaces = \true %~default soft
+ \codelinenumber = 1\relax
+ \processdesign{\code}{#1}%
+ \global\increment \codenumber
+ \codeformat
+ \let \par = \zcodepar
+ \obeylines
+ \if \verbatimspaces \obeyspaces \fi
+ \let \zrealincl = \include
+ \let \include = \zcodeincl
+ \let \zrealfn = \footnote
+ \let \footnote = \zcodefn
+ \def \zarg {\arg}%
+ \if \tokeqlp{\callouttext}{\zarg}%
+ \def \!{\zcodecoformat}%
+ \else
+ \def \!{\zcodecoformat{\callouttext}}%
+ \fi
+ \settaginfo{}{}% % No tag information so far.
+ \if \notp{\emptytoksp{\textcolor}}\color{\the\textcolor}\fi
+ \begingroup % So we can undo the following things.
+ \if \autocallout \everyparagraph = {\!}\fi
+ \if \verbatimchars
+ \uncatcode{\allowTeXcommands}{\allowatsigncommands}{\allowTeXmath}
+ \fi
+ \zcodeflushline}
+
+{\catcode`\^^M = \catactive
+\gdef \zcodeflushline #1^^M{}%
+
+\gdef \endcode^^M{%
+%%% \columnbreak{\breakallowed}% % Allow break after last line.
+ \endgroup % Undo the \uncatcode,
+ \if \notp{\emptytoksp{\textcolor}}\endcolor \fi%
+ \futurelet\nexttoken \zendcode}% % and grab onto the next character.
+} % \catcode
+
+\def \zendcode {%
+ \hyphenchar\font = \zcodehyph
+ \setlist \zcodeadjlist = {}%
+ \endformat
+ \forcenextpenalty
+ \bbskipbelowblockpar{\nexttoken}{\belowpenalty}{\belowskip}%
+ \global\decrement \codedepth
+ \endblockscope{code}%
+ \parnext}
+
+\def \codeformat {%
+ \endgraf
+ \alterindentation{\leftindent}{\rightindent}%
+ \settextwidth{\width}%
+ \setparrag{0pt}%
+ \the\bodyfont
+ \zcodehyph = \hyphenchar\font
+ \hyphenchar\font = -1
+ \parskip = 0pt \parindent = 0pt
+ \bbskipabove{\abovepenalty}{\aboveskip}
+ \beginformat}
+
+\def \zcodepar {%
+ \increment \codelinenumber
+ \if \hmodep
+ \endgraf
+ \if \notp{\allowbreaks}\nobreak \relax \fi
+ \zchkcodeadj
+ \else
+ \if \notp{\allowbreaks}\nobreak \relax \fi
+ \zchkcodeadj
+ \vskip \baselineskip
+ \fi}
+
+% This macro allows the compositor to noninvasively adjust pages between
+% lines of code.
+
+\setlist \zcodeadjlist = {}
+
+\long\def \codeadjustment #1#2{% {line-number}{commands}
+ \append{{#1}{#2}}{\zcodeadjlist}}
+
+\long\def \zchkcodeadj {%
+ \maplist{\zchkcodeadjb##1}{\zcodeadjlist}}
+
+\long\def \zchkcodeadjb #1#2{% {line-number}{commands}
+ \if \eqlp{#1}{\codelinenumber}%
+ #2\relax
+ \fi}
+
+\def \zcodecoformat #1{% {text}
+ \ensurepar
+ {\ztoksa = {}%
+ \zcodecocln #1\zmark
+ \calloutformat{\the\ztoksa}}%
+ \if \allowcallouttag \settaginfo{#1}{???}\fi
+ \global\increment \calloutnumber}
+
+\def \zcodecocln #1#2\zmark{%
+ \ifx #1\ \else \ztoksa = \expandafter{\the\ztoksa#1}\fi
+ \if \notp{\emptyargp{#2}}\zcodecocln #2\zmark \fi}
+
+% Code Tools
+% ---- -----
+
+
+%~ This command is used to place a math expression in a
+%~ code block that doesn't allow dollar signs.
+
+\def \codemath {% $math$ %^code
+ $%
+ \catcodemath
+ \let \znext = } % Discard opening $.
+
+%~ This command produces a vertical ellipsis in code,
+%~ with optional text explaining the omission.
+
+\def \codeellipsis #1{% {text} %^code
+ \ensurepar
+ {\lower .85\baselineskip \hbox{%
+ \vbox{\baselineskip = .5\baselineskip \lineskiplimit = 0pt
+ \kern \baselineskip \hbox{.}\hbox{.}\hbox{.}\kern \baselineskip}}%
+ \unbreakable\quad {\the\metafont #1}}}%
+
+{\catcode`\^^M = \catactive
+
+% The \include macro is redefined to use this version, which eats
+% the newline at the end of the line.
+
+\gdef \zcodeincl #1^^M{\zrealincl{#1}}%
+
+% The \footnote macro is redefined so that it turns off \obeylines.
+
+\gdef \zcodefn {%
+ \bgroup%
+ \let ^^M = \space%
+ \zcodefnb}%
+
+\gdef \zcodefnb #1{%
+ \zrealfn{#1}%
+ \egroup}%
+
+%~ This command allows a vertical adjustment between two lines
+%~ of code. A typical use would be
+%~ \adjustcode{\fullpagebreak}
+
+\gdef \adjustcode #1#2^^M{#1}% {command} %^code
+
+%~ Blank lines in code should be produced with this command.
+%~ A regular blank line produces too much space.
+
+\gdef \codegap #1^^M{% %^code
+ \if \dimnegp{\codegapskip}%
+ \vspace{\baselineskip}%
+ \else%
+ \vspace{\codegapskip}%
+ \fi}%
+
+} % \catcode
+
+% Code Fragment
+% ---- --------
+
+
+%~ A "code fragment" is a short sequence of program code in the running text.
+%~ Most books use |\mono|, which is defined in terms of this command.
+
+\def \codefragment #1#2#3#4{% {prefix}{suffix}{font}{text}
+ {#1%
+ \measurespacewidth{\tdimena}%
+ #3%
+ \if \monoencodingp \spaceskip = 1.2\tdimena \fi
+ \relax #4%
+ #2}}
+
+% Multicolumn Block
+% ----------- -----
+
+
+\defineblock{\multicolumn}{\endmulticolumn}{\false}{}
+
+%~block multicolumn Type
+% \abovepenalty = integer % Penalty above block.
+% \aboveskip = glue % Visual space above block.
+% \belowpenalty = integer % Penalty below block.
+% \belowskip = glue % Visual space below block.
+% \brokenpenalty = penalty % For hyphenation at bottom of column.
+% \columngutter = dimen % Width of column gutter.
+% \columnrulecolor = {color} % Color of rule separating columns.
+% \columnrulewidth = dimen % Width of rule.
+% \columns = integer % Number of columns.
+% \setflag \flushbottom = flag % Should bottoms be flush?
+% \leftindent = glue % Indentation for left edge.
+% \margins = {left,right,top,bottom} % Four margins.
+% \parrag = dimen % Paragraph raggedness.
+% \setflag \preservelistdepth = flag % Preserve list depth?
+% \siderulecolor = {color} % Color of rules on sides.
+% \siderulewidth = dimen % Width of rules.
+% \vshift = dimen % Vertical shift for entire element.
+% \width = dimen % Width of each column.
+%~end
+
+\definetoks{\columnrulecolor}
+\definedimen{\columnrulewidth}{0pt}
+\definecount{\columns}{0}
+\definetoks{\margins}
+\definetoks{\siderulecolor}
+\definedimen{\siderulewidth}{0pt}
+
+\definebox{\zmctext}
+\definecount{\zmccolumn}{0}
+\definecount{\zentrylistdepth}{0}
+\definebox{\zmccoli}
+\definebox{\zmccolii}
+\definebox{\zmccoliii}
+\definebox{\zmccoliv}
+\definebox{\zmccolv}
+\definebox{\zmccolvi}
+\definebox{\zmccolvii}
+\definebox{\zmccolviii}
+\definedimen{\zmcmaxht}{0pt}
+\definebox{\zmcbox}
+
+
+\def \multicolumn #1{% {type}
+ \beginblockscope{multicolumn}%
+ \global\increment \multicolumndepth
+ \abovepenalty = \breakgood %~default hard
+ \belowpenalty = \breakgood %~default hard
+ \brokenpenalty = \breaknever %~default soft
+ \setflag \preservelistdepth = \false %~default soft
+ \vshift = 0pt %~default soft
+ \processdesign{\multicolumn}{#1}%
+ \global\increment \multicolumnnumber
+ \expandafter\zmcparse \the\margins\zmark
+ \setbox \zmctext = \vtop\bgroup
+ \zentrylistdepth = \listdepth
+ \zpushvcontext
+ \if \preservelistdepth \global\listdepth = \zentrylistdepth \fi
+ \settextwidth{\width}%
+ \setparrag{\parrag}}
+
+\def \endmulticolumn {%
+ \endgraf
+ \zpopvcontext
+ \egroup % \vtop
+ \zbuildmc
+ \global\decrement \multicolumndepth
+ \endblockscope{multicolumn}}
+
+\def \zbuildmc {%
+ \splitmaxdepth = \dp\strutbox
+ \vbadness = 10000 % Do we want this?
+ \setbox \zmctext = \vbox{%
+ \vskip \splittopskip
+ \vskip -\ht\zmctext
+ \unvbox \zmctext
+ \unskip \unpenalty \unskip}%
+ \zbuildmca
+ \zbuildmcb
+ \bbskipabove{\abovepenalty}{\aboveskip}%
+ \hfuzz=999pc
+ \hindent{\leftindent} \lower \vshift \box\zmcbox \par
+ \prevdepth = 0pt % Nothing better to do.
+ \bbskipbelowblock{\belowpenalty}{\belowskip}}
+
+\def \zbuildmca {%
+ \zmccolumn = \columns
+ \zmcmaxht = 0pt
+ \loop
+ \calculate \tdimena =
+ {\ht\zmctext,-,\splittopskip,/,\zmccolumn,+,\splittopskip}%
+ \setbox \name{\zmccol\romannumeral\zmccolumn} =
+ \if \onep{\zmccolumn}\box\zmctext \else
+ \vsplit \zmctext to \tdimena \fi
+ \tdimena = \ht\name{\zmccol\romannumeral\zmccolumn}%
+ \if \dimgtrp{\tdimena}{\zmcmaxht}\zmcmaxht = \tdimena \fi
+ \decrement \zmccolumn
+ \if \posp{\zmccolumn}\repeat}
+
+\def \zbuildmcb {%
+ \setbox \zmcbox = \hbox{%
+ \vrule width \siderulewidth
+ \hskip -\siderulewidth
+ \hskip \zmcleft
+ \zmccolumn = \columns
+ \loop
+ \tdimena = \dp\name{\zmccol\romannumeral\zmccolumn}%
+ \setbox \zboxa = \vbox to \zmcmaxht {%
+ \unvbox \name{\zmccol\romannumeral\zmccolumn}%
+ \if \notp{\flushbottom}\vfil \fi
+ \vskip -\tdimena
+ \vskip \zmcbottom}%
+ \calculate \tdimena = {\ht\zboxa,-,\splittopskip}%
+ \lower \tdimena \hbox{\box\zboxa}%
+ \if \gtrp{\zmccolumn}{1}%
+ \hskip .5\columngutter
+ \hskip -.5\columnrulewidth
+ \vrule width \columnrulewidth
+ \hskip -.5\columnrulewidth
+ \hskip .5\columngutter
+ \fi
+ \decrement \zmccolumn
+ \if \posp{\zmccolumn}\repeat
+ \hskip \zmcright
+ \hskip -\siderulewidth
+ \vrule width \siderulewidth}}
+
+\def \zmcparse #1,#2,#3,#4\zmark{%
+ \def \zmcleft {#1\relax}%
+ \def \zmcright {#2\relax}%
+ \splittopskip = #3\relax
+ \def \zmcbottom {#4\relax}}
diff --git a/macros/plain/contrib/zztex/tex/zzttladj.tex b/macros/plain/contrib/zztex/tex/zzttladj.tex
new file mode 100644
index 0000000000..d23439bfe3
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzttladj.tex
@@ -0,0 +1,78 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX New Title Adjustment Scheme
+%
+% Synopsis: The new title adjustment scheme is an improvement over the
+% original scheme provided by \adjusttitle.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 9 July 1997
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Title Adjustment Commands
+% ----- ---------- --------
+
+
+%~ This command provides an adjustment to the enclosing title
+%~ when it appears in the body of the book. The argument text
+%~ is included only when the title appears in the body.
+
+\def \adjustbodytitle #1{% {text} %^title_adj
+ \if \eqlp{\zadjtitle}{\zadjtitlebody}#1\fi}
+
+%~ This command provides an adjustment to the enclosing title
+%~ when it appears in a running head or foot. The argument text
+%~ is included only when the title appears in a runner.
+
+\def \adjustmarktitle #1{% {text} %^title_adj
+ \if \eqlp{\zadjtitle}{\zadjtitlemark}#1\fi}
+
+%~ This command provides an adjustment to the enclosing title
+%~ when it appears in the table of contents. The argument text
+%~ is included only when the title appears in the ToC.
+
+\def \adjusttoctitle #1{% {text} %^title_adj
+ \if \eqlp{\zadjtitle}{\zadjtitletoc}#1\fi}
+
+%~ This command provides an adjustment to the enclosing title
+%~ when it appears in a mini-Toc. The argument text
+%~ is included only when the title appears in a mini-ToC.
+
+\def \adjustminitoctitle #1{% {text} %^title_adj
+ \if \eqlp{\zadjtitle}{\zadjtitleminitoc}#1\fi}
+
+\def \adjusttitle {%
+ \error{obsolete}{The \noexpand\adjusttitle command is obsolete}}
+
+% Common Adjustment Commands
+% ------ ---------- --------
+
+
+%~ This command is equivalent to |\adjustbodytitle{\nl}|.
+
+\def \titlenl;{\adjustbodytitle{\nl}} %^title_adj
+
+%~ This command is equivalent to |\adjustbodytitle{\tl}|.
+
+\def \titletl;{\adjustbodytitle{\tl}} %^title_adj
+
+%~ This command is equivalent to |\adjusttoctitle{\nl}|.
+
+\def \tocnl;{\adjusttoctitle{\nl}} %^title_adj
+
+%~ This command is equivalent to |\adjusttoctitle{\tl}|.
+
+\def \toctl;{\adjusttoctitle{\tl}} %^title_adj
+
+%~ This command is equivalent to |\adjustminitoctitle{\nl}|.
+
+\def \minitocnl;{\adjustminitoctitle{\nl}} %^title_adj
+
+%~ This command is equivalent to |\adjustminitoctitle{\tl}|.
+
+\def \minitoctl;{\adjustminitoctitle{\tl}} %^title_adj
+
diff --git a/macros/plain/contrib/zztex/tex/zztures.tex b/macros/plain/contrib/zztex/tex/zztures.tex
new file mode 100644
index 0000000000..60f86eb367
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zztures.tex
@@ -0,0 +1,24 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX TeXtures Interface
+%
+% Synopsis: This module provides replacement definitions for things
+% that are different in TeXtures.
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 17 March 1994
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Unencodable Characters
+% ----------- ----------
+
+
+\def \PSbackslash {$\backslash$}
+\def \PSbar {$\vert$}
+\def \PSbullet {$\bullet$}
+\def \PSdollar {\char "24}
+\def \PSunderscore {\kern .06em \vbox{\hrule width .3em}}
diff --git a/macros/plain/contrib/zztex/tex/zzver.tex b/macros/plain/contrib/zztex/tex/zzver.tex
new file mode 100644
index 0000000000..7b3fd2bfa2
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzver.tex
@@ -0,0 +1 @@
+\def \ZzTeXversion {17.7}
diff --git a/macros/plain/contrib/zztex/tex/zzvmode.tex b/macros/plain/contrib/zztex/tex/zzvmode.tex
new file mode 100644
index 0000000000..a81b33d2bd
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzvmode.tex
@@ -0,0 +1,380 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Vertical Mode Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 21 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Interline Skip
+% --------- ----
+
+
+\def \nointerlineskip {%
+ \prevdepth = -1000pt}
+
+\def \offinterlineskip {%
+ \baselineskip = -1000pt
+ \lineskip = 0pt
+ \lineskiplimit = \maxdimen}
+
+% Vertical Skiping Environment
+% -------- ------- -----------
+
+
+% The following registers make up the vertical skiping environment.
+
+\definecount{\zvskenvtype}{0} % Previous vertical skip type.
+\definecount{\zvskenvpen}{0} % Previous columnbreak penalty.
+\defineskip{\zvskenvreq}{0pt} % Previous required base-to-base skip.
+\defineskip{\zvskenvskip}{0pt} % Previous actual skip amount.
+
+\chardef \zvskenvdiscard = 0 % Just initialized the environment.
+\chardef \zvskenvpar = 1 % Previous element was a paragraph.
+\chardef \zvskenvabove = 2 % Just finished an above skip.
+\chardef \zvskenvbelow = 3 % Just finished a below skip.
+\chardef \zvskenvmath = 4 % Previous element was a paragraph ending
+ % with a math display.
+
+\definecount{\zvskenvnopen}{20000\relax}
+
+\let \noskip = \mindimen
+
+
+% The vertical skiping environment is maintained in the vertical context.
+
+\zdeclareeveryvcontext{\zvskenvvcontext}
+
+\def \zvskenvvcontext {%
+ \zsavevcontext{\zvskenvtype=\the\zvskenvtype
+ \zvskenvpen=\the\zvskenvpen
+ \zvskenvreq=\the\zvskenvreq
+ \zvskenvskip=\the\zvskenvskip}%
+ \zvskpar
+ \global\zvskenvtype = \zvskenvdiscard}
+
+% Base-to-Base Skiping
+% ------------ -------
+
+
+\declareeverypar{\zvskpar}
+
+\def \zvskpar {%
+ \global\zvskenvtype = \zvskenvpar
+ \global\zvskenvpen = \zvskenvnopen
+ \global\zvskenvreq = \parskip \global\advance \zvskenvreq by \baselineskip
+ \global\zvskenvskip = 0pt}
+
+
+%~ This command produces vertical space so that the base-to-base
+%~ distance above the next element is equal to the *glue*. The
+%~ space is preceded by the specified *penalty*. If there is a font
+%~ change for the next element, it must be specified before this command.
+
+\def \bbskipabove #1#2{% {penalty}{glue} %^vspace
+ \if \neqlp{\zvskenvtype}{\zvskenvdiscard}%
+ {\zvskprevmath{\parskip}{\baselineskip}%
+ \zparseglue #2\zmark
+ \setflag \znosk = {\dimeqlp{\zskipa}{\noskip}}%
+ \vpenalty{#1}%
+ \ifcase \zvskenvtype
+ \relax
+ \or
+ \if \znosk \zskipa = \zvskenvreq \fi
+ \or
+ \zskipa = \zvskenvreq
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \fi
+ \if \notp{\dimzerop{\zvskenvskip}}\vskip -\zvskenvskip \fi
+ \zskipb = \zskipa
+ \advance \zskipb by -\parskip
+ \advance \zskipb by -\baselineskip
+ \vskip \zskipb
+ \if \notp{\znosk}%
+ \global\zvskenvtype = \zvskenvabove
+ \global\zvskenvreq = \zskipa
+ \fi
+ \global\zvskenvskip = \zskipb}%
+ \fi}
+
+%~ This command produces vertical space so that the base-to-base
+%~ distance below the current element is equal to the *glue*. The
+%~ space is preceded by the specified *penalty*.
+
+\def \bbskipbelow #1#2{% {penalty}{glue} %^vspace
+ \zvskbelow{#1}{#2}{\parskip}{\baselineskip}}
+
+\def \bbskipbelowblock #1#2{% {penalty}{glue}
+ \zvskbelow{#1}{#2}{\enclosingparskip}{\enclosingbaselineskip}}
+
+% This macro "returns" a value in \parnext:
+% \noindent if next token does not start a new paragraph.
+% empty if next token starts a new paragraph.
+
+\def \bbskipbelowblockpar #1#2#3{% {token}{penalty}{glue}
+ {\setflag \znext = \false % Set \true if token starts new paragraph.
+ \ifcat \noexpand#1\relax \setflag \znext = \true \fi
+ \ifcat \noexpand#1\endgraf \setflag \znext = \true \fi
+ \ifcat \noexpand#1\egroup \setflag \znext = \true \fi
+ \ifcat \noexpand#1&\setflag \znext = \true \fi
+ \ifx #1\noindent \setflag \znext = \false \fi
+ \xdef \parnext {\if \znext \else \noindent \fi}%
+ \zskipa = #3\relax
+ \if \andp{\znext}{\dimneqlp{#3}{\noskip}}%
+ \tdimena = \zskipa
+ \advance \zskipa by -\tdimena
+ \advance \zskipa by \enclosingparskip
+ \advance \zskipa by \enclosingbaselineskip
+ \if \dimlssp{\zskipa}{#3}\zskipa = #3\fi
+ \fi
+ \zvskbelow{#2}{\zskipa}{\enclosingparskip}{\enclosingbaselineskip}}}
+
+\def \zvskbelow #1#2#3#4{% {penalty}{glue}{parskip}{baselineskip}
+ {\zvskprevmath{#3}{#4}%
+ \zparseglue #2\zmark
+ \setflag \znosk = {\dimeqlp{\zskipa}{\noskip}}%
+ \vpenalty{#1}%
+ \ifcase \zvskenvtype
+ \zzerror{Skiping type is discard}%
+ \or
+ \if \znosk \zskipa = #3 \advance \zskipa by #4\fi
+ \or
+ \error{skipab}{A `skip below' follows a `skip above'}%
+ \or
+ \if \znosk \zskipa = \zvskenvreq \fi
+ \or
+ \if \dimlssp{\zskipa}{\zvskenvreq}\zskipa = \zvskenvreq \fi
+ \fi
+ \if \notp{\dimzerop{\zvskenvskip}}\vskip -\zvskenvskip \fi
+ \zskipb = \zskipa
+ \advance \zskipb by -#3%
+ \advance \zskipb by -#4%
+ \vskip \zskipb
+ \if \notp{\znosk}%
+ \if \neqlp{\zvskenvtype}{\zvskenvmath}% % Stay as math type so
+ \global\zvskenvtype = \zvskenvbelow % subsequent below skip
+ \fi % won't override.
+ \global\zvskenvreq = \zskipa
+ \fi
+ \global\zvskenvskip = \zskipb}}
+
+\def \zvskprevmath #1#2{% {parskip}{baselineskip}
+ \if \eqlp{\mathdisplayprevgraf}{\prevgraf}%
+ \global\zvskenvtype = \zvskenvmath
+ \global\zvskenvpen = \mathdisplayprevpenalty
+ \global\zvskenvreq = \mathdisplayprevskip
+ \global\advance \zvskenvreq by #1
+ \global\advance \zvskenvreq by #2
+ \global\zvskenvskip = \mathdisplayprevskip
+ \global\mathdisplayprevgraf = -1\relax
+ \fi}
+
+%~ This command forces the next base-to-base skip command
+%~ regardless of the relationship between the previous element
+%~ and the next one.
+
+\def \forcenextbbskip {% %^vspace
+ \global\zvskenvtype = \zvskenvpar
+ \global\mathdisplayprevgraf = -1\relax}
+
+\definecount{\zvpen}{0}
+
+\def \vpenalty #1{% {penalty}
+ \zvpen = \if \emptyargp{#1}\breaknever \else #1\fi
+ \if \orp{\eqlp{\zvskenvpen}{\zvskenvnopen}}
+ {\eqlp{\zvpen}{\breaknever}}%
+ \columnbreak{\zvpen}%
+ \global\zvskenvpen = \zvpen\relax
+ \else \if \andp{\posp{\zvskenvpen}}{\gtrp{\zvpen}{\zvskenvpen}}%
+ \columnbreak{\zvpen}%
+ \global\zvskenvpen = \zvpen\relax
+ \fi\fi}
+
+\def \forcenextpenalty {%
+ \global\zvskenvpen = \zvskenvnopen}
+
+\def \repeatpenalty {%
+ \if \neqlp{\zvskenvpen}{\zvskenvnopen}%
+ \columnbreak{\zvskenvpen}%
+ \fi}
+
+%~ This command inserts the specified amount of extra vertical space
+%~ between the previous element and the next one.
+
+\def \vspace #1{% {glue} %^vspace
+ \if \neqlp{\zvskenvtype}{\zvskenvdiscard}%
+ \zparseglue #1\zmark
+ \vskip \zskipa
+ \fi}
+
+%~ This command inserts extra vertical space between the previous element
+%~ and the next one. The space is measured in lines; a fractional number
+%~ is allowed.
+
+\def \linespace #1{\vspace{#1\baselineskip}}% {lines} %^vspace
+
+\def \zparseglue #1#2\zmark{% {token}{tokens...}
+ \def \znext {#1}%
+ \def \zskip {\skip}%
+ \if \tokeqlp{\znext}{\zskip}%
+ \setskip \zskipa = #2\relax
+ \else
+ \zskipa = #1#2\relax
+ \fi}
+
+% Top to Text Skipping
+% --- -- ---- --------
+
+
+% These commands use \zskipb so as not to screw up \fakepar.
+
+\def \vsinkfromtypearea #1{% {sinkage}
+ \endgraf
+ \nobreak % So \fakepar can't break.
+ \fakepar % So \bbskipabove won't discard.
+ \vbox{}% % Force start of page if not already.
+ \kern -\pagetotal
+ \kern -\headerheight
+ \bbskipabove{\breaknever}{#1}}
+
+\let \vsink = \vsinkfromtypearea
+
+\def \vsinkfromtrim #1{% {sinkage}
+ \zskipb = #1\relax
+ \advance \zskipb by -\headmargin
+ \vsinkfromtypearea{\zskipb}}
+
+\def \vsinkfromtextarea #1{% {sinkage}
+ \zskipb = #1\relax
+ \advance \zskipb by \headerheight
+ \if \topdeltaadjustment
+ \advance \zskipb by \topdelta
+ \fi
+ \vsinkfromtypearea{\zskipb}}
+
+% Rules
+% -----
+
+
+\def \parrule #1#2{% {shift}{dimensions}
+ \endgraf
+ {\if \notp{\baselinetoprules}\zadjrule{#2}\fi
+ \hfuzz = 100pc
+ \noindent \hspace{#1}\vbox{\hrule height 0pt depth 0pt #2}\endgraf}}
+
+\def \colorparrule #1#2#3{% {color}{shift}{dimensions}
+ \endgraf
+ {\if \notp{\baselinetoprules}\zadjrule{#3}\fi
+ \hfuzz = 100pc
+ \noindent \hspace{#2}%
+ \color{#1}\vbox{\hrule height 0pt depth 0pt #3}\endcolor \endgraf}}
+
+\def \scotchrule #1#2#3{% {shift}{width}{height,gap,...}
+ \endgraf
+ {\hfuzz = 100pc
+ \commalist{\zscotchlist}{#3}%
+ \tcounta = 1\relax
+ \maplist{\zscotchb{#1}{#2}{##1}}{\zscotchlist}}}
+
+\def \zscotchb #1#2#3{% {shift}{width}{dimension}
+ \if \andp{\eqlp{\tcounta}{1}}{\notp{\baselinetoprules}}%
+ \zadjrule{height #3 depth 0pt}%
+ \fi
+ \if \oddp{\tcounta}
+ \noindent \hspace{#1}\vbox{\hrule height #3 depth 0pt width #2}\endgraf
+ \parskip = 0pt
+ \else
+ \nobreak
+ \vspace{#3}%
+ \nointerlineskip
+ \fi
+ \increment \tcounta}
+
+\def \zadjrule #1{% {dimensions}
+ \if \notp{\innermodep}%
+ \fakepar
+ \tdimena = \baselineskip
+ \advance \tdimena by -\prevdepth
+ \setbox \zboxa = \hbox{\vrule #1}%
+ \advance \tdimena by -\ht\zboxa
+ \vskip \tdimena
+ \vskip \topskip
+ \rule{height 0pt depth 0pt width 0pt}%
+ \penalty \breaknever
+ \vskip -\topskip
+ \parskip = 0pt \baselineskip = \ht\zboxa
+ \fi}
+
+% Vertical Alignment
+% -------- ---------
+
+
+\def \bottomout {%
+ \hrule width 0pt height 0pt % Make sure \vskip isn't discarded.
+ \vskip 0pt plus 1filll}
+
+% Counting Lines
+% -------- -----
+
+
+\definecount{\zlinect}{0}
+
+
+\def \countlines #1#2#3#4{% {\count}{width}{font}{text}
+ \setbox\zboxa = \vbox{%
+ \hsize = #2%
+ #3%
+ #4\par}%
+ \global\zlinect = 0
+ \setbox\zboxa = \vbox{\unvbox\zboxa \zscanvbox}%
+ #1=\zlinect}
+
+\def \zscanvbox {%
+ \loop
+ \setflag \zscanagain = \false
+ \setbox\zboxa = \lastbox
+ \if \hboxp{\zboxa}%
+ \global\increment \zlinect
+ \setflag \zscanagain = \true
+ \else\if \notp{\dimzerop{\lastskip}}%
+ \unskip
+ \setflag \zscanagain = \true
+ \else\if \notp{\dimzerop{\lastkern}}%
+ \unkern
+ \setflag \zscanagain = \true
+ \else\if \notp{\zerop{\lastpenalty}}%
+ \unpenalty
+ \setflag \zscanagain = \true
+ \fi\fi\fi\fi
+ \if \zscanagain \repeat}
+
+% Special Boxes
+% ------- -----
+
+
+\definedimen{\zibprevdepth}{0pt}
+
+
+\long\def \interjectbox #1#2{% {right-shift}{content}
+ {\zibprevdepth = \prevdepth
+ \penalty \breaknever
+ \nointerlineskip
+ \moveright #1 \vbox to 0pt{%
+ \zpushvcontext
+ #1\relax
+ \zpopvcontext}%
+ \prevdepth = \zibprevdepth}}
+
+\long\def \smashbox #1{%
+ \vbox to 0pt{%
+ #1\relax
+ \vss}} \ No newline at end of file
diff --git a/macros/plain/contrib/zztex/tex/zzxref.tex b/macros/plain/contrib/zztex/tex/zzxref.tex
new file mode 100644
index 0000000000..a0771f3910
--- /dev/null
+++ b/macros/plain/contrib/zztex/tex/zzxref.tex
@@ -0,0 +1,245 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% Module: ZzTeX Cross-Referencing Facilities
+%
+% Synopsis:
+%
+% Author: Paul C. Anagnostopoulos
+% Created: 19 September 1989
+%
+% Copyright 1989--2020 by Paul C. Anagnostopoulos
+% under The MIT License (opensource.org/licenses/MIT)
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Data Structures
+% ---- ----------
+
+
+\definewrite{\zxrootfile}
+
+\definewrite{\zxdivfile}
+\setflag \zxdivopen = \false
+
+\definewrite{\zxcompfile}
+\setflag \zxcompavail = \false
+
+\chardef \xrefbadmode = 0 % Invalid mode.
+\chardef \xrefrunmode = 1 % Normal running environment.
+\chardef \xrefsnapmode = 2 % Taking a division snapshot.
+\chardef \xrefcopymode = 3 % Copying cross-reference files.
+\chardef \xrefloadmodes = 4 % Beginning of load modes:
+\chardef \xrefloadtagmode = 5 % Load tag definitions.
+\chardef \xrefloadtocmode = 6 % Load table of contents.
+\chardef \xrefloadauxmode = 7 % Create BibTeX auxiliary file.
+\chardef \xrefloadendmode = 8 % Load endnotes.
+\chardef \xrefloadcitemode = 9 % Load citation folios.
+
+\let \xrefmode = \xrefbadmode % Default mode.
+
+% Comment Lines
+% ------- -----
+
+
+{\catcode`\%=\catother
+\gdef \zcomment {%\space}
+} % \catcode
+
+
+\def \zxwritecomment #1#2#3{% {file}{keyword}{values}
+ \immediate\write #1 {\zcomment #2: #3}}
+
+% Initialization
+% --------------
+
+
+\def \zxrefinit {%
+ \zxcompinit
+ \zxopenroot
+ \let \xrefmode = \xrefrunmode}
+
+\def \zxcompinit {%
+ \checkfile{\zxcompavail}{\jobname.zzc}%
+ \if \zxcompavail
+ \zxloadcomp{\xrefloadtagmode}%
+ \else
+ \checkfile{\zxcompavail}{\jobname.zzx}%
+ \if \zxcompavail
+ \zxgencomp
+ \zxloadcomp{\xrefloadtagmode}%
+ \else
+ \remark{There is no cross-reference file available for this run.}%
+ \fi
+ \fi}
+
+\def \zxopenroot {%
+ \immediate\openout \zxrootfile = \jobname.zzx\relax
+ \zxwritecomment{\zxrootfile}{root}{\jobname}}
+
+% Division Handling
+% -------- --------
+
+
+\def \zxdivinit #1#2{% {division-name}{setting-it?}
+ \immediate\write \zxrootfile {\noexpand\zinputzzx{#1}}%
+ \if #2%
+ \immediate\openout \zxdivfile = #1.zzx\relax
+ \global\setflag \zxdivopen = \true
+ \zxwritecomment{\zxdivfile}{division}{#1}%
+ \immediate\write \zxdivfile
+ {\noexpand\xref{div}{}{}{}{\the\divisionname}\zcomment}%
+ \fi}
+
+% There is nothing to do with each entry in the cross-reference file.
+
+\def \xrefdiv #1#2#3#4{}
+
+
+\def \zxdivfinal #1{%
+ \if \zxdivopen
+ \ztakesnap
+ \zxwritecomment{\zxdivfile}{end}{#1}%
+ \immediate\closeout \zxdivfile
+ \global\setflag \zxdivopen = \false
+ \fi}
+
+% Finalization
+% ------------
+
+
+\def \zxreffinal {%
+ \zxwritecomment{\zxrootfile}{end}{\jobname}%
+ \immediate\closeout \zxrootfile
+ \zxgencomp}
+
+% Generate Composite File
+% -------- --------- ----
+
+
+\def \zxgencomp {%
+ \remark{Generating composite cross-reference file:}%
+ \immediate\openout \zxcompfile = \jobname.zzc\relax
+ \zxwriteinfo{\true}{jobname}{\jobname}{}%
+ \zxwriteinfo{\true}{time}{\number\year.\number\month.\number\day}{\formattime}%
+ \zxwriteinfo{\true}{version}{\ZzTeXversion}{}%
+ \zxwriteinfo{\true}{author}{\bookauthor}{}%
+ \zxwriteinfo{\true}{title}{\booktitle}{}%
+ \zxwriteinfo{\true}{publisher}{\bookpublisher}{}%
+ \zxwriteinfo{\true}{ISBN}{\bookISBN}{}%
+ \zxwriteinfo{\true}{art-root}{\zartroot}{}%
+ \zxwriteinfo{\true}{place-art}{\zplaceart}{}%
+ \zxwriteinfo{\true}{PDF-hyperlinks}{\PDFhyperlinks}{}%
+ \zxwriteinfo{\true}{proof}{\the\zproofid}{}%
+ \zxwriteinfo{\true}{compositor}{\ininame}{\iniorganization}%
+ \zxwriteinfo{\true}{trim}{\the\trimwidth}{\the\trimheight}%
+ \zxwriteinfo{\true}{head-margin}{\the\headmargin}{}%
+ \zxwriteinfo{\true}{inner-margin}{\the\eveninnermargin}{\the\oddinnermargin}%
+ \let \zxmodesave = \xrefmode
+ \let \xrefmode = \xrefcopymode
+ \input \jobname.zzx\relax
+ \let \xrefmode = \zxmodesave
+ \zxwritecomment{\zxcompfile}{end}{\jobname}%
+ \immediate\closeout \zxcompfile}
+
+% This macro writes an information entry in the composite cross-reference
+% file.
+
+\def \zxwriteinfo #1#2#3#4{% {composite?}{key}{value1}{value2}
+ \if #1%
+ \immediate\write \zxcompfile {\noexpand\xref{info}{}{#2}{#3}{#4}\zcomment}%
+ \else
+ \zbeginhidewrite
+ \edef \znext {\noexpand\xref{info}{\noexpand\folio}%
+ {#2}%
+ {#3}
+ {#4}}%
+ \znext
+ \zendhidewrite
+ \fi}
+
+%%% \immediate\write #1{\noexpand\xref{info}{#2}{#3}{#4}{\noexpand\folio}\zcomment}}
+
+% There is nothing to do when info entries are executed.
+
+\def \xrefinfo #1#2#3#4{}
+
+% This macro is used in the root cross-reference file to suck in the
+% division cross-reference files.
+
+\def \zinputzzx #1{%
+ \checkfile{\znext}{#1.zzx}%
+ \if \znext \input #1.zzx \fi}
+
+% Load Composite File
+% ---- --------- ----
+
+
+\def \zxloadcomp #1{% {xref-mode}
+ \if \zxcompavail
+ \let \zxmodesave = \xrefmode
+ \let \xrefmode =#1%
+ \input \jobname.zzc\relax
+ \let \xrefmode = \zxmodesave
+ \fi}
+
+\def \zxloadothercomp #1#2{% {file}{xref-mode}
+ \let \zxmodesave = \xrefmode
+ \let \xrefmode = #2%
+ \input #1\relax
+ \let \xrefmode = \zxmodesave}
+
+\def \loadrelatedxref #1{% {file}
+ \zxloadothercomp{#1}{\xrefloadtagmode}}
+
+% Cross-Reference Macro
+% --------------- -----
+
+
+% Here's how the arguments are treated in each of the modes:
+%
+% Mode type page arg3 title arg5
+%
+% load expanded --- passed to appropriate \xrefxxx macro ---
+% copy expanded expanded expanded unexpanded expanded
+% run expanded unexpanded expanded unexpanded expanded
+% snap expanded expanded expanded expanded expanded
+
+% This macro is written for speed.
+
+\long\def \xref #1#2#3#4#5{% {type}{page-number}{arg3}{title}{arg5}
+ \ifnum \xrefmode>\xrefloadmodes
+ \name{\xref#1}{#2}{#3}{#4}{#5}%
+ \else\ifnum \xrefmode=\xrefcopymode
+ {\def \zxtitle {#4}%
+ \immediate\write \zxcompfile {\noexpand\xref{#1}{#2}{#3}%
+ {\expandafter\zdefof \meaning\zxtitle\zmark}{#5}\zcomment}}%
+ \name{\xref#1}{#2}{#3}{#4}{#5}% In case they want to do something.
+ \else\ifnum \xrefmode=\xrefrunmode
+ {\def \zxtitle {#4}%
+ \edef \znext {\noexpand\noexpand\noexpand\xref
+ {#1}{\noexpand#2}{#3}%
+ {\expandafter\zdefof \meaning\zxtitle\zmark}{#5}}%
+ \expandafter\zxwrite\expandafter{\znext\zcomment}}%
+ \if \vmodep \repeatpenalty \fi % In case glue follows write.
+ \else\ifnum \xrefmode=\xrefsnapmode
+ \immediate\zxwrite{\noexpand\xref{#1}{#2}{#3}{#4}{#5}\zcomment}%
+ \else
+ \zxnomode
+ \fi\fi\fi\fi}
+
+\def \zxwrite {%
+ \if \zxdivopen \write \zxdivfile \else \write \zxrootfile \fi}
+
+\def \zxnomode {%
+ \zzerror{No cross-reference mode is set}}
+
+% Page Hints
+% ---- -----
+
+
+\def \pagehint #1{%
+ \xref{hint}{\noexpand\folio}{}{#1}{}}
+
+% There is nothing to do when hint entries are executed.
+
+\def \xrefhint #1#2#3#4{}
diff --git a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
index d510f79e54..584a861f29 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -19,8 +19,8 @@ $mirrors = {
'https://mirrors.bfsu.edu.cn/CTAN/' => 1,
'https://mirrors.cqu.edu.cn/CTAN/' => 1,
'https://mirrors.hit.edu.cn/CTAN/' => 1,
+ 'https://mirrors.nju.edu.cn/CTAN/' => 1,
'https://mirrors.sjtug.sjtu.edu.cn/ctan/' => 1,
- 'https://mirrors.tuna.tsinghua.edu.cn/CTAN/' => 1,
'https://mirrors.ustc.edu.cn/CTAN/' => 1,
},
'Hong Kong' => {
@@ -46,6 +46,7 @@ $mirrors = {
},
'Korea' => {
'http://ftp.kaist.ac.kr/pub/tex-archive/' => 1,
+ 'http://ftp.ktug.org/tex-archive/' => 1,
'http://mirror.kakao.com/CTAN/' => 1,
'https://ftp.harukasan.org/CTAN/' => 1,
'https://mirror.navercorp.com/CTAN/' => 1,
@@ -101,6 +102,7 @@ $mirrors = {
'https://ftp.fau.de/ctan/' => 1,
'https://ftp.gwdg.de/pub/ctan/' => 1,
'https://ftp.rrze.uni-erlangen.de/ctan/' => 1,
+ 'https://ftp.rrzn.uni-hannover.de/pub/mirror/tex-archive/' => 1,
'https://ftp.tu-chemnitz.de/pub/tex/' => 1,
'https://mirror.informatik.hs-fulda.de/tex-archive/' => 1,
'https://packages.oth-regensburg.de/ctan/' => 1,
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 13007ce297..ac32f1a2ac 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/55852
+depend revision/55862
name 00texlive.image
category TLCore
-revision 55849
+revision 55862
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
@@ -4187,6 +4187,7 @@ runfiles size=5023
tlpkg/tlpsrc/zxjafbfont.tlpsrc
tlpkg/tlpsrc/zxjafont.tlpsrc
tlpkg/tlpsrc/zxjatype.tlpsrc
+ tlpkg/tlpsrc/zztex.tlpsrc
name 00texlive.installation
category TLCore
@@ -4230,7 +4231,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 55840
+revision 55854
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
@@ -66445,7 +66446,7 @@ containerchecksum 8e08a60ca96ceb9f9395770a93860baaea5d54477c49096d7660a2709c8f3a
name collection-plaingeneric
category Collection
-revision 55751
+revision 55862
shortdesc Plain (La)TeX packages
relocated 1
longdesc Add-on packages and macros that work with plain TeX, often
@@ -66553,8 +66554,9 @@ depend xii
depend xii-lat
depend xlop
depend yax
-containersize 916
-containerchecksum 4c73b37ff33085b0c637d7e36d0826850a8d37ec5f5bd1a6b9c0e319e29fbf0afce60da3b7e09d7d9b590e597165a72bd487ded537551aa7be56ffbe8e8b1c0f
+depend zztex
+containersize 920
+containerchecksum 189ecb31093cb1f78fef105f98581013563041e7b35a1d6fdc19bcee2f68c0d852b9b3ae8120b3f9069e78fb188166648a967c878dda656bd05d6a70b687cf14
name collection-pstricks
category Collection
@@ -154706,7 +154708,7 @@ binfiles arch=x86_64-solaris size=1
name l3experimental
category Package
-revision 55586
+revision 55860
shortdesc Experimental LaTeX3 concepts
relocated 1
longdesc The l3experimental packages are a collection of experimental
@@ -154715,29 +154717,26 @@ longdesc higher-level ideas such as the Designer Interface. Some of them
longdesc work as stand alone packages, providing new functionality, and
longdesc can be used on top of LaTeX2e with no changes to the existing
longdesc kernel. The present release includes: l3benchmark for measuring
-longdesc the time taken by TeX to run certain code; l3cctab, support for
-longdesc saving and restoring category codes en masse in a table;
-longdesc l3color, support for setting colors using a range of color
-longdesc models; l3draw, a code-level interface for constructing
-longdesc drawings; l3graphics, an interfaces for the inclusion of
-longdesc graphics files; l3pdf, support for core PDF concepts like
-longdesc compression, objects, PDF version and so on; l3str, support for
-longdesc string manipulation; l3sys-shell, which provides abstractions
-longdesc for common shell functions like file deletion and copying;
-longdesc xcoffins, which allows the alignment of boxes using a series of
-longdesc 'handle' positions, supplementing the simple TeX reference
-longdesc point; xgalley, which controls boxes receiving text for
-longdesc typesetting.
+longdesc the time taken by TeX to run certain code; l3color, support for
+longdesc setting colors using a range of color models; l3draw, a
+longdesc code-level interface for constructing drawings; l3graphics, an
+longdesc interfaces for the inclusion of graphics files; l3pdf, support
+longdesc for core PDF concepts like compression, objects, PDF version
+longdesc and so on; l3str, support for string manipulation; l3sys-shell,
+longdesc which provides abstractions for common shell functions like
+longdesc file deletion and copying; xcoffins, which allows the alignment
+longdesc of boxes using a series of 'handle' positions, supplementing
+longdesc the simple TeX reference point; xgalley, which controls boxes
+longdesc receiving text for typesetting.
depend l3kernel
-containersize 25448
-containerchecksum 4ced0af62038e861b1d929927995131b396b3bb5532bd219ee96548e9ab65e9a1d3f8887259112c2872e7653df85afc3dc8ad929aff27a098106170ffadd8d60
-doccontainersize 3896060
-doccontainerchecksum 3d08eacd09a37e7a82f3543ba3eec45596b377a5fd30659ce759d9770787333fbbf2ab7dea8c307058dec28c9a12dd074c1207a6c5aea54bd51542117b827d0c
-docfiles size=1194
+containersize 25220
+containerchecksum 31d21a9ab4cec7e60c82b2408d68c3c66aa8a658627e9aa1f05b0faea5e95ea274f97791aec0311f6f47fc0dc68844d3c7601d966b49ac8dfcfb1d394dddc5a2
+doccontainersize 3652252
+doccontainerchecksum 675b6b78984734e7162c0d33a4a304d1a690d80a91f9d0e266701c971040a5ec77309cf591aedccfc3f51821c50e04ed76611148229602cfd39a81e84609dc08
+docfiles size=1106
RELOC/doc/latex/l3experimental/CHANGELOG.md
RELOC/doc/latex/l3experimental/README.md details="Readme"
RELOC/doc/latex/l3experimental/l3benchmark/l3benchmark.pdf details="l3benchmark documentation"
- RELOC/doc/latex/l3experimental/l3cctab/l3cctab.pdf details="l3cctab documentation"
RELOC/doc/latex/l3experimental/l3color/l3color.pdf details="l3color documentation"
RELOC/doc/latex/l3experimental/l3draw/l3draw-code.pdf
RELOC/doc/latex/l3experimental/l3draw/l3draw-code.tex
@@ -154751,13 +154750,11 @@ docfiles size=1194
RELOC/doc/latex/l3experimental/xcoffins/xcoffins.pdf details="xcoffins documentation"
RELOC/doc/latex/l3experimental/xgalley/l3galley.pdf
RELOC/doc/latex/l3experimental/xgalley/xgalley.pdf details="xgalley documentation"
-srccontainersize 85708
-srccontainerchecksum 011ae303a5eb2281117edcb3f6f526d393db937b62e690bd6845723ad2131a576e9b3a24e7ce0e236b93cf8c04d8e9888c2b66e5c57e2a32ebaced5b5cf33664
-srcfiles size=141
+srccontainersize 84668
+srccontainerchecksum 689c566bf46897604d8ff3d1e3260d4a42d8eb2f7f60bc10657429459881ef3b46a2d040902077af9c7b54571c57048053ad3dc30d041735002c45c6822a456c
+srcfiles size=138
RELOC/source/latex/l3experimental/l3benchmark/l3benchmark.dtx
RELOC/source/latex/l3experimental/l3benchmark/l3benchmark.ins
- RELOC/source/latex/l3experimental/l3cctab/l3cctab.dtx
- RELOC/source/latex/l3experimental/l3cctab/l3cctab.ins
RELOC/source/latex/l3experimental/l3color/l3color.dtx
RELOC/source/latex/l3experimental/l3color/l3color.ins
RELOC/source/latex/l3experimental/l3draw/l3draw-boxes.dtx
@@ -154783,9 +154780,8 @@ srcfiles size=141
RELOC/source/latex/l3experimental/xgalley/l3galley.dtx
RELOC/source/latex/l3experimental/xgalley/xgalley.dtx
RELOC/source/latex/l3experimental/xgalley/xgalley.ins
-runfiles size=53
+runfiles size=52
RELOC/tex/latex/l3experimental/l3benchmark/l3benchmark.sty
- RELOC/tex/latex/l3experimental/l3cctab/l3cctab.sty
RELOC/tex/latex/l3experimental/l3color/l3color.sty
RELOC/tex/latex/l3experimental/l3draw/l3draw.sty
RELOC/tex/latex/l3experimental/l3graphics/l3graphics.sty
@@ -154803,7 +154799,7 @@ catalogue-topics macro-supp layout latex3 pre-release
name l3kernel
category Package
-revision 55586
+revision 55860
shortdesc LaTeX3 programming conventions
relocated 1
longdesc The l3kernel bundle provides an implementation of the LaTeX3
@@ -154813,11 +154809,11 @@ longdesc LaTeX3 kernel and other future code are built: it is an API for
longdesc TeX programmers. The packages are set up so that the LaTeX3
longdesc conventions can be used with regular LaTeX2e packages.
depend l3backend
-containersize 153172
-containerchecksum 3bd5f1ef96b47ab05e4a0a9277e5c3b72584a197dbbeb479189337aa62ad1ef7949482288e11793e7337967e702962e8bf85e63c653f1528f5c790b41283417e
-doccontainersize 10048644
-doccontainerchecksum e8ede57eb49bb8f5e40cba34d2aedf5eea011f64b3b44aa74565ffa78238a96aa81c6ac0e9ac917e3f0a56c991915cad53de626f77fb50c87c43ae306aba7160
-docfiles size=2847
+containersize 152004
+containerchecksum d855f0425502892142d9a75d9545f0d45477ed4a5a74c4fadea588703996ff4d6e6c081bf8f09d7b36f70cf0fceafcd08e6093a7e38005fd2848a7bc4708e3c8
+doccontainersize 10078428
+doccontainerchecksum c6697b805bb24484c2de1adf353c8ebbeb0a710b3983bc4f01799245fc96761d6b3cfbeeafb82f3e3db93c39fbb6ab2d7189d8d3b5ab3e88ad311cd7ef001b32
+docfiles size=2849
RELOC/doc/latex/l3kernel/CHANGELOG.md
RELOC/doc/latex/l3kernel/README.md details="Readme"
RELOC/doc/latex/l3kernel/expl3.pdf details="The LaTeX3 Programming Language"
@@ -154863,9 +154859,9 @@ docfiles size=2847
RELOC/doc/latex/l3kernel/source3.pdf
RELOC/doc/latex/l3kernel/source3.tex
RELOC/doc/latex/l3kernel/source3body.tex
-srccontainersize 540640
-srccontainerchecksum 01834ed70a99bb92daf9784a8c47589283bd6d4bd34d459726745de0adea0c9f7f556148fdb6ba41d52efdd4579bf54f41af2c5bfcaa1f491dcc54d4af4ac084
-srcfiles size=839
+srccontainersize 543296
+srccontainerchecksum dc6e1f938ff1fb5b626eb1802d29489cc35ce645bf5575affa16aa377fa50c81aa79dcdc48b3858bfc9f844e75cbafed474ab162a4cdf3a96b2e5921dd47567f
+srcfiles size=840
RELOC/source/latex/l3kernel/expl3.dtx
RELOC/source/latex/l3kernel/l3.ins
RELOC/source/latex/l3kernel/l3alloc.dtx
@@ -154873,6 +154869,7 @@ srcfiles size=839
RELOC/source/latex/l3kernel/l3bootstrap.dtx
RELOC/source/latex/l3kernel/l3box.dtx
RELOC/source/latex/l3kernel/l3candidates.dtx
+ RELOC/source/latex/l3kernel/l3cctab.dtx
RELOC/source/latex/l3kernel/l3clist.dtx
RELOC/source/latex/l3kernel/l3coffins.dtx
RELOC/source/latex/l3kernel/l3color-base.dtx
@@ -154924,7 +154921,7 @@ srcfiles size=839
RELOC/source/latex/l3kernel/l3tl.dtx
RELOC/source/latex/l3kernel/l3token.dtx
RELOC/source/latex/l3kernel/l3unicode.dtx
-runfiles size=319
+runfiles size=311
RELOC/tex/latex/l3kernel/expl3-code.tex
RELOC/tex/latex/l3kernel/expl3-generic.tex
RELOC/tex/latex/l3kernel/expl3.ltx
@@ -224881,23 +224878,23 @@ catalogue-version 2.0f
name pas-cours
category Package
-revision 42036
+revision 55859
shortdesc Macros useful in preparing teaching material
relocated 1
longdesc Several groups of macros cover different branches of
longdesc mathematics.
-containersize 1924
-containerchecksum 0110f82a7e0fe6219b44f645bcb01a5ff97a8a6800c06cb9b6bf10cb15a5a4749d82728622e23e11f272bd2250f3e1757edffe3c9d27f808a3e2bed5f4439166
-doccontainersize 153288
-doccontainerchecksum ff7dd904160a21ad3d84a71f75f6b25fdfa3aa0687128f2f2eda19b2d590a91d0db1e654dd7d1fd7be9bd643e008db1f0c30b2d46ee6e3b02d0d71bda2b964cf
-docfiles size=70
- RELOC/doc/latex/pas-cours/README details="Readme"
+containersize 2176
+containerchecksum a2a96c526de2581461941553b0c47bb4b08b3a9df03ffd121d14f3ea6e8bd62227f12acb4853f04240608a805189f4d90459324801ee25def1b44c48ebc83bb1
+doccontainersize 198984
+doccontainerchecksum 7bbfff0a879ba2287e528a63815b005a2159800656078db2ea2c0460887dd15772e04b1eb8953446c86281037180d82d84172370e015d2c66dcbf23651c6a182
+docfiles size=86
+ RELOC/doc/latex/pas-cours/MiKTeX-screenshot01.png
+ RELOC/doc/latex/pas-cours/MiKTeX-screenshot02.png
+ RELOC/doc/latex/pas-cours/MiKTeX-screenshot03.png
RELOC/doc/latex/pas-cours/README.TEXLIVE
+ RELOC/doc/latex/pas-cours/README.txt details="Readme"
RELOC/doc/latex/pas-cours/attention.png
RELOC/doc/latex/pas-cours/coeur.png
- RELOC/doc/latex/pas-cours/decomp.tex
- RELOC/doc/latex/pas-cours/doc.codes.tex
- RELOC/doc/latex/pas-cours/doc.styles.tex
RELOC/doc/latex/pas-cours/macro-calculs.tex
RELOC/doc/latex/pas-cours/macro-patrons.tex
RELOC/doc/latex/pas-cours/macro-solides.tex
@@ -224910,7 +224907,7 @@ runfiles size=2
catalogue-ctan /macros/latex/contrib/pas-cours
catalogue-license lppl
catalogue-topics teaching
-catalogue-version 1.6
+catalogue-version 1.9
name pas-crosswords
category Package
@@ -278192,7 +278189,7 @@ binfiles arch=x86_64-solaris size=1
name tex4ht
category Package
-revision 55848
+revision 55858
shortdesc Convert (La)TeX to HTML/XML
longdesc A converter from TeX and LaTeX to SGML-based formats such as
longdesc (X)HTML, MathML, OpenDocument, and DocBook, providing a
@@ -278207,10 +278204,10 @@ longdesc restricted-syntax systems such as hyperlatex and gellmu. Note
longdesc that CTAN no longer holds the definitive sources of the
longdesc package: see the 'Readme' file.
depend tex4ht.ARCH
-containersize 864740
-containerchecksum 20fe73048feffd29841c7035af6f2901562ddb3af5c1a6adffe4dfdef924d7ade59a5581617842ed356f592cb622795d2a9491364f614b4f468799bca1678f5b
+containersize 864956
+containerchecksum 020ab98f9d9154b3341e67c3f792f57773d5f21edca8288e0d7bbc40bb57a1f18f258ed5d3a1a6dc2a259eb52ad5cd211f3c459b8bd584c0b52e613803484fe9
doccontainersize 135724
-doccontainerchecksum 1887a51113b3d1956f62c8369b35d41586eafacb0bea7719e6a7e8e02609b39ee1e24b035457be3595d8eac06200d84ea73ad3e549d0f8c2985d442b3e083c70
+doccontainerchecksum 6f0a55e81d57819afdcffff853d4e10113f264bd1101894d8c57dd3cf2860a138f0984c1b6d667adc1d6802e5b36bd602344070cfdabd3329bd9637d36563c8a
docfiles size=258
texmf-dist/doc/generic/tex4ht/Makefile
texmf-dist/doc/generic/tex4ht/TeX4ht-doc.tex
@@ -286323,15 +286320,15 @@ docfiles size=592
name texlive-docindex
category TLCore
-revision 55840
+revision 55854
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 388
-containerchecksum 6745477d08ae66d2c7098e12deab122a630a42b518b864d3bcb4077582a65faf55912de6e2584a39fda1c97d358fb2d3fbb48b948d3718e1b90e3d7184e55db0
-doccontainersize 167608
-doccontainerchecksum 0653c69b3e2f3901cc758aed20b9d02593ba17d6cf41565d118c2a8c3723d928ebc86013216b2316d378fa16e93ce3444d557f4ef960ade4560feaf3a48bd696
+containerchecksum f54618c34330d783575853f08bfa133ff87908785d11e98953262e5038774c8e64ed6a42cbfb4dcee974603f48dcc8977e3a6e63cda27cc2a9ccdf0ad6c1e675
+doccontainersize 167636
+doccontainerchecksum cd8886096960e8545f485498342d5e0bdd49bf2db16c7c87027e710fdbb3a0910482c9b1e15d79d70e4b7e2f8c2b91b677612dc8db9b8f65e8c69d2c379a038e
docfiles size=332
doc.html
@@ -286553,7 +286550,7 @@ docfiles size=368
name texlive-scripts
category TLCore
-revision 55840
+revision 55854
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.
@@ -286561,10 +286558,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 131984
-containerchecksum cd1f243be97cb8f12bead40e4bf950a6383f0364f0968c829ad9214c6f96097c6be63b9ab93a2a0a4011b3e3f444d22f4b8b3fb484a811e9bffd7016feb4b2e1
-doccontainersize 218656
-doccontainerchecksum ec95501c85f840ce2e47b6ff0caeb24cf1768ed9ccd6be7ca15f2f67ebf6e053f0e14055913fbc59d6400a38367e702a1b1e1749938fb319e24df4ec2e87379a
+containersize 131992
+containerchecksum d58a2f33b5e37908d6e9793c4e8653e91fa098ca012eaaa92ca84f2a871dbfd02c31d6e7ab3861505cead320b1b4e7a9c65ba3c1ef5496922097392847a7751e
+doccontainersize 218652
+doccontainerchecksum b0f18b1122734603ea96660e52662ac0423832b03a13ad94f84a41c501d4bf1cf122404a9404196c1b630c4e0d4cbfa176cb475984148aca973c00890c070c6b
docfiles size=141
texmf-dist/doc/man/man1/fmtutil-sys.1
texmf-dist/doc/man/man1/fmtutil-sys.man1.pdf
@@ -290814,7 +290811,7 @@ catalogue-topics maths-theorem decoration
name thmtools
category Package
-revision 53219
+revision 55861
shortdesc Extensions to theorem environments
relocated 1
longdesc The bundle provides several packages for commonly-needed
@@ -290824,20 +290821,19 @@ longdesc theorem and amsthm packages. Features of the bundle include: a
longdesc key-value interface to \newtheorem; a \listoftheorems command;
longdesc hyperref and autoref compatibility; a mechanism for restating
longdesc entire theorems in a single macro call.
-containersize 12372
-containerchecksum 1530f49499593262aaa24714bb4f9801876f9903b4c8f664deae0ee65e9384d52a050c5352ebd2cf158342752191e15deec4b7f5d2cc880a39012720963cc723
-doccontainersize 240616
-doccontainerchecksum 9331df3428012c486ddff27810248f83fb607a780509691d82b7f732269654d848441d2982cc8609f5804a3b73eeca5184cdecae90e3a337945357bbe660c685
-docfiles size=76
+containersize 12516
+containerchecksum 129b12d44574794571a44893bf615a3ec50a53c48f7d11de2af3a241099ef3a65a37f760af3a1e068542dc55479561d0c15552db0d74154b0a2064328e238f10
+doccontainersize 242784
+doccontainerchecksum e702c386f534a00969e65f4f0b5f5515feb270cbecb554031cfeeeebb9bcb9af1651c37605ffeaaa549715e85b0e2e03e3c678dd2313aa343b1ec007807ee2a1
+docfiles size=75
RELOC/doc/latex/thmtools/COPYING
- RELOC/doc/latex/thmtools/README details="Readme"
- RELOC/doc/latex/thmtools/TODO
+ RELOC/doc/latex/thmtools/README.md details="Readme"
RELOC/doc/latex/thmtools/VERSION.tex
RELOC/doc/latex/thmtools/changes.txt
+ RELOC/doc/latex/thmtools/thmtools-manual.pdf details="Package documentation"
RELOC/doc/latex/thmtools/thmtools-manual.tex
- RELOC/doc/latex/thmtools/thmtools.pdf details="Package documentation"
-srccontainersize 19556
-srccontainerchecksum 9d08c2249ee3d9e6d243b22a52a1dbf8fe834ca322be31c7bdb12def50da3e851476070aa4ad7b9ce20246d86f3ac94146099553696ff4a7f2ccbc071d216074
+srccontainersize 19628
+srccontainerchecksum 533b791016652d3f1bba112fae26da632da5236c00dca7f5231249790cd504389282b1d6bc9f4c429b034171c24fe2f7b041ce0bc9472ce639695d83f842ac2c
srcfiles size=28
RELOC/source/latex/thmtools/aliasctr.dtx
RELOC/source/latex/thmtools/parseargs.dtx
@@ -290873,10 +290869,12 @@ runfiles size=23
RELOC/tex/latex/thmtools/thmdef-thmbox.sty
RELOC/tex/latex/thmtools/thmtools.sty
RELOC/tex/latex/thmtools/unique.sty
-catalogue-ctan /macros/latex/exptl/thmtools
+catalogue-contact-bugs https://github.com/muzimuzhi/thmtools/issues
+catalogue-contact-repository https://github.com/muzimuzhi/thmtools
+catalogue-ctan /macros/latex/contrib/thmtools
catalogue-license lppl1.3c
catalogue-topics maths maths-theorem
-catalogue-version 68
+catalogue-version 69
name threadcol
category Package
@@ -316356,7 +316354,7 @@ catalogue-topics biblatex
name wintools.win32
category TLCore
-revision 55798
+revision 55855
shortdesc utilities provided only for Windows
longdesc Common utilities, mainly from the w32tex distribution.
postaction filetype name="TL.PSViewer.view" cmd='"TEXDIR/bin/win32/psviewer.exe" "%1"'
@@ -316371,10 +316369,10 @@ postaction progid extension=.png filetype="TL.bitmap2eps.convert"
postaction progid extension=.ps filetype="TL.PSViewer.view"
postaction progid extension=.tif filetype="TL.bitmap2eps.convert"
postaction progid extension=.tiff filetype="TL.bitmap2eps.convert"
-containersize 4987420
-containerchecksum 56fbdb388b3b16ccc975ee618c083e01811a49c5ccb7971527b6fd74c8b11f587abb126dd72bcbbada2428780001f3ced0853f16fe1ecd33c7fc1408c4f66b48
+containersize 4987408
+containerchecksum b28ef7cbe0e10a0a4876ae6b5fe9acaaca0f6747e4532fd580e9735213b2889e17ef01b216cedbf20f582a3b8b3ccd71df6c2b908eeb339ae29e7e03d6d3d2f0
doccontainersize 977368
-doccontainerchecksum 9b99d5c311838367af106242dbbb90e216058ba28162c679e205f1a720738536c05a40ee5326977fb2441e5e40fa9adb69f84876874fb3c5b6434fab885122be
+doccontainerchecksum 72a4b9f5000b9922038d4523607ab7c20755d6bee91a463c855e65365b71504aebb457d0fa40729841d4abe65106a2a404b5e48ba39529b562a35cabd78588af
docfiles size=337
texmf-dist/doc/psviewer/psviewer.README
texmf-dist/doc/psviewer/psviewer.ico
@@ -329555,3 +329553,86 @@ catalogue-license mit
catalogue-topics std-conform japanese xetex
catalogue-version 0.7
+name zztex
+category Package
+revision 55862
+shortdesc A full-featured TeX macro package for producing books, journals, and manuals
+relocated 1
+longdesc The ZzTeX macro package is a full-featured TeX macro package
+longdesc specially designed for producing books, journals, and manuals.
+longdesc Development of the package began in 1989. Since then, about 500
+longdesc textbooks and journals have been produced with it for a variety
+longdesc of publishers. Numerous authors have used the package to
+longdesc produce subsequent editions of their books. ZzTeX runs under
+longdesc Plain TeX. The only documentation available for the package is
+longdesc contained in the zz*.dat files that accompany the TeX files.
+containersize 101724
+containerchecksum eb325564ee9e001e0e5ff79b6e3cc9f22f5b9b100ef021552f54953802edbce1e4b1295ff4590832f959386db7a63aaf8e31dc2d61b38e5c8a140082ca423e83
+doccontainersize 47816
+doccontainerchecksum bd2a3a42b62da61db572058b4731161425545374584a575607f11bb2302aa2ce900b694aaf06562f4c9eb9046c80c4fbf5b50233f6d0526fac787c213070d542
+docfiles size=49
+ RELOC/doc/plain/zztex/README details="Readme"
+ RELOC/doc/plain/zztex/zzbuiltin.dat
+ RELOC/doc/plain/zztex/zzdetails.dat
+ RELOC/doc/plain/zztex/zzphrase.dat
+ RELOC/doc/plain/zztex/zzplain.dat
+runfiles size=169
+ RELOC/tex/plain/zztex/zzart.tex
+ RELOC/tex/plain/zztex/zzbiblio.tex
+ RELOC/tex/plain/zztex/zzbibtex.tex
+ RELOC/tex/plain/zztex/zzblock.tex
+ RELOC/tex/plain/zztex/zzcmmath.tex
+ RELOC/tex/plain/zztex/zzcomenc.tex
+ RELOC/tex/plain/zztex/zzdiv.tex
+ RELOC/tex/plain/zztex/zzdoc.tex
+ RELOC/tex/plain/zztex/zzerror.tex
+ RELOC/tex/plain/zztex/zzfloat.tex
+ RELOC/tex/plain/zztex/zzfont.tex
+ RELOC/tex/plain/zztex/zzfront.tex
+ RELOC/tex/plain/zztex/zzhelp.tex
+ RELOC/tex/plain/zztex/zzhmode.tex
+ RELOC/tex/plain/zztex/zzhmodeb.tex
+ RELOC/tex/plain/zztex/zzhyper.tex
+ RELOC/tex/plain/zztex/zzhyph.tex
+ RELOC/tex/plain/zztex/zzindexv1.tex
+ RELOC/tex/plain/zztex/zzindexv2.tex
+ RELOC/tex/plain/zztex/zzio.tex
+ RELOC/tex/plain/zztex/zzlist.tex
+ RELOC/tex/plain/zztex/zzltrspc.tex
+ RELOC/tex/plain/zztex/zzlucida.tex
+ RELOC/tex/plain/zztex/zzmath.tex
+ RELOC/tex/plain/zztex/zzmathv3.tex
+ RELOC/tex/plain/zztex/zzmathv4.tex
+ RELOC/tex/plain/zztex/zzmathv5.tex
+ RELOC/tex/plain/zztex/zzmathv6.tex
+ RELOC/tex/plain/zztex/zzmerge.tex
+ RELOC/tex/plain/zztex/zzmisc.tex
+ RELOC/tex/plain/zztex/zzmtime.tex
+ RELOC/tex/plain/zztex/zznewmath.tex
+ RELOC/tex/plain/zztex/zznote.tex
+ RELOC/tex/plain/zztex/zzoverlay.tex
+ RELOC/tex/plain/zztex/zzpage.tex
+ RELOC/tex/plain/zztex/zzplain.tex
+ RELOC/tex/plain/zztex/zzprog.tex
+ RELOC/tex/plain/zztex/zzps.tex
+ RELOC/tex/plain/zztex/zzreg.tex
+ RELOC/tex/plain/zztex/zzrunner.tex
+ RELOC/tex/plain/zztex/zzsect.tex
+ RELOC/tex/plain/zztex/zztabbing.tex
+ RELOC/tex/plain/zztex/zztabularv1.tex
+ RELOC/tex/plain/zztex/zztabularv2.tex
+ RELOC/tex/plain/zztex/zztabularv3.tex
+ RELOC/tex/plain/zztex/zztag.tex
+ RELOC/tex/plain/zztex/zztex.tex
+ RELOC/tex/plain/zztex/zztext.tex
+ RELOC/tex/plain/zztex/zzttladj.tex
+ RELOC/tex/plain/zztex/zztures.tex
+ RELOC/tex/plain/zztex/zzver.tex
+ RELOC/tex/plain/zztex/zzvmode.tex
+ RELOC/tex/plain/zztex/zzxref.tex
+catalogue-contact-home http://www.windfall.com
+catalogue-ctan /macros/plain/contrib/zztex
+catalogue-license mit
+catalogue-topics book-pub journalpub
+catalogue-version 17.7
+
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index 121bc58e76..f39f8cfcbf 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-f7dea45795aa9405a2c3e17083eabc9c texlive.tlpdb
+7d9c1443bf3059a556a6fb1f39105366 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index 8e717c86cb..68dbfdba7d 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-5dd24e094fb76b3236c6e4e30ce555a80fb12d29014f9e0b510b1987e5d9b88d647588f425a85466168d196ffabae9842a31b2178782b60dd9098cc1bf4bc104 texlive.tlpdb
+ae36793ab76ffc7f679a2a9aa6c1085f678dd4d986152aaf288bf7bc1a42f3455623afefb1fa20e32eb1cfc472ca189bbe55cee43c3bf53cc1ebdfe9352f9b04 texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 695b1b86d9..e915a8d07f 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-----
-iQEcBAEBCgAGBQJfEOk+AAoJEEzhh34ZQ4xwreYH/2yLCk/zYWRRyLHTVs2JvWNt
-hvgSplLrnBNZLx6MWdUqrHTYsbt+u9yBlMG1lePHWmBRtHEZX18anFPsg3RI0eP5
-npgteA56fuGzUa4efVKNyJhmAhxTCruWiR4+rhewMqRR6cS9DqKh4vz+mlagula3
-zZabZ3DXsoxCycEfL4oUann78zMqxe+IYdleisQmz4MbJbrPp2bHGurv88kU7+F/
-+0TnXqzluDiPtvJoWNhddOe95kAgC7N59SZ4qlv+t+NZ7hbZrprckVkuXw9GTP6C
-xDp6RxmAu41zddX78zlCn1ggrSoqXOw1EztMBSFU6RWTFR3pbeGWrZ1MMN1WSQs=
-=Tu4y
+iQEcBAEBCgAGBQJfEjq/AAoJEEzhh34ZQ4xwvu0H/3AGHy8UO2yKhPdRsm2tREwG
++7ijoAAredEUQi1G2hmjs8C8cwsH5Gm+6OTLByOhmuB9D7Z92GrIpPQBIQYfWajO
+J7GGbkzr8qfR9HDz1kCPg19zPfYDnsVUdU3hRk1v8MHhBc5rv8NpxTRABrpgjOR+
+2JsEUa9QQotYZYSX/SlCNYN2cCMUd81z5GC41jsO9DBQhy6da9ATEj0/glCfOFV6
+iuGlG3Trvy5IOA7t2i1O11oHMmz5kK1qEf4SAOktdEMheLXVEJvaRm+MdLgP1BTm
+4rDIp52INuhFAJ5FP2ZgntM3GBlHerZg93UWbs+sIOHfcrh5GuKa/U8YZVYOrk8=
+=ntIp
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 761f56ae43..09eb6bb77c 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 44758f1412..c08223cc0b 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=1594930581
+date=1595016943
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=8d5880e8f3f5a4be3563ff96a6c2a350
+lstdigest=3c40e190409d9ebb4d8e00211a1eb1f7
numpkg=3949
relstate=next
-version=7502
+version=7503
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: bLx+rMj1qAEMZpmsplh8inZvZnSD89v+2toRKICi1lrOV7SqTyy6TdMS1iJ4CI/lXrTVNRsQpvA/kxt0EXsXWNgqrwmS0+aSZ9Ev/MLb/3Spj92pRdPt4dUv8G9mKuwugkpNlQrvVIIMEW2IYelKa6kzi0fg4jH+Nhtm6XWgZ4fo5dMbvLhfVwecYjnhChsIrewDu7XiZTsHPJuCWdot1A4PJiH/YVQ974d/UYp1S6fmnU6fZeYk+B+rsE6fzwFuMBW4AL87VQDWlhxF1ChsOgyyhwlQZzxieqjrQoxo7mt1QSa6I6v5D1nPLefsYB3tODmrAIvoyZJfzE+oJGw12w==
+;;;; signature/miktex: mBH9/x9aLQtbI35Sjkd6s0st1m9fIk0gcjYsy4JF6eNLlPZntFjbEUpUShOO1ytajqtILzfGjpodqzWZSpZJH3yTv5N11HscD3+4YvHeQ6MVL0oZ1DJp5/HKI4zeampded6L7wiNXOlTKjHDNgdKTJ3c9RzU5tiHDwZp06xZoATKzQsJKfT4O5GXJZwfJx4bQB4W351Yjn0D3Qxfe3qLfPN2OPDjSZbYWekk6nKGKZiaRA34eLX5lli6fQWRF0ql6rorHB2aXCglcBelZjTAV0HhpHDciCfqgFwJkJhx9zdd2gZbiIYHLo7MX7oSaLFinuX9vJ8MqSMRbpjR09leXA==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/miktex/tm/packages/pr.ini b/systems/win32/miktex/tm/packages/pr.ini
index 5849b4d401..8df9eab4eb 100644
--- a/systems/win32/miktex/tm/packages/pr.ini
+++ b/systems/win32/miktex/tm/packages/pr.ini
@@ -1,13 +1,13 @@
[repository]
-date=1594930325
+date=1595016718
lastupd=babel babel-french beamerthemenord cascade circuitikz de-macro ekdosis eplain expkv expkv-def guitlogo mcf2graph media9 miktex-misc nanicolle overlock reledmac semantex beamerappendixnote bubblesort
-lstdigest=e5947c4761b098235e733bf59fa6c9b2
+lstdigest=6aabdf695154587b899e0d9a827bf097
numpkg=3944
relstate=stable
-version=7502
+version=7503
;;;;This configuration file is signed by a MiKTeX maintainer. The signature follows.
;;;;-----BEGIN MIKTEX SIGNATURE-----
-;;;; signature/miktex: mvxWoaSeYiKOuka97KXZKt4w3Fg6c+SEa+d0R7bRZASv9DodcMrcoKauNCI244+EYUppHFdSym2vkhwFLgh634zw7ZaKemVfhyh9Mt92Bof+bwR2ZvLM0x5Fk/y/xR8KnSH0xVnlQnDI/XGjBSQF9Gq6+WqjpELQlO+TgwKAXgRGvhKwmt7ZY+DDSbdepSOW568LKUSYmlQOvfKyBDdmo4t9iL2kxTwmu0ssjSnVQriE/XIBhTWWqVe15celsHkAayaN/U2reirhSjbd2Ae5+Q3t0OAvV4zVXyVMDmqqXfLRoggYbkLLDvJoth9F+HJNGthan6zumrUMUPSro+wK+g==
+;;;; signature/miktex: ELfuBljGh61tiRPIbC+R6wslfSV3+pf+xoCWXepjnDUnVAvh3skdSCbitswjVmd0iJjG2AVRVxw4ycyjFtM9Xz8tQZ3Lmz2kxCWtlkL73rLae/G5gThDClwy1oxnFgn5wk+CJN4ftsW08ZEEPUvCsrugUiJxjxyJltw/J8+RYOu3SrZJ78zte/mDN5nLeiGYkqVrTM9o/tMilfb2Z/YzV6SYqfJHfgypt9ZPYBdytgYqQcqqbh9GNp78MgLQ0v4rJV01vPSg2oxgFWN2XyonzhoXLzyl6BjDB3lO/kXaGihK/m4FffMwePsDDM/nbMRzldN8758GjoXSC9oyLlWWHA==
;;;;-----END MIKTEX SIGNATURE-----
diff --git a/systems/win32/w32tex/ChangeLog b/systems/win32/w32tex/ChangeLog
index 35089c3aa2..9d59bbc862 100644
--- a/systems/win32/w32tex/ChangeLog
+++ b/systems/win32/w32tex/ChangeLog
@@ -1,5 +1,12 @@
W32TeX (x86 & x64) ChangeLog
+[2020/07/17]
+(01) ltxpkgs.tar.xz
+ Update tocdata.
+(02) tex4htk-w32.tar.xz
+ Update article.4ht, book.4ht, report.4ht, scrbook.4ht,
+ scrreprt.4ht and usepackage.4ht.
+
[2020/07/16]
(01) ltxpkgs.tar.xz
Update etoolbox.
diff --git a/timestamp b/timestamp
index ebb836c697..037ededa58 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-17-02-02
+2020-07-18-02-02