summaryrefslogtreecommitdiff
path: root/macros/latex-dev
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-15 03:00:57 +0000
committerNorbert Preining <norbert@preining.info>2019-09-15 03:00:57 +0000
commitfed27f633aadbacbd3d1221da7993fed8d4efffe (patch)
tree3cae3cde89de26b178894a2e88d9ef5ba89dafcc /macros/latex-dev
parent0eea86bf18826522b3686f54fc3afb8ddc31e62a (diff)
CTAN sync 201909150300
Diffstat (limited to 'macros/latex-dev')
-rw-r--r--macros/latex-dev/base/README.md2
-rw-r--r--macros/latex-dev/base/TEMPLATE-IncludeInRelease.txt19
-rw-r--r--macros/latex-dev/base/alltt.dtx4
-rw-r--r--macros/latex-dev/base/alltt.ins12
-rw-r--r--macros/latex-dev/base/alltt.pdfbin172938 -> 172940 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.pdfbin0 -> 219622 bytes
-rw-r--r--macros/latex-dev/base/cfgguide.tex561
-rw-r--r--macros/latex-dev/base/changes.txt65
-rw-r--r--macros/latex-dev/base/classes.dtx65
-rw-r--r--macros/latex-dev/base/classes.ins12
-rw-r--r--macros/latex-dev/base/classes.pdfbin508697 -> 520779 bytes
-rw-r--r--macros/latex-dev/base/clsguide.pdfbin0 -> 371688 bytes
-rw-r--r--macros/latex-dev/base/clsguide.tex1874
-rw-r--r--macros/latex-dev/base/cmextra.ins12
-rw-r--r--macros/latex-dev/base/cmfonts.fdd4
-rw-r--r--macros/latex-dev/base/cmfonts.ins12
-rw-r--r--macros/latex-dev/base/cmfonts.pdfbin270766 -> 270773 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.pdfbin0 -> 223458 bytes
-rw-r--r--macros/latex-dev/base/cyrguide.tex398
-rw-r--r--macros/latex-dev/base/doc.dtx4
-rw-r--r--macros/latex-dev/base/doc.pdfbin621079 -> 628628 bytes
-rw-r--r--macros/latex-dev/base/docstrip.dtx4
-rw-r--r--macros/latex-dev/base/docstrip.ins12
-rw-r--r--macros/latex-dev/base/docstrip.pdfbin469784 -> 470204 bytes
-rw-r--r--macros/latex-dev/base/ec.ins12
-rw-r--r--macros/latex-dev/base/encguide.pdfbin0 -> 1244570 bytes
-rw-r--r--macros/latex-dev/base/encguide.tex1481
-rw-r--r--macros/latex-dev/base/exscale.dtx4
-rw-r--r--macros/latex-dev/base/exscale.ins12
-rw-r--r--macros/latex-dev/base/exscale.pdfbin195895 -> 195896 bytes
-rw-r--r--macros/latex-dev/base/fix-cm.dtx4
-rw-r--r--macros/latex-dev/base/fix-cm.ins12
-rw-r--r--macros/latex-dev/base/fix-cm.pdfbin261919 -> 261921 bytes
-rw-r--r--macros/latex-dev/base/fntguide.pdfbin0 -> 356425 bytes
-rw-r--r--macros/latex-dev/base/fntguide.tex1907
-rw-r--r--macros/latex-dev/base/fontdef.dtx69
-rw-r--r--macros/latex-dev/base/format.ins14
-rw-r--r--macros/latex-dev/base/graphpap.dtx4
-rw-r--r--macros/latex-dev/base/graphpap.ins12
-rw-r--r--macros/latex-dev/base/graphpap.pdfbin156297 -> 156299 bytes
-rw-r--r--macros/latex-dev/base/idx.tex4
-rw-r--r--macros/latex-dev/base/ifthen.dtx4
-rw-r--r--macros/latex-dev/base/ifthen.ins12
-rw-r--r--macros/latex-dev/base/ifthen.pdfbin205221 -> 205224 bytes
-rw-r--r--macros/latex-dev/base/inputenc.dtx4
-rw-r--r--macros/latex-dev/base/inputenc.ins12
-rw-r--r--macros/latex-dev/base/inputenc.pdfbin294773 -> 294774 bytes
-rw-r--r--macros/latex-dev/base/kernel-external-commands.txt1356
-rw-r--r--macros/latex-dev/base/kernel-internal-commands.txt1268
-rw-r--r--macros/latex-dev/base/lablst.tex4
-rw-r--r--macros/latex-dev/base/latex209.dtx4
-rw-r--r--macros/latex-dev/base/latex209.ins12
-rw-r--r--macros/latex-dev/base/latexchanges.pdfbin0 -> 391042 bytes
-rw-r--r--macros/latex-dev/base/latexchanges.tex836
-rw-r--r--macros/latex-dev/base/latexrelease.dtx4
-rw-r--r--macros/latex-dev/base/latexrelease.ins12
-rw-r--r--macros/latex-dev/base/latexrelease.pdfbin245931 -> 245932 bytes
-rw-r--r--macros/latex-dev/base/latexsym.dtx6
-rw-r--r--macros/latex-dev/base/latexsym.ins16
-rw-r--r--macros/latex-dev/base/latexsym.pdfbin192300 -> 192302 bytes
-rw-r--r--macros/latex-dev/base/lb2.err1622
-rw-r--r--macros/latex-dev/base/lb2.pdfbin238193 -> 0 bytes
-rw-r--r--macros/latex-dev/base/legal.txt2
-rw-r--r--macros/latex-dev/base/letter.dtx4
-rw-r--r--macros/latex-dev/base/letter.ins12
-rw-r--r--macros/latex-dev/base/letter.pdfbin301141 -> 305034 bytes
-rw-r--r--macros/latex-dev/base/lgc2.err697
-rw-r--r--macros/latex-dev/base/lgc2.pdfbin202911 -> 0 bytes
-rw-r--r--macros/latex-dev/base/lppl.pdfbin125868 -> 0 bytes
-rw-r--r--macros/latex-dev/base/lppl.tex511
-rw-r--r--macros/latex-dev/base/ltalloc.dtx4
-rw-r--r--macros/latex-dev/base/ltbibl.dtx4
-rw-r--r--macros/latex-dev/base/ltboxes.dtx32
-rw-r--r--macros/latex-dev/base/ltclass.dtx184
-rw-r--r--macros/latex-dev/base/ltcntrl.dtx4
-rw-r--r--macros/latex-dev/base/ltcounts.dtx4
-rw-r--r--macros/latex-dev/base/ltdefns.dtx187
-rw-r--r--macros/latex-dev/base/ltdirchk.dtx4
-rw-r--r--macros/latex-dev/base/lterror.dtx48
-rw-r--r--macros/latex-dev/base/ltfiles.dtx15
-rw-r--r--macros/latex-dev/base/ltfinal.dtx7
-rw-r--r--macros/latex-dev/base/ltfloat.dtx4
-rw-r--r--macros/latex-dev/base/ltfntcmd.dtx4
-rw-r--r--macros/latex-dev/base/ltfssbas.dtx28
-rw-r--r--macros/latex-dev/base/ltfsscmp.dtx4
-rw-r--r--macros/latex-dev/base/ltfssdcl.dtx199
-rw-r--r--macros/latex-dev/base/ltfssini.dtx18
-rw-r--r--macros/latex-dev/base/ltfsstrc.dtx4
-rw-r--r--macros/latex-dev/base/lthyphen.dtx4
-rw-r--r--macros/latex-dev/base/ltidxglo.dtx7
-rw-r--r--macros/latex-dev/base/ltlength.dtx19
-rw-r--r--macros/latex-dev/base/ltlists.dtx4
-rw-r--r--macros/latex-dev/base/ltlogos.dtx9
-rw-r--r--macros/latex-dev/base/ltluatex.pdfbin302382 -> 302611 bytes
-rw-r--r--macros/latex-dev/base/ltmath.dtx179
-rw-r--r--macros/latex-dev/base/ltmiscen.dtx186
-rw-r--r--macros/latex-dev/base/ltnews.cls4
-rw-r--r--macros/latex-dev/base/ltnews.pdfbin0 -> 849012 bytes
-rw-r--r--macros/latex-dev/base/ltnews.tex277
-rw-r--r--macros/latex-dev/base/ltnews01.pdfbin0 -> 150037 bytes
-rw-r--r--macros/latex-dev/base/ltnews01.tex152
-rw-r--r--macros/latex-dev/base/ltnews02.pdfbin0 -> 141568 bytes
-rw-r--r--macros/latex-dev/base/ltnews02.tex154
-rw-r--r--macros/latex-dev/base/ltnews03.pdfbin0 -> 141553 bytes
-rw-r--r--macros/latex-dev/base/ltnews03.tex145
-rw-r--r--macros/latex-dev/base/ltnews04.pdfbin0 -> 135588 bytes
-rw-r--r--macros/latex-dev/base/ltnews04.tex143
-rw-r--r--macros/latex-dev/base/ltnews05.pdfbin0 -> 163996 bytes
-rw-r--r--macros/latex-dev/base/ltnews05.tex158
-rw-r--r--macros/latex-dev/base/ltnews06.pdfbin0 -> 133153 bytes
-rw-r--r--macros/latex-dev/base/ltnews06.tex149
-rw-r--r--macros/latex-dev/base/ltnews07.pdfbin0 -> 130846 bytes
-rw-r--r--macros/latex-dev/base/ltnews07.tex146
-rw-r--r--macros/latex-dev/base/ltnews08.pdfbin0 -> 144488 bytes
-rw-r--r--macros/latex-dev/base/ltnews08.tex154
-rw-r--r--macros/latex-dev/base/ltnews09.pdfbin0 -> 120228 bytes
-rw-r--r--macros/latex-dev/base/ltnews09.tex142
-rw-r--r--macros/latex-dev/base/ltnews10.pdfbin0 -> 147958 bytes
-rw-r--r--macros/latex-dev/base/ltnews10.tex153
-rw-r--r--macros/latex-dev/base/ltnews11.pdfbin0 -> 104961 bytes
-rw-r--r--macros/latex-dev/base/ltnews11.tex141
-rw-r--r--macros/latex-dev/base/ltnews12.pdfbin0 -> 137932 bytes
-rw-r--r--macros/latex-dev/base/ltnews12.tex154
-rw-r--r--macros/latex-dev/base/ltnews13.pdfbin0 -> 161084 bytes
-rw-r--r--macros/latex-dev/base/ltnews13.tex201
-rw-r--r--macros/latex-dev/base/ltnews14.pdfbin0 -> 150934 bytes
-rw-r--r--macros/latex-dev/base/ltnews14.tex169
-rw-r--r--macros/latex-dev/base/ltnews15.pdfbin0 -> 122102 bytes
-rw-r--r--macros/latex-dev/base/ltnews15.tex169
-rw-r--r--macros/latex-dev/base/ltnews16.pdfbin0 -> 137511 bytes
-rw-r--r--macros/latex-dev/base/ltnews16.tex161
-rw-r--r--macros/latex-dev/base/ltnews17.pdfbin0 -> 156570 bytes
-rw-r--r--macros/latex-dev/base/ltnews17.tex230
-rw-r--r--macros/latex-dev/base/ltnews18.pdfbin0 -> 36022 bytes
-rw-r--r--macros/latex-dev/base/ltnews18.tex51
-rw-r--r--macros/latex-dev/base/ltnews19.pdfbin0 -> 235086 bytes
-rw-r--r--macros/latex-dev/base/ltnews19.tex116
-rw-r--r--macros/latex-dev/base/ltnews20.pdfbin0 -> 283194 bytes
-rw-r--r--macros/latex-dev/base/ltnews20.tex153
-rw-r--r--macros/latex-dev/base/ltnews21.pdfbin0 -> 236117 bytes
-rw-r--r--macros/latex-dev/base/ltnews21.tex255
-rw-r--r--macros/latex-dev/base/ltnews22.pdfbin0 -> 302730 bytes
-rw-r--r--macros/latex-dev/base/ltnews22.tex244
-rw-r--r--macros/latex-dev/base/ltnews23.pdfbin0 -> 274345 bytes
-rw-r--r--macros/latex-dev/base/ltnews23.tex257
-rw-r--r--macros/latex-dev/base/ltnews24.pdfbin0 -> 255315 bytes
-rw-r--r--macros/latex-dev/base/ltnews24.tex263
-rw-r--r--macros/latex-dev/base/ltnews25.pdfbin0 -> 196347 bytes
-rw-r--r--macros/latex-dev/base/ltnews25.tex137
-rw-r--r--macros/latex-dev/base/ltnews26.pdfbin0 -> 365476 bytes
-rw-r--r--macros/latex-dev/base/ltnews26.tex239
-rw-r--r--macros/latex-dev/base/ltnews27.pdfbin0 -> 239777 bytes
-rw-r--r--macros/latex-dev/base/ltnews27.tex135
-rw-r--r--macros/latex-dev/base/ltnews28.pdfbin0 -> 368527 bytes
-rw-r--r--macros/latex-dev/base/ltnews28.tex365
-rw-r--r--macros/latex-dev/base/ltnews29.pdfbin0 -> 435477 bytes
-rw-r--r--macros/latex-dev/base/ltnews29.tex526
-rw-r--r--macros/latex-dev/base/ltnews30.pdfbin0 -> 464618 bytes
-rw-r--r--macros/latex-dev/base/ltnews30.tex665
-rw-r--r--macros/latex-dev/base/ltoutenc.dtx35
-rw-r--r--macros/latex-dev/base/ltoutenc.ins12
-rw-r--r--macros/latex-dev/base/ltoutput.dtx9
-rw-r--r--macros/latex-dev/base/ltpage.dtx45
-rw-r--r--macros/latex-dev/base/ltpageno.dtx4
-rw-r--r--macros/latex-dev/base/ltpar.dtx4
-rw-r--r--macros/latex-dev/base/ltpictur.dtx154
-rw-r--r--macros/latex-dev/base/ltplain.dtx8
-rw-r--r--macros/latex-dev/base/ltsect.dtx86
-rw-r--r--macros/latex-dev/base/ltspace.dtx89
-rw-r--r--macros/latex-dev/base/lttab.dtx84
-rw-r--r--macros/latex-dev/base/ltthm.dtx4
-rw-r--r--macros/latex-dev/base/ltvers.dtx38
-rw-r--r--macros/latex-dev/base/ltx3info.pdfbin0 -> 197812 bytes
-rw-r--r--macros/latex-dev/base/ltx3info.tex474
-rw-r--r--macros/latex-dev/base/ltxcheck.tex4
-rw-r--r--macros/latex-dev/base/ltxdoc.dtx4
-rw-r--r--macros/latex-dev/base/ltxdoc.pdfbin215562 -> 215566 bytes
-rw-r--r--macros/latex-dev/base/ltxguide.cls4
-rw-r--r--macros/latex-dev/base/ltxref.dtx189
-rw-r--r--macros/latex-dev/base/makeindx.dtx4
-rw-r--r--macros/latex-dev/base/makeindx.ins12
-rw-r--r--macros/latex-dev/base/makeindx.pdfbin160692 -> 160694 bytes
-rw-r--r--macros/latex-dev/base/manual.err365
-rw-r--r--macros/latex-dev/base/manual.pdfbin151372 -> 0 bytes
-rw-r--r--macros/latex-dev/base/minimal.cls4
-rw-r--r--macros/latex-dev/base/modguide.pdfbin0 -> 226754 bytes
-rw-r--r--macros/latex-dev/base/modguide.tex412
-rw-r--r--macros/latex-dev/base/newdc.ins12
-rw-r--r--macros/latex-dev/base/newlfont.dtx4
-rw-r--r--macros/latex-dev/base/nfssfont.dtx4
-rw-r--r--macros/latex-dev/base/nfssfont.ins12
-rw-r--r--macros/latex-dev/base/nfssfont.pdfbin202441 -> 202443 bytes
-rw-r--r--macros/latex-dev/base/olddc.ins12
-rw-r--r--macros/latex-dev/base/oldlfont.dtx4
-rw-r--r--macros/latex-dev/base/preload.dtx4
-rw-r--r--macros/latex-dev/base/proc.dtx4
-rw-r--r--macros/latex-dev/base/proc.ins12
-rw-r--r--macros/latex-dev/base/proc.pdfbin216909 -> 216911 bytes
-rw-r--r--macros/latex-dev/base/slides.dtx4
-rw-r--r--macros/latex-dev/base/slides.ins20
-rw-r--r--macros/latex-dev/base/slides.pdfbin351780 -> 351783 bytes
-rw-r--r--macros/latex-dev/base/slifonts.fdd2
-rw-r--r--macros/latex-dev/base/slifonts.pdfbin214308 -> 214312 bytes
-rw-r--r--macros/latex-dev/base/source2e.pdfbin2698128 -> 2858445 bytes
-rw-r--r--macros/latex-dev/base/source2e.tex4
-rw-r--r--macros/latex-dev/base/syntonly.dtx4
-rw-r--r--macros/latex-dev/base/syntonly.ins12
-rw-r--r--macros/latex-dev/base/syntonly.pdfbin182080 -> 181859 bytes
-rw-r--r--macros/latex-dev/base/testpage.tex4
-rw-r--r--macros/latex-dev/base/texpert.txt2
-rw-r--r--macros/latex-dev/base/tlc2.err4630
-rw-r--r--macros/latex-dev/base/tlc2.pdfbin273666 -> 0 bytes
-rw-r--r--macros/latex-dev/base/tulm.fdd6
-rw-r--r--macros/latex-dev/base/tulm.ins12
-rw-r--r--macros/latex-dev/base/tulm.pdfbin156547 -> 156547 bytes
-rw-r--r--macros/latex-dev/base/unpack.ins4
-rw-r--r--macros/latex-dev/base/usrguide.pdfbin0 -> 396665 bytes
-rw-r--r--macros/latex-dev/base/usrguide.tex1817
-rw-r--r--macros/latex-dev/base/utf8ienc.dtx4
-rw-r--r--macros/latex-dev/base/utf8ienc.pdfbin337796 -> 338056 bytes
-rw-r--r--macros/latex-dev/base/webcomp.err381
-rw-r--r--macros/latex-dev/base/webcomp.pdfbin136173 -> 0 bytes
-rw-r--r--macros/latex-dev/required/amsmath/README.md81
-rw-r--r--macros/latex-dev/required/amsmath/ams-external.txt547
-rw-r--r--macros/latex-dev/required/amsmath/ams-internal.txt482
-rw-r--r--macros/latex-dev/required/amsmath/amsbsy.dtx238
-rw-r--r--macros/latex-dev/required/amsmath/amsbsy.ins50
-rw-r--r--macros/latex-dev/required/amsmath/amsbsy.pdfbin0 -> 161341 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amscd.dtx322
-rw-r--r--macros/latex-dev/required/amsmath/amscd.ins50
-rw-r--r--macros/latex-dev/required/amsmath/amscd.pdfbin0 -> 165759 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsgen.dtx386
-rw-r--r--macros/latex-dev/required/amsmath/amsgen.ins50
-rw-r--r--macros/latex-dev/required/amsmath/amsgen.pdfbin0 -> 164359 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsldoc.pdfbin0 -> 453064 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsldoc.tex2770
-rw-r--r--macros/latex-dev/required/amsmath/amsmath.dtx6383
-rw-r--r--macros/latex-dev/required/amsmath/amsmath.ins50
-rw-r--r--macros/latex-dev/required/amsmath/amsmath.pdfbin0 -> 379697 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsopn.dtx263
-rw-r--r--macros/latex-dev/required/amsmath/amsopn.ins50
-rw-r--r--macros/latex-dev/required/amsmath/amsopn.pdfbin0 -> 129178 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amstex.sty2025
-rw-r--r--macros/latex-dev/required/amsmath/amstext.dtx302
-rw-r--r--macros/latex-dev/required/amsmath/amstext.ins51
-rw-r--r--macros/latex-dev/required/amsmath/amstext.pdfbin0 -> 193911 bytes
-rw-r--r--macros/latex-dev/required/amsmath/amsxtra.dtx127
-rw-r--r--macros/latex-dev/required/amsmath/amsxtra.ins51
-rw-r--r--macros/latex-dev/required/amsmath/amsxtra.pdfbin0 -> 104557 bytes
-rw-r--r--macros/latex-dev/required/amsmath/changes.txt123
-rw-r--r--macros/latex-dev/required/amsmath/diffs-m.txt551
-rw-r--r--macros/latex-dev/required/amsmath/manifest.txt32
-rw-r--r--macros/latex-dev/required/amsmath/subeqn.pdfbin0 -> 101303 bytes
-rw-r--r--macros/latex-dev/required/amsmath/subeqn.tex202
-rw-r--r--macros/latex-dev/required/amsmath/technote.pdfbin0 -> 130493 bytes
-rw-r--r--macros/latex-dev/required/amsmath/technote.tex233
-rw-r--r--macros/latex-dev/required/amsmath/testmath.pdfbin0 -> 428714 bytes
-rw-r--r--macros/latex-dev/required/amsmath/testmath.tex2342
-rw-r--r--macros/latex-dev/required/graphics/README.md2
-rw-r--r--macros/latex-dev/required/graphics/color.dtx2
-rw-r--r--macros/latex-dev/required/graphics/color.pdfbin201388 -> 201390 bytes
-rw-r--r--macros/latex-dev/required/graphics/drivers.dtx2
-rw-r--r--macros/latex-dev/required/graphics/drivers.pdfbin263550 -> 263552 bytes
-rw-r--r--macros/latex-dev/required/graphics/epsfig.dtx2
-rw-r--r--macros/latex-dev/required/graphics/epsfig.pdfbin154501 -> 154503 bytes
-rw-r--r--macros/latex-dev/required/graphics/graphics.pdfbin282826 -> 282829 bytes
-rw-r--r--macros/latex-dev/required/graphics/graphicx.dtx2
-rw-r--r--macros/latex-dev/required/graphics/graphicx.pdfbin232397 -> 232399 bytes
-rw-r--r--macros/latex-dev/required/graphics/grfguide.pdfbin310552 -> 310556 bytes
-rw-r--r--macros/latex-dev/required/graphics/grfguide.tex2
-rw-r--r--macros/latex-dev/required/graphics/keyval.dtx2
-rw-r--r--macros/latex-dev/required/graphics/keyval.pdfbin222532 -> 222533 bytes
-rw-r--r--macros/latex-dev/required/graphics/lscape.dtx2
-rw-r--r--macros/latex-dev/required/graphics/lscape.pdfbin150124 -> 150125 bytes
-rw-r--r--macros/latex-dev/required/graphics/rotating.dtx6
-rw-r--r--macros/latex-dev/required/graphics/rotating.pdfbin246259 -> 245879 bytes
-rw-r--r--macros/latex-dev/required/graphics/rotex.pdfbin162266 -> 162266 bytes
-rw-r--r--macros/latex-dev/required/graphics/trig.dtx2
-rw-r--r--macros/latex-dev/required/graphics/trig.pdfbin191711 -> 191712 bytes
-rw-r--r--macros/latex-dev/required/tools/README.md54
-rw-r--r--macros/latex-dev/required/tools/afterpage.dtx385
-rw-r--r--macros/latex-dev/required/tools/afterpage.ins75
-rw-r--r--macros/latex-dev/required/tools/afterpage.pdfbin0 -> 189866 bytes
-rw-r--r--macros/latex-dev/required/tools/array-2016-10-06.sty341
-rw-r--r--macros/latex-dev/required/tools/array.dtx3092
-rw-r--r--macros/latex-dev/required/tools/array.pdfbin0 -> 481578 bytes
-rw-r--r--macros/latex-dev/required/tools/bm.dtx1705
-rw-r--r--macros/latex-dev/required/tools/bm.ins75
-rw-r--r--macros/latex-dev/required/tools/bm.pdfbin0 -> 306803 bytes
-rw-r--r--macros/latex-dev/required/tools/calc.dtx1357
-rw-r--r--macros/latex-dev/required/tools/calc.pdfbin0 -> 340620 bytes
-rw-r--r--macros/latex-dev/required/tools/changes.txt1671
-rw-r--r--macros/latex-dev/required/tools/dcolumn.dtx361
-rw-r--r--macros/latex-dev/required/tools/dcolumn.pdfbin0 -> 199062 bytes
-rw-r--r--macros/latex-dev/required/tools/delarray.dtx206
-rw-r--r--macros/latex-dev/required/tools/delarray.pdfbin0 -> 183449 bytes
-rw-r--r--macros/latex-dev/required/tools/enumerate.dtx335
-rw-r--r--macros/latex-dev/required/tools/enumerate.pdfbin0 -> 199071 bytes
-rw-r--r--macros/latex-dev/required/tools/fileerr.dtx123
-rw-r--r--macros/latex-dev/required/tools/fileerr.pdfbin0 -> 180448 bytes
-rw-r--r--macros/latex-dev/required/tools/fontsmpl.dtx338
-rw-r--r--macros/latex-dev/required/tools/fontsmpl.pdfbin0 -> 144837 bytes
-rw-r--r--macros/latex-dev/required/tools/ftnright.dtx1018
-rw-r--r--macros/latex-dev/required/tools/ftnright.pdfbin0 -> 347284 bytes
-rw-r--r--macros/latex-dev/required/tools/hhline.dtx322
-rw-r--r--macros/latex-dev/required/tools/hhline.pdfbin0 -> 175737 bytes
-rw-r--r--macros/latex-dev/required/tools/indentfirst.dtx77
-rw-r--r--macros/latex-dev/required/tools/indentfirst.pdfbin0 -> 144797 bytes
-rw-r--r--macros/latex-dev/required/tools/layout.dtx1025
-rw-r--r--macros/latex-dev/required/tools/layout.pdfbin0 -> 246978 bytes
-rw-r--r--macros/latex-dev/required/tools/longtable.dtx2154
-rw-r--r--macros/latex-dev/required/tools/longtable.ins75
-rw-r--r--macros/latex-dev/required/tools/longtable.pdfbin0 -> 350094 bytes
-rw-r--r--macros/latex-dev/required/tools/manifest.txt111
-rw-r--r--macros/latex-dev/required/tools/multicol-2017-04-11.sty1042
-rw-r--r--macros/latex-dev/required/tools/multicol.dtx4450
-rw-r--r--macros/latex-dev/required/tools/multicol.ins77
-rw-r--r--macros/latex-dev/required/tools/multicol.pdfbin0 -> 490377 bytes
-rw-r--r--macros/latex-dev/required/tools/rawfonts.dtx219
-rw-r--r--macros/latex-dev/required/tools/rawfonts.pdfbin0 -> 135706 bytes
-rw-r--r--macros/latex-dev/required/tools/shellesc.dtx243
-rw-r--r--macros/latex-dev/required/tools/shellesc.pdfbin0 -> 167032 bytes
-rw-r--r--macros/latex-dev/required/tools/showkeys.dtx905
-rw-r--r--macros/latex-dev/required/tools/showkeys.pdfbin0 -> 242802 bytes
-rw-r--r--macros/latex-dev/required/tools/somedefs.dtx172
-rw-r--r--macros/latex-dev/required/tools/somedefs.pdfbin0 -> 156478 bytes
-rw-r--r--macros/latex-dev/required/tools/tabularx.dtx968
-rw-r--r--macros/latex-dev/required/tools/tabularx.ins74
-rw-r--r--macros/latex-dev/required/tools/tabularx.pdfbin0 -> 254101 bytes
-rw-r--r--macros/latex-dev/required/tools/theorem.dtx1144
-rw-r--r--macros/latex-dev/required/tools/theorem.pdfbin0 -> 323376 bytes
-rw-r--r--macros/latex-dev/required/tools/tools-overview.pdfbin0 -> 68306 bytes
-rw-r--r--macros/latex-dev/required/tools/tools-overview.tex217
-rw-r--r--macros/latex-dev/required/tools/tools.ins217
-rw-r--r--macros/latex-dev/required/tools/trace.dtx733
-rw-r--r--macros/latex-dev/required/tools/trace.pdfbin0 -> 212749 bytes
-rw-r--r--macros/latex-dev/required/tools/varioref-2016-02-16.sty779
-rw-r--r--macros/latex-dev/required/tools/varioref.dtx2447
-rw-r--r--macros/latex-dev/required/tools/varioref.ins76
-rw-r--r--macros/latex-dev/required/tools/varioref.pdfbin0 -> 354966 bytes
-rw-r--r--macros/latex-dev/required/tools/verbatim.dtx1858
-rw-r--r--macros/latex-dev/required/tools/verbatim.pdfbin0 -> 309055 bytes
-rw-r--r--macros/latex-dev/required/tools/xr.dtx186
-rw-r--r--macros/latex-dev/required/tools/xr.pdfbin0 -> 163818 bytes
-rw-r--r--macros/latex-dev/required/tools/xspace.dtx507
-rw-r--r--macros/latex-dev/required/tools/xspace.pdfbin0 -> 238029 bytes
346 files changed, 66953 insertions, 11627 deletions
diff --git a/macros/latex-dev/base/README.md b/macros/latex-dev/base/README.md
index fc5e0b5080..b13734bf8c 100644
--- a/macros/latex-dev/base/README.md
+++ b/macros/latex-dev/base/README.md
@@ -1,7 +1,7 @@
The LaTeX kernel
================
-Release 2019-10-01 pre-release 2
+Release 2019-10-01 pre-release 3
Overview
--------
diff --git a/macros/latex-dev/base/TEMPLATE-IncludeInRelease.txt b/macros/latex-dev/base/TEMPLATE-IncludeInRelease.txt
deleted file mode 100644
index ae509a90f7..0000000000
--- a/macros/latex-dev/base/TEMPLATE-IncludeInRelease.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-%</2ekernel>
-%<*2ekernel|latexrelease>
-%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\XXX}{Info}%
-
-
-
-
-
-
-%</2ekernel|latexrelease>
-%<latexrelease>\EndIncludeInRelease
-%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\XXX}{Info}%
-
-%<latexrelease>
-
-%<latexrelease>\EndIncludeInRelease
-%<*2ekernel>
diff --git a/macros/latex-dev/base/alltt.dtx b/macros/latex-dev/base/alltt.dtx
index 358a059902..c106b5a97f 100644
--- a/macros/latex-dev/base/alltt.dtx
+++ b/macros/latex-dev/base/alltt.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/alltt.ins b/macros/latex-dev/base/alltt.ins
index 73d2d0b420..e60d1f6df3 100644
--- a/macros/latex-dev/base/alltt.ins
+++ b/macros/latex-dev/base/alltt.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/alltt.pdf b/macros/latex-dev/base/alltt.pdf
index 021c5fb92d..6d3539701a 100644
--- a/macros/latex-dev/base/alltt.pdf
+++ b/macros/latex-dev/base/alltt.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cfgguide.pdf b/macros/latex-dev/base/cfgguide.pdf
new file mode 100644
index 0000000000..a3b3e1f80a
--- /dev/null
+++ b/macros/latex-dev/base/cfgguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cfgguide.tex b/macros/latex-dev/base/cfgguide.tex
new file mode 100644
index 0000000000..651b59bc20
--- /dev/null
+++ b/macros/latex-dev/base/cfgguide.tex
@@ -0,0 +1,561 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: cfgguide.tex
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1995/11/28]
+
+\newcommand{\filesection}[1]{\subsection{\sffamily{#1}}}
+\newcommand{\iniTeX}{ini\TeX}
+
+\setcounter{secnumdepth}{0}
+
+\title{Configuration options for \LaTeXe}
+
+\author{\copyright~Copyright 1998, 2001, 2003 \LaTeX3 Project Team.\\
+ All rights reserved.}
+
+\date{14 February 2003}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\newpage
+
+\section{Configuring \LaTeX}
+
+Since one of the main aims of the new standard \LaTeX{} is to give all
+users the freedom provided by a reliable document processing system
+linked to a highly portable document format, the number of
+configuration possibilities is strictly limited. The reasons for this
+are explained in more detail in the article
+\textit{Modifying \LaTeX{}} in the file \texttt{modguide.tex}.
+An important consequence of this is that any document that relies on
+any extension package must declare this package within the document
+file; this helps to ensure that the document will work at a different
+site, where the \LaTeX{} system may be configured differently.
+
+Local configuration options are, by convention, placed in
+`configuration files', which have extension |.cfg|. This document
+describes the possibilities for configuration in this release of
+\LaTeX; it also explains how to configure the font definition files to
+take advantage of the available fonts.
+
+The last section considers briefly how to proceed if you require
+further customisation of the formatter.
+
+
+\section{System configuration}
+
+\filesection{texsys.cfg}
+
+This is the only configuration file that \emph{must} be present.
+During installation, if \LaTeX\ cannot find a file with this name
+then a default file |texsys.cfg|, consisting entirely of comments, is
+written out and used. Note that, until this file has been read,
+\LaTeX{} is not able to test reliably whether a given file exists on
+the system.
+
+The contents of the file |texsys.cfg| allow \LaTeX{} to cope with
+various differences between the behaviours of different \TeX{} systems,
+mainly in relation to file handling. The default version of this file
+contains, in its comments, possible settings that may be needed for a
+range of \TeX{} systems. For more information, typeset the file
+|ltdirchk.dtx|.
+
+If you have copied your \LaTeX{} installation from a computer that
+used a different operating system then you may well have a version of
+|texsys.cfg| that will make it difficult to install \LaTeX{} on your
+system. If this happens then start the process again with an empty
+|texsys.cfg| file; this will produce an installation that should, at
+least, allow you to typeset the documentation. However, it is
+possible that \LaTeX{} can still find only those files that are in the
+current directory; in this case you must set the macro |\input@path|
+correctly for your system.
+
+
+\section{Configuring the \LaTeX\ format}
+
+There are four configuration files that enable personal preferences to
+be incorporated into the \LaTeX{} format file |latex.fmt|. The range
+of preferences that can be configured by these files is strictly
+limited as this helps to ensure document portability.
+
+All four files work in the same way: if the file \m{file}|.cfg| is
+found, it will be input by \iniTeX; otherwise a default file
+\m{file}|.ltx| will be input; this is sometimes done via a
+minimal \m{file}|.cfg| that simply inputs \m{file}|.ltx|. Thus,
+providing your own version of any of these |.cfg| files can completely
+override any settings in the corresponding default standard |.ltx|
+file.
+
+
+\subsection{Font configuration}
+
+Before you even think about configuring the font declarations by
+producing a file |fontmath.cfg| or |fonttext.cfg|, you should
+read the documented file |fontdef.dtx|. This is the source file from
+which the default files |fonttext.ltx| and |fontmath.ltx| are
+produced; it contains information concerning the
+contents of the default files and what sort of customisation is
+possible. In particular, it describes in detail the effects of
+individual customisations on document portability including: which
+customisations can be made without endangering the ability to exchange
+documents with other sites (even if the formatting differs); and which
+things should be left untouched because they will make your system so
+different from others that the documents it produces will be
+non-portable.
+
+\textbf{WARNING } Please note that use of either of these font
+configuration files has the following consequences.
+ \begin{itemize}
+ \item Since the content of the file |fontdef.dtx| \emph{might}
+ change in the future, anyone writing a font configuration file
+ must be prepared to update it for use with future releases.
+ \item Documents produced on your system are likely, at best, to be
+ portable only in the sense of being processable at a different
+ site---the actual formatting will not be the same if different
+ fonts are used.
+ \item The \LaTeX3 project team will not be able to support you in
+ diagnosing problems if these cannot be reproduced with a format
+ that does not use any configuration files.
+ \end{itemize}
+
+\filesection{fonttext.cfg}
+
+The file |fonttext.cfg| can contain declarations relating to the use
+of fonts in text modes.
+
+If it exists, it defines which font shapes, families and encodings are
+normally used in text mode, as well as the behavior of font attribute
+commands such as |\textbf| etc.
+
+It could be used, for example, to produce a \LaTeX\ format that, by
+default, typesets documents using Times fonts. Be warned, however,
+that such customisation can have unfortunate consequences; so please
+read carefully this section and the file |fontdef.dtx| below if you
+are thinking of doing this.
+
+Please note carefully the above \textbf{warning}.
+
+\filesection{fontmath.cfg}
+
+The file |fontmath.cfg| can contain declarations relating to the use
+of fonts in math mode.
+
+If it exists, it defines which fonts in which sizes are used in math
+mode, and how they are used. It also defines all the math mode
+commands that `are likely to' depend on the choice of math fonts used
+(e.g.~commands that depend on the position of a glyph in a math font).
+
+The main reason for the existence of this file is to provide for future
+updates when a standard math font encoding is available. Right now we
+do \emph{not} encourage the use of this configuration file other than
+for special applications. Writing a proper configuration file for math
+mode needs expert knowledge!
+
+Please note carefully the above \textbf{warning}.
+
+\filesection{preload.cfg}
+
+The contents of the file |preload.cfg| can control the preloading of
+commonly used fonts. Preloading fonts speeds up the processing of
+documents but, because fonts cannot be `unloaded', you should not
+preload too many; otherwise you may be unable to process documents
+requiring unusual font families.
+
+The default file |preload.ltx| is produced from |preload.dtx|. It
+loads only a few fonts and these are a good choice if you normally use
+documents at the default, 10\,pt, size. If you normally use 11\,pt
+or~12\,pt then the time for \LaTeX\ to startup may be noticeably
+decreased if you preload the corresponding fonts for the sizes you
+use. Similarly, if you normally use a different font family, for
+example Times Roman (|ptm|) then you may want to preload fonts in this
+family rather than the default Computer Modern fonts.
+
+\subsection{Hyphenation configuration}
+
+\filesection{hyphen.cfg}
+
+In order to hyphenate text, \TeX{} must have hyphenation patterns and,
+since these patterns can be loaded only by \iniTeX, the choice of
+which patterns to load must be made when the format is created.
+
+The hyphenation patterns for American English are stored in the file
+named |hyphen.tex|; \LaTeX~2.09 always loaded this file when its
+format was made.
+
+With \LaTeXe{} it is possible to configure which hyphenation patterns
+are to be loaded into the format. When \iniTeX{} is processing
+|latex.ltx|, it looks for a file called |hyphen.cfg|; this file can
+be used to control which hyphenation patterns are loaded. If a file
+|hyphen.cfg| cannot be found then \iniTeX{} will load the file
+|hyphen.ltx|.
+
+The file |hyphen.ltx| loads the file |hyphen.tex| if it can find it;
+otherwise it stops with an error since a format with no hyphenation
+patterns is not very useful. It then sets |\language=0| and it sets
+the values |\lefthyphenmin=2| and |\righthyphenmin=3|, which are
+needed for American English.
+
+Thus, if you want any other patterns to be loaded then you should
+create a file |hyphen.cfg|. For each language for which you wish to
+load hyphenation patterns this file should:
+\begin{itemize}
+\item set |\language=|\m{number};
+\item load the file which contains the hyphenation patterns for that
+ language.
+\end{itemize}
+If the patterns you use require some definitions or assignments then
+a group should be used to keep such changes local to their file.
+
+\textbf{Note.} The hyphenation files that are read in should \emph{only}
+set the hyphenation tables for the language, using the commands
+|\hyphenation| and |\patterns|. In particular they should make no
+assignments to the lowercase/uppercase tables (|\lccode| and
+|\uccode|) and should not make any global command definitions to be
+used after the file has been read. Unfortunately some older
+hyphenation files do contain such settings; thus they are
+\emph{incompatible} with the mechanisms \LaTeX\ uses to ensure
+independence of input and output encodings.
+
+After this the file |hyphen.cfg| should:
+\begin{itemize}
+\item set |\language| to its default value;
+\item set |\lefthyphenmin| and |\righthyphenmin| to the correct values
+ for this default language.
+\end{itemize}
+
+There are packages available, such as `french', that can help you with
+this configuration. The `babel' collection contains many examples of
+setting up a multi-lingual \LaTeX{} format. The documentation in
+|lthyphen.dtx| (the source file for |hyphen.ltx|) also contains some
+useful examples.
+
+[We intend in a future release of \LaTeX{} to provide a set of
+standard commands for use in configuring hyphenation.]
+
+
+\section{Configuring the font definition files}
+
+If you have special fonts available (or if some fonts are unavailable)
+at your site then you may need to produce customised versions of the
+font definition files; these have extension \texttt{.fd} and are read
+by \LaTeX{} to obtain information about the font files installed at your
+system and when to load them.
+
+Although we do not encourage such customisation, you will find
+information about the content of these files and its syntax in the
+documented source file \texttt{cmfonts.fdd} and
+\textit{\LaTeXe{} font selection} in the file \texttt{fntguide.tex}.
+[We hope to be able to provide further information and examples on
+this subject at some time in the future.]
+
+Please note that the use of customised font definition files has the
+following consequences.
+ \begin{itemize}
+ \item Documents produced on your system will, at best, to be
+ portable only in the sense of being processable at a different
+ site---the actual formatting will not be the same if different
+ fonts are used.
+ \item The \LaTeX3 project team will not be able to support you in
+ diagnosing problems if these cannot be reproduced with a format
+ that does not use any customised font definition files.
+ \end{itemize}
+
+Please also note that the whilst licence conditions on the standard
+font definition files allow you to produce a customised version for
+your own use, they do not allow you to distribute such a customised
+font definition file under the original file name!
+
+
+\subsection*{Note to system administrators}
+
+If you install a version of \LaTeX{} with a locally configured font
+set-up then this system is likely to produce documents that are no
+longer `formatting compatible'; for example, the use of different
+default fonts will most likely produce different line and page breaks.
+If you do install, on a multi-user system, a system that is configured
+in such a way that it is not `formatting compatible' then you should
+consider carefully the needs of users who need to create portable
+documents. A good way to provide for their needs is to make
+available, in addition, a standard form of \LaTeX{} without any
+`formatting incompatible' customisations.
+
+
+\section{Configuring compatibility mode}
+
+When processing documents that begin with |\documentstyle|, \LaTeXe{}
+tries to emulate the old \LaTeX~2.09 system as far as possible.
+
+\filesection{latex209.cfg}
+
+Whenever a \LaTeX{} document starts with |\documentstyle|, rather than
+with |\documentclass|, \LaTeX{} assumes that it is a \LaTeX~2.09
+document and therefore processes it in `compatibility mode'. This
+does the following:
+\begin{itemize}
+\item sets the flag |\@compatibilitytrue|;
+\item inputs the file |latex209.def|;
+\item inputs the file |latex209.cfg| if it exists.
+\end{itemize}
+
+The \LaTeX~2.09 set-up allowed the format itself to be customised.
+When making the format with \iniTeX, the process ended with this
+request:
+\begin{quote}\tt
+ Input any local modifications here.
+\end{quote}
+
+If your site did input any modifications at that point then the
+\LaTeXe{} `compatibility mode' will not fully emulate \LaTeX~2.09
+\emph{as installed at your site}. In this case you should put all
+these `local modifications' into a file called |latex209.cfg| and put
+this file in the default input path at your site. These `local
+modifications', although not stored in the format, will then be loaded
+before any old-style document is processed. This should ensure that
+you can continue to process any old documents that made use of this
+local customisation.
+
+
+\section[Configuration files for standard packages and classes]%
+ {Configuration files for standard packages\\ and classes}
+
+Most of the packages in the distribution do not have any associated
+configuration files. The exceptions are listed here.
+
+\filesection{sfonts.cfg}
+
+The file |sfonts.cfg| can contain declarations relating to the use of
+fonts in the slides class.
+If it exists, it is read instead of the file |sfonts.def|.
+
+Please note that use of this configuration file has the following
+consequences.
+ \begin{itemize}
+ \item Since the font set-up for slides has not yet been revised to
+ fit modern usage, the content of this file should be completely
+ updated sometime. Thus anyone writing such a configuration
+ file must be prepared to update it for use with future releases.
+ \item Documents are portable only in the sense of being processable
+ at a different site---the actual formatting will not be the same
+ if different fonts are used.
+ \item The \LaTeX3 project team will not be able to support you in
+ diagnosing problems if these cannot be reproduced with a format
+ that does not use this configuration file.
+ \end{itemize}
+
+
+\filesection{ltnews.cfg}
+
+The file |ltnews.cfg| can be used to customise some aspects of the
+behaviour of the \textsf{ltnews} class; this class is used to typeset
+the the one page newsletter accompanying every \LaTeX{} distribution.
+If this file is present then it is read in at the beginning of the
+file |ltnews.cls|.
+
+
+\filesection{ltxdoc.cfg}
+
+The file |ltxdoc.cfg| can be used to customise some aspects of the
+behaviour of the \textsf{ltxdoc} class; this class is used to typeset
+the documented code in the |.dtx| files. If this file is present then
+it is read in at the beginning of the file |ltxdoc.cls|.
+
+As this file is read before the \textsf{article} class is loaded, you
+may pass options to \textsf{article}. For example the following line
+might be added to |ltxdoc.cfg| to format the documentation for A4 paper
+instead of the default US letter paper size.
+\begin{quote}
+|\PassOptionsToClass{a4paper}{article}|
+\end{quote}
+You should note however, that even if paper size options are specified,
+the \textsf{ltxdoc} class always sets the |\textwidth| parameter to
+355\,pt, to enable 72 columns of text to appear in the verbatim code
+listings. If you really need to over-ride this you could use:
+\begin{quote}
+|\AtEndOfClass{\setlength{\textwidth}{ ...}}|
+\end{quote}
+To set the |\textwidth| to your desired value at the end of the
+\textsf{ltxdoc} class.
+
+By default, most of the |.dtx| documented code files in the
+distribution will produce a `description' section followed by full
+source listing of the package. If you wish to suppress the source
+listings you may add the following line to |ltxdoc.cfg|:
+\begin{quote}
+|\AtBeginDocument{\OnlyDescription}|
+\end{quote}
+
+The documentation of the \textsf{ltxdoc} package, which may be typeset
+from the file |ltxdoc.dtx|, contains more examples of the use of this
+configuration file.
+
+\filesection{ltxguide.cfg}
+
+The class \textsf{ltxguide} is used by the `guide' documents, such as
+this document, in the \LaTeX\ distribution. A configuration file
+|ltxguide.cfg| may be used with this class in a way very similar to
+the customisation of the \textsf{ltxdoc} class described in the
+previous section.
+
+\section{Configuration for other supported packages}
+
+The `graphics' bundle of packages needs two configuration files,
+primarily to specify the driver used to process the |.dvi| file that
+\LaTeX{} produces. More documentation on these files comes with the
+graphics bundle but we mention them here for completeness.
+
+\filesection{graphics.cfg}
+ Normally this file just specifies a default option, by calling
+ |\ExecuteOptions|, for example |\ExecuteOptions{dvips}| or
+ |\ExecuteOptions{textures}|.
+
+ This file is read by the \textsf{graphics} package, and so affects
+ all the packages in the bundle that are based on \textsf{graphics}:
+ \textsf{graphicx}, \textsf{epsfig}, \textsf{lscape}.
+
+\filesection{color.cfg}
+ Normally this file is identical to |graphics.cfg|. It specifies the
+ default driver option for the \textsf{color} package.
+
+\section{Non-standard versions}
+
+If you feel the need to make a version of \LaTeX{} that differs from
+the standard version in ways that are not possible using the above
+configuration possibilities, then you should first read
+\textit{Modifying \LaTeX{}} in the file |modguide.tex|; this
+will probably make you realise that you do not have any such need.
+
+Thus we are sure that you will never need to create a non-standard
+version and, even if you do create one, we hope that you will not
+distribute such a version. Nevertheless, you are permitted to do this
+provided you take great care to do the following:
+\begin{itemize}
+\item
+respect the conditions in legal.txt and individual files regarding
+modification of files and changing the name;
+
+\item
+change all the relevant `|\typeout| banners': i.e.~those produced by
+all the non-standard files in your version and by the format;
+
+\item
+ ensure that the method used to run your version is clearly
+ distinguished from that used to run standard \LaTeX{}; e.g.~by using
+ a command name or menu entry that is clearly different from
+ \texttt{latex} (or \texttt{LaTeX} etc).
+\end{itemize}
+
+\subsection{Examples}
+
+Since we have been prompted, despite our misgivings, to document how
+to do this by members of the League for Programming Freedom, it seems
+appropriate to describe here a possible modification of \LaTeX{} to
+produce a system called fsf\TeX.
+
+To do this, you should create a file called \texttt{fsftex.tex} and
+then run it using \iniTeX{} and the standard \LaTeX{} format.
+
+The contents of the file \texttt{fsftex.tex} should be as shown on
+page \pageref{fsfcode}. The particular changes to the \LaTeX{} kernel
+that you wish to make need to be added to the file at the position
+indicated. You can also choose the extensions you want to use for the
+class and package files in your system.
+
+\newpage
+\label{fsfcode}
+
+\begin{footnotesize}
+\begin{verbatim}
+% fsftex.tex
+%
+% iniTEX Source code to make a `fsftex' format.
+%
+% To make this format on Unix:
+%
+% initex \&latex fsftex
+%
+% Then to run the format on file.tex:
+%
+% tex &fsftex file
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% *** VERY IMPORTANT!!! ***
+% Change the typeout banner so users know that they
+% are NOT running Standard LaTeX.
+\everyjob{\typeout{fsfTeX 1.0 based on LaTeX2e \fmtversion}}
+\makeatletter
+
+% fsfTeX changes some LaTeX internals:
+% ... put what you like here ...
+\def \fsf@xxxx {Some arbitrary \emph{freely modifiable} code goes here}
+
+% fsfTeX class files have extension .fcl (this week):
+\def \@clsextension {fcl}
+
+% fsfTeX package files have extension .fsy:
+\def \@pkgextension {fsy}
+
+% Change the file handling so that when a fsfTeX package or class
+% is not available, the standard LaTeX file will be read.
+%
+% For example, \documentclass{article} will load article.fcl if such
+% a file exists, but article.cls otherwise. This allows arbitrary
+% processing on `article' documents without changing the standard
+% article.cls file.
+
+\let\fsf@missingfileerror\@missingfileerror
+
+\def\@missingfileerror#1#2{%
+ \ifx #2\@clsextension
+ \InputIfFileExists {#1.cls}%
+ {\wlog {fsfTeX: loading #1.cls rather than #1.#2.}}%
+ {\fsf@missingfileerror {#1}{#2}}%
+ \else
+ \ifx #2\@pkgextension
+ \InputIfFileExists {#1.sty}%
+ {\wlog {fsfTeX: loading #1.sty rather than #1.#2.}}%
+ {\fsf@missingfileerror {#1}{#2}}%
+ \else
+ \fsf@missingfileerror {#1}{#2}%
+ \fi
+ \fi
+}
+
+\makeatother
+\dump
+\end{verbatim}
+\end{footnotesize}
+
+\end{document}
diff --git a/macros/latex-dev/base/changes.txt b/macros/latex-dev/base/changes.txt
index 11ad40cf3f..481604d422 100644
--- a/macros/latex-dev/base/changes.txt
+++ b/macros/latex-dev/base/changes.txt
@@ -4,6 +4,71 @@ completeness or accuracy and it contains some references to files that
are not part of the distribution.
=======================================================================
+2019-09-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltclass.dtx (subsection{Providing shipment}):
+ Support optional argument for filecontents to allow overwrite
+ and nosearch
+
+2019-08-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * lterror.dtx (subsection{Tracing}):
+ Dummy defs for \conditionally@traceon and \conditionally@traceoff added
+
+2019-08-29 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltmiscen.dtx (subsection{Environments}):
+ Make \begin/\end robust
+
+2019-08-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * lttab.dtx: Make various commands robust
+
+ * ltspace.dtx: Make various commands robust
+
+ * ltsect.dtx: Make various commands robust
+
+ * ltpictur.dtx: Make various commands robust
+
+ * ltpage.dtx: Make various commands robust
+
+ * ltoutput.dtx: Make \AtBeginDvi robust
+
+ * ltmiscen.dtx: Make various commands robust
+
+ * ltmath.dtx: Make various commands robust
+
+ * ltlogos.dtx: Make \TeX logo robust
+
+ * ltidxglo.dtx: Make \index and \glossary robust
+
+ * ltfssini.dtx: Various commands made robust
+
+ * ltfssdcl.dtx: Make math accents and delimiters robust
+
+ * ltfssbas.dtx: Various commands made robust
+
+ * ltfiles.dtx: Make \IfFileExists and \InputIf FileExists robust
+
+ * ltdefns.dtx: Various commands made robust
+ Make assignments by \MakeRobust global as we need to apply them
+ in a group once in a while.
+
+ * ltclass.dtx: Various commands made robust
+
+ * ltboxes.dtx: Various commands made robust
+
+ * classes.dtx: Various commands made robust
+
+ * fontdef.dtx: Various commands made robust
+
+2019-08-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * ltxref.dtx (subsection{Cross Referencing}):
+ Allow \p@... commands in \refstepcounter definition to have an
+ argument (receiving the \the...). This was previously only the
+ case when varioref was loaded.
+
2019-07-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
* utf8ienc.dtx (subsection{The mapping table}):
diff --git a/macros/latex-dev/base/classes.dtx b/macros/latex-dev/base/classes.dtx
index a2dde6ade1..9fed94dfdd 100644
--- a/macros/latex-dev/base/classes.dtx
+++ b/macros/latex-dev/base/classes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -53,7 +53,7 @@
%<*driver>
\ProvidesFile{classes.drv}
%</driver>
- [2018/09/03 v1.4i
+ [2019/08/27 v1.4j
%<article|report|book> Standard LaTeX document class]
%<10pt|11pt|12pt> Standard LaTeX file (size option)]
% \end{macrocode}
@@ -213,6 +213,7 @@
% \changes{v1.3l}{1995/10/20}{Disabled in compatibility mode all
% options that are new in \LaTeXe.}
% \changes{v1.3v}{1997/06/16}{Documentation fixes.}
+% \changes{v1.4j}{2019/08/27}{Various commands made robust}
%
%
% \title{Standard Document Classes for \LaTeX{} version 2e\thanks{This
@@ -220,7 +221,8 @@
%
% \author{%
% Copyright (C) 1992 by Leslie Lamport \and
-% Copyright (C) 1994-97 by Frank Mittelbach \and Johannes Braams
+% Copyright (C) 1994-2019 by Frank Mittelbach \and Johannes Braams \and
+% \LaTeX3 Project Team
% }
% \date{\filedate}
% \MaintainedByLaTeXTeam{latex}
@@ -608,6 +610,11 @@
% \begin{macrocode}
\normalsize
% \end{macrocode}
+% We use |\MakeRobust| instead of |\DeclareRobustCommand| above to avoid a log
+% entry for the redefinition.
+% \begin{macrocode}
+\MakeRobust\normalsize
+% \end{macrocode}
% \end{macro}
% \end{macro}
%
@@ -618,7 +625,7 @@
% \changes{v1.2e}{1994/04/14}{\cs{small} is no longer defined in the
% kernel; use \cs{newcommand}}
% \begin{macrocode}
-\newcommand\small{%
+\DeclareRobustCommand\small{%
%<*10pt>
\@setfontsize\small\@ixpt{11}%
\abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@
@@ -660,7 +667,7 @@
% kernel, so use \cs{renewcommand}. ASAJ.}
% \changes{v1.2e}{1994/04/14}{use \cs{newcommand} again}
% \begin{macrocode}
-\newcommand\footnotesize{%
+\DeclareRobustCommand\footnotesize{%
%<*10pt>
\@setfontsize\footnotesize\@viiipt{9.5}%
\abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@
@@ -712,30 +719,30 @@
% \changes{v1.2e}{1994/04/14}{use \cs{newcommand} again}
% \begin{macrocode}
%<*10pt>
-\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt}
-\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt}
-\newcommand\large{\@setfontsize\large\@xiipt{14}}
-\newcommand\Large{\@setfontsize\Large\@xivpt{18}}
-\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}
-\newcommand\huge{\@setfontsize\huge\@xxpt{25}}
-\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}
+\DeclareRobustCommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt}
+\DeclareRobustCommand\tiny{\@setfontsize\tiny\@vpt\@vipt}
+\DeclareRobustCommand\large{\@setfontsize\large\@xiipt{14}}
+\DeclareRobustCommand\Large{\@setfontsize\Large\@xivpt{18}}
+\DeclareRobustCommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}
+\DeclareRobustCommand\huge{\@setfontsize\huge\@xxpt{25}}
+\DeclareRobustCommand\Huge{\@setfontsize\Huge\@xxvpt{30}}
%</10pt>
%<*11pt>
-\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
-\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
-\newcommand\large{\@setfontsize\large\@xiipt{14}}
-\newcommand\Large{\@setfontsize\Large\@xivpt{18}}
-\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}
-\newcommand\huge{\@setfontsize\huge\@xxpt{25}}
-\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}}
+\DeclareRobustCommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
+\DeclareRobustCommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
+\DeclareRobustCommand\large{\@setfontsize\large\@xiipt{14}}
+\DeclareRobustCommand\Large{\@setfontsize\Large\@xivpt{18}}
+\DeclareRobustCommand\LARGE{\@setfontsize\LARGE\@xviipt{22}}
+\DeclareRobustCommand\huge{\@setfontsize\huge\@xxpt{25}}
+\DeclareRobustCommand\Huge{\@setfontsize\Huge\@xxvpt{30}}
%</11pt>
%<*12pt>
-\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
-\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
-\newcommand\large{\@setfontsize\large\@xivpt{18}}
-\newcommand\Large{\@setfontsize\Large\@xviipt{22}}
-\newcommand\LARGE{\@setfontsize\LARGE\@xxpt{25}}
-\newcommand\huge{\@setfontsize\huge\@xxvpt{30}}
+\DeclareRobustCommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}}
+\DeclareRobustCommand\tiny{\@setfontsize\tiny\@vipt\@viipt}
+\DeclareRobustCommand\large{\@setfontsize\large\@xivpt{18}}
+\DeclareRobustCommand\Large{\@setfontsize\Large\@xviipt{22}}
+\DeclareRobustCommand\LARGE{\@setfontsize\LARGE\@xxpt{25}}
+\DeclareRobustCommand\huge{\@setfontsize\huge\@xxvpt{30}}
\let\Huge=\huge
%</12pt>
% \end{macrocode}
@@ -1766,9 +1773,9 @@
% information provided. The definitions of these macros are shown
% here for information.
% \begin{macrocode}
-% \newcommand*{\title}[1]{\gdef\@title{#1}}
-% \newcommand*{\author}[1]{\gdef\@author{#1}}
-% \newcommand*{\date}[1]{\gdef\@date{#1}}
+% \DeclareRobustCommand*{\title}[1]{\gdef\@title{#1}}
+% \DeclareRobustCommand*{\author}[1]{\gdef\@author{#1}}
+% \DeclareRobustCommand*{\date}[1]{\gdef\@date{#1}}
% \end{macrocode}
% The |\date| macro gets today's date by default.
% \begin{macrocode}
diff --git a/macros/latex-dev/base/classes.ins b/macros/latex-dev/base/classes.ins
index b87115cee6..b56871b111 100644
--- a/macros/latex-dev/base/classes.ins
+++ b/macros/latex-dev/base/classes.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/classes.pdf b/macros/latex-dev/base/classes.pdf
index 2decd1439d..2df44af1ae 100644
--- a/macros/latex-dev/base/classes.pdf
+++ b/macros/latex-dev/base/classes.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide.pdf b/macros/latex-dev/base/clsguide.pdf
new file mode 100644
index 0000000000..b95148768e
--- /dev/null
+++ b/macros/latex-dev/base/clsguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/clsguide.tex b/macros/latex-dev/base/clsguide.tex
new file mode 100644
index 0000000000..2b3c4b3b00
--- /dev/null
+++ b/macros/latex-dev/base/clsguide.tex
@@ -0,0 +1,1874 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: clsguide.tex
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1995/11/28]
+
+\title{\LaTeXe~for class and package writers}
+
+\author{Copyright \copyright~1995--2006 The \LaTeX3 Project\\
+ All rights reserved}
+
+\date{15 February 2006}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+This document is an introduction to writing classes and packages for
+\LaTeX{}, with special attention given to upgrading existing
+\LaTeX~2.09 packages to \LaTeXe{}. The latter subject is also
+covered in an article by Johannes Braams published in TUGboat~15.3.
+
+\subsection{Writing classes and packages for \LaTeXe}
+
+\LaTeX{} is a document preparation system that enables the document
+writer to concentrate on the contents of their text, without bothering
+too much about the formatting of it. For example, chapters are
+indicated by |\chapter{<title>}| rather than by selecting 18pt bold.
+
+The file that contains the information about how to turn logical
+structure (like `|\chapter|') into formatting (like `18pt bold ragged
+right') is a \emph{document class}. In addition, some features (such
+as colour or included graphics) are independent of the document class
+and these are contained in \emph{packages}.
+
+One of the largest differences between \LaTeX~2.09 and \LaTeXe{} is in
+the commands used to write packages and classes. In \LaTeX~2.09,
+there was very little support for writing |.sty| files, and so writers
+had to resort to using low-level commands.
+
+\LaTeXe{} provides high-level commands for structuring packages.
+It is also much easier to build classes and packages on top of each
+other, for example writing a local technical report class |cetechr|
+(for the Chemical Engineering department) based on |article|.
+
+\subsection{Overview}
+
+This document contains an overview of how to write classes and
+packages for \LaTeX{}. It does \emph{not} introduce all of the
+commands necessary to write packages: these can be found in either
+\emph{\LaTeXbook} or \emph{\LaTeXcomp}. But it does describe the new
+commands for structuring classes and packages.
+
+\begin{description}
+
+\item[Section~\ref{Sec:general}] contains some general advice about
+ writing classes and packages. It describes the difference between
+ classes and packages, the command naming conventions, the use of
+ |doc| and |docstrip|, how \TeX's primitive file and box commands
+ interact with \LaTeX{}. It also contains some hints about general
+ \LaTeX{} style.
+
+\item[Section~\ref{Sec:structure}] describes the structure of classes
+ and packages. This includes building classes and packages on top of
+ other classes and packages, declaring options and declaring
+ commands. It also contains example classes.
+
+\item[Section~\ref{Sec:commands}] lists the new class and package
+ commands.
+
+ \item[Section~\ref{Sec:upgrade}] gives detailed advice on how to
+ upgrade existing \LaTeX~2.09 classes and packages to \LaTeXe{}.
+
+\end{description}
+
+\subsection{Further information}
+
+For a general introduction to \LaTeX{}, including the new features of
+\LaTeXe{}, you should read \emph{\LaTeXbook}
+by Leslie Lamport~\cite{A-W:LLa94}.
+
+A more detailed description of the new features of \LaTeX, including an
+overview of more than 200 packages and nearly 1000 ready to run examples, is
+to be found in \emph{\LaTeXcomp\ second edition} by Frank Mittelbach and
+Michel Goossens~\cite{A-W:MG2004}.
+
+The \LaTeX{} system is based on \TeX{}, which is
+described in \emph{The \TeX book} by Donald E.~Knuth~\cite{A-W:DEK91}.
+
+There are a number of documentation files which accompany every copy
+of \LaTeX{}. A copy of \emph{\LaTeX{} News} will come out with each
+six-monthly release of \LaTeX{}, and is found in the files
+|ltnews*.tex|. The author's guide \emph{\usrguide} describes the new
+\LaTeX{} document features; it is in |usrguide.tex|. The guide
+\emph{\fntguide} describes the \LaTeX{} font selection scheme for
+class- and package-writers; it is in |fntguide.tex|. Configuring
+\LaTeX{} is covered by the guide \emph{\cfgguide} in
+\texttt{cfgguide.tex} whilst the philosophy behind our policy on
+modifying \LaTeX{} is described in \emph{\modguide} in
+\texttt{modguide.tex}.
+
+The documented source code (from the files used to produce the kernel
+format via |latex.ltx|) is now available as
+\emph{The \LaTeXe\ Sources}.
+This very large document also includes an index of
+\LaTeX{} commands. It can be typeset from the \LaTeX{} file
+|source2e.tex| in the |base| directory, using the source files and
+the class file |ltxdoc.cls| from this directory.
+
+For more information about \TeX{} and \LaTeX{}, please contact your
+local \TeX{} Users Group, or the international \TeX{} Users Group.
+Addresses and other details can be found at:
+\begin{quote}\small\label{addrs}
+ \texttt{http://www.tug.org/lugs.html}
+\end{quote}
+
+
+\subsection{Policy on standard classes}
+
+Many of the problem reports we receive concerning the standard classes
+are not concerned with bugs but are suggesting, more or less politely,
+that the design decisions embodied in them are `not optimal' and
+asking us to modify them.
+
+There are several reasons why we should not make such changes to these
+files.
+\begin{itemize}
+\item
+ However misguided, the current behaviour is clearly what was
+ intended when these classes were designed.
+\item
+ It is not good practice to change such aspects of `standard classes'
+ because many people will be relying on them.
+\end{itemize}
+
+We have therefore decided not to even consider making such
+modifications, nor to spend time justifying that decision. This does
+not mean that we do not agree that there are many deficiencies in the
+design of these classes, but we have many tasks with higher priority
+than continually explaining why the standard classes for \LaTeX{}
+cannot be changed.
+
+We would, of course, welcome the production of better classes, or of
+packages that can be used to enhance these classes. So your first
+thought when you consider such a deficiency will, we hope, be ``what
+can I do to improve this?''
+
+Similar considerations apply to those parts of the kernel that are
+implementing design decisions, many of which should be left to the
+class file but are not in the current system. We realise that in such
+cases it is much more difficult for you to rectify the problem
+yourself but it is also the case that making such changes in the
+kernel would probably be a major project for us; therefore such
+enhancements will have to wait for \LaTeX3.
+
+\section{Writing classes and packages}
+\label{Sec:writing}
+
+This section covers some general points concerned with writing
+\LaTeX{} classes and packages.
+
+
+\subsection{Old versions}
+
+If you are upgrading an existing \LaTeX~2.09 style file then we
+recommend freezing the 2.09 version and no longer maintaining it.
+Experience with the various dialects of \LaTeX{} which existed in the
+early 1990's suggests that maintaining packages for different versions
+of \LaTeX{} is almost impossible. It will, of course, be necessary
+for some organisations to maintain both versions in parallel for some
+time but this is not essential for those packages and classes
+supported by individuals: they should support only the new standard
+\LaTeXe{}, not obsolete versions of \LaTeX{}.
+
+
+\subsection{Using `docstrip' and `doc'}
+
+If you are going to write a large class or package for \LaTeX{} then
+you should consider using the |doc| software which comes with
+\LaTeX{}.
+\LaTeX{} classes and packages written using this can be
+processed in two ways: they can be run through \LaTeX{}, to produce
+documentation; and they can be processed with |docstrip|, to produce
+the |.cls| or |.sty| file.
+
+The |doc| software can automatically generate indexes of definitions,
+indexes of command use, and change-log lists. It is very useful for
+maintaining and documenting large \TeX{} sources.
+
+The documented sources of the \LaTeX{} kernel itself, and of the
+standard classes, etc, are |doc| documents; they are in the |.dtx|
+files in the distribution. You can, in fact, typeset the source code
+of the kernel as one long document, complete with index, by running
+\LaTeX{} on |source2e.tex|. Typesetting these documents uses the
+class file |ltxdoc.cls|.
+
+For more information on |doc| and |docstrip|, consult the files
+|docstrip.dtx|, |doc.dtx|, and \emph{\LaTeXcomp}. For examples of its
+use, look at the |.dtx| files.
+
+\subsection{Is it a class or a package?}
+\label{Sec:classorpkg}
+
+The first thing to do when you want to put some new \LaTeX{} commands
+in a file is to decide whether it should be a \emph{document class} or a
+\emph{package}. The rule of thumb is:
+\begin{quote}
+ If the commands could be used with any document class, then make
+ them a package; and if not, then make them a class.
+\end{quote}
+
+There are two major types of class: those like |article|, |report| or
+|letter|, which are free-standing; and those which are extensions or
+variations of other classes---for example, the |proc| document class,
+which is built on the |article| document class.
+
+Thus, a company might have a local |ownlet| class for printing letters
+with their own headed note-paper. Such a class would build on top of
+the existing |letter| class but it cannot be used with any other
+document class, so we have |ownlet.cls| rather than |ownlet.sty|.
+
+The |graphics| package, in contrast, provides commands for including
+images into a \LaTeX{} document. Since these commands can be used
+with any document class, we have |graphics.sty| rather than
+|graphics.cls|.
+
+
+\subsection{Command names}
+
+\LaTeX{} has three types of command.
+
+There are the author commands, such as |\section|, |\emph| and
+|\times|: most of these have short names, all in lower case.
+
+There are also the class and package writer commands:
+most of these have long mixed-case names such as the following.
+\begin{verbatim}
+ \InputIfFileExists \RequirePackage \PassOptionsToClass
+\end{verbatim}
+
+Finally, there are the internal commands used in the \LaTeX{}
+implementation, such as |\@tempcnta|, |\@ifnextchar| and |\@eha|:
+most of these commands contain |@| in their name, which means they
+cannot be used in documents, only in class and package files.
+
+Unfortunately, for historical reasons the distinction between these
+commands is often blurred. For example, |\hbox| is an internal
+command which should only be used in the \LaTeX{} kernel, whereas
+|\m@ne| is the constant $-1$ and could have been |\MinusOne|.
+
+However, this rule of thumb is still useful: if a command has |@| in
+its name then it is not part of the supported \LaTeX{} language---and
+its behaviour may change in future releases! If a command is
+mixed-case, or is described in \emph{\LaTeXbook}, then you can rely on
+future releases of \LaTeXe{} supporting the command.
+
+\subsection{Box commands and colour}
+\label{Sec:colour}
+
+Even if you do not intend to use colour in your own documents, by
+taking note of the points in this section you can ensure that your
+class or package is compatible with the |color| package. This may
+benefit people using your class or package who have access to colour
+printers.
+
+The simplest way to ensure `colour safety' is to always use \LaTeX{}
+box commands rather than \TeX{} primitives, that is use |\sbox| rather
+than |\setbox|, |\mbox| rather than |\hbox| and |\parbox| or
+the |minipage| environment rather than |\vbox|.
+The \LaTeX{} box commands have new options which mean that they are now
+as powerful as the \TeX{} primitives.
+
+As an example of what can go wrong, consider that in
+|{\ttfamily <text>}|
+the font is restored just \emph{before} the |}|, whereas in the
+similar looking construction
+|{\color{green} <text>}|
+the colour is restored just \emph{after} the final |}|. Normally this
+distinction does not matter at all; but consider a primitive \TeX{}
+box assignment such as:
+\begin{verbatim}
+ \setbox0=\hbox{\color{green} <text>}
+\end{verbatim}
+Now the colour-restore occurs after the |}| and so is \emph{not}
+stored in the box. Exactly what bad effects this can have depends on
+how colour is implemented: it can range from getting the wrong
+colours in the rest of the document, to causing errors in the
+dvi-driver used to print the document.
+
+Also of interest is the command |\normalcolor|. This is
+normally just |\relax| (i.e., does nothing)
+but you can use it rather like |\normalfont| to
+set regions of the page such as captions or section headings to the
+`main document colour'.
+
+
+\subsection{Defining text and math characters}
+\label{Sec:chars}
+
+Because \LaTeXe{} supports different encodings, definitions of commands
+for producing symbols, accents, composite glyphs, etc.\ must be
+defined using the commands provided for this purpose and described in
+\emph{\fntguide}. This part of the system is still under development
+so such tasks should be undertaken with great caution.
+
+Also, |\DeclareRobustCommand| should be used for encoding-independent
+commands of this type.
+
+Note that it is no longer possible to refer to the math font set-up
+outside math mode: for example, neither |\textfont 1| nor
+|\scriptfont 2| are guaranteed to be defined in other modes.
+
+
+\subsection{General style}
+\label{Sec:general}
+
+The new system provides many commands designed to help you produce
+well-structured class and package files that are both robust and
+portable. This section outlines some ways to make intelligent use of
+these.
+
+\subsubsection{Loading other files}
+\label{Sec:loading}
+
+\NEWdescription{1995/12/01}
+\LaTeX{} provides these commands:
+\begin{verbatim}
+ \LoadClass \LoadClassWithOptions
+ \RequirePackage \RequirePackageWithOptions
+\end{verbatim}
+for using classes or packages inside other classes or packages. We
+recommend strongly that you use them, rather than the primitive
+|\input| command, for a number of reasons.
+
+Files loaded with |\input <filename>| will not be listed in the
+|\listfiles| list.
+
+If a package is always loaded with |\RequirePackage...| or |\usepackage|
+then, even if its loading is requested several times, it will be
+loaded only once. By contrast, if it is loaded with |\input| then it
+can be loaded more than once; such an extra loading may waste time and
+memory and it may produce strange results.
+
+If a package provides option-processing then, again, strange results
+are possible if the package is |\input| rather than loaded by means of
+|\usepackage| or |\RequirePackage...|.
+
+If the package |foo.sty| loads the package |baz.sty| by use of
+|\input baz.sty| then the user will get a warning:
+\begin{verbatim}
+ LaTeX Warning: You have requested package `foo',
+ but the package provides `baz'.
+\end{verbatim}
+Thus, for several reasons, using |\input| to load packages is not a
+good idea.
+
+Unfortunately, if you are upgrading the file |myclass.sty| to a class
+file then you have to make sure that any old files which contain
+|\input myclass.sty| still work.
+
+This was also true for the standard classes (|article|, |book| and
+|report|), since a lot of existing \LaTeX~2.09 document styles contain
+|\input article.sty|. The approach which we use to solve this is
+to provide minimal files |article.sty|, |book.sty| and |report.sty|,
+which simply load the appropriate class files.
+
+For example, |article.sty| contains just the following lines:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \@obsoletefile{article.cls}{article.sty}
+ \LoadClass{article}
+\end{verbatim}
+You may wish to do the same or, if you think that it is safe to do so,
+you may decide to just remove |myclass.sty|.
+
+\subsubsection{Make it robust}
+
+We consider it good practice, when writing packages and classes, to use
+\LaTeX{} commands as much as possible.
+
+Thus, instead of using |\def...| we recommend using one of
+|\newcommand|, |\renewcommand| or |\providecommand|; |\CheckCommand| is
+also useful. Doing this makes
+it less likely that you will inadvertently redefine a command, giving
+unexpected results.
+
+When you define an environment, use |\newenvironment| or
+|\renewenvironment| instead |\def\foo{...}| and |\def\endfoo{...}|.
+
+If you need to set or change the value of a \m{dimen} or \m{skip}
+register, use |\setlength|.
+
+To manipulate boxes, use \LaTeX{} commands such as |\sbox|,
+|\mbox| and |\parbox| rather than |\setbox|, |\hbox| and |\vbox|.
+
+Use |\PackageError|, |\PackageWarning| or |\PackageInfo| (or the
+equivalent class commands) rather than |\@latexerr|, |\@warning| or
+|\wlog|.
+
+It is still possible to declare options by defining |\ds@<option>| and
+calling |\@options|; but we recommend the |\DeclareOption| and
+|\ProcessOptions| commands instead. These are more powerful and use
+less memory. So rather than using:
+\begin{verbatim}
+ \def\ds@draft{\overfullrule 5pt}
+ \@options
+\end{verbatim}
+you should use:
+\begin{verbatim}
+ \DeclareOption{draft}{\setlength{\overfullrule}{5pt}}
+ \ProcessOptions\relax
+\end{verbatim}
+
+The advantage of this kind of practice is that your code is more
+readable and, more important, that it is less likely to break when
+used with future versions of \LaTeX{}.
+
+\subsubsection{Make it portable}
+
+It is also sensible to make your files are as portable as possible. To
+ensure this; they should contain only visible 7-bit text; and the
+filenames should contain at most eight characters (plus the three
+letter extension). Also, of course, it \textbf{must not} have the
+same name as a file in the standard \LaTeX{} distribution, however
+similar its contents may be to one of these files.
+
+It is also useful if local classes or packages have a common prefix,
+for example the University of Nowhere classes might begin with |unw|.
+This helps to avoid every University having its own thesis class, all
+called |thesis.cls|.
+
+If you rely on some features of the \LaTeX{} kernel, or on a package,
+please specify the release-date you need. For example, the package
+error commands were introduced in the June 1994 release so, if you use
+them then you should put:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\end{verbatim}
+
+\subsubsection{Useful hooks}
+
+Some packages and document styles had to redefine the command
+|\document| or |\enddocument| to achieve their goal. This is no
+longer necessary. You can now use the `hooks' |\AtBeginDocument| and
+|\AtEndDocument| (see Section~\ref{Sec:delays}). Again, using these
+hooks makes it less likely that your code breaks with future versions
+of \LaTeX{}. It also makes it more likely that your package can work
+together with someone else's.
+
+\NEWdescription{1996/12/01}
+However, note that code in the |\AtBeginDocument| hook is part of the
+preamble. Thus there are restrictions on what can be put there; in
+particular, no typesetting can be done.
+
+\section{The structure of a class or package}
+\label{Sec:structure}
+
+\LaTeXe{} classes and packages have more structure than \LaTeX~2.09
+style files did. The outline of a class or package file is:
+\begin{description}
+\item[Identification] The file says that it is a \LaTeXe{} package or
+ class, and gives a short description of itself.
+\item[Preliminary declarations]
+ Here the file declares some commands and can also load
+ other files. Usually these commands will be just those needed for
+ the code used in the declared options.
+\item[Options] The file declares and processes its options.
+\item[More declarations] This is where the file does most of its work:
+ declaring new variables, commands and fonts; and loading other files.
+\end{description}
+
+\subsection{Identification}
+
+The first thing a class or package file does is identify itself.
+Package files do this as follows:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesPackage{<package>}[<date> <other information>]
+\end{verbatim}
+For example:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesPackage{latexsym}[1994/06/01 Standard LaTeX package]
+\end{verbatim}
+Class files do this as follows:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesClass{<class-name>}[<date> <other information>]
+\end{verbatim}
+For example:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesClass{article}[1994/06/01 Standard LaTeX class]
+\end{verbatim}
+\NEWdescription{1998/06/19}
+The \m{date} should be given in the form `\textsc{yyyy/mm/dd}' and
+must be present if the optional argument is used (this is also true
+for the |\NeedsTeXFormat| command).
+Any derivation from this syntax will result in low-level \TeX{}
+errors---the commands expect a valid syntax to speed up the daily
+usage of the package or class and make no provision for the case that
+the developer made a mistake!
+
+This date is checked whenever a user specifies a date in their
+|\documentclass| or |\usepackage| command. For example, if you wrote:
+\begin{verbatim}
+ \documentclass{article}[1995/12/23]
+\end{verbatim}
+then users at a different location
+would get a warning that their copy of |article| was out of
+date.
+
+The description of a class is displayed when the class is used. The
+description of a package is put into the log file. These descriptions
+are also displayed by the |\listfiles| command. The phrase
+\texttt{Standard LaTeX} \textbf{must not} be used in the identification
+banner of any file other than those in the standard \LaTeX{}
+distribution.
+
+
+\subsection{Using classes and packages}
+
+The first major difference between \LaTeX~2.09 style files and
+\LaTeXe{} packages and classes is that \LaTeXe{} supports
+\emph{modularity}, in the sense of building files from small
+building-blocks rather than using large single files.
+
+A \LaTeX{} package or class can load a package as follows:
+\begin{verbatim}
+ \RequirePackage[<options>]{<package>}[<date>]
+\end{verbatim}
+For example:
+\begin{verbatim}
+ \RequirePackage{ifthen}[1994/06/01]
+\end{verbatim}
+This command has the same syntax as the author command |\usepackage|.
+It allows packages or classes to use features provided by other
+packages. For example, by loading the |ifthen| package, a package
+writer can use the `if\dots then\dots else\dots' commands provided
+by that package.
+
+A \LaTeX{} class can load one other class as follows:
+\begin{verbatim}
+ \LoadClass[<options>]{<class-name>}[<date>]
+\end{verbatim}
+For example:
+\begin{verbatim}
+ \LoadClass[twocolumn]{article}
+\end{verbatim}
+This command has the same syntax as the author command |\documentclass|.
+It allows classes to be based on the syntax and appearance of another
+class. For example, by loading the |article| class, a class writer
+only has to change the bits of |article| they don't like, rather than
+writing a new class from scratch.
+
+\NEWfeature{1995/12/01}
+The following commands can be used in the common case that you want to
+simply load a class or package file with exactly those options that
+are being used by the current class.
+\begin{verbatim}
+ \LoadClassWithOptions{<class-name>}[<date>]
+ \RequirePackageWithOptions{<package>}[<date>]
+\end{verbatim}
+For example:
+\begin{verbatim}
+ \LoadClassWithOptions{article}
+ \RequirePackageWithOptions{graphics}[1995/12/01]
+\end{verbatim}
+
+\subsection{Declaring options}
+
+\NEWdescription{1998/12/01}
+The other major difference between \LaTeX~2.09 styles and \LaTeXe{}
+packages and classes is in option handling. Packages and classes can
+now declare options and these can be specified by authors; for
+example, the |twocolumn| option is declared by the |article| class.
+Note that the name of an option should contain only those characters
+allowed in a `\LaTeX{} name'; in particular it must not contain any
+control sequences.
+
+An option is declared as follows:
+\begin{verbatim}
+ \DeclareOption{<option>}{<code>}
+\end{verbatim}
+For example, the |dvips| option (slightly simplified)
+to the |graphics| package is implemented as:
+\begin{verbatim}
+ \DeclareOption{dvips}{\input{dvips.def}}
+\end{verbatim}
+This means that when an author writes |\usepackage[dvips]{graphics}|,
+the file |dvips.def| is loaded. As another example, the |a4paper|
+option is declared in the |article| class to set the |\paperheight|
+and |\paperwidth| lengths:
+\begin{verbatim}
+ \DeclareOption{a4paper}{%
+ \setlength{\paperheight}{297mm}%
+ \setlength{\paperwidth}{210mm}%
+ }
+\end{verbatim}
+Sometimes a user will request an option which the class
+or package has not explicitly declared. By default this will produce
+a warning (for classes) or error (for packages); this behaviour
+can be altered as follows:
+\begin{verbatim}
+ \DeclareOption*{<code>}
+\end{verbatim}
+For example, to make the package |fred| produce a warning rather than
+an error for unknown options, you could specify:
+\begin{verbatim}
+ \DeclareOption*{%
+ \PackageWarning{fred}{Unknown option `\CurrentOption'}%
+ }
+\end{verbatim}
+Then, if an author writes |\usepackage[foo]{fred}|, they will get a
+warning \texttt{Package fred Warning: Unknown option `foo'.} As
+another example, the |fontenc| package tries to load a file
+|<ENC>enc.def| whenever the \m{ENC} option is used. This
+can be done by writing:
+\begin{verbatim}
+ \DeclareOption*{%
+ \input{\CurrentOption enc.def}%
+ }
+\end{verbatim}
+\NEWdescription{1998/12/01}
+It is possible to pass options on to another package or class, using
+the command |\PassOptionsToPackage| or |\PassOptionsToClass| (note
+that this is a specialised operation that works only for option
+names). For example, to pass every unknown option on to the |article|
+class, you can use:
+\begin{verbatim}
+ \DeclareOption*{%
+ \PassOptionsToClass{\CurrentOption}{article}%
+ }
+\end{verbatim}
+If you do this then you should make sure you load the class at some
+later point, otherwise the options will never be processed!
+
+So far, we have explained only how to declare options, not how to
+execute them. To process the options with which the file was called,
+you should use:
+\begin{verbatim}
+ \ProcessOptions\relax
+\end{verbatim}
+This executes the \m{code} for each option that was both specified and
+declared (see Section~\ref{Sec:commands.options} for details of how
+this is done).
+
+For example, if the |jane| package file contains:
+\begin{verbatim}
+ \DeclareOption{foo}{\typeout{Saw foo.}}
+ \DeclareOption{baz}{\typeout{Saw baz.}}
+ \DeclareOption*{\typeout{What's \CurrentOption?}}
+ \ProcessOptions\relax
+\end{verbatim}
+and an author writes |\usepackage[foo,bar]{jane}|, then they will see
+the messages \texttt{Saw foo.} and \texttt{What's bar?}
+
+\subsection{A minimal class file}
+
+Most of the work of a class or package is in defining new commands, or
+changing the appearance of documents. This is done in the body of the
+package, using commands such as |\newcommand| or |\setlength|.
+
+\LaTeXe{} provides several new commands to help class and package
+writers; these are described in detail in Section~\ref{Sec:commands}.
+
+There are four things that every class file \emph{must} contain: these
+are a definition of |\normalsize|, values for |\textwidth| and
+|\textheight| and a specification for page-numbering. So a minimal
+document class file\footnote {This class is now in the standard
+distribution, as \texttt{minimal.cls}.} looks like this:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesClass{minimal}[1995/10/30 Standard LaTeX minimal class]
+ \renewcommand{\normalsize}{\fontsize{10pt}{12pt}\selectfont}
+ \setlength{\textwidth}{6.5in}
+ \setlength{\textheight}{8in}
+ \pagenumbering{arabic} % needed even though this class will
+ % not show page numbers
+\end{verbatim}
+However, this class file will not support footnotes, marginals,
+floats, etc., nor will it provide any of the 2-letter font commands
+such as |\rm|; thus most classes will contain more than this minimum!
+
+\subsection{Example: a local letter class}
+
+A company may have its own letter class, for setting letters in the
+company style. This section shows a simple implementation of such a
+class, although a real class would need more structure.
+
+The class begins by announcing itself as |neplet.cls|.
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesClass{neplet}[1995/04/01 NonExistent Press letter class]
+\end{verbatim}
+Then this next bit passes any options on to the |letter| class, which
+is loaded with the |a4paper| option.
+\begin{verbatim}
+ \DeclareOption*{\PassOptionsToClass{\CurrentOption}{letter}}
+ \ProcessOptions\relax
+ \LoadClass[a4paper]{letter}
+\end{verbatim}
+In order to use the company letter head, it redefines the
+|firstpage| page style: this is the page style that is used on
+the first page of letters.
+\begin{verbatim}
+ \renewcommand{\ps@firstpage}{%
+ \renewcommand{\@oddhead}{<letterhead goes here>}%
+ \renewcommand{\@oddfoot}{<letterfoot goes here>}%
+ }
+\end{verbatim}
+And that's it!
+
+\subsection{Example: a newsletter class}
+
+A simple newsletter can be typeset with \LaTeX{}, using a variant of the
+|article| class.
+The class begins by announcing itself as |smplnews.cls|.
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesClass{smplnews}[1995/04/01 The Simple News newsletter class]
+
+ \newcommand{\headlinecolor}{\normalcolor}
+\end{verbatim}
+It passes most specified options on to the |article| class: apart from
+the |onecolumn| option, which is switched off, and the |green| option,
+which sets the headline in green.
+\begin{verbatim}
+ \DeclareOption{onecolumn}{\OptionNotUsed}
+ \DeclareOption{green}{\renewcommand{\headlinecolor}{\color{green}}}
+
+ \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+
+ \ProcessOptions\relax
+\end{verbatim}
+It then loads the class |article| with the option |twocolumn|.
+\begin{verbatim}
+ \LoadClass[twocolumn]{article}
+\end{verbatim}
+Since the newsletter is to be printed in colour, it now loads the
+|color| package. The class does not specify a device driver option
+since this should be specified by the user of the |smplnews| class.
+\begin{verbatim}
+ \RequirePackage{color}
+\end{verbatim}
+The class then redefines |\maketitle| to produce the title in 72pt
+Helvetica bold oblique, in the appropriate colour.
+\begin{verbatim}
+ \renewcommand{\maketitle}{%
+ \twocolumn[%
+ \fontsize{72}{80}\fontfamily{phv}\fontseries{b}%
+ \fontshape{sl}\selectfont\headlinecolor
+ \@title
+ ]%
+ }
+\end{verbatim}
+It redefines |\section| and switches off section numbering.
+\begin{verbatim}
+ \renewcommand{\section}{%
+ \@startsection
+ {section}{1}{0pt}{-1.5ex plus -1ex minus -.2ex}%
+ {1ex plus .2ex}{\large\sffamily\slshape\headlinecolor}%
+ }
+
+ \setcounter{secnumdepth}{0}
+\end{verbatim}
+It also sets the three essential things.
+\begin{verbatim}
+ \renewcommand{\normalsize}{\fontsize{9}{10}\selectfont}
+ \setlength{\textwidth}{17.5cm}
+ \setlength{\textheight}{25cm}
+\end{verbatim}
+In practice, a class would need more than this: it would provide
+commands for issue numbers, authors of articles, page styles and so
+on; but this skeleton gives a start. The |ltnews| class file is not
+much more complex than this one.
+
+\section{Commands for class and package writers}
+\label{Sec:commands}
+
+This section describes briefly each of the new commands for class and
+package writers. To find out about other aspects of the new system,
+you should also read \emph{\LaTeXbook}, \emph{\LaTeXcomp} and
+\emph{\usrguide}.
+
+\subsection{Identification}
+
+The first group of commands discussed here are those used
+to identify your class or package file.
+
+\begin{decl}
+|\NeedsTeXFormat| \arg{format-name} \oarg{release-date}
+\end{decl}
+This command tells \TeX{} that this file should be processed using a
+format with name \m{format-name}. You can use the optional argument
+\m{release-date} to further specify the earliest release date of the
+format that is needed. When the release date of the format is older
+than the one specified a warning will be generated. The standard
+\m{format-name} is \texttt{LaTeX2e}. The date, if present, must be in
+the form \textsc{yyyy/mm/dd}.
+
+Example:
+\begin{verbatim}
+ \NeedsTeXFormat{LaTeX2e}[1994/06/01]
+\end{verbatim}
+
+\begin{decl}
+|\ProvidesClass| \arg{class-name} \oarg{release-info} \\
+|\ProvidesPackage| \arg{package-name} \oarg{release-info}
+\end{decl}
+This declares that the current file contains the definitions for the
+document class \m{class-name} or package \m{package-name}.
+
+The optional \m{release-info}, if used, must contain:
+\begin{itemize}
+ \item the release date of
+ this version of the file, in the form \textsc{yyyy/mm/dd};
+\item optionally followed by a space and a short description, possibly
+ including a version number.
+\end{itemize}
+The above syntax must be followed exactly so that this information
+can be used by |\LoadClass| or |\documentclass| (for classes) or
+|\RequirePackage| or |\usepackage| (for packages) to test that the
+release is not too old.
+
+The whole of this \m{release-info} information is displayed by
+|\listfiles| and should therefore not be too long.
+
+Example:
+\begin{verbatim}
+ \ProvidesClass{article}[1994/06/01 v1.0 Standard LaTeX class]
+ \ProvidesPackage{ifthen}[1994/06/01 v1.0 Standard LaTeX package]
+\end{verbatim}
+
+\begin{decl}
+ |\ProvidesFile| \arg{file-name} \oarg{release-info}
+\end{decl}
+This is similar to the two previous commands except that here the full
+filename, including the extension, must be given. It is used for
+declaring any files other than main class and package files.
+
+Example:
+\begin{verbatim}
+ \ProvidesFile{T1enc.def}[1994/06/01 v1.0 Standard LaTeX file]
+\end{verbatim}
+
+Note that the phrase \texttt{Standard LaTeX} \textbf{must not} be used
+in the identification banner of any file other than those in the
+standard \LaTeX{} distribution.
+
+\subsection{Loading files}
+\label{Sec:loadf}
+
+\NEWfeature{1995/12/01}
+This group of commands can be used to create your own document class or
+package by building on existing classes or packages.
+\begin{decl}
+ |\RequirePackage| \oarg{options-list} \arg{package-name}
+ \oarg{release-info}\\
+ |\RequirePackageWithOptions| \arg{package-name}
+ \oarg{release-info}
+\end{decl}
+Packages and classes should use these commands to load other packages.
+
+The use of |\RequirePackage| is the same as the author command
+|\usepackage|.
+
+Examples:
+\begin{verbatim}
+ \RequirePackage{ifthen}[1994/06/01]
+ \RequirePackageWithOptions{graphics}[1995/12/01]
+\end{verbatim}
+
+\begin{decl}
+ |\LoadClass| \oarg{options-list} \arg{class-name}
+ \oarg{release-info}\\
+ |\LoadClassWithOptions| \arg{class-name}
+ \oarg{release-info}
+\end{decl}
+\NEWfeature{1995/12/01}
+These commands are for use \emph{only} in class files, they cannot be
+used in packages files;
+they can be used at most once within a class file.
+
+The use of |\LoadClass| is the same as
+the use of |\documentclass| to load a class file.
+
+Examples:
+\begin{verbatim}
+ \LoadClass{article}[1994/06/01]
+ \LoadClassWithOptions{article}[1995/12/01]
+\end{verbatim}
+
+\NEWfeature{1995/12/01}
+The two |WithOptions| versions simply load the class (or package) file
+with exactly those options that are being used by the current file
+(class or package). See below, in \ref{Sec:opmove}, for further
+discussion of their use.
+
+
+\subsection{Option declaration}
+\label{Sec:commands.options.dec}
+
+\NEWdescription{1998/12/01}
+The following commands deal with the declaration and handling of
+options to document classes and packages. Every option name must be a
+`\LaTeX{} name'.
+
+There are some commands designed especially for use within the
+\m{code} argument of these commands (see below).
+
+\begin{decl}
+ |\DeclareOption| \arg{option-name} \arg{code}
+\end{decl}
+This makes \m{option-name} a `declared option' of the class or package
+in which it is put.
+
+The \m{code} argument contains the code to be executed if that option
+is specified for the class or package; it can contain any valid
+\LaTeXe{} construct.
+
+Example:
+\begin{verbatim}
+ \DeclareOption{twoside}{\@twosidetrue}
+\end{verbatim}
+
+\begin{decl}
+ |\DeclareOption*| \arg{code}
+\end{decl}
+This declares the \m{code} to be executed for every option which is
+specified for, but otherwise not explicitly declared by, the class or
+package; this code is called the `default option code' and it can
+contain any valid \LaTeXe{} construct.
+
+If a class file contains no |\DeclareOption*| then, by default, all
+specified but undeclared options for that class will be silently
+passed to all packages (as will the specified and declared options for
+that class).
+
+If a package file contains no |\DeclareOption*| then, by default, each
+specified but undeclared option for that package will produce an error.
+
+
+\subsection{Commands within option code}
+\label{Sec:within.code}
+
+These two commands can be used only within the \m{code} argument of
+either |\DeclareOption| or |\DeclareOption*|. Other commands commonly
+used within these arguments can be found in the next few subsections.
+
+\begin{decl}
+ |\CurrentOption|
+\end{decl}
+This expands to the name of the current option.
+
+\begin{decl}
+ |\OptionNotUsed|
+\end{decl}
+This causes the current option to
+be added to the list of `unused options'.
+
+\NEWfeature{1995/06/01}
+ You can now include hash marks (\texttt{\#}) within these \m{code}
+ arguments without special treatment (formerly, it had been
+ necessary to double them).
+
+\subsection{Moving options around}
+\label{Sec:opmove}
+
+These two commands are also very useful within the \m{code} argument
+of |\DeclareOption| or |\DeclareOption*|:
+\begin{decl}
+ |\PassOptionsToPackage| \arg{options-list} \arg{package-name}\\
+ |\PassOptionsToClass| \arg{options-list} \arg{class-name}
+\end{decl}
+The command |\PassOptionsToPackage| passes the option names in
+\m{options-list} to package \m{package-name}.
+This means that it adds the \m{option-list} to the
+list of options used by any future |\RequirePackage| or |\usepackage|
+command for package \m{package-name}.
+
+Example:
+\begin{verbatim}
+ \PassOptionsToPackage{foo,bar}{fred}
+ \RequirePackage[baz]{fred}
+\end{verbatim}
+is the same as:
+\begin{verbatim}
+ \RequirePackage[foo,bar,baz]{fred}
+\end{verbatim}
+
+Similarly, |\PassOptionsToClass| may be used in a class file to pass
+options to another class to be loaded with |\LoadClass|.
+
+\NEWdescription{1995/12/01}
+The effects and use of these two commands should be contrasted with
+those of the following two (documented above, in \ref{Sec:loadf}):
+\begin{verbatim}
+ \LoadClassWithOptions
+ \RequirePackageWithOptions
+\end{verbatim}
+The command |\RequirePackageWithOptions| is similar to
+|\RequirePackage|, but it always loads the required package with
+exactly the same option list as that being used by the current class
+or package, rather than with any option explicitly supplied or passed
+on by |\PassOptionsToPackage|.
+
+The main purpose of |\LoadClassWithOptions| is to allow one class to
+simply build on another, for example:
+\begin{verbatim}
+ \LoadClassWithOptions{article}
+\end{verbatim}
+This should be compared with the slightly different construction
+\begin{verbatim}
+ \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+ \ProcessOptions\relax
+ \LoadClass{article}
+\end{verbatim}
+As used above, the effects are more or less the same, but the first is
+a lot less to type; also the |\LoadClassWithOptions| method runs
+slightly quicker.
+
+If, however, the class declares options of its own then
+the two constructions are different. Compare, for example:
+\begin{verbatim}
+ \DeclareOption{landscape}{\@landscapetrue}
+ \ProcessOptions\relax
+ \LoadClassWithOptions{article}
+\end{verbatim}
+with:
+\begin{verbatim}
+ \DeclareOption{landscape}{\@landscapetrue}
+ \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
+ \ProcessOptions\relax
+ \LoadClass{article}
+\end{verbatim}
+In the first example, the \textsf{article} class will be loaded with
+option |landscape| precisely when the current class is called with
+this option. By contrast, in the second example it will never be
+called with option \texttt{landscape} as in that case \textsf{article}
+is passed options only by the default option handler, but this handler
+is not used for |landscape| because that option is explicitly
+declared.
+
+\subsection{Delaying code}
+\label{Sec:delays}
+
+These first two commands are also intended primarily for use within
+the \m{code} argument of |\DeclareOption| or |\DeclareOption*|.
+
+\begin{decl}
+ |\AtEndOfClass| \arg{code}\\
+ |\AtEndOfPackage| \arg{code}
+\end{decl}
+These commands declare \m{code} that is saved away internally and then
+executed after processing the whole of the current class or package
+file.
+
+Repeated use of these commands is permitted: the code in the
+arguments is stored (and later executed) in the order of their
+declarations.
+
+\begin{decl}
+ |\AtBeginDocument| \arg{code}\\
+ |\AtEndDocument| \arg{code}
+\end{decl}
+These commands declare \m{code} to be saved internally and executed
+while \LaTeX{} is executing |\begin{document}| or |\end{document}|.
+
+The \m{code} specified in the argument to |\AtBeginDocument| is
+executed near the end of the |\begin{document}| code, \emph{after} the
+font selection tables have been set up. It is therefore a useful
+place to put code which needs to be executed after everything has been
+prepared for typesetting and when the normal font for the document is
+the current font.
+
+\NEWdescription{1995/12/01}
+The |\AtBeginDocument| hook should not be used for code that does any
+typesetting since the typeset result would be unpredictable.
+
+The \m{code} specified in the argument to |\AtEndDocument| is
+executed at the beginning of the |\end{document}| code,
+\emph{before} the final page is finished and before any leftover
+floating environments are processed. If some of the \m{code} is to be
+executed after these two processes, you should include a |\clearpage|
+at the appropriate point in \m{code}.
+
+Repeated use of these commands is permitted: the code in the
+arguments is stored (and later executed) in the order of their
+declarations.
+
+\begin{decl}[1994/12/01]
+ |\AtBeginDvi| \arg{specials}
+\end{decl}
+These commands save in a box register things which are written to the
+|.dvi| file at the beginning of the `shipout' of the first page of the
+document.
+
+This should not be used for anything that will add any typeset
+material to the |.dvi| file.
+
+Repeated use of this command is permitted.
+
+
+\subsection{Option processing}
+\label{Sec:commands.options}
+
+\begin{decl}
+ |\ProcessOptions|
+\end{decl}
+This command executes the \m{code} for each selected option.
+
+We shall first describe how |\ProcessOptions| works in a package file,
+and then how this differs in a class file.
+
+To understand in detail what |\ProcessOptions| does in a package file,
+you have to know the difference between \emph{local} and \emph{global}
+options.
+\begin{itemize}
+\item \textbf{Local options} are those which have been explicitly
+ specified for this particular package in the \m{options} argument of
+ any of these:
+\begin{quote}
+ |\PassOptionsToPackage{<options>}| \ |\usepackage[<options>]|\\
+ |\RequirePackage[<options>]|
+\end{quote}
+\item \textbf{Global options} are any other options that are specified
+ by the author in the \m{options} argument of
+ |\documentclass[<options>]|.
+\end{itemize}
+For example, suppose that a document begins:
+\begin{verbatim}
+ \documentclass[german,twocolumn]{article}
+ \usepackage{gerhardt}
+\end{verbatim}
+whilst package |gerhardt| calls package |fred| with:
+\begin{verbatim}
+ \PassOptionsToPackage{german,dvips,a4paper}{fred}
+ \RequirePackage[errorshow]{fred}
+\end{verbatim}
+then:
+\begin{itemize}
+\item |fred|'s local options are |german|, |dvips|, |a4paper|
+ and |errorshow|;
+\item |fred|'s only global option is |twocolumn|.
+\end{itemize}
+
+When |\ProcessOptions| is called, the following happen.
+\begin{itemize}
+\item \emph{First}, for each option so far declared in |fred.sty|
+ by |\DeclareOption|, it looks to see if that option is either a
+ global or a local option for |fred|: if it is then the corresponding
+ code is executed.
+
+ This is done in the order in which these options
+ were declared in |fred.sty|.
+\item \emph{Then}, for each remaining \emph{local} option, the command
+ |\ds@<option>| is executed if it has been defined somewhere (other
+ than by a |\DeclareOption|); otherwise, the `default option code' is
+ executed. If no default option code has been declared then an error
+ message is produced.
+
+ This is done in the order in which these
+ options were specified.
+\end{itemize}
+Throughout this process, the system ensures that the code declared for
+an option is executed at most once.
+
+Returning to the example, if |fred.sty| contains:
+\begin{verbatim}
+ \DeclareOption{dvips}{\typeout{DVIPS}}
+ \DeclareOption{german}{\typeout{GERMAN}}
+ \DeclareOption{french}{\typeout{FRENCH}}
+ \DeclareOption*{\PackageWarning{fred}{Unknown `\CurrentOption'}}
+ \ProcessOptions\relax
+\end{verbatim}
+then the result of processing this document will be:
+\begin{verbatim}
+ DVIPS
+ GERMAN
+ Package fred Warning: Unknown `a4paper'.
+ Package fred Warning: Unknown `errorshow'.
+\end{verbatim}
+Note the following:
+
+\begin{itemize}
+\item the code for the |dvips| option is executed before that for the
+ |german| option, because that is the order in which they are declared
+ in |fred.sty|;
+\item the code for the |german| option is executed only once, when the
+ declared options are being processed;
+\item the |a4paper| and |errorshow| options produce the warning from
+ the code declared by |\DeclareOption*| (in the order in which they
+ were specified), whilst the |twocolumn| option does not: this is
+ because |twocolumn| is a global option.
+\end{itemize}
+
+In a class file, |\ProcessOptions| works in the same way, except
+that: \emph{all} options are local; and the default value for
+|\DeclareOption*| is |\OptionNotUsed| rather than an error.
+
+\NEWdescription{1995/12/01}
+Note that, because |\ProcessOptions| has a |*|-form, it is wise to
+follow the non-star form with |\relax|, as in the previous examples,
+since this prevents unnecessary look ahead and possibly misleading
+error messages being issued.
+
+\begin{decl}
+ |\ProcessOptions*| \\
+ |\@options|
+\end{decl}
+This is like |\ProcessOptions| but it executes the options in the
+order specified in the calling commands, rather than in the order of
+declaration in the class or package. For a package this means that the
+global options are processed first.
+
+The |\@options| command from \LaTeX~2.09 has been made equivalent to
+this in order to ease the task of updating old document styles to
+\LaTeXe{} class files.
+
+\begin{decl}
+ |\ExecuteOptions| \arg{options-list}
+\end{decl}
+
+For each option in the \m{options-list}, in order,
+this command simply executes the command
+|\ds@<option>| (if this command is not defined, then that option is
+silently ignored).
+
+It can be used to provide a `default option list' just before
+|\ProcessOptions|. For example, suppose that in a class file you want
+to set up the default design to be: two-sided printing; 11pt fonts;
+in two columns. Then it could specify:
+\begin{verbatim}
+ \ExecuteOptions{11pt,twoside,twocolumn}
+\end{verbatim}
+
+
+\subsection{Safe file commands}
+
+These commands deal with file input; they ensure that the non-existence
+of a requested file can be handled in a user-friendly way.
+
+\begin{decl}
+|\IfFileExists| \arg{file-name} \arg{true} \arg{false}
+\end{decl}
+If the file exists then the code specified in \m{true} is
+executed.
+
+If the file does not exist then the code specified in \m{false} is
+executed.
+
+This command does \emph{not} input the file.
+
+\begin{decl}
+ |\InputIfFileExists| \arg{file-name} \arg{true} \arg{false}
+\end{decl}
+This inputs the file \m{file-name} if it exists and, immediately
+before the input, the code specified in \m{true} is executed.
+
+If the file does not exist then the code specified in \m{false} is
+executed.
+
+It is implemented using |\IfFileExists|.
+
+
+\subsection{Reporting errors, etc}
+
+These commands should be used by third party classes and packages to
+report errors, or to provide information to authors.
+
+\begin{decl}
+ |\ClassError| \arg{class-name} \arg{error-text} \arg{help-text}\\
+ |\PackageError| \arg{package-name} \arg{error-text} \arg{help-text}
+\end{decl}
+These produce an error message. The \m{error-text} is displayed and the
+|?| error prompt is shown. If the user types |h|, they will be shown
+the \m{help-text}.
+
+Within the \m{error-text} and \m{help-text}: |\protect| can be used to
+stop a command from expanding; |\MessageBreak| causes a line-break;
+and |\space| prints a space.
+
+Note that the \m{error-text} will have a full stop added to it, so do
+not put one into the argument.
+
+For example:
+\begin{verbatim}
+ \newcommand{\foo}{FOO}
+ \PackageError{ethel}{%
+ Your hovercraft is full of eels,\MessageBreak
+ and \protect\foo\space is \foo
+ }{%
+ Oh dear! Something's gone wrong.\MessageBreak
+ \space \space Try typing \space <<return>>
+ \space to proceed, ignoring \protect\foo.
+ }
+\end{verbatim}
+produces this display:
+\begin{verbatim}
+ ! Package ethel Error: Your hovercraft is full of eels,
+ (ethel) and \foo is FOO.
+
+ See the ethel package documentation for explanation.
+\end{verbatim}
+If the user types |h|, this will be shown:
+\begin{verbatim}
+ Oh dear! Something's gone wrong.
+ Try typing <<return>> to proceed, ignoring \foo.
+\end{verbatim}
+
+\begin{decl}
+ |\ClassWarning| \arg{class-name} \arg{warning-text}\\
+ |\PackageWarning| \arg{package-name} \arg{warning-text}\\
+ |\ClassWarningNoLine| \arg{class-name} \arg{warning-text}\\
+ |\PackageWarningNoLine| \arg{package-name} \arg{warning-text}\\
+ |\ClassInfo| \arg{class-name} \arg{info-text}\\
+ |\PackageInfo| \arg{package-name} \arg{info-text}
+\end{decl}
+The four |Warning| commands are similar to the error commands, except
+that they produce only a warning on the screen, with no error prompt.
+
+The first two, |Warning| versions, also show the line number where the
+warning occurred, whilst the second two, |WarningNoLine| versions, do
+not.
+
+The two |Info| commands are similar except that they log the
+information only in the transcript file, including the line number.
+There are no |NoLine| versions of these two.
+
+Within the \m{warning-text} and \m{info-text}: |\protect| can be used to
+stop a command from expanding; |\MessageBreak| causes a line-break;
+and |\space| prints a space.
+Also, these should not end with a full stop as one is
+automatically added.
+
+
+\subsection{Defining commands}
+\label{Sec:commands.define}
+
+\LaTeXe{} provides some extra methods of (re)defining commands that are
+intended for use in class and package files.
+
+\NEWfeature{1994/12/01}
+The \texttt{*}-forms of these commands should be used to define
+commands that are not, in \TeX{} terms, long. This can be useful for
+error-trapping with commands whose arguments are not intended to
+contain whole paragraphs of text.
+
+\begin{decl}
+ |\DeclareRobustCommand| \arg{cmd} \oarg{num} \oarg{default}
+ \arg{definition}\\
+ |\DeclareRobustCommand*| \arg{cmd} \oarg{num} \oarg{default}
+ \arg{definition}
+\end{decl}
+This command takes the same arguments as |\newcommand| but it declares
+a robust command, even if some code within the \m{definition} is
+fragile. You can use this command to define new robust commands, or
+to redefine existing commands and make them robust. A log is put into
+the transcript file if a command is redefined.
+
+For example, if |\seq| is defined as follows:
+\begin{verbatim}
+ \DeclareRobustCommand{\seq}[2][n]{%
+ \ifmmode
+ #1_{1}\ldots#1_{#2}%
+ \else
+ \PackageWarning{fred}{You can't use \protect\seq\space in text}%
+ \fi
+ }
+\end{verbatim}
+Then the command |\seq| can be used in moving arguments, even though
+|\ifmmode| cannot, for example:
+\begin{verbatim}
+ \section{Stuff about sequences $\seq{x}$}
+\end{verbatim}
+
+Note also that there is no need to put a |\relax| before the
+|\ifmmode| at the beginning of the definition; this is because the
+protection given by this |\relax| against expansion at the wrong time
+will be provided internally.
+
+\begin{decl}
+ |\CheckCommand| \arg{cmd} \oarg{num} \oarg{default}
+ \arg{definition}\\
+ |\CheckCommand*| \arg{cmd} \oarg{num} \oarg{default}
+ \arg{definition}
+\end{decl}
+This takes the same arguments as |\newcommand| but, rather than define
+\m{cmd}, it just checks that the current definition of \m{cmd} is
+exactly as given by \m{definition}. An error is raised if these
+definitions differ.
+
+This command is useful for checking the state of the system before
+your package starts altering the definitions of commands. It allows
+you to check, in particular, that no other package has redefined the
+same command.
+
+\subsection{Moving arguments}
+
+\NEWdescription{1994/12/01}
+The setting of protect whilst processing (i.e.~moving) moving arguments
+has been reimplemented, as has the method of writing information from
+the |.aux| file to other files such as the |.toc| file. Details can
+be found in the file |ltdefns.dtx|.
+
+We hope that these changes will not affect many packages.
+
+\section{Miscellaneous commands, etc}
+\label{Sec:commands.misc}
+
+\subsection{Layout parameters}
+
+\begin{decl}
+|\paperheight|\\
+|\paperwidth|
+\end{decl}
+These two parameters are usually set by the class to be the size of
+the paper being used. This should be actual paper size, unlike
+|\textwidth| and |\textheight| which are the size of the main text
+body within the margins.
+
+
+\subsection{Case changing}
+\label{sec:case}
+
+\begin{decl}
+ |\MakeUppercase| \arg{text} \\
+ |\MakeLowercase| \arg{text}
+\end{decl}
+
+\NEWfeature{1995/06/01}
+\TeX{} provides two primitives |\uppercase| and |\lowercase| for
+changing the case of text. These are sometimes used in document
+classes, for example to set information in running heads in all
+capitals.
+
+Unfortunately, these \TeX{} primitives do not change the case of
+characters accessed by commands like |\ae| or |\aa|. To overcome this
+problem, \LaTeX{} provides two new commands |\MakeUppercase| and
+|\MakeLowercase| to do this.
+
+For example:
+\begin{quotation}
+\begin{tabular}{rl}
+ |\uppercase{aBcD\ae\AA\ss\OE}| & \uppercase{aBcD\ae\AA\ss\OE}\\
+ |\lowercase{aBcD\ae\AA\ss\OE}| & \lowercase{aBcD\ae\AA\ss\OE}\\
+ |\MakeUppercase{aBcD\ae\AA\ss\OE}| &
+ \MakeUppercase{aBcD\ae\AA\ss\OE}\\
+ |\MakeLowercase{aBcD\ae\AA\ss\OE}| & \MakeLowercase{aBcD\ae\AA\ss\OE}
+\end{tabular}
+\end{quotation}
+
+The commands |\MakeUppercase| and |\MakeLowercase| themselves are
+robust, but they have moving arguments.
+
+The commands use the \TeX{} primitives |\uppercase| and |\lowercase|,
+and so have a number of unexpected `features'. In particular, they
+change the case of everything (except characters in the names of
+control-sequences) in their text argument: this includes mathematics,
+environment names, and label names.
+
+For example:
+\begin{verbatim}
+ \MakeUppercase{$x+y$ in \ref{foo}}
+\end{verbatim}
+produces $X+Y$ and the warning:
+\begin{verbatim}
+ LaTeX Warning: Reference `FOO' on page ... undefined on ...
+\end{verbatim}
+In the long run, we would like to use all-caps fonts rather than any
+command like |\MakeUppercase| but this is not possible at the moment
+because such fonts do not exist.
+
+\NEWdescription{1995/12/01}
+In order that upper/lower-casing will work reasonably well, and in
+order to provide any correct hyphenation, \LaTeXe{} \emph{must} use,
+throughout a document, the same fixed table for changing case.
+The table used is designed for the font encoding |T1|; this works well
+with the standard \TeX{} fonts for all Latin alphabets but will cause
+problems when using other alphabets.
+
+\subsection{The `openany' option in the `book' class}
+
+\NEWdescription{1996/06/01}
+The |openany| option allows chapter and similar openings to
+occur on left hand pages. Previously this option affected only
+|\chapter| and |\backmatter|. It now also affects
+|\part|, |\frontmatter| and |\mainmatter|.
+
+\subsection{Better user-defined math display environments}
+
+\begin{decl}
+ |\ignorespacesafterend|
+\end{decl}
+
+\NEWfeature{1996/12/01}
+\NEWdescription{2003/12/01}
+Suppose that you want to define an environment for displaying text
+that is numbered as an equation. A straightforward way to do this is
+as follows:
+\begin{verbatim}
+ \newenvironment{texteqn}
+ {\begin{equation}
+ \begin{minipage}{0.9\linewidth}}
+ {\end{minipage}
+ \end{equation}}
+\end{verbatim}
+However, if you have tried this then you will probably have noticed
+that it does not work perfectly when used in the middle of a paragraph
+because an inter-word space appears at the beginning of the first
+line after the environment.
+
+There is now an extra command (with a very long name) available that
+you can use to avoid this problem; it should be inserted as shown here:
+\begin{verbatim}
+ \newenvironment{texteqn}
+ {\begin{equation}
+ \begin{minipage}{0.9\linewidth}}
+ {\end{minipage}
+ \end{equation}
+ \ignorespacesafterend}
+\end{verbatim}
+
+This command may also have other uses.
+
+\subsection{Normalising spacing}
+
+\begin{decl}
+ |\normalsfcodes|
+\end{decl}
+
+\NEWfeature{1997/06/01}
+This command should be used to restore the normal settings of the
+parameters that affect spacing between words, sentences, etc.
+
+An important use of this feature is to correct a problem, reported by
+Donald Arseneau, that punctuation in page headers has always (in all
+known \TeX{} formats) been potentially wrong whenever a page break
+happens while a local setting of the space codes is in effect. These
+space codes are changed by, for example, the command
+\verb|\frenchspacing|) and the \textsf{verbatim} environment.
+
+It is normally given the correct definition automatically in
+|\begin{document}| and so need not be explicitly set; however, if it
+is explicitly made nonempty in a class file then automatic
+default setting will be over-ridden.
+
+
+\section{Upgrading \LaTeX~2.09 classes and packages}
+\label{Sec:upgrade}
+
+This section describes the changes you may need to make when you
+upgrade an existing \LaTeX{} style to a package or class but we shall
+start in optimistic mode.
+
+Many existing style files will run with \LaTeXe{} without any
+modification to the file itself. When everything is running OK,
+please put a note in the newly created package or class file to record
+that it runs with the new standard \LaTeX{}; then distribute it to
+your users.
+
+\subsection{Try it first!}
+\label{Sec:try-it}
+
+The first thing you should do is to test your style in `compatibility
+mode'. The only change you need to make in order to do this is,
+possibly, to change the extension of the file to |.cls|: you should
+make this change only if your file was used as a main document style.
+Now, without any other modifications, run \LaTeXe{} on a document that
+uses your file. This assumes that you have a suitable collection of
+files that tests all the functionality provided by your style file.
+(If you haven't, now is the time to make one!)
+
+You now need to change the test document files so that they are
+\LaTeXe{} documents: see \emph{\usrguide} for details of how to do
+this and then try them again. You have now tried the test documents
+in both \LaTeXe{} native mode and \LaTeX~2.09 compatibility mode.
+
+\subsection{Troubleshooting}
+\label{Sec:trouble}
+
+If your file does not work with \LaTeXe{}, there are two likely
+reasons.
+\begin{itemize}
+\item \LaTeX{} now has a robust, well-defined designer's interface for
+ selecting fonts, which is very different from the \LaTeX~2.09
+ internals.
+\item Your style file may have used some \LaTeX~2.09 internal commands
+ which have changed, or which have been removed.
+\end{itemize}
+
+When you are debugging your file, you will probably need more
+information than is normally displayed by \LaTeXe. This is achieved
+by resetting the counter |errorcontextlines| from its default value of
+$-1$ to a much higher value, e.g.~999.
+
+\subsection{Accommodating compatibility mode}
+
+Sometimes an existing collection of \LaTeX~2.09 documents makes it
+inconvenient or impossible to abandon the old commands entirely.
+If this is the case, then it is possible to accommodate both conventions
+by making special provision for documents processed in compatibility
+mode.
+
+\begin{decl}
+|\if@compatibility|
+\end{decl}
+This switch is set when a document begins with |\documentstyle| rather
+than |\documentclass|. Appropriate code can be supplied for either
+condition, as follows:
+\begin{verbatim}
+ \if@compatibility
+ <code emulating LaTeX 2.09 behavior>
+ \else
+ <code suitable for LaTeX2e>
+ \fi
+\end{verbatim}
+
+
+\subsection{Font commands}
+
+Some font and size commands are now defined by the document class
+rather than by the \LaTeX{} kernel. If you are upgrading a
+\LaTeX~2.09 document style to a class that does not load one of the
+standard classes, then you will probably need to add definitions for
+these commands.
+
+\begin{decl}
+ |\rm| |\sf| |\tt| |\bf| |\it| |\sl| |\sc|
+\end{decl}
+None of these short-form font selection commands are defined in the
+\LaTeXe{} kernel. They are defined by all the standard class files.
+
+If you want to define them in your class file, there are several
+reasonable ways to do this.
+
+One possible definition is:
+\begin{verbatim}
+ \newcommand{\rm}{\rmfamily}
+ ...
+ \newcommand{\sc}{\scshape}
+\end{verbatim}
+This would make the font commands orthogonal; for example
+|{\bf\it text}| would produce bold italic, thus: \textbf{\textit{text}}.
+It will also make them produce an error if used in math mode.
+
+Another possible definition is:
+\begin{verbatim}
+ \DeclareOldFontCommand{\rm}{\rmfamily}{\mathrm}
+ ...
+ \DeclareOldFontCommand{\sc}{\scshape}{\mathsc}
+\end{verbatim}
+This will make |\rm| act like |\rmfamily| in text mode (see above) and
+it will make |\rm| select the |\mathrm| math alphabet in math mode.
+
+Thus |${\rm math} = X + 1$| will produce `${\rm math} = X + 1$'.
+
+If you do not want font selection to be orthogonal then you can
+follow the standard classes and define:
+\begin{verbatim}
+ \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
+ ...
+ \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\mathsc}
+\end{verbatim}
+This means, for example, that |{\bf\it text}| will produce medium
+weight (rather than bold) italic, thus: \textit{text}.
+
+\begin{decl}
+ |\normalsize| \\
+ |\@normalsize|
+\end{decl}
+The command |\@normalsize| is retained for compatibility with
+\LaTeX~2.09 packages which may have used its value; but redefining it
+in a class file will have no effect since it is always reset to have
+the same meaning as |\normalsize|.
+
+This means that classes \emph{must} now redefine |\normalsize| rather
+than redefining |\@normalsize|; for example (a rather incomplete one):
+\begin{verbatim}
+ \renewcommand{\normalsize}{\fontsize{10}{12}\selectfont}
+\end{verbatim}
+Note that |\normalsize| is defined by the \LaTeX{} kernel to be an
+error message.
+
+\begin{decl}
+ |\tiny| |\footnotesize| |\small| |\large|\\
+ |\Large| |\LARGE| |\huge| |\Huge|
+\end{decl}
+None of these other `standard' size-changing commands are defined in
+the kernel: each needs to be defined in a class file if you need it.
+They are all defined by the standard classes.
+
+This means you should use |\renewcommand| for |\normalsize| and
+|\newcommand| for the other size-changing commands.
+
+
+\subsection{Obsolete commands}
+
+Some packages will not work with \LaTeXe{}, normally because they relied
+on an internal \LaTeX{} command which was never supported and has now
+changed, or been removed.
+
+In many cases there will now be a robust, high-level means of
+achieving what previously required low-level commands. Please consult
+Section~\ref{Sec:commands} to see if you can now use the \LaTeXe{}
+class and package writers commands.
+
+Also, of course, if your package or class redefined any of the kernel
+commands (i.e.~those defined in the files |latex.tex|, |slitex.tex|,
+|lfonts.tex|, |sfonts.tex|) then you will need to check it very
+carefully against the new kernel in case the implementation has
+changed or the command no longer exists in the \LaTeX2e{} kernel.
+
+Too many of the internal commands of \LaTeX~2.09 have been
+re-implemented or removed to be able to list them all here. You must
+check any that you have used or changed.
+
+We shall, however, list some of the more important commands which are
+no longer supported.
+
+\begin{decl}
+ |\tenrm| |\elvrm| |\twlrm| \dots\\
+ |\tenbf| |\elvbf| |\twlbf| \dots\\
+ |\tensf| |\elvsf| |\twlsf| \dots\\
+ \qquad$\vdots$
+\end{decl}
+The (approximately) seventy internal commands of this form are no longer
+defined. If your class or package uses them then \emph{please}
+replace them with new font commands described in \emph{\fntguide}.
+
+For example, the command |\twlsf| should be replaced by:
+\begin{verbatim}
+ \fontsize{12}{14}\normalfont\sffamily\selectfont
+\end{verbatim}
+
+Another possibility is to use the |rawfonts| package, described in
+\emph{\usrguide}.
+
+Also, remember that many of the fonts preloaded by \LaTeX~2.09
+are no longer preloaded.
+
+\begin{decl}
+ |\vpt| |\vipt| |\viipt| \dots
+\end{decl}
+These were the internal size-selecting commands in \LaTeX~2.09.
+(They can still be used in \LaTeX~2.09 compatibility mode.)
+Please use the command |\fontsize| instead: see \emph{\fntguide} for
+details.
+
+For example, |\vpt| should be replaced by:
+\begin{verbatim}
+ \fontsize{5}{6}\normalfont\selectfont
+\end{verbatim}
+
+\begin{decl}
+ |\prm|, |\pbf|, |\ppounds|, |\pLaTeX| \dots
+\end{decl}
+\LaTeX~2.09 used several commands beginning with |\p| in order to
+provide `protected' commands. For example, |\LaTeX| was defined to be
+|\protect\pLaTeX|, and |\pLaTeX| was defined to produce the \LaTeX{}
+logo. This made |\LaTeX| robust, even though |\pLaTeX| was not.
+
+These commands have now been reimplemented using
+|\DeclareRobustCommand|
+(described in Section~\ref{Sec:commands.define}).
+If your package redefined one of the |\p|-commands then you must
+remove the redefinition and use |\DeclareRobustCommand| to redefine the
+non-|\p| command.
+
+\begin{decl}
+|\footheight|\\
+|\@maxsep|\\
+|\@dblmaxsep|
+\end{decl}
+These parameters are not used by \LaTeXe{} so they have been removed,
+except in \LaTeX~2.09 compatibility mode. Classes should no longer
+set them.
+
+\begin{thebibliography}{1}
+
+\bibitem{A-W:DEK91}
+Donald~E. Knuth.
+\newblock {\em The \TeX book}.
+\newblock Addison-Wesley, Reading, Massachusetts, 1986.
+\newblock Revised to cover \TeX3, 1991.
+
+\bibitem{A-W:LLa94}
+Leslie Lamport.
+\newblock {\em {\LaTeX:} A Document Preparation System}.
+\newblock Addison-Wesley, Reading, Massachusetts, second edition, 1994.
+
+\bibitem{A-W:MG2004}
+Frank Mittelbach and Michel Goossens.
+\newblock {\em The {\LaTeX} Companion second edition}.
+\newblock With Johannes Braams, David Carlisle, and Chris Rowley.
+\newblock Addison-Wesley, Reading, Massachusetts, 2004.
+
+\end{thebibliography}
+
+\newpage
+\thispagestyle{empty}
+
+\section*{\LaTeXe{} Summary sheet: updating old styles}
+
+Section references below are to \emph{\clsguide}.
+
+\begin{enumerate}
+
+\item Should it become a class or a package?
+ See Section~\ref{Sec:classorpkg} for how to answer this question.
+
+\item If it uses another style file, then you will need to obtain an
+ updated version of this other file. Look at Section~\ref{Sec:loading}
+ for information on how to load other class and package files.
+
+\item Try it: see Section~\ref{Sec:try-it}.
+
+\item It worked? Excellent, but there are probably still some things
+ you should change in order to make your file into a well-structured
+ \LaTeXe{} file that is both robust and portable. So you should now
+ read Section~\ref{Sec:writing}, especially~\ref{Sec:general}. You
+ will also find some useful examples in Section~\ref{Sec:structure}.
+
+ If your file sets up new fonts, font-changing commands or symbols,
+ you should also read \emph{\fntguide}.
+
+\item It did not work? There are three possibilities here:
+ \begin{itemize}
+ \item error messages are produced whilst reading your file;
+ \item error messages are produced whilst processing test documents;
+ \item there are no errors but the output is not as it should be.
+ \end{itemize}
+ Don't forget to check carefully for this last possibility.
+
+ If you have got to this stage then you will need to read
+ Section~\ref{Sec:upgrade} to find the solutions that will make your
+ file work.
+\end{enumerate}
+
+\end{document}
+
diff --git a/macros/latex-dev/base/cmextra.ins b/macros/latex-dev/base/cmextra.ins
index 292bcd46d6..00a8554464 100644
--- a/macros/latex-dev/base/cmextra.ins
+++ b/macros/latex-dev/base/cmextra.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2018
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2018
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/cmfonts.fdd b/macros/latex-dev/base/cmfonts.fdd
index 1c83814ee5..f330394792 100644
--- a/macros/latex-dev/base/cmfonts.fdd
+++ b/macros/latex-dev/base/cmfonts.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/cmfonts.ins b/macros/latex-dev/base/cmfonts.ins
index 79da8994db..b28cb7ba29 100644
--- a/macros/latex-dev/base/cmfonts.ins
+++ b/macros/latex-dev/base/cmfonts.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/cmfonts.pdf b/macros/latex-dev/base/cmfonts.pdf
index f475df54a9..ed19ce70b2 100644
--- a/macros/latex-dev/base/cmfonts.pdf
+++ b/macros/latex-dev/base/cmfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cyrguide.pdf b/macros/latex-dev/base/cyrguide.pdf
new file mode 100644
index 0000000000..ef24d35ed0
--- /dev/null
+++ b/macros/latex-dev/base/cyrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/cyrguide.tex b/macros/latex-dev/base/cyrguide.tex
new file mode 100644
index 0000000000..ed73423510
--- /dev/null
+++ b/macros/latex-dev/base/cyrguide.tex
@@ -0,0 +1,398 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1999/02/28]
+
+\title{Cyrillic languages support in \LaTeX}
+
+\author{\copyright~Copyright 1998--1999,\\ Vladimir Volovich,
+ Werner Lemberg and \LaTeX3 Project Team.\\ All rights reserved.}
+
+\date{12 March 1999}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+\begin{abstract}
+ This document contains basic information on the Cyrillic setup for
+ \LaTeX{}: how to get the fonts, how to set them up, how to use
+ the interface, its interaction with \babel{}, etc. This is only a first
+ draft of the document and it will probably be modified in future; so
+ please send in comments on it via the \texttt{latexbug} system
+ (see below).
+\end{abstract}
+
+
+\section{Introduction}
+
+Most Latin-based European languages were supported in \LaTeX{} by
+introducing the~|T1|~font encoding and by using the \textsf{fontenc}
+and \textsf{inputenc} packages; these use only standard \TeX{} means
+to support any \mbox{8-bit} input encoding and this one standard font
+encoding. The restriction to a single font encoding guarantees that
+multiple languages can happily coexist in one document (\eg
+hyphenation will be correct for all languages).
+
+Starting with the December~1998 Release, \LaTeX{} finally supports
+Cyrillic languages. This support is based on the new standard
+Cyrillic \TeX{} font encodings---|T2A|, |T2B|, |T2C|, and~|X2|. The
+first three of these satisfy some basic requirements for
+\LaTeX{}~|T*|~encodings, and thus can be used in multi-lingual documents
+with other languages based on standard font encodings.
+
+The reason why we need four different Cyrillic font encodings is that
+these font encodings support \emph{all} the Cyrillic languages that
+have been used during the twentieth century (see
+Section~\ref{fontencs})! The number of Cyrillic glyphs is large, so
+they cannot be represented with 128~character slots; the other (lower)
+128~slots are reserved for Latin letters and other invariant symbols
+that are needed for the encoding to be a conformant
+\LaTeX{}~\texttt{T}~encoding.
+
+There are some glyphs in the |T2*|~encodings which do not yet have
+associated characters in \emph{Unicode}, the world-wide character
+standard. Also, one more font encoding, |T2D|,~is planned for a
+forthcoming release of \LaTeX{}. A lot of Cyrillic input encodings
+are already supported (see Section~\ref{inputencs}), and additional
+encodings could be added easily.
+
+
+\subsection{Acknowledgments}
+\label{sec:acks}
+
+The work on |T2*|~encodings was carried out by the T2~Team, led by
+Alexander Berdnikov (other members are Mikhail Kolodin and Andrew
+Janishewskii). The LH~fonts were produced by Olga Lapko (with
+A.~Khodulev). The \textsf{T2} bundle and \textsf{ruhyphen} package
+were written by Werner Lemberg and Vladimir Volovich (except that the
+concrete hyphenation patterns which are part of \textsf{ruhyphen} came
+from individual authors). The support for the Ukrainian language was
+prepared by Andrij Shvaika.
+
+
+\section{Installation}
+
+The \textsf{fontenc} and \textsf{inputenc} packages are installed
+automatically in every base \LaTeX{} distribution.
+
+All the necessary extra files to use with these packages for Cyrillic
+are in the \textsf{cyrillic} bundle, which at present contains the
+following: four font encoding definition files (|t2aenc.def|,
+|t2benc.def|, |t2cenc.def|, |x2enc.def|); several input encoding
+definition files (all the other |*.def| files), and font definition
+files (|*.fd|).
+The installation of these is described here.
+
+\subsection{Fonts}
+
+The default font families in \LaTeX{} are the Computer Modern
+families, namely the CM~fonts (|OT1|~encoded) and the EC~fonts
+(|T1|~encoded). The LH~fonts, which are now available, provide
+Computer Modern fonts for all Cyrillic font encodings. They are
+designed to be compatible with the EC~fonts, and they provide the same
+font shapes and sizes; they are available at |CTAN:fonts/cyrillic/lh|
+(the latest version is 3.20). The installation instructions for the
+fonts are in the file |INSTALL| in the font distribution.
+
+Other fonts, including Type~1 fonts, can also be used, provided that
+their encoding (for \TeX{}) is \mbox{|T2|-compatible}. Some
+ready-to-use packages supporting such fonts are also available, \eg at
+\URL{ftp://ftp.vsu.ru/pub/tex} (they should soon be on \ctan). Currently,
+you will find two packages there: \textsf{PsCyr}, which contains some
+freely distributable Cyrillic Type~1 fonts with support for \LaTeX{};
+and \textsf{c1fonts}, which contains virtual fonts similar to the
+\textsf{AE}~fonts package using the BlueSky and BaKoMa fonts
+available from \ctan{} (see the |README| file in that package for
+detailed information). Further font packages are expected soon.
+
+\subsection{Hyphenation patterns}
+
+You can find a collection of hyphenation patterns for the Russian
+language in the \textsf{ruhyphen} package at
+|CTAN:language/hyphenation/ruhyphen|. These patterns support the
+|T2*|~encodings, as well as other popular font encodings used for
+Russian typesetting (including the Omega internal encoding).
+Patterns for other Cyrillic languages should be adapted to work with
+the |T2*|~encodings.
+
+\subsection{\babel{} support for Russian and Ukrainian}
+\label{bblrus}
+
+Version~3.6k of \babel{} includes support for the |T2*|~encodings and
+for typesetting both Russian and Ukrainian texts using the Cyrillic
+letters. The temporary fontencoding |LWN|, which was used in earlier
+releases of \babel{}, will be withdrawn in the near future and replaced
+by the |OT2| encoding.
+
+\subsection{Getting pre-built packages}
+
+Many of the major \TeX{} distributions, such as te\TeX{}, fp\TeX{} and
+\TeX{}live, contain (or soon will) everything that is needed,
+including the LH~fonts, \textsf{ruhyphen} and the latest version of
+\babel{}. We hope that all \TeX{} distributions will soon include all
+of these, so that the chances are that you will not need to install
+this by yourself (but it is not difficult).
+
+If you are using em\TeX, Mik\TeX, or fp\TeX, you
+can download the \textsf{ruemtex} package from
+\URL{ftp://ftp.vsu.ru/pub/tex}.
+
+\section{Usage}
+
+Support for Cyrillic is based on these standard \LaTeX{} mechanisms:
+the \textsf{fontenc} and \textsf{inputenc} packages (and on \babel{}).
+Thus the basic principles for its use are similar to those for other
+European languages: you simply add, to your document preamble, lines
+like the following.
+
+\begin{verbatim}
+\usepackage[T2A]{fontenc}
+\usepackage[koi8-r]{inputenc}
+\end{verbatim}
+
+Here you can put any desired input encoding instead of
+\mbox{\texttt{koi8-r}}: for example, it would be \texttt{cp866} if you are
+using a MS-DOS text editor with this Cyrillic code page to prepare your
+documents, or \texttt{cp1251} if you are a MS~Windows user with Cyrillic
+support. A full list of the available Cyrillic encodings can be found in
+Section~\ref{inputencs} and in the file |cyinpenc.dtx|.
+
+Documents are, naturally, not restricted to a single font encoding;
+this is essential for multi-lingual journals or documents. Such
+changes can be made by using the |\fontencoding| command as part of a
+font-change. However, it is best to access these font encodings via a
+higher-level interface.
+
+Since such changes are often closely related to other
+language-dependent settings, it is often sensible to use the \babel{}
+system, which provides further useful `localisation' and standardised
+multi-lingual interfaces (for further details, see
+Section~\ref{bblrus}). Then you can use lines like the following in
+your document:
+
+\begin{verbatim}
+\usepackage[koi8-r]{inputenc}
+\usepackage[russian]{babel}
+\end{verbatim}
+
+This will automatically choose the default font encoding for Russian,
+which is |T2A|, if available. Documentation of the complete set of
+font-encoding selection rules can be found in |cyrillic.dtx| which is
+part of |rusbabel|.
+
+These \LaTeX{} interfaces are very convenient because they make your
+documents completely portable, being based solely on standard \TeX{}
+features. This will mean that your documents can be processed on any
+\TeX{} system without any need for re-encoding to the `native'
+encoding used on each platform; this is because the encoding of the
+document is specified in the document itself.
+
+Moreover, if necessary, more than one input encoding can be used
+within a document; this could be useful if, for example, you need to
+combine articles prepared by authors on different machines. Each part
+of the document is then identified by a |\inputencoding| command,
+which can therefore only be used between paragraphs.
+
+Please note that you must always use the two standard \LaTeX{}
+commands, |\MakeUppercase| and |\MakeLowercase| to produce uppercase
+or lowercase text in your documents. This is because |\uppercase| and
+|\lowercase| will not work at all for Cyrillic (note that these latter
+two commands are not, and never have been, available for use directly
+in \LaTeX{} documents).
+
+
+\section{Font encodings for Cyrillic languages}
+\label{fontencs}
+
+The Cyrillic font encodings support the following languages. Note
+that some languages can be properly typeset with more than one
+encoding.
+
+\begin{itemize}
+\raggedright
+\item[|T2A|:]
+ Abaza, Avar, Agul, Adyghei, Azerbaijani, Altai, Balkar, Bashkir,
+ Bulgarian, Buryat, Byelorussian, Gagauz, Dargin, Dungan, Ingush,
+ Kabardino-Cherkess, Kazakh, Kalmyk, Karakalpak, Karachaevskii,
+ Karelian, Kirghiz, Komi-Zyrian, Komi-Permyak, Kumyk, Lak, Lezghin,
+ Macedonian, Mari-Mountain, Mari-Valley, Moldavian, Mongolian,
+ Mordvin-Moksha, Mordvin-Erzya, Nogai, Oroch, Osetin, Russian, Rutul,
+ Serbian, Tabasaran, Tadzhik, Tatar, Tati, Teleut, Tofalar, Tuva,
+ Turkmen, Udmurt, Uzbek, Ukrainian, Hanty-Obskii, Hanty-Surgut,
+ Gipsi, Chechen, Chuvash, Crimean-Tatar.
+\item[|T2B|:]
+ Abaza, Avar, Agul, Adyghei, Aleut, Altai, Balkar, Byelorussian,
+ Bulgarian, Buryat, Gagauz, Dargin, Dolgan, Dungan, Ingush, Itelmen,
+ Kabardino-Cherkess, Kalmyk, Karakalpak, Karachaevskii, Karelian,
+ Ketskii, Kirghiz, Komi-Zyrian, Komi-Permyak, Koryak, Kumyk, Kurdian,
+ Lak, Lezghin, Mansi, Mari-Valley, Moldavian, Mongolian,
+ Mordvin-Moksha, Mordvin-Erzya, Nanai, Nganasan, Negidal, Nenets,
+ Nivh, Nogai, Oroch, Russian, Rutul, Selkup, Tabasaran, Tadzhik,
+ Tatar, Tati, Teleut, Tofalar, Tuva, Turkmen, Udyghei, Uigur, Ulch,
+ Khakass, Hanty-Vahovskii, Hanty-Kazymskii, Hanty-Obskii,
+ Hanty-Surgut, Hanty-Shurysharskii, Gipsi, Chechen, Chukcha, Shor,
+ Evenk, Even, Enets, Eskimo, Yukagir, Crimean Tatar, Yakut.
+\item[|T2C|:]
+ Abkhazian, Bulgarian, Gagauz, Karelian, Komi-Zyrian, Komi-Permyak,
+ Kumyk, Mansi, Moldavian, Mordvin-Moksha, Mordvin-Erzya, Nanai,
+ Orok (Uilta), Negidal, Nogai, Oroch, Russian, Saam, Old-Bulgarian,
+ Old-Russian, Tati, Teleut, Hanty-Obskii, Hanty-Surgut, Evenk,
+ Crimean Tatar.
+\end{itemize}
+
+The |X2|~encoding was designed to support all the above languages.
+Its name does not start with |T| because, for example, it contains no
+Latin letters (it is purely a Cyrillic glyph container); it therefore
+cannot be used in mixed-script documents along with the other |T*|
+encodings. Please consult Section~6.4 \textit{Naming conventions} of
+the file |fntguide.tex| in the base \LaTeX{} distribution for details
+of the differences between \LaTeX{} font encodings and how they are
+named.
+
+There are two other \LaTeX{} Cyrillic font encodings, |OT2| and |LCY|,
+that are not included in the base \LaTeX{} distribution. The first is
+a \mbox{7-bit} encoding (hence the |O|) developed by the AMS; it is
+useful for typesetting relatively small fragments of text in Cyrillic,
+using a Latin transliteration scheme. The other, |LCY|, is an
+\mbox{8-bit} Cyrillic encoding which is not compatible with the
+requirements for \LaTeX{} |T*|~encodings (hence the |L|); thus it is not
+suitable for typesetting multi-lingual documents, but it can be used in
+Plain \TeX{}-based macro packages because it is an extension of |OT1|.
+These two encodings are supported by \babel{} and by \textsf{ot2cyr}.
+
+
+\section{Input encodings}
+\label{inputencs}
+
+Several Cyrillic code-pages are widely used. Currently, \LaTeX{}
+contains support for 20~Cyrillic input encodings (some of which are
+variants of each other).
+
+\begin{itemize}
+
+\item |cp855| --- the standard \mbox{MS-DOS} Cyrillic code-page.
+
+\item |cp866| --- the standard \mbox{MS-DOS} Russian code-page.
+ Several code-pages very similar to this are also supported
+ (the differences are all in the range 242--254).
+ \begin{itemize}
+ \item |cp866av| -- the `Cyrillic Alternative' code-page (an
+ alternative variant of cp866);
+ \item |cp866mav| -- the `Modified Alternative Variant';
+ \item |cp866nav| -- the `New Alternative Variant';
+ \item |cp866tat| -- an experimental Tatarian code-page.
+ \end{itemize}
+
+\item |cp1251| --- the standard MS Windows Cyrillic code-page.
+
+\item \mbox{\texttt{koi8-r}} --- a standard Cyrillic code-page widely
+ used in UNIX-like systems for Russian language support that is
+ specified in RFC~1489. The situation with \mbox{\texttt{koi8-r}} is
+ somewhat similar to that for |cp866|: there are several similar
+ code-pages which coincide for all Russian letters but add some other
+ Cyrillic letters. The following are supported:
+ \begin{itemize}
+ \item \mbox{\texttt{koi8-u}} -- for Ukrainian;
+ \item \mbox{\texttt{koi8-ru}} -- this is described in a draft RFC
+ document specifying a widely used character set for mail and news
+ exchange in the Ukrainian internet community, as well as for
+ presenting WWW information resources in the Ukrainian language;
+ \item |isoir111| -- the \mbox{ISO-IR-111 ECMA} Cyrillic Code Page.
+ \end{itemize}
+
+\item |iso88595| --- the \mbox{ISO 8859-5} Cyrillic code-page (also called
+ \mbox{ISO-IR-144}).
+
+\item |maccyr| --- the Apple Macintosh Cyrillic code-page (also known
+ as Microsoft cp10007) and |macukr|, the Apple Macintosh Ukrainian
+ code-page, very similar to the Cyrillic code-page.
+
+\item The Mongolian code-pages: |ctt| |dbk| |mnk| |mos| |ncc| |mls|.
+ These code-pages were taken from Oliver Corff's `Mon\TeX' package
+ (available at |CTAN:language/mongolian/montex|). Since the |T2*|
+ encodings support the Mongolian Cyrillic script, it is convenient to
+ have support for Mongolian input encodings as well. Pointers to
+ documentation for these code-pages will be much appreciated.
+
+\end{itemize}
+
+
+\section{Reporting bugs}
+
+In case you find a bug and want to report it, please follow the
+guidelines given in the file |bugs.txt| in the base \LaTeX{}
+distributions. Note that there is a category specifically for
+reporting any bugs that occur only when using Cyrillic fonts or
+support packages.
+
+
+\section{Miscellanea in the \textsf{T2} bundle}
+\label{t2m}
+
+The \textsf{T2}~bundle at |CTAN:macros/latex/contrib/supported/t2|
+contains some other useful files, including support for Plain
+\TeX{}-based macro packages, support for Bib\TeX{} and MakeIndex (see
+also the \textsf{xindy} program and package---highly recommended for
+making indices with Cyrillic), support for the \textsf{fontinst}
+package, mapping tables relating these Cyrillic font encodings (and
+input encodings) to the Unicode character names and slots (these are
+in the subdirectory |enc-maps|), and more!
+
+To produce documented source listings of the \textsf{T2}~package, run
+\LaTeX{} on the |*.dtx| and |*.fdd| files therein.
+
+When typesetting Cyrillic texts, there is a tradition of using
+Cyrillic letters (in some situations) within math formul\ae, in
+exactly the same way as most of the world uses Latin letters.
+By default this does not work, because symbols declared with
+|\DeclareTextSymbol| may not be used in math.
+
+If you need within math to `transparently' typeset glyphs declared in
+font encoding definition files, then you could try using the
+experimental \textsf{mathtext} package, which is also in the
+\textsf{T2}~bundle. Note that this package uses up at least one
+additional math alphabet per font encoding. For this and other
+reasons, The \LaTeX3 Project Team considers that this experimental
+extension to \LaTeX{}'s glyph-handling mechanisms should be used with
+caution; but please try it out and send us your opinions and ideas.
+Note that it is not included in the core of \LaTeX{} because both the
+coding and the interfaces are likely to change at some point in the
+future.
+
+Finally, here are some pointers to further information:
+
+\begin{quote}
+ \URL{http://www.cemi.rssi.ru/cyrtug}\\
+ \URL{http://xtalk.price.ru/tex}
+\end{quote}
+
+\end{document}
diff --git a/macros/latex-dev/base/doc.dtx b/macros/latex-dev/base/doc.dtx
index aad1551543..971bb6053e 100644
--- a/macros/latex-dev/base/doc.dtx
+++ b/macros/latex-dev/base/doc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/doc.pdf b/macros/latex-dev/base/doc.pdf
index 6067252d3b..b8d91a63bb 100644
--- a/macros/latex-dev/base/doc.pdf
+++ b/macros/latex-dev/base/doc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/docstrip.dtx b/macros/latex-dev/base/docstrip.dtx
index be3dda6d32..5ee3d1b7ae 100644
--- a/macros/latex-dev/base/docstrip.dtx
+++ b/macros/latex-dev/base/docstrip.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/docstrip.ins b/macros/latex-dev/base/docstrip.ins
index 61a9343af6..7b68b7ce85 100644
--- a/macros/latex-dev/base/docstrip.ins
+++ b/macros/latex-dev/base/docstrip.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -52,7 +52,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -65,7 +65,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/docstrip.pdf b/macros/latex-dev/base/docstrip.pdf
index 0ab1ce1802..a8aadc3522 100644
--- a/macros/latex-dev/base/docstrip.pdf
+++ b/macros/latex-dev/base/docstrip.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ec.ins b/macros/latex-dev/base/ec.ins
index c611508981..196396a24a 100644
--- a/macros/latex-dev/base/ec.ins
+++ b/macros/latex-dev/base/ec.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/encguide.pdf b/macros/latex-dev/base/encguide.pdf
new file mode 100644
index 0000000000..4195748d07
--- /dev/null
+++ b/macros/latex-dev/base/encguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/encguide.tex b/macros/latex-dev/base/encguide.tex
new file mode 100644
index 0000000000..ec18fab6f8
--- /dev/null
+++ b/macros/latex-dev/base/encguide.tex
@@ -0,0 +1,1481 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+%
+
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1994/11/20]
+
+\usepackage[T1]{fontenc}
+\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{}
+\usepackage{textcomp}
+\usepackage{url}
+\usepackage{mflogo}
+
+\addtolength\textheight{6\baselineskip}
+\addtolength\topmargin{-2\baselineskip}
+
+
+\newcommand\ttverb[1]{\texttt{\string#1}}
+
+
+% for encodings
+\providecommand{\Enc}[1]{\texttt{#1}}
+
+% for packages
+\providecommand{\Pkg}[1]{%
+ \textsf{#1}}
+
+% for files
+\providecommand{\File}[1]{%
+ \texttt{#1}}
+
+% let's have meta values too
+\providecommand{\meta}[1]{%
+ \ensuremath{\langle}\emph{#1}\ensuremath{\rangle}}
+
+\usepackage{tabularx}
+
+% eine Umgebung zur Darstellung von Kodierungen
+%
+% Argumente:
+% #1: Name in LaTeX (z.B. OT1)
+% #2: Name der Kodierung (z.B. TeX text)
+% #3: Name des Autors (z.B. Don Knuth)
+% #4: Bereich der benützten Glyphindizes
+% #5: variable Positionen
+% #6: Beispielzeichensatz
+% #7: Referenz
+%
+% XXX add code to handle more than a single font example (e.g., larm1000,
+% lbrm1000, and lcrm1000).
+%
+\newenvironment{encodinginfo}[7]%
+ {\noindent
+ \begin{tabularx}{\linewidth}{@{}l>{\raggedright\let\\\tabularnewline}X}%
+ \LaTeX{} name: & \texttt{#1}\\%
+ Public name: & #2\\%
+ Author: & #3\\%
+ Glyph slots used: & #4\\%
+ Variable slots: & #5\\%
+ Font example: & \def\@tempa{#6}\ifx\@tempa\@empty---%
+ \else\texttt{#6}\referenceftable{#6}\fi\\%
+ Further reference: & #7%
+ \end{tabularx}%
+ \par\nobreak
+ \vspace*{3pt}%
+ \quote
+ }%
+ {\endquote
+ \vspace{6pt}}
+
+\makeatletter
+\def\referenceftable#1{
+ \@ifundefined{r@fonttable:#1}%
+ \relax
+ {;\space encoding table on page~\pageref{fonttable:#1}}%
+}
+
+% font table macros mainly lifted from manmac.tex
+\def\oct#1{\hbox{\rm\'{}\kern-.2em\it#1\/\kern.05em}}
+\def\hex#1{\hbox{\rm\H{}\tt#1}}
+
+\def\oddline#1{\cr\noalign{\nointerlineskip}
+ \multispan{19}\hrulefill&
+ \setbox0=\hbox{\lower 2.3pt\hbox{\hex{#1x}}}\smash{\box0}\cr
+ \noalign{\nointerlineskip}}
+\def\evenline{\cr\noalign{\hrule}}
+\def\chartstrut{\lower4.5pt\vbox to14pt{}}
+\def\beginchart#1#2{$$\global\count@=0 #1
+ \halign to\hsize\bgroup
+ \chartstrut##\tabskip0pt plus10pt&
+ &\hfil##\hfil&\vrule##\cr
+ \lower6.5pt\null
+ &#2&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline}
+\def\endchart{\raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B&
+ &\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$}
+\def\:{\setbox0=\hbox{\noboundary\char\count@\noboundary}%
+ \ifdim\ht0>7.5pt\reposition
+ \else\ifdim\dp0>2.5pt\reposition\fi\fi
+ \box0\global\advance\count@ by1 }
+\def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}
+\def\normalchart{%
+ &\oct{00x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline0
+ &\oct{01x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{02x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline1
+ &\oct{03x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{04x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline2
+ &\oct{05x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{06x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline3
+ &\oct{07x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{10x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline4
+ &\oct{11x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{12x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline5
+ &\oct{13x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{14x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline6
+ &\oct{15x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{16x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline7
+ &\oct{17x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ \top}
+
+\def\notophalf{}
+\def\tophalf{%
+%\noalign{\vskip 5pt\hrule}
+ &\oct{20x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline8
+ &\oct{21x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{22x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline9
+ &\oct{23x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{24x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline A
+ &\oct{25x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{26x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline B
+ &\oct{27x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{30x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline C
+ &\oct{31x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{32x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline D
+ &\oct{33x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{34x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline E
+ &\oct{35x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline
+ &\oct{36x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\oddline F
+ &\oct{37x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&\evenline}
+
+\def\ftable#1#2{%
+ \batchmode
+ \font\X=#1%
+ \errorstopmode
+ \ifx\X\nullfont
+ \@warning{Font #1 not found, table omitted}
+ \else
+ \count@="80
+ \setbox0=\hbox{\X
+ \loop\char\count@\advance\count@ by1 \ifnum\count@<"100
+ \repeat}%
+ \ifdim\wd0>0pt \let\top\tophalf\else\let\top\notophalf\fi
+ \beginchart\X{\hfill\llap{\textbf{#1, \large#2}\label{fonttable:#1}}}\normalchart
+ \endchart\par\vfill
+ \fi}
+\makeatother
+
+
+\setcounter{tocdepth}{3}
+
+\title{\LaTeX{} font encodings}
+
+\author{Frank Mittelbach \and Robin
+ Fairbairns \and Werner Lemberg \and \LaTeX3 Project Team.}
+
+\date{\copyright~Copyright 1995--2016 \\[5pt] 18 February 2016}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+This document explains the ideas that underpin \LaTeX{} font
+encodings and the constraints that apply when defining a new encoding; it
+also lists the encodings that have already been defined.
+
+\subsection{Encodings in \TeX{}}
+
+\TeX{} (the program) implicitly recognises three sorts of encoding,
+and all are (in a sense) discussed in the \TeX{}book~\cite{A-W:DKn86}:
+\begin{itemize}
+\item[1.] The input encoding, which specifies the meanings of characters
+ in files presented to \TeX{} for processing. The \TeX{}book
+ suggests that `your version of \TeX{} will recognise the characters
+ you type on your keyboard' (\TeX{} the program has provision for
+ static translations of input characters).
+\end{itemize}
+Such direct use of \TeX{}'s facilities is not the way modern
+\LaTeX{} (or indeed any other \TeX{} macro package) is likely to deal
+with input encodings. This document does not address the topic of
+input encodings; the interested reader should examine the \LaTeX{}
+base package \Pkg{inputenc} \cite[sec.~7.5.2, p.~357]{A-W:MG2004}.
+\begin{itemize}
+\item[2.] The token stream that \TeX{} processes internally. This stream
+ of \TeX{}'s consciousness is discussed in great detail in the
+ \TeX{}book.
+\end{itemize}
+Again, this document does not address the topic. \LaTeX's internal
+character representation (\textsc{licr}) is well discussed in
+\cite[sec.~7.11.2, p.~442]{A-W:MG2004}.
+\begin{itemize}
+\item[3.] The font encoding---i.e., the mapping of character codes to
+ glyphs in the fonts that are used to typeset \TeX{}'s output.
+ Again, a set of font encodings is enumerated in the \TeX{}book, but
+ that set has proved inadequate to the needs of modern multilingual
+ use of \LaTeX.
+\end{itemize}
+This document explains \emph{why} Knuth's original set of encodings is
+inadequate to modern conditions, and discusses the issues that
+surround the design and definition of new font encodings.
+
+Font encodings are important for more than their r\^{o}le in mapping the
+glyphs of the fonts to be used for typesetting: their glyph tables are
+also the context in which \TeX{}'s hyphenation algorithm operates.
+There are constraints imposed by \TeX{} that affect the way in which
+new font encodings, for use in a multi-lingual environment, may be
+structured (see section~\ref{sec:restrictions} for details).
+
+\subsection{The history of \TeX{} font encodings}
+
+Little attention was paid to font encodings prior to the arrival of
+\TeX{}\,3. Up to that time, one used Donald Knuth's fonts (the
+Computer Modern family, using the encodings we now refer to as \Enc{OT1} and
+the \Enc{OM} series), or one was on one's own.
+
+The Computer Modern text encoding raises problems in unmodified
+\TeX{}, because hyphenation cannot break words containing
+\verb"\accent" commands. Even in those Western European languages for
+which the \Enc{OT1} encoding has symbols for the necessary
+\verb"\accent"-based diacritics, this shortcoming ruins typesetting of
+running text.
+
+With the advent of \TeX{}\,3, with its ability to switch between
+hyphenation pattern sets, it was clear that the situation could not
+continue. Thus a group at the TUG Annual General Meeting in Cork,
+Ireland, specified a uniform encoding for 256-glyph fonts, that
+contains accented letters and non-\textsc{ascii} letters necessary to
+express most Western European languages (and some Eastern European ones)
+without recourse to the \verb"\accent" command.
+
+This ``Cork'' encoding has since been realised in a series of fonts
+designed with Metafont, in at least one font series that is available
+both in Adobe Type 1 format and in OpenType format, % viz., Latin Modern
+and in a number of virtual-font mappings of other font series.
+
+Since the time of the Cork meeting, much effort has been devoted to
+the design of encodings for text fonts to use with \TeX{}, and the
+Cork encoding influenced the design of many such encodings.
+
+Encodings for mathematical fonts have, in contrast, changed little
+since Knuth's contributions. A TUG Technical Working Group was
+established at the Cork meeting, whose aim was to define a set of
+256-glyph encodings to regularise and extend Knuth's originals, using
+ideas from several other fonts that had appeared since, and from the
+known needs of researchers in mathematics and the mathematical sciences.
+
+Independently, a first proposal (the so-called \emph{Aston proposal}) was worked
+out by Justin Ziegler together with Frank Mittelbach and other members of the
+\LaTeX3 project team~\cite{ziegler}. A first implementation of
+this propsal was realized by Matthias Clasen und Ulrik
+Vieth~\cite{clasen,clasen-vieth}.
+
+However, the slow progress of these Mathematical encodings has been
+overtaken by the addition (in the last decade or so) of a large number
+of mathematical symbols to Unicode~\cite{beeton}; one can expect
+further changes so that new public mathematical font encodings will
+most likely be delayed still further.
+
+
+
+\subsection{Further information}
+
+For a general introduction to \LaTeX, including the new features of
+\LaTeXe, you should read \emph{\LaTeXbook},
+Leslie Lamport, Addison Wesley, 2nd~ed, 1994.
+
+A more detailed description of the new features of \LaTeX, including an
+overview of more than 200 packages and nearly 1000 ready to run examples, is
+to be found in \emph{\LaTeXcomp{} second edition} by Frank Mittelbach and
+Michel Goossens~\cite{A-W:MG2004}.
+
+The \LaTeX{} project sponsored a report on Mathematical % spelt out in full
+font encodings, which
+is worth reading for its insight into the problems of defining the way
+in which math is used: see~\cite{ziegler,clasen,clasen-vieth}.
+
+The \LaTeX{} font selection scheme is based on \TeX, which is described
+by its developer in \emph{The \TeX book}, Donald E.~Knuth, Addison
+Wesley, 1986, revised in 1991 to include the features of \TeX~3.
+
+For more information about \TeX{} and \LaTeX, please contact your local
+\TeX{} Users Group, or the international \TeX{} Users Group
+(\url{http://www.tug.org}).
+
+
+
+\section{Existing font encodings}
+
+This section lists the encodings currently assigned; for each
+encoding, we list the registered (\LaTeX{}) name, the assigned purpose
+of the encoding, and the author. Further details may list the code
+positions used in the encoding, the \emph{variable slots} (see below),
+an example font (for which a listing will be provided later in the
+document if the relevant fonts are present), and a source for further
+reference.
+
+While the characteristic feature of an encoding is that each font
+encoded according to the encoding should have the same glyph set,
+there are some encodings (notably \Enc{OT1} and its descendants) in
+which a few glyph code slots differ in their contents in different
+fonts.
+
+\subsection{Naming conventions}
+
+Names for encoding schemes are strings of up to three letters (all
+upper case) plus digits.
+
+The \LaTeX3 project reserves the use of encoding names starting with the
+following letters: |T| (standard 256-long text encodings), |TS|
+(symbols that are designed to extend a corresponding |T| encoding),
+|X| (text encodings that do not conform to the strict requirements for
+|T| encodings), |M| (standard 256-long mathematical encodings), |S| (other
+symbol encodings), |A| (other special applications), |OT| (standard
+128-long text encodings), and |OM| (standard 128-long mathematical encodings).
+
+Please do not use the above starting letters for non-portable
+encodings. If new standard encodings emerge then we shall add them in
+a later release of \LaTeX.
+
+Encoding schemes which are local to a site or a system should start
+with |L|, experimental encodings intended for wide distribution will
+start with |E|, whilst |U| is for Unknown or Unclassified encodings.
+
+\begin{quote}
+ \itshape We recommend that new encoding names should not be
+ introduced unless careful consideration and discussion in the user
+ community has confirmed the need for the encoding. If encodings have to
+ change from font to font, a number of problems arise, so it is best to
+ develop encodings that can be used with a large number of fonts in parallel.
+ This allows documents to be typeset using different fonts without problems.
+
+ The \Enc{TS1} encoding is a good example of a \emph{bad} encoding (even
+ though it was developed with the best intentions) as a huge number of fonts
+ can only implement parts of it. Similarly, the fact that the few sets of
+ available mathematical fonts (beside Computer Modern Math) nearly
+ all implement slightly different encodings is a huge source of
+ problems. Don't add to this if possible!
+\end{quote}
+
+
+\subsection{128$^+$ glyph encodings (text)}
+
+The `OT' series of font encodings start with Donald Knuth's original
+text encoding, that used for the text fonts in the earliest releases
+of \TeX{} itself. The `O' of the encoding designator may be taken as
+signifying `original', or just `old'.
+
+\begin{encodinginfo}{OT1}
+ {\TeX{} text}
+ {Donald Ervin Knuth}
+ {0x00--0x7F}
+ {0x0B--0x0F, 0x24, 0x3C, 0x3E, 0x5C, 0x7B--0x7D}
+% {0X--'177}
+% {'13--'17, '44, '74, '76, '134, '173--'175}
+ {cmr10}
+ {\cite[p.427]{A-W:DKn86}}
+
+ Donald Knuth designed his font encoding (and hence his fonts) in a
+ very different environment from that which now pervades the \TeX{}
+ world: his (mainframe) computer had very little memory, there was
+ little experience in (or demand for) for multilingual technical
+ typesetting, and as a result it was appropriate to sacrifice
+ uniformity for efficiency.
+
+ Thus Knuth's original fonts differ slightly in some encoded slots:
+ for example, the glyphs \texttt{\string<}, \texttt{\string>},
+ \verb=\=, \verb={=, and \verb=}= are only available in the
+ typewriter fonts and the \textdollar{} and \textsterling{} signs
+ share the same position (in different font shapes).
+
+ This means that direct selection of these slots can produce
+ unpredictable results, e.g., typing \texttt{\string<} or
+ \verb=\symbol{'74}= in a document can yield `\textquestiondown'.
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{OT2}
+ {UW cyrillic encoding}
+ {University of Washington}
+ {0x00--0x7F}
+ {---}
+ {wnr10}
+ {\cite{Beeton:TB6-3-124}}
+ Support for this encoding is available in the Cyrillic bundle although for
+ all practical purposes it is better to use one of the \Enc{T2} encodings.
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{OT3}
+ {UW IPA encoding}
+ {University of Washington}
+ {0x00--0x7f}
+ {---}
+ {wsuipa10}
+ {\cite[p.149]{CorkGW:91}}
+ The \Enc{OT3} encoding was never really used with \LaTeXe{}
+ following the introduction of the TIPA system which offers much
+ better support for IPA. In particular, no \File{ot3enc.def}
+ file was ever produced.
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{OT4}
+ {Polish text encoding}
+ {B.~Jackowski and M.~Ry\'cko} %% ? Marcin Woli\'nski
+ {0x00--0x7F, 0x81, 0x82, 0x86, 0x8A, 0x8B, 0x91, 0x99, 0x9B, 0xA1,
+ 0xA2, 0xA6, 0xAA, 0xAB, 0xAE, 0xAF, 0xB1, 0xB9, 0xBB, 0xD3, 0xF3,
+ 0xFF}
+ {0x0B--0x0F, 0x24, 0x3C, 0x3E, 0x5C, 0x7B--0x7D}
+ {plr10}
+ {---}
+
+ While Knuth included the means of typesetting the `lost L' (\L) in
+ his \Enc{OT1} encoding, he omitted the ogonek (\,\,\k{}), a diacritic
+ mark that is also needed in Polish text; hence the appearance, well
+ before the \Enc{T1} encoding, of fonts using this encoding.
+\end{encodinginfo}
+
+\begin{encodinginfo}{OT5}
+ {Not currently allocated}
+ {---}
+ {---}
+ {---}
+ {}
+ {---}
+
+\end{encodinginfo}
+
+
+
+\begin{encodinginfo}{OT6}
+ {Armenian text encoding}
+ {Serguei Dachian}
+ {0x03--0x0F, 0x13--0x7F}
+ {---}
+ {artmr10}
+ {---}
+
+ This encoding was allocated to permit use of Dachian's
+ Armenian fonts in a standard \LaTeX{} environment.
+
+ Because of license issues the \texttt{artmr} fonts are not necessarily
+ included in distributed \TeX{} installations (and for this reason the
+ corresponding encoding table is not shown below). However, the fonts
+ and the support macros can be found on the CTAN archives (look for
+ \texttt{armtex}).
+
+\end{encodinginfo}
+
+
+
+\subsection{256 glyph encodings (text)}
+
+\begin{encodinginfo}{T1}
+ {Cork encoding}
+ {Euro \TeX{} conference at Cork}
+ {0x00--0xFF}
+ {---}
+ {ecrm1000}
+ {\cite[p.514]{tub:MFe90}, \cite[p.99]{Knappen:TB17-2-96}}
+
+ The Cork encoding was developed so that advantage could be taken of
+ the (then) new facilities of \TeX{}\,3, allowing hyphenation of
+ most Western European (and some Eastern European) languages in an
+ unmodified version of \TeX{}.
+
+ The encoding was developed in the absence of any extant effort at
+ font design, but instances written in Metafont (the `EC' fonts), and
+ more recently Adobe Type 1 instances of the same fonts have become
+ available.
+
+ Substantial (but incomplete) instances have also been developed,
+ which use virtual fonts. These latter instances map either Knuth's
+ original (OT1-encoded) fonts, or commercial fonts that contain the
+ Adobe `standard' set of 224 glyphs.
+\end{encodinginfo}
+
+\begin{encodinginfo}
+ {T2A, T2B, T2C}
+ {Cyrillic encodings}
+ {The CyrTUG font team}
+ {0x00--0xFF}
+ {--- (within each encoding)}
+ {larm1000}
+ {\cite{Berdnikov:eurotex-98}}
+
+ There are too many glyphs in the full Cyrillic complement of
+ languages for all of them to be covered by a single
+ \LaTeX{}-compliant encoding (the lower half of each
+ \Enc{T2}~encoding is identical to that of \Enc{T1}, in order that
+ each should be a conforming \LaTeX{} encoding~--- see
+ section~\ref{sec:restrictions}). The approach taken is
+ therefore to develop a single encoding, \Enc{X2} (see \ref{sec:extendedenc})
+ which contains all the glyphs needed for the full set of
+ languages, and then to derive the three \LaTeX{}-complaint
+ \Enc{T2}-family encodings using the \Enc{X2} set together with that of
+ \Enc{T1}.
+
+\end{encodinginfo}
+
+
+
+\begin{encodinginfo}{T3}
+ {IPA encoding}
+ {FUKUI Rei, University of Tokyo}
+ {0x00--0xFF}
+ {---}
+ {tipa10}
+ {\cite[p.102]{Rei:TB17-2-102}}
+
+
+ The \Enc{T3} encoding (and associated macros) provides the glyphs required
+ in phonetic description according to current International Phonetic
+ Association recommendations \cite{ipa}.
+
+ The \Enc{T3} encoding does \emph{not fulfil} the requirements for \Enc{T}
+ encodings---the name is a historical accident. The correct name would be
+ \Enc{X3}, but due to the fact that this font family has been used under its
+ current encoding name for a long time, the name will not change for
+ compatibility reasons.
+
+\end{encodinginfo}
+
+
+
+\begin{encodinginfo}{T4}
+ {African Latin (fc)} % public name
+ {J\"org Knappen} % author name
+ {0x00--0xFF} % range(s) of slots used for glyphs
+ {0x24} % range(s) of slots with variable glyphs if any
+ {fcr10} % name of an example font
+ {\cite{tub:JKn93}}
+
+The African Latin fonts contain in their lower half (0--127) the same
+characters as the European Latin (T1-encoded) Fonts, while in their
+upper half (128--255) they
+contain letters and symbols for African languages that use extended
+Latin alphabets.
+Due to lack of space, J\"org had to play the unfortunate trick of
+assigning \verb=\textdollar= and \verb=\textsterling=
+the same position; users should take these characters
+from the text companion font, if they are needed. Instead of defining
+a lot of new control sequences for the single letters, there are three
+accent-like control sequences with general purpose:
+\verb=\m= (Modified-1),
+\verb=\M= (Modified-2) and
+\verb=\B= (Barred).
+Most standard \LaTeX{} encoding-dependent commands
+work. However, the Icelandic special letters are not available and `best
+replacements' for \verb=\Th=, \verb=\th=, and \verb=\dh=
+are used (barred T and d resp.).
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{T5}
+ {Vietnamese encoding}
+ {Werner Lemberg and
+ Vladimir Volovich}
+ {0x00--0xFF}
+ {---}
+ {vnr10}
+ {\cite{vnr}}
+
+ The \Enc{T5} encoding was developed for Vietnamese. Again, this encoding
+ \emph{does not} conform to the requirements for a \Enc{T}-encoding
+ because its large number of accented letters prevent the \verb=\lccode= and
+ \verb=\uccode= mapping requirements for \Enc{T} encodings from being
+ fulfilled. However, since the Vietnamese language does not
+ use word division in typesetting so that this requirement is
+ actually not important for this particular language.
+ Since every glyph used in Vietnamese text is internally
+ represented as \textsc{licr} macros, the commands \verb=\MakeUppercase= and
+ \verb=\MakeLowercase= still work as expected (as they change the case of the
+ \textsc{ascii} characters in \textsc{licr} definitions).
+
+\end{encodinginfo}
+
+\begin{encodinginfo}
+ {T6}
+ {Armenian}
+ {---}
+ {---}
+ {---}
+ {}
+ {---}
+
+ This encoding is reserved to permit future expansion of Armenian
+ \TeX{} to use 256-character (hyphenatable) fonts.
+\end{encodinginfo}
+
+\begin{encodinginfo}{T7}
+ {Greek encoding}
+ {---}
+ {---}
+ {---}
+ {}
+ {---}
+
+The name is already reserved for a 256 glyph greek encoding. The encoding
+itself hasn't been defined so far.
+
+\end{encodinginfo}
+
+
+
+\subsection{256$^-$ glyph encodings (text symbols)}
+
+\begin{encodinginfo}{TS1}
+ {Text Companion encoding (Cork)}
+ {J\"org Knappen}
+ {0x00--0x0D, 0x12, 0x15, 0x16, 0x18--0x1D, 0x20, 0x24, 0x27, 0x2A,
+ 0x2C--0x3A, 0x3C--0x3E, 0x4D, 0x4F, 0x57, 0x5B, 0x5D--0x60,
+ 0x62--0x64, 0x6C--0x6E, 0x7E--0xBF, 0xD6, 0xF6}
+ {---}
+ {tcrm1000}
+ {\cite{Knappen:TB17-2-96}}
+
+ The text symbol encoding offers access to symbolic glyphs that are
+ commonly used in text (for a variety of reasons), and whose style
+ should vary with the text that surrounds them.
+
+ Unfortunately, the \Enc{TS1} encoding was developed without
+ reference to the glyphs available in existing commercial fonts.
+ As a result, only font families
+ explicitly developed for \TeX{} (i.e., typically originating with
+ \MF{}) actually contain all glyphs required by the \Enc{TS1}
+ encoding. Most other font families (whether free or commercial)
+ often only provide half of the set%
+%%
+%% don't show the comment if the tables are not generated
+%%
+\expandafter\ifx\csname r@fonttable:tcrm1000\endcsname\relax
+\else
+ \expandafter\ifx\csname r@fonttable:ptmr8c\endcsname\relax
+ \else
+ \space (compare the two tables for \Enc{TS1} on
+ pages~\pageref{fonttable:tcrm1000}
+ and~\pageref{fonttable:ptmr8c})%
+ \fi
+\fi.
+ To improve this situation somewhat, NFSS provides a way to define encoding
+ subsets on a per family basis in the \Pkg{textcomp} package (which
+ package offers support for the \Enc{TS1} encoding).
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{TS3}
+ {IPA symbol encoding}
+ {FUKUI Rei, University of Tokyo}
+ {0x00--0x0A, 0x20--0x49, 0x50--0x56, 0x70--0x7B}
+ {---}
+ {tipx10}
+ {\cite{Rei:TB17-2-102}}
+
+ The \Enc{TS3} encoding (together with the \Enc{T3} encoding) provides the
+ glyphs for typesetting phonetic transcriptions following the
+ guidelines of the International Phonetic Association \cite{ipa}. Support
+ is offered through the \Pkg{tipa} package.
+\end{encodinginfo}
+
+
+
+
+\subsection{256 glyph encodings (text extended)}
+\label{sec:extendedenc}
+
+\begin{encodinginfo}
+ {X2}
+ {Cyrillic glyph container}
+ {The CyrTUG font team}
+ {0x00--0xFF}
+ {---}
+ {rxrm1000}
+ {\cite{Berdnikov:eurotex-98}}
+
+ This encoding specifies the glyph container for Cyrillic characters,
+ which is used in specifying the \Enc{T2A}, \Enc{T2B} and \Enc{T2C} encodings.
+\end{encodinginfo}
+
+
+
+
+\subsection{128$^+$ glyph encodings (mathematics)}
+
+
+\begin{encodinginfo}{OML}
+ {\TeX{} math italic}
+ {Donald Ervin Knuth}
+ {0x00--0x7F}
+ {---}
+ {cmmi10}
+ {\cite[p.430]{A-W:DKn86}}
+
+ The \Enc{OML} encoding contains italic Latin and Greek letters for
+ use in mathematical formulas (typically used for variables) together
+ with some symbols.
+
+\end{encodinginfo}
+
+\begin{encodinginfo}{OMS}
+ {\TeX{} math symbol}
+ {Donald Ervin Knuth}
+ {0x00--0x7F}
+ {---}
+ {cmsy10}
+ {\cite[p.431]{A-W:DKn86}}
+
+ The \Enc{OMS} encoding contains basic mathematical symbols,
+ together with an uppercase ``calligraphic'' Latin alphabet.
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{OMX}
+ {\TeX{} math extension}
+ {Donald Ervin Knuth}
+ {0x00--0x7F}
+ {---}
+ {cmex10}
+ {\cite[p.432]{A-W:DKn86}}
+
+ \Enc{OMS} encodes mathematical symbols with variable sizes, such as
+ the $\sum$ sign, which changes its size if used in displayed
+ formulas, and the construction parts for
+ brackets, braces and radicals, etc., which can stretch to accommodate
+ the thing they're enclosing.
+
+\end{encodinginfo}
+
+
+
+
+\subsection{256 glyph encodings (mathematics)}
+
+So far there are no 256 glyph mathematical encodings. A proposal is
+given in \cite{ziegler}.
+
+
+\subsection{Other encodings}
+
+\begin{encodinginfo}
+ {C..}
+ {CJK encodings}
+ {Werner Lemberg}
+ {0x00--0xFF}
+ {---}
+ {} % no font, of course
+ {\cite{CJK}}
+
+ The \Pkg{CJK} package defines a number of encodings which access Chinese,
+ Japanese and Korean fonts.
+
+\end{encodinginfo}
+
+\begin{encodinginfo}
+ {E..}
+ {Experimental encodings}
+ {---}
+ {0x00--0xFF}
+ {all}
+ {}
+ {\cite[p.416]{A-W:MG2004}}
+
+ As the name indicates, encodings starting with the letter \Enc{E} are
+ intended for experimental encodings, that are still likely to change.
+\end{encodinginfo}
+
+\begin{encodinginfo}{L..}
+ {Local encoding (site dependent)}
+ {---}
+ {0x00--0xFF}
+ {all}
+ {}
+ {\cite[p.416]{A-W:MG2004}}
+
+ `Local' encodings provide the means to develop representation
+ techniques that are suited to a particular \TeX{} environment. While
+ the developer has freedom to specify their encoding as he or she
+ pleases, there is a strong incentive to obey the \LaTeX{} rules for
+ encodings, since it will otherwise be difficult to compose text using
+ the encoding.
+
+ At least it was the intention that \Enc{L..} encodings are local and
+ site dependent. However, a number of such encodings became generally
+ used without ever getting a different name allocated.
+
+\end{encodinginfo}
+
+
+
+\begin{encodinginfo}{LY1}
+ {Y\&Y 256 glyph encoding}
+ {Berthold Horn}
+ {0x00--0x08, 0x0C, 0x10, 0x12--0xFF}
+ {\emph{believed none}}
+ {ptmr8y}
+ {\cite[p.416]{A-W:MG2004}}
+
+ This is an alternative to the \Enc{T1} encoding developed by Y\&Y and
+ used in their commercial \TeX{} implementation.
+
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{LV1}
+ {MicroPress encoding}
+ {Michael Vulis}
+ {\emph{unknown}}
+ {\emph{unknown}}
+ {}
+ {\cite[p.416]{A-W:MG2004}}
+
+ This is an encoding developed by MicroPress and used for some of their
+ fonts.
+
+\end{encodinginfo}
+
+
+\begin{encodinginfo}{LGR}
+ {Greek 256 glyph encoding}
+ {\emph{unknown}}
+ {0x00--0xFF}
+ {\emph{believed none}}
+ {grmn1000}
+ {\cite[p.575]{A-W:MG2004}}
+
+ Currently the main encoding in use for the Greek language.
+
+ This encoding doesn't conform to the restrictions for
+ \Enc{T}-encodings described in section~\ref{sec:restrictions} on
+ page~\pageref{sec:restrictions} as it doesn't have \textsc{ascii}
+ glyphs at all.
+
+\end{encodinginfo}
+
+
+\begin{encodinginfo}
+ {PD1}
+ {PDF DocEncoding}
+ {Adobe}
+ {0x08--0x0A, 0x0C, 0x0D, 0x18--0x7E, 0x80--0x9E, 0xA0--0xAE, 0xB0--0xFF}
+ {---}
+ {}
+ {\cite{Adobe:PDF-1.6}, \cite{hyperref}}
+
+ The \Enc{PD1} encoding is a virtual encoding with 256 glyphs needed to
+ produce bookmarks and similar text in PDF document generated with pdf\LaTeX.
+ The encoding is ``virtual'' because by design there are no \TeX{}
+ fonts that cover \Enc{PD1}. Details can be found in appendix D.1
+ of~\cite{Adobe:PDF-1.6}.
+\end{encodinginfo}
+
+\begin{encodinginfo}
+ {PU}
+ {PDF Unicode Encoding}
+ {Adobe}
+ {---}
+ {---}
+ {}
+ {\cite{Adobe:PDF-1.6}, \cite{hyperref}}
+
+ Another virtual encoding (with more than 600 characters) for
+ Unicode-encoded bookmarks in PDF documents.
+\end{encodinginfo}
+
+\begin{encodinginfo}{U}
+ {Unknown encoding}
+ {---}
+ {potentially 0x00-0xFF}
+ {all}
+ {wasy10}
+ {\cite[p.416]{A-W:MG2004}}
+
+ This encoding should be used for fonts that resist classification,
+ e.g., when it is clear that there will never be more than one font
+ using the same encoding.
+
+\end{encodinginfo}
+
+
+
+\section{Restrictions}
+\label{sec:restrictions}
+
+
+\subsection{Required glyphs for general text encodings}
+
+Encodings that are supposed to be used with \LaTeX{} for `general
+purpose text fonts' need to have certain fixed glyphs in certain
+encoding slots. A `general purpose text font' is one intended for
+arbitrary natural language text and not just within special
+environments (such as the phonetic alphabet) or just for typesetting
+individual symbols (e.g., the text companion font with encoding
+\Enc{TS1}).
+
+This is the case for the following glyphs that have to be in their
+\textsc{ascii} positions for general purpose text encodings:
+\begin{center}
+\begin{tabular}[t]{cc}
+ Glyph & Position \\ \hline
+ ! & \number`\! \\
+ ' & \number`\' \\
+ ( & \number`\( \\
+ ) & \number`\) \\
+ \relax* & \number`\* \\
+ + & \number`\+ \\
+ , & \number`\, \\
+ - & \number`\- \\
+ . & \number`\. \\
+ / & \number`\/ \\
+ 0 \ldots\ 9 & \number`\0\ to \number`\9 \\
+ \end{tabular}
+ \quad
+ \begin{tabular}[t]{cc}
+ Glyph & Position \\ \hline
+ : & \number`\: \\
+ ; & \number`\; \\
+ = & \number`\= \\
+ ? & \number`\? \\
+ @ & \number`\@ \\
+ A \ldots\ Z & \number`\A\ to \number`\Z \\
+ \relax[ & \number`\[ \\
+ ] & \number`\] \\
+ ` & \number`\` \\
+ a \ldots\ z & \number`\a\ to \number`\z \\
+\end{tabular}
+\quad
+\begin{tabular}[t]{cc}
+Glyph\footnotemark & Position \\ \hline
+< & \number`\< \\
+> & \number`\> \\
+\string| & \number`\| \\
+\end{tabular}\footnotetext{The requirement for these three glyphs is
+ violated in the Latin alphabet \Enc{OT} encodings.}
+\end{center}
+In addition the following glyphs have to be present
+somewhere\footnote{The position in this case is not important as they
+are generated from ligature programs.} in the encoding together with
+corresponding ligature programs to generate them:
+\begin{center}
+\begin{tabular}[t]{cc}
+Glyph & Ligature program \\ \hline
+ `` & \texttt{`\/`} \\
+ '' & \texttt{'\/'} \\
+ -- & \texttt{-\/-} \\
+ --- & \texttt{-\/-\/-} \\
+\end{tabular}
+\end{center}
+
+This is $33 + 2 * 26 = 85$ positions ``required'', which leaves 171
+positions free.
+
+If there are free slots available then adding all or some of the
+diacritics would be the best way to fill them.
+
+If there are insufficient slots for the characters needed, a possible
+technique is to create a subsidiary encoding, and to move non-letter
+characters to it. Since only ``letters'' take part in the hyphenation
+algorithm, this technique doesn't affect the appearance of the typeset
+result.
+
+\subsection{The constraints on upper/lower case tables}
+
+Due to some technical restrictions of \TeX{} related to hyphenation it
+is not possible in \LaTeX{} to use more than one \verb=\lccode= or
+\verb=\uccode= table. Therefore all encodings need to share these two
+tables which are defined to be those of the \Enc{T1} encoding.
+
+The \Enc{T1} encoding has some nasty peculiarities which make certain slot
+positions more or less unusable for other encodings if this
+restriction is to be obeyed. This is unfortunate but since \Enc{T1} is well
+established and the basis for a large number of languages it seemed
+better to live with this situation instead of trying to replace \Enc{T1} with a
+slightly better standard (with the result that for a long time
+different \LaTeX{} installations would not be able to communicate with
+each other because of incompatible font sets).
+
+The positions that are problematic are as follows.
+\begin{center}
+\begin{tabular}{lp{.8\linewidth}}
+25 (\char 25) & uppercase maps strangely (same as for 105, \char 105)\\
+26 (\char 26) & uppercase maps strangely (same as for 106, \char 106)\\
+27 (\char 27) & lowercase maps to itself which makes this slot subject
+ to hyphenation (used to support \Enc{OT1} encoding) \\
+157 (\char 157) & lowercase maps strangely (same as for 73, \char 73) \\
+158 (\char 158) & uppercase maps strangely (same as for 240, \char 240) \\
+\end{tabular}
+\end{center}
+One way to use such slots is to fill them with ligature glyphs as
+\TeX{} will not consult these tables for glyphs constructed through
+ligatures programs but instead uses the entries for the individual
+glyphs used to produce the ligature.
+
+A complete listing of the uppercase/lowercase mapping tables is to be
+found in section~\ref{sec:uclc-tab} (page \pageref{sec:uclc-tab}).
+
+\newcount\temp \newcount\tempL \newcount\tempU
+
+\def\nextstep{\global\tempL=\lccode\temp
+ \global\tempU=\uccode\temp
+ \lctablenumbersize\the\temp &
+ \the\tempL&
+ \the\tempU&\printlowerupper{\the\temp}{\the\tempL}{\the\tempU}\\
+ \global\advance\temp by 1
+ \stepprint}
+
+\def\printlowerupper#1#2#3{\char#1\relax
+ (\ifnum#2=0\relax--\else\char#2\fi
+ /\ifnum#3=0\relax--\else\char#3\fi)}
+
+\def\stepprint{\relax\ifnum\temp<\endval
+ \let\next=\nextstep
+ \else
+ \let\next=\relax
+ \fi
+ \next}
+
+\def\dolctable#1#2{{\temp=#1\relax
+\def\endval{#2}%
+\setlength\tabcolsep{1.5pt}%
+\begin{tabular}[t]{@{}cccc@{}}
+pos&lc&uc&glyphs\\\hline
+\stepprint
+\end{tabular}}}
+
+\iffalse
+\begin{center}
+\tiny\let\lctablenumbersize\tiny
+\mbox{\dolctable{0}{52}\vrule
+\dolctable{52}{104}\vrule
+\dolctable{104}{156}\vrule
+\dolctable{156}{208}\vrule
+\dolctable{208}{256}}
+\end{center}
+\fi
+
+\iffalse
+\begin{center}\tiny
+\mbox{\dolctable{0}{65}\vrule
+\dolctable{65}{128}\vrule
+\dolctable{128}{193}\vrule
+\dolctable{193}{256}}
+\end{center}
+\fi
+
+
+
+\section{Encoding specific commands}
+
+An encoding specific command is one that generates a glyph (or
+glyphs), to produce a graphic effect that may be implemented
+differently in different encodings. The encoding specific command
+automatically changes its implementation when the encoding changes in
+the course of the document. Encoding specific commands figure in
+\LaTeX's internal character representation (\textsc{licr}) and are also
+discussed in \cite[sec.~7.11.2, p.~442]{A-W:MG2004}.
+
+The following table only covers the encoding specific commands from
+the \Enc{OT1} and \Enc{T1} encodings. Other encodings may specify
+additional encoding specific commands. In the table, the first 15
+commands are `accent-like' and need as an argument the character to be
+accented. For example, |\v{c}| is the \textsc{licr} for `\v{c}'.
+
+\begin{tabbing}
+\ttverb\textvisiblespace\quad\=bbbbbbbbbbbbbb\=b'b'\=ccccccccccc\kill
+\ttverb\`{} \>OT1,T1\> \a`{}\> (grave) \\
+\ttverb\'{} \>OT1,T1\> \a'{}\> (acute) \\
+\ttverb\^{} \>OT1,T1\> \^{}\> (circumflex) \\
+\ttverb\~{} \>OT1,T1\> \~{}\> (tilde) \\
+\ttverb\"{} \>OT1,T1\> \"{}\> (umlaut) \\
+\ttverb\H{} \>OT1,T1\> \H{}\> (Hungarian umlaut) \\
+\ttverb\r{} \>OT1,T1\> \r{}\> (ring) \\
+\ttverb\v{} \>OT1,T1\> \v{}\> (ha\v{c}ek) \\
+\ttverb\u{} \>OT1,T1\> \u{}\> (breve) \\
+\ttverb\t{} \>OT1,T1\> \t{}\> (tie) \\
+\ttverb\={} \>OT1,T1\> \a={}\> (macron) \\
+\ttverb\.{} \>OT1,T1\> \.{}\> (dot) \\
+\ttverb\b{} \>OT1,T1\> \b{}\> (underbar) \\
+\ttverb\c{} \>OT1,T1\> \c{}\> (cedilla) \\
+\ttverb\d{} \>OT1,T1\> \d{}\> (dot under) \\
+\ttverb\k{} \>T1 \> \k{}\> (ogonek) \\
+% \ttverb\AA \>OT1,T1\> \AA \> \\ % no longer
+\ttverb\AE \>OT1,T1\> \AE \> \\
+\ttverb\DH \>T1 \> \DH \> \\
+\ttverb\DJ \>T1 \> \DJ \> \\
+\ttverb\L \>OT1,T1\> \L \> \\
+\ttverb\NG \>T1 \> \NG \> \\
+\ttverb\OE \>OT1,T1\> \OE \> \\
+\ttverb\O \>OT1,T1\> \O \> \\
+\ttverb\SS \>OT1,T1\> \SS \> \\
+\ttverb\TH \>T1 \> \TH \> \\
+% \ttverb\aa \>OT1,T1\> \aa \> \\ no-longer
+\ttverb\ae \>OT1,T1\> \ae \> \\
+\ttverb\dh \>T1 \> \dh \> \\
+\ttverb\dj \>T1 \> \dj \> \\
+\ttverb\guillemotleft \>T1 \> \guillemotleft \> (guillemet) \\
+\ttverb\guillemotright \>T1 \> \guillemotright \> (guillemet) \\
+\ttverb\guilsinglleft \>T1 \> \guilsinglleft \> (guillemet) \\
+\ttverb\guilsinglright \>T1 \> \guilsinglright \> (guillemet) \\
+\ttverb\i \>OT1,T1\> \i \> \\
+\ttverb\j \>OT1,T1\> \j \> \\
+\ttverb\l \>OT1,T1\> \l \> \\
+\ttverb\ng \>T1 \> \ng \> \\
+\ttverb\oe \>OT1,T1\> \oe \> \\
+\ttverb\o \>OT1,T1\> \o \> \\
+\ttverb\quotedblbase \>T1 \> \quotedblbase \> \\
+\ttverb\quotesinglbase \>T1 \> \quotesinglbase \> \\
+\ttverb\ss \>OT1,T1\> \ss \> \\
+\ttverb\textasciicircum \>OT1,T1\> \textasciicircum \> \\
+\ttverb\textasciitilde \>OT1,T1\> \textasciitilde \> \\
+\ttverb\textbackslash \>OT1,T1\> \textbackslash \> \\
+\ttverb\textbar \>OT1,T1\> \textbar \> \\
+\ttverb\textbraceleft \>OT1,T1\> \textbraceleft \> \\
+\ttverb\textbraceright \>OT1,T1\> \textbraceright \> \\
+\ttverb\textcompwordmark \>OT1,T1\> \textcompwordmark\> (invisible) \\
+\ttverb\textdollar \>OT1,T1\> \textdollar \> \\
+\ttverb\textemdash \>OT1,T1\> \textemdash \> \\
+\ttverb\textendash \>OT1,T1\> \textendash \> \\
+\ttverb\textexclamdown \>OT1,T1\> \textexclamdown \> \\
+\ttverb\textgreater \>OT1,T1\> \textgreater \> \\
+\ttverb\textless \>OT1,T1\> \textless \> \\
+\ttverb\textquestiondown \>OT1,T1\> \textquestiondown\> \\
+\ttverb\textquotedbl \>T1 \> \textquotedbl \> \\
+\ttverb\textquotedblleft \>OT1,T1\> \textquotedblleft\> \\
+\ttverb\textquotedblright \>OT1,T1\> \textquotedblright\> \\
+\ttverb\textquoteleft \>OT1,T1\> \textquoteleft \> \\
+\ttverb\textquoteright \>OT1,T1\> \textquoteright \> \\
+\ttverb\textregistered \>OT1,T1\> \textregistered \> \\
+\ttverb\textsection \>OT1,T1\> \textsection \> \\
+\ttverb\textsterling \>OT1,T1\> \textsterling \> \\
+\ttverb\texttrademark \>OT1,T1\> \texttrademark \> \\
+\ttverb\textunderscore \>OT1,T1\> \textunderscore \> \\
+\ttverb\textvisiblespace \>OT1,T1\> \textvisiblespace\> \\
+\ttverb\th \>T1 \> \th \>
+\end{tabbing}
+
+\section{Encodings for Unicode based \TeX\ systems}
+\label{sec:unicode}
+
+The preceding text has assumed a classic TeX system that is
+restricted to the use of fonts with at most 256 characters. In order
+to accommodate all the characters needed for different languages and
+mathematics it is necessary to have multiple encodings as described
+above, and \LaTeX\ needs to be aware of the encoding used for each
+font.
+
+Unicode aims to provide a single encoding that removes most of the
+need to switch encodings, apart from very specialist use for non-standard characters. Rather than assign codes in the range 0--256 (hex
+FF) Unicode codes are in the range 0--1,114,111 (hex 10FFFF), although
+not all slots are available for distinct characters for technical
+reasons. Unicode offers the possibility to use a single input encoding
+(usually UTF-8) for all documents and to use essentially the same
+Unicode encoding for all fonts, so removing the need to switch
+encodings in different contexts.
+
+Omega was perhaps the first widely used \TeX\ extension that
+supported Unicode. Currently the two actively supported systems that are
+present in most modern \TeX\ distributions are Xe\TeX\ and Lua\TeX.
+
+When used with these extended \TeX\ engines, \LaTeX's font system can
+refer to Unicode fonts (typically OpenType fonts installed system-wide
+on your operating system rather than fonts specifically encoded/installed for
+\TeX). Currently the usual method of accessing these fonts is through
+the contributed \Pkg{fontspec} package. This uses as encoding \Enc{TU}:
+``\TeX{} Unicode'' (historically two experimental encodings \Enc{EU1}
+and \Enc{EU2}
+were used, depending on the engine, but these are deprecated).
+The exact rules for \LaTeX\ encodings
+for Unicode engines have not yet been finalised in terms of the (usual)
+requirement that each slot should be defined. (This is not realistic for
+a Unicode font, as almost all fonts address subsets of the full range.)
+It is rare to need to specify the \Enc{TU} encoding a document as the
+\Pkg{fontspec} package sets up the correct encoding when loaded.
+
+The restrictions described in section \ref{sec:restrictions} do not
+apply, or need to be modified in a Unicode based engine. Clearly the
+lowercase table (and hyphenation patterns) can not be restricted to
+the values used for \Enc{T1} and do only refer to the first 256
+characters.
+
+When the \LaTeX\ format is made \LaTeX\ sets up the lowercase table
+and classifies characters as letter- or non-letter-based on \Enc{T1} if
+a classic \TeX\ or pdf\TeX\ is being used. If a Unicode based \TeX\ is
+detected, the values are instead based on the classification and
+lower-case mappings provided by the Unicode Character Database
+\cite{ucd}. The \LaTeX{} team have written a generic loader bundle,
+\Pkg{unicode-data}, which provides the mechanism to load this information
+directly from the Unicode Character Database data files and which is read
+when a Unicode-compliant engine is detected during format-building.
+
+Similarly in the default configuration files used by modern \TeX\
+distribution, the hyphenation files for each supported language are
+written in UTF-8 encoding, using Unicode code points for all letters,
+then if a classic \TeX\ system is detected, some additional macros are
+loaded to convert these files to 256-character encodings where
+possible, and assuming the \Enc{T1} lowercase table. For Unicode engines
+no conversion takes place. (The hyphenation patterns for a small number of
+languages require that some punctuation characters have non-zero
+c values. This are set during pattern reading, and may at some
+stage in the future use the e-\TeX{} \verb=\savinghyphcodes= mechanism to
+avoid any need to manipulate \verb=\lccode= in the document.)
+
+
+
+
+\begin{thebibliography}{99}
+\addcontentsline{toc}{section}{\numberline{\relax}\refname}
+
+
+\bibitem{Adobe:PDF-1.6} \emph{\textsc{PDF} reference}:
+ Adobe portable document format version~1.6. Adobe Systems
+ Incorporated, 2005. % why \textsuperscript{3}?
+ \url{http://partners.adobe.com/public/developer/en/pdf/PDFReference16.pdf}.
+
+\bibitem{Beeton:TB6-3-124} Barbara Beeton:
+ \emph{Mathematical symbols and cyrillic fonts ready for
+ distribution}. In: TUGBoat, 6\#3), 1985.
+ \url{http://tug.org/TUGboat/Articles/tb06-3/tb13beetcyr.pdf}.
+
+\bibitem{beeton} Barbara Beeton: \emph{Unicode
+ and math, a combination whose time has come -- Finally!}. In:
+ TUGBoat, 21\#3, 2000.
+ \url{http://www.tug.org/TUGboat/Articles/tb21-3/tb68beet.pdf}.
+
+
+\bibitem{Berdnikov:eurotex-98} A.\@ Berdnikov, O.\@
+ Lapko, M.\@ Kolodin, A.\@ Janishevsky and
+ A.\@ Burykin: \emph{The Encoding Paradigm in
+ \LaTeXe{} and the Projected X2 Encoding for Cyrillic Texts}.
+ Euro\TeX~98.
+ \url{http://www.gutenberg.eu.org/pub/GUTenberg/publicationsPDF/28-29-berdnikova.pdf}.
+
+\bibitem{CJK} \emph{The \Pkg{CJK} package}:
+ \url{http://cjk.ffii.org}.
+
+\bibitem{clasen} Matthias Clasen: \emph{A new
+ implementation of \LaTeX{} math}, 1997-98.
+ \url{http://www.tug.org/twg/mfg/papers/current/newmath.ps.gz}.
+
+\bibitem{clasen-vieth} Matthias Clasen and Ulrik
+ Vieth: \emph{Towards a new Math Font Encoding
+ for (La)\TeX}. March 1998,
+ \url{http://www.tug.org/twg/mfg/papers/current/mfg-euro-all.ps.gz}.
+
+\bibitem{CorkGW:91}
+Dean Guenther and Janene Winter.
+\newblock An international phonetic alphabet.
+\newblock In Guenther \cite{proc:MGu91}, pages 149--156.
+\newblock Published as {TUG}boat 12\#1.
+
+\bibitem{proc:MGu91}
+Mary Guenther, editor.
+\newblock {\em {\TeX} 90 Conference Proceedings}, March 1991.
+\newblock Published as {TUG}boat 12\#1.
+
+\bibitem{tub:MFe90}
+Michael~J. Ferguson.
+\newblock Report on multilingual activities.
+\newblock {\em {TUG}boat}, 11(4):514--516, 1990.
+
+\bibitem{fontinst} \emph{The \Pkg{fontinst} package}:
+ \textlangle CTAN\textrangle\url{/fonts/utilities/fontinst}.
+
+\bibitem{Rei:TB17-2-102} Fukui Rei:
+ \emph{\textsl{TIPA}: A system for processing phonetic
+ symbols in \LaTeX}. In: TUGBoat, 17\#, 1996.
+ \url{http://www.tug.org/TUGboat/Articles/tb17-2/tb51rei.pdf}.
+
+\bibitem{hyperref} \emph{The \Pkg{hyperref} package}:
+ \url{http://www.tug.org/applications/hyperref}.
+
+\bibitem{tub:JKn93}
+J\"org Knappen.
+\newblock Fonts for Africa: The fc Fonts.
+\newblock {\em {TUG}boat}, 14(2):104, 1993.
+
+\bibitem{Knappen:TB17-2-96} J\"org Knappen:
+ \emph{The \Pkg{dc} fonts~1.3: Move towards stability
+ and completeness}. In: TUGBoat 17\#2, 1996.
+ \url{http://www.tug.org/TUGboat/Articles/tb17-2/tb51knap.pdf}.
+
+\bibitem{A-W:DKn86}
+Donald~E. Knuth.
+\newblock {\em The {\TeX}book}.
+\newblock Volume~A of {\em Computers \& {T}ypesetting\/},
+ May 1989.
+\newblock Eight printing.
+
+\bibitem{vnr} \emph{The \Pkg{vnr} font family}, developed by
+ the author of pdf\TeX, {H\`an Th\^e\protect\llap{\raise 0.5ex\hbox{\'{\relax}}} Th\`anh}.
+ \url{http://vntex.org/download/vntex}.
+
+ \bibitem{ipa} Home page of the International Phonetic Association.
+ \url{http://www.arts.gla.ac.uk/IPA/ipa.html}
+
+\bibitem{A-W:LLa94}
+Leslie Lamport.
+\newblock {\em {\LaTeX:} A Document Preparation System}.
+\newblock Addison-Wesley, Reading, Massachusetts, second edition, 1994.
+
+\bibitem{LH-Fonts} \emph{The \Pkg{lh}-Fonts for Cyrillic}:
+ \textlangle CTAN\textrangle\url{/fonts/cyrillic/lh}.
+
+\bibitem{A-W:MG2004}
+Frank Mittelbach and Michel Goossens.
+\newblock {\em The {\LaTeX} Companion second edition}.
+\newblock With Johannes Braams, David Carlisle, and Chris Rowley.
+\newblock Addison-Wesley, Reading, Massachusetts, 2004.
+
+\bibitem{Unicode} \emph{The Unicode Standard}.
+ \url{http://unicode.org}.
+
+\bibitem{ucd} \emph{The Unicode Character Database}.
+ \url{http://unicode.org/ucd}.
+
+\bibitem{ziegler} Justin Ziegler, \emph{Technical
+ Report on Math Font Encodings}, June 1994,
+ \url{http://www.tug.org/twg/mfg/papers/ltx3pub/l3d007.ps.gz}.
+
+\end{thebibliography}
+
+\clearpage\appendix
+\begin{center}
+ \Large\bfseries Appendices
+\end{center}
+
+\section{Example code tables}
+
+This appendix contains a table of each font mentioned as an ``example''
+font above, providing that the font was available when the document
+was processed with \LaTeX{}. (\LaTeX{} generates a warning message
+for each font it fails to find.)
+
+\subsection{Text encodings}
+
+\ftable{cmr10}{OT1}
+
+\ftable{wnr10}{OT2}
+
+\ftable{wsuipa10}{OT3}
+
+\ftable{plr10}{OT4}
+
+%\ftable{artmr10}{OT6}
+
+\ftable{ecrm1000}{T1}
+
+\ftable{larm1000}{T2A}
+
+\ftable{lbrm1000}{T2B}
+
+\ftable{lcrm1000}{T2C}
+
+\ftable{tipa10}{T3}
+
+\ftable{fcr10}{T4}
+
+\ftable{vnr10}{T5}
+
+
+\subsection{Text symbol encodings}
+
+The full table for \Enc{TS1} as provided by European Computer Modern family:
+\ftable{tcrm1000}{TS1}
+
+\pagebreak
+
+In contrast typical PostScript fonts usually have incomplete implementations
+of \Enc{TS1} sometimes missing more than half of the glyphs:
+
+\ftable{ptmr8c}{TS1}
+
+\ftable{tipx10}{TS3}
+
+
+
+\subsection{Extended text encodings}
+
+\ftable{rxrm1000}{X2}
+
+
+\subsection{Mathematical encodings}
+
+\ftable{cmmi10}{OML}
+
+\ftable{cmsy10}{OMS}
+
+\ftable{cmex10}{OMX}
+
+
+\subsection{Other encodings}
+
+\ftable{ptmr8y}{LY1}
+
+%%\ftable{????}{LV1}
+
+\ftable{grmn1000}{LGR}
+
+\ftable{wasy10}{U}
+\ftable{logo10}{U}
+
+\clearpage
+\section{Uppercase and lowercase tables}
+\label{sec:uclc-tab}
+
+The following two sets of tables list the \verb"\uppercase" and
+\verb"\lowercase" values for each position in the \LaTeX{} standard
+256-character tables.
+
+Each row of each table lists:
+\begin{quote}
+ \begin{tabular}{lp{0.7\textwidth}}
+ pos & The position in the table (0-255) \\
+ lc & The value in the \verb"\lowercase" table at the position \\
+ & (note that value 0 here means that \verb"\lowercase" is
+ ineffective for this character, and hyphenation does not apply
+ to it) \\
+ uc & The value in the \verb"\uppercase" table at the position \\
+ & (note that value 0 here means that \verb"\uppercase" is
+ ineffective for this character) \\
+ glyphs & The glyphs specified for the T1 encoding for this
+ position, laid out as \meta{glyph}\textbf{(}\meta{lowercase
+ glyph}\textbf{/}\meta{uppercase glyph}\textbf{)}
+ \end{tabular}
+\end{quote}
+
+\begin{center}
+ \let\lctablenumbersize\footnotesize
+ \makebox[\textwidth]{\hss
+ \dolctable{0}{32}\quad\dolctable{32}{64}\quad
+ \dolctable{64}{96}\quad\dolctable{96}{128}%
+ \hss}
+
+ \makebox[\textwidth]{\hss
+ \dolctable{128}{160}\quad\dolctable{160}{192}\quad
+ \dolctable{192}{224}\quad\dolctable{224}{256}%
+ \hss}
+\end{center}
+\end{document}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/macros/latex-dev/base/exscale.dtx b/macros/latex-dev/base/exscale.dtx
index 49e53ca5f8..575a89ce68 100644
--- a/macros/latex-dev/base/exscale.dtx
+++ b/macros/latex-dev/base/exscale.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/exscale.ins b/macros/latex-dev/base/exscale.ins
index 4e4a36996d..cc8d8d9ae9 100644
--- a/macros/latex-dev/base/exscale.ins
+++ b/macros/latex-dev/base/exscale.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/exscale.pdf b/macros/latex-dev/base/exscale.pdf
index d2f4ce540c..239d39d308 100644
--- a/macros/latex-dev/base/exscale.pdf
+++ b/macros/latex-dev/base/exscale.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fix-cm.dtx b/macros/latex-dev/base/fix-cm.dtx
index b4311efa3c..7f770cf8c0 100644
--- a/macros/latex-dev/base/fix-cm.dtx
+++ b/macros/latex-dev/base/fix-cm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/fix-cm.ins b/macros/latex-dev/base/fix-cm.ins
index 56a7923a13..eb4547d576 100644
--- a/macros/latex-dev/base/fix-cm.ins
+++ b/macros/latex-dev/base/fix-cm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/fix-cm.pdf b/macros/latex-dev/base/fix-cm.pdf
index 6011bf720a..4434d83588 100644
--- a/macros/latex-dev/base/fix-cm.pdf
+++ b/macros/latex-dev/base/fix-cm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.pdf b/macros/latex-dev/base/fntguide.pdf
new file mode 100644
index 0000000000..95e5533372
--- /dev/null
+++ b/macros/latex-dev/base/fntguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/fntguide.tex b/macros/latex-dev/base/fntguide.tex
new file mode 100644
index 0000000000..d0b1ab378a
--- /dev/null
+++ b/macros/latex-dev/base/fntguide.tex
@@ -0,0 +1,1907 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: fntguide.tex
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1995/11/28]
+
+\title{\LaTeXe{} font selection}
+
+\author{\copyright~Copyright 1995--2019, \LaTeX3 Project Team.\\
+ All rights reserved.}
+
+\date{July 2019}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+This document describes the new font selection features of the \LaTeX{}
+Document Preparation System. It is intended for package writers who
+want to write font-loading packages similar to |times| or |latexsym|.
+
+This document is only a brief introduction to the new facilities and
+is intended for package writers who are familiar with \TeX{} fonts and
+\LaTeX{} packages. It is \emph{neither} a user-guide \emph{nor} a
+reference manual for fonts in \LaTeXe.
+
+\subsection{\LaTeXe~fonts}
+
+The most important difference between \LaTeX~2.09 and \LaTeXe{} is the
+way that fonts are selected. In \LaTeX~2.09, the Computer Modern fonts
+were built into the \LaTeX~format, and so customizing \LaTeX{} to use
+other fonts was a major effort.
+
+In \LaTeXe, very few fonts are built into the format, and there are
+commands to load new text and math fonts. Packages such as |times| or
+|latexsym| allow authors to access these fonts.
+This document describes how to write similar font-loading packages.
+
+The \LaTeXe{} font selection system was first released as the `New Font
+Selection Scheme' (NFSS) in 1989, and then in release~2 in 1993.
+\LaTeXe{} includes NFSS release~2 as standard.
+
+\subsection{Overview}
+
+This document contains an overview of the new font commands
+of \LaTeX.
+
+\begin{description}
+
+\item[Section~\ref{Sec:text}] describes the commands for selecting fonts
+ in classes and packages. It lists the five \LaTeX{} font
+ attributes, and lists the commands for selecting fonts. It also
+ describes how to customize the author commands such as |\textrm| and
+ |\textit| to suit your document design.
+
+\item[Section~\ref{Sec:math}] explains the commands for controlling
+ \LaTeX{} math fonts. It describes how to specify new math fonts and
+ new math symbols.
+
+\item[Section~\ref{Sec:install}] explains how to install new fonts into
+ \LaTeX. It shows how \LaTeX{} font attributes are turned into \TeX{}
+ font names, and how to specify your own fonts using font definition
+ files.
+
+\item[Section~\ref{Sec:encode}] discusses text font encodings.
+ It describes how to declare a new encoding and how to define
+ commands, such as |\AE| or |\"|, which have different definitions in
+ different encodings, depending on whether ligatures, etc.\ are
+ available in the encoding.
+
+\item[Section~\ref{Sec:misc}] covers font miscellanea. It describes how
+ \LaTeX{} performs font substitution, how to customize fonts that are
+ preloaded in the \LaTeX{} format, and the naming conventions used in
+ \LaTeX{} font selection.
+
+\end{description}
+
+\subsection{Further information}
+
+For a general introduction to \LaTeX, including the new features of
+\LaTeXe, you should read \emph{\LaTeXbook},
+Leslie Lamport, Addison Wesley, 2nd~ed, 1994.
+
+A more detailed description of the \LaTeX{} font selection scheme is to
+be found in \emph{\LaTeXcomp}, 2nd~ed, by Mittelbach and Goossens, Addison
+Wesley, 2004.
+
+The \LaTeX{} font selection scheme is based on \TeX, which is described
+by its developer in \emph{The \TeX book}, Donald E.~Knuth, Addison
+Wesley, 1986, revised in 1991 to include the features of \TeX~3.
+
+Sebastian Rahtz's |psnfss| software contains the software for using a
+large number of Type~1 fonts (including the Adobe Laser Writer 35 and
+the Monotype CD-ROM fonts) in \LaTeX. It should be available from the
+same source as your copy of \LaTeX.
+
+The |psnfss| software uses fonts generated by Alan Jeffrey's
+|fontinst| software. This can convert fonts from Adobe Font Metric
+format into a format readable by \LaTeX, including the generation of
+the font definition files described in Section~\ref{Sec:install}. The
+|fontinst| software should be available from the same source as your
+copy of \LaTeX.
+
+Whenever practical, \LaTeX{} uses the font naming scheme called
+`fontname'; this was described in \emph{Filenames for fonts},%
+\footnote{An up-to-date electronic version
+of this document can be found on any CTAN server, in the directory
+\texttt{info/fontname}.}
+\emph{TUGboat}~11(4),~1990.
+
+The class-writer's guide \emph{\clsguide} describes
+the new \LaTeX{} features for writers of document classes and packages
+and is kept in |clsguide.tex|. Configuring
+\LaTeX{} is covered by the guide \emph{\cfgguide} in
+\texttt{cfgguide.tex} whilst the philosophy behind our policy on
+modifying \LaTeX{} is described in \emph{\modguide} in
+\texttt{modguide.tex}.
+
+The documented source code (from the files used to produce
+the kernel format via |latex.ltx|) is now available as
+\emph{The \LaTeXe\ Sources}.
+This very large document also includes an index of \LaTeX{}
+commands. It can be typeset from the \LaTeX{} file |source2e.tex|
+in the |base| directory; this uses the class file |ltxdoc.cls|.
+
+For more information about \TeX{} and \LaTeX{}, please contact your
+local \TeX{} Users Group, or the international \TeX{} Users Group.
+Addresses and other details can be found at:
+\begin{quote}\small\label{addrs}
+ \texttt{http://www.tug.org/lugs.html}
+\end{quote}
+
+
+\section{Text fonts}
+\label{Sec:text}
+
+This section describes the commands available to class and package
+writers for specifying and selecting fonts.
+
+\subsection{Text font attributes}
+
+Every text font in \LaTeX{} has five \emph{attributes}:
+\begin{description}
+
+\item[encoding] This specifies the order that characters appear in the
+ font. The two most common text encodings used in \LaTeX{} are
+ Knuth's `\TeX{} text' encoding, and the `\TeX{} text extended'
+ encoding developed by the \TeX{} Users Group members during a \TeX{}
+ Conference at Cork in~1990 (hence its informal name `Cork encoding').
+
+\item[family] The name for a collection of fonts, usually grouped under
+ a common name by the font foundry. For example, `Adobe Times', `ITC
+ Garamond', and Knuth's `Computer Modern Roman' are all font families.
+
+\item[series] How heavy and/or expanded a font is. For example, `medium
+ weight', `narrow' and `bold extended' are all series.
+
+\item[shape] The form of the letters within a font family. For
+ example, `italic', `oblique' and `upright' (sometimes called
+ `roman') are all font shapes.
+
+\item[size] The design size of the font, for example `10pt'. If no
+ dimension is specified, `pt' is assumed.
+
+\end{description}
+The possible values for these attributes are given short acronyms by
+\LaTeX. The most common values for the font encoding are:
+\begin{center}
+\begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |OT1| & \TeX{} text \\
+ |T1| & \TeX{} extended text \\
+ |OML| & \TeX{} math italic \\
+ |OMS| & \TeX{} math symbols \\
+ |OMX| & \TeX{} math large symbols \\
+ |U| & Unknown \\
+ |L<xx>| & A local encoding
+ \end{tabular}
+\end{minipage}
+\end{center}
+The `local' encodings are intended for font encodings which are only
+locally available, for example a font containing an organization's
+logo in various sizes.
+
+There are far too many font families to list them all, but some common
+ones are:
+\begin{center}
+\begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |cmr| & Computer Modern Roman \\
+ |cmss| & Computer Modern Sans \\
+ |cmtt| & Computer Modern Typewriter \\
+ |cmm| & Computer Modern Math Italic \\
+ |cmsy| & Computer Modern Math Symbols \\
+ |cmex| & Computer Modern Math Extensions \\
+ |ptm| & Adobe Times \\
+ |phv| & Adobe Helvetica \\
+ |pcr| & Adobe Courier
+ \end{tabular}
+\end{minipage}
+\end{center}
+\NEWdescription{2019/07/10}
+The font series is denoting a combination of the weight (boldness) and
+the width (amount of expansion). The standard supported for weights
+and widths are:
+\begin{center}
+%\begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |ul| & Ultra Light \\
+ |el| & Extra Light \\
+ |l| & Light \\
+ |sl| & Semi Light \\
+ |m| & Medium (normal)\\
+ |sb| & Semi Bold \\
+ |b| & Bold \\
+ |eb| & Extra Bold \\
+ |ub| & Ultra Bold \\
+ \end{tabular}
+\qquad
+ \begin{tabular}{rlr}
+ |uc| & Ultra Condensed & 50\% \\
+ |ec| & Extra Condensed & 62.5\% \\
+ |c| & Condensed & 75\% \\
+ |sc| & Semi Condensed & 87.5\% \\
+ |m| & Medium & 100\% \\
+ |sx| & Semi Expanded & 112.5\% \\
+ |x| & Expanded & 125\% \\
+ |ex| & Extra Expanded & 150\% \\
+ |ux| & Ultra Expanded & 200\% \\
+ \end{tabular}
+\end{center}
+These are concatenated to a single series value except that |m| is
+dropped unless both weight and width are medium in which case a single
+|m| is used.
+
+\newpage
+
+Examples for series values are then:
+\begin{center}
+\begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |m| & Medium weight and width \\
+ |b| & Bold weight, medium width \\
+ |bx| & Bold extended \\
+ |sb| & Semi-bold, medium width\\
+ |sbx| & Semi-bold extended\\
+ |c| & Medium weight, condensed width
+ \end{tabular}
+\end{minipage}
+\end{center}
+\NEWdescription{2019/07/10}
+Note, that there are a large variety of names floating around like
+``regular'', ``black'', ``demi-bold'', ``thin'', ``heavy'' and many
+more. If at all possible they should be matched into the standard
+naming scheme to allow for sensible default substitutions if
+necessary, e.g., ``demi-bold'' is normally just another name for
+``semi-bold'', so should get |sb| assigned, etc.
+
+The most common values for the font shape are:
+\begin{center}
+\begin{minipage}{.7\linewidth}
+ \begin{tabular}{rl}
+ |n| & Normal (that is `upright' or `roman') \\
+ |it| & Italic \\
+ |sl| & Slanted (or `oblique') \\
+ |sc| & Caps and small caps
+ \end{tabular}
+\end{minipage}
+\end{center}
+The font size is specified as a dimension, for example |10pt| or
+|1.5in| or |3mm|; if no unit is specified, |pt| is assumed. These five
+parameters specify every \LaTeX{} font, for example:
+\begin{center}
+ \begin{tabular}{@{}r@{\,}l@{\,}c@{\,}c@{\,}cc@{}r@{}}
+ \multicolumn{5}{@{}c}{\emph{\LaTeX{} specification}} &
+ \emph{Font} &
+ \emph{\TeX{} font name} \\
+ |OT1| & |cmr| & |m| & |n| & |10| &
+ Computer Modern Roman 10 point &
+ |cmr10| \\
+ |OT1| & |cmss| & |m| & |sl| & |1pc| &
+ Computer Modern Sans Oblique 1 pica &
+ |cmssi12| \\
+ |OML| & |cmm| & |m| & |it| & |10pt| &
+ Computer Modern Math Italic 10 point &
+ |cmmi10| \\
+ |T1| & |ptm| & |b| & |it| & |1in| &
+ Adobe Times Bold Italic 1 inch &
+ |ptmb8t at 1in|
+ \end{tabular}
+\end{center}
+These five parameters are displayed whenever \LaTeX{} gives an overfull
+box warning, for example:
+\begin{verbatim}
+ Overfull \hbox (3.80855pt too wide) in paragraph at lines 314--318
+ []\OT1/cmr/m/n/10 Normally [] and [] will be iden-ti-cal,
+\end{verbatim}
+The author commands for fonts set the five attributes:
+\begin{center}
+ \begin{tabular}{rcl}
+ \emph{Author command} &
+ \emph{Attribute} &
+ \emph{Value in} |article| \emph{class} \\
+ |\textnormal{..}| or |\normalfont| & family & |cmr| \\
+ |\textrm{..}| or |\rmfamily| & family & |cmr| \\
+ |\textsf{..}| or |\sffamily| & family & |cmss| \\
+ |\texttt{..}| or |\ttfamily| & family & |cmtt| \\
+ |\textmd{..}| or |\mdseries| & series & |m| \\
+ |\textbf{..}| or |\bfseries| & series & |bx| \\
+ |\textup{..}| or |\upshape| & shape & |n| \\
+ |\textit{..}| or |\itshape| & shape & |it| \\
+ |\textsl{..}| or |\slshape| & shape & |sl| \\
+ |\textsc{..}| or |\scshape| & shape & |sc| \\
+ |\tiny| & size & |5pt| \\
+ |\scriptsize| & size & |7pt| \\
+ |\footnotesize| & size & |8pt| \\
+ |\small| & size & |9pt| \\
+ |\normalsize| & size & |10pt| \\
+ |\large| & size & |12pt| \\
+ |\Large| & size & |14.4pt| \\
+ |\LARGE| & size & |17.28pt| \\
+ |\huge| & size & |20.74pt| \\
+ |\Huge| & size & |24.88pt|
+ \end{tabular}
+\end{center}
+The values used by these commands are determined by the document class,
+using the parameters defined in Section~\ref{Sec:text.param}.
+
+Note that there are no author commands for selecting new encodings.
+These should be provided by packages, such as the |fontenc| package.
+
+This section does not explain how \LaTeX{} font specifications are
+turned into \TeX{} font names. This is described in
+Section~\ref{Sec:install}.
+
+\subsection{Selection commands}
+
+The low-level commands used to select a text font are as follows.
+
+\begin{decl}
+|\fontencoding| \arg{encoding} \\
+|\fontfamily| \arg{family}\\
+|\fontseries| \arg{series}\\
+|\fontshape| \arg{shape}\\
+|\fontsize| \arg{size} \arg{baselineskip}\\
+|\linespread| \arg{factor}
+\end{decl}
+
+\NEWdescription{1998/12/01}
+Each of the commands starting with |\font...| sets one of the font
+attributes; |\fontsize| also sets |\baselineskip|. The |\linespread|
+command prepares to multiply the current (or newly defined)
+|\baselineskip| with \m{factor} (e.g., spreads the lines apart for
+values greater one).
+
+The actual font in use is not altered by these commands, but the
+current attributes are used to determine which font and baseline skip
+to use after the next |\selectfont| command.
+
+
+\begin{decl}
+|\selectfont|
+\end{decl}
+Selects a text font, based on the current values of the font attributes.
+
+\emph{Warning}: There \emph{must} be a |\selectfont| command
+immediately after any settings of the font parameters by (some of)
+the six commands above, before any following text.
+For example, it is legal to say:
+\begin{verbatim}
+ \fontfamily{ptm}\fontseries{b}\selectfont Some text.
+\end{verbatim}
+but it is \emph{not} legal to say:
+\begin{verbatim}
+ \fontfamily{ptm} Some \fontseries{b}\selectfont text.
+\end{verbatim}
+You may get unexpected results if you put text between a
+|\font<parameter>| command (or |\linespread|) and a |\selectfont|.
+
+\begin{decl}
+|\usefont| \arg{encoding} \arg{family} \arg{series} \arg{shape}
+\end{decl}
+A short hand for the equivalent |\font...| commands followed by a
+call to |\selectfont|.
+
+
+\subsection{Internals}
+
+The current values of the font attributes are held in internal macros.
+
+\begin{decl}
+ |\f@encoding| \\
+ |\f@family| \\
+ |\f@series| \\
+ |\f@shape| \\
+ |\f@size| \\
+ |\f@baselineskip| \\
+ |\tf@size| \\
+ |\sf@size| \\
+ |\ssf@size|
+\end{decl}
+
+These hold the current values of the encoding, the family, the series,
+the shape, the size, the baseline skip, the main math size, the
+`script' math size and the `scriptscript' math size. The last three
+are accessible only within a formula; outside of math they may contain
+arbitrary values.
+
+For example, to set the size to 12 without
+changing the baseline skip:
+\begin{verbatim}
+ \fontsize{12}{\f@baselineskip}
+\end{verbatim}
+However, you should \emph{never} alter the values of the internal
+commands directly; they must only be modified using the low-level
+commands like |\fontfamily|, |\fontseries|, etc. If you disobey this
+warning you might produce code that loops.
+
+\subsection{Parameters for author commands}
+\label{Sec:text.param}
+
+The parameter values set by author commands such as |\textrm| and
+|\rmfamily|, etc.\ are not hard-wired into \LaTeX; instead these
+commands use the values of a number of parameters set by the document
+class and packages. For example, |\rmdefault| is the name of the
+default family selected by |\textrm| and |\rmfamily|. Thus to set a
+document in Adobe Times, Helvetica and Courier, the document designer
+specifies:
+\begin{verbatim}
+ \renewcommand{\rmdefault}{ptm}
+ \renewcommand{\sfdefault}{phv}
+ \renewcommand{\ttdefault}{pcr}
+\end{verbatim}
+
+\begin{decl}
+ |\encodingdefault| \\
+ |\familydefault| \\
+ |\seriesdefault| \\
+ |\shapedefault|
+\end{decl}
+The encoding, family, series and shape of the main body font. By
+default these are |OT1|, |\rmdefault|, |m| and |n|. Note that since
+the default family is |\rmdefault|, this means that changing
+|\rmdefault| will change the main body font of the document.
+
+\begin{decl}
+ |\rmdefault| \\
+ |\sfdefault| \\
+ |\ttdefault|
+\end{decl}
+The families selected by |\textrm|, |\rmfamily|, |\textsf|,
+|\sffamily|, |\texttt| and |\ttfamily|. By default these are |cmr|,
+|cmss| and |cmtt|.
+
+\begin{decl}
+ |\bfdefault| \\
+ |\mddefault|
+\end{decl}
+The series selected by |\textbf|, |\bfseries|, |\textmd| and
+|\mdseries|. By default these are |bx| and |m|.
+These values are suitable for the default families used. If other
+fonts are used as standard document fonts (for example, certain
+PostScript fonts) it might be necessary to adjust the value of
+|\bfdefault| to |b| since only a few such families have a `bold
+extended' series. An alternative (taken for the fonts provided by
+|psnfss|) is to define silent substitutions from |bx| series to |b|
+series with special |\DeclareFontShape| declarations and the |ssub|
+size function, see Section~\ref{sec:sizefunct}.
+
+
+\begin{decl}
+ |\itdefault| \\
+ |\sldefault| \\
+ |\scdefault| \\
+ |\updefault|
+\end{decl}
+The shapes selected by |\textit|, |\itshape|, |\textsl|, |\slshape|,
+|\textsc|, |\scshape|, |\textup| and |\upshape|. By default these are
+|it|, |sl|, |sc| and |n|.
+
+Note that there are no parameters for the size commands. These should
+be defined directly in class files, for example:
+\begin{verbatim}
+ \renewcommand{\normalsize}{\fontsize{10}{12}\selectfont}
+\end{verbatim}
+More elaborate examples (setting additional parameters when the text
+size is changed) can be found in |classes.dtx| the source
+documentation for the classes |article|, |report|, and |book|.
+
+
+\subsection{Special font declaration commands}
+
+\begin{decl}
+|\DeclareFixedFont| \arg{cmd} \arg{encoding} \arg{family} \arg{series}
+ \arg{shape} \arg{size}
+\end{decl}
+
+Declares command \m{cmd} to be a font switch which selects the font
+that is specified by the attributes \m{encoding}, \m{family},
+\m{series}, \m{shape}, and \m{size}.
+
+The font is selected without any adjustments to baselineskip and other
+surrounding conditions.
+
+This example makes |{\picturechar .}| select a small dot very quickly:
+\begin{verbatim}
+ \DeclareFixedFont{\picturechar}{OT1}{cmr}{m}{n}{5}
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareTextFontCommand| \arg{cmd} \arg{font-switches}
+\end{decl}
+
+Declares command \m{cmd} to be a font command with one argument.
+The current font attributes are locally modified by \m{font-switches}
+and then the argument of \m{cmd} is typeset in the resulting new font.
+
+Commands defined by |\DeclareTextFontCommand| automatically take care
+of any necessary italic correction (on either side).
+
+The following example shows how |\textrm| is defined by the kernel.
+\begin{verbatim}
+ \DeclareTextFontCommand{\textrm}{\rmfamily}
+\end{verbatim}
+
+To define a command that always typeset its argument in the italic
+shape of the main document font you could declare:
+\begin{verbatim}
+ \DeclareTextFontCommand{\normalit}{\normalfont\itshape}
+\end{verbatim}
+
+This declaration can be used to change the meaning of a command; if
+\m{cmd} is already defined, a log that it has been redefined
+is put in the transcript file.
+
+\begin{decl}
+|\DeclareOldFontCommand| \arg{cmd} \arg{text-switch}
+ \arg{math-switch}
+\end{decl}
+
+Declares command \m{cmd} to be a font switch (i.e.~used with the
+syntax |{<cmd>...}|) having the definition \m{text-switch}
+when used in text and the definition \m{math-switch} when used in a
+formula.
+Math alphabet commands, like |\mathit|, when used within \m{math-switch}
+should not have an argument. Their use in this argument causes their
+semantics to change so that they here act as a font switch, as
+required by the usage of the \m{cmd}.
+
+This declaration is useful for setting up commands like |\rm| to behave
+as they did in \LaTeX~2.09. We strongly urge you \emph{not} to misuse
+this declaration to invent new font commands.
+
+The following example defines |\it| to produce the italic shape of the
+main document font if used in text and to switch to the font that would
+normally be produced by the math alphabet |\mathit| if used in a
+formula.
+\begin{verbatim}
+ \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
+\end{verbatim}
+
+This declaration can be used to change the meaning of a command; if
+\m{cmd} is already defined, a log that it has been redefined
+is put in the transcript file.
+
+
+\section{Math fonts}
+\label{Sec:math}
+
+This section describes the commands available to class and package
+writers for specifying math fonts and math commands.
+
+\subsection{Math font attributes}
+
+The selection of fonts within math mode is quite different to that of
+text fonts.
+
+Some math fonts are selected explicitly by one-argument commands such
+as |\mathsf{max}| or |\mathbf{vec}|; such fonts are called \emph{math
+alphabets}. These math alphabet commands affect only the font used
+for letters and symbols of type |\mathalpha| (see
+Section~\ref{Sec:math.commands}); other symbols within the argument
+will be left unchanged. The predefined math alphabets are:
+\begin{center}
+ \begin{tabular}{ccc}
+ \emph{Alphabet} & \emph{Description} & \emph{Example} \\
+ |\mathnormal| & default & $abcXYZ$ \\
+ |\mathrm| & roman & $\mathrm{abcXYZ}$ \\
+ |\mathbf| & bold roman & $\mathbf{abcXYZ}$ \\
+ |\mathsf| & sans serif & $\mathsf{abcXYZ}$ \\
+ |\mathit| & text italic & $\mathit{abcXYZ}$ \\
+ |\mathtt| & typewriter & $\mathtt{abcXYZ}$ \\
+ |\mathcal| & calligraphic & $\mathcal{XYZ}$
+ \end{tabular}
+\end{center}
+Other math fonts are selected implicitly by \TeX{} for symbols, with
+commands such as |\oplus| (producing $\oplus$) or with straight
+characters like |>>| or |+|. Fonts containing such math symbols are
+called \emph{math symbol fonts}. The predefined math symbol fonts
+are:
+\begin{center}
+ \begin{tabular}{ccc}
+ \emph{Symbol font} & \emph{Description} & \emph{Example} \\
+ |operators| & symbols from |\mathrm| & $[\;+\;]$ \\
+ |letters| & symbols from |\mathnormal| & $<<\star>>$ \\
+ |symbols| & most \LaTeX{} symbols & $\leq*\geq$ \\
+ |largesymbols| & large symbols & $\sum\prod\int$
+ \end{tabular}
+\end{center}
+Some math fonts are both \emph{math alphabets} and \emph{math symbol
+fonts}, for example |\mathrm| and |operators| are the same font, and
+|\mathnormal| and |letters| are the same font.
+
+Math fonts in \LaTeX{} have the same five attributes as text fonts:
+encoding, family, series, shape and size. However, there are no
+commands that allow the attributes to be individually changed.
+Instead, the conversion from math fonts to these five attributes is
+controlled by the \emph{math version}. For example, the |normal| math
+version maps:
+\begin{center}
+ \begin{tabular}{rlc@{ }c@{ }c@{ }c}
+ \multicolumn{2}{c}{\emph{Math font}} &
+ \multicolumn{4}{c}{\emph{External font}} \\
+ \emph{Alphabets} & \emph{Symbol fonts} &
+ \multicolumn{4}{c}{\emph{Attributes}} \\
+ |\mathnormal| & |letters| & |OML| & |cmm| & |m| & |it| \\
+ |\mathrm| & |operators| & |OT1| & |cmr| & |m| & |n| \\
+ |\mathcal| & |symbols| & |OMS| & |cmsy| & |m| & |n| \\
+ & |largesymbols| & |OMX| & |cmex| & |m| & |n| \\
+ |\mathbf| & & |OT1| & |cmr| & |bx| & |n| \\
+ |\mathsf| & & |OT1| & |cmss| & |m| & |n| \\
+ |\mathit| & & |OT1| & |cmr| & |m| & |it| \\
+ |\mathtt| & & |OT1| & |cmtt| & |m| & |n|
+ \end{tabular}
+\end{center}
+The |bold| math version is similar except that it contains bold fonts.
+The command |\boldmath| selects the |bold| math version.
+
+Math versions can only be changed outside of math mode.
+
+The two predefined math versions are:
+\begin{center}
+ \begin{tabular}{rl}
+ |normal| & the default math version \\
+ |bold| & the bold math version
+ \end{tabular}
+\end{center}
+Packages may define new math alphabets, math symbol fonts, and math
+versions. This section describes the commands for writing such
+packages.
+
+\subsection{Selection commands}
+
+There are no commands for selecting symbol fonts. Instead, these are
+selected indirectly through symbol commands like |\oplus|.
+Section~\ref{Sec:math.commands} explains how to define symbol commands.
+
+\begin{decl}
+ |\mathnormal{<math>}|\\
+ |\mathcal{<math>}|\\
+ |\mathrm{<math>}|\\
+ |\mathbf{<math>}|\\
+ |\mathsf{<math>}|\\
+ |\mathit{<math>}|\\
+ |\mathtt{<math>}|
+\end{decl}
+Each math alphabet is a command which can only be used inside math
+mode. For example, |$x + \mathsf{y} + \mathcal{Z}$| produces $x +
+\mathsf{y} + \mathcal{Z}$.
+
+\begin{decl}
+|\mathversion{<version>}|
+\end{decl}
+This command selects a math version; it can only be used outside math
+mode. For example, |\boldmath| is defined to be |\mathversion{bold}|.
+
+\subsection{Declaring math versions}
+
+\begin{decl}
+|\DeclareMathVersion| \arg{version}
+\end{decl}
+
+Defines \m{version} to be a math version.
+
+The newly declared version is initialized with the defaults for all
+symbol fonts and math alphabets declared so far (see the commands
+|\DeclareSymbolFont| and |\DeclareMathAlphabet|).
+
+If used on an already existing version, an information message is
+written to the transcript file and all previous |\SetSymbolFont| or
+|\SetMathAlphabet| declarations for this version are overwritten by
+the math alphabet and symbol font defaults, i.e.~one ends up with a
+virgin math version.
+
+Example:
+\begin{verbatim}
+ \DeclareMathVersion{normal}
+\end{verbatim}
+
+
+\subsection{Declaring math alphabets}
+
+\begin{decl}
+|\DeclareMathAlphabet| \arg{math-alph} \arg{encoding} \arg{family}
+ \arg{series} \arg{shape}
+\end{decl}
+
+\NEWdescription{1997/12/01}
+If this is the first declaration for \m{math-alph} then a new math
+alphabet with this as its command name is created.
+
+The arguments \m{encoding} \m{family} \m{series} \m{shape} are used to
+set, or reset, the default values for this math alphabet in all math
+versions; if required, these must be further reset later for a
+particular math version by a |\SetMathAlphabet| command.
+
+If \m{shape} is empty then this \m{math-alph} is declared to be invalid
+in all versions, unless it is set by a later |\SetMathAlphabet|
+command for a particular math version.
+
+Checks that the command \m{math-alph} is either already a math
+alphabet command or is undefined; and that \m{encoding} is a known
+encoding scheme, i.e., has been previously declared.
+
+
+In these examples, |\foo| is defined for all math versions but |\baz|,
+by default, is defined nowhere.
+\begin{verbatim}
+ \DeclareMathAlphabet{\foo}{OT1}{cmtt}{m}{n}
+ \DeclareMathAlphabet{\baz}{OT1}{}{}{}
+\end{verbatim}
+
+
+\begin{decl}
+|\SetMathAlphabet| \arg{math-alph} \arg{version}\\
+ \null\hfill\arg{encoding} \arg{family} \arg{series} \arg{shape}
+\end{decl}
+
+Changes, or sets, the font for the math alphabet \m{math-alph} in math
+version \m{version} to \m{encoding}\m{family}\m{series}\m{shape}.
+
+Checks that \m{math-alph} has been declared as a math alphabet,
+\m{version} is a known math version and \m{encoding} is a known
+encoding scheme.
+
+
+This example defines |\baz| for the `normal' math version only:
+\begin{verbatim}
+ \SetMathAlphabet{\baz}{normal}{OT1}{cmss}{m}{n}
+\end{verbatim}
+
+Note that this declaration is not used for all math alphabets:
+Section~\ref{sec:symalph} describes |\DeclareSymbolFontAlphabet|,
+which is used to set up math alphabets contained in fonts which have
+been declared as symbol fonts.
+
+
+\subsection{Declaring symbol fonts}
+\label{sec:symalph}
+
+\begin{decl}
+|\DeclareSymbolFont| \arg{sym-font} \arg{encoding} \arg{family}
+ \arg{series} \arg{shape}
+\end{decl}
+
+\NEWdescription{1997/12/01}
+If this is the first declaration for \m{sym-font} then a new
+symbol font with this name is created (i.e.~this identifier is assigned
+to a new \TeX{} math group).
+
+The arguments \m{encoding} \m{family} \m{series} \m{shape} are used to
+set, or reset. the default values for this symbol font in \emph{all}
+math versions; if required, these must be further reset later for
+a particular math version by a |\SetSymbolFont| command.
+
+Checks that \m{encoding} is a declared encoding scheme.
+
+
+For example, the following sets up the first four standard math symbol
+fonts:
+\begin{verbatim}
+ \DeclareSymbolFont{operators}{OT1}{cmr}{m}{n}
+ \DeclareSymbolFont{letters}{OML}{cmm}{m}{it}
+ \DeclareSymbolFont{symbols}{OMS}{cmsy}{m}{n}
+ \DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n}
+\end{verbatim}
+
+
+\begin{decl}
+|\SetSymbolFont| \arg{sym-font} \arg{version}\\
+ \null\hfill \arg{encoding} \arg{family} \arg{series} \arg{shape}
+\end{decl}
+
+Changes the symbol font \m{sym-font} for math version \m{version}
+to \m{encoding} \m{family} \m{series} \m{shape}.
+
+Checks that \m{sym-font} has been declared as a symbol font,
+\m{version} is a known math version and \m{encoding} is a
+declared encoding scheme.
+
+
+For example, the following come from the set up of the `bold'
+math version:
+\begin{verbatim}
+ \SetSymbolFont{operators}{bold}{OT1}{cmr}{bx}{n}
+ \SetSymbolFont{letters}{bold}{OML}{cmm}{b}{it}
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareSymbolFontAlphabet| \arg{math-alph} \arg{sym-font}
+\end{decl}
+
+\NEWdescription{1997/12/01}
+Allows the previously declared symbol font \m{sym-font} to be the
+math alphabet with command \m{math-alph} in \emph{all} math versions.
+
+Checks that the command \m{math-alph} is either already a math alphabet
+command or is undefined; and that \m{sym-font} is a symbol font.
+
+
+Example:
+\begin{verbatim}
+ \DeclareSymbolFontAlphabet{\mathrm}{operators}
+ \DeclareSymbolFontAlphabet{\mathcal}{symbols}
+\end{verbatim}
+
+This declaration should be used in preference to
+|\DeclareMathAlphabet| and |\SetMathAlphabet| when a math alphabet is
+the same as a symbol font; this is because it makes better use of the
+limited number (only 16) of \TeX's math groups.
+
+\NEWdescription{1997/12/01}
+Note that, whereas a \TeX{} math group is allocated to each symbol font
+when it is first declared, a math alphabet uses a \TeX{} math group
+only when its command is used within a math formula.
+
+
+\subsection{Declaring math symbols}
+\label{Sec:math.commands}
+
+\begin{decl}
+|\DeclareMathSymbol| \arg{symbol} \arg{type} \arg{sym-font}
+ \arg{slot}
+\end{decl}
+
+The \m{symbol} can be either a single character such as `|>>|', or a
+macro name, such as |\sum|.
+
+Defines the \m{symbol} to be a math symbol of type
+\m{type} in slot \m{slot} of symbol font \m{sym-font}. The
+\m{type} can be given as a number or as a command:
+\begin{center}
+ \begin{tabular}{ccc}
+ \emph{Type} & \emph{Meaning} & \emph{Example} \\
+ |0| or |\mathord | & Ordinary & $\alpha$ \\
+ |1| or |\mathop | & Large operator & $\sum$ \\
+ |2| or |\mathbin | & Binary operation & $\times$ \\
+ |3| or |\mathrel | & Relation & $\leq$ \\
+ |4| or |\mathopen | & Opening & $\langle$ \\
+ |5| or |\mathclose| & Closing & $\rangle$ \\
+ |6| or |\mathpunct| & Punctuation & $;$ \\
+ |7| or |\mathalpha| & Alphabet character & $A$
+ \end{tabular}
+\end{center}
+Only symbols of type |\mathalpha| will be affected by math alphabet
+commands: within the argument of a math alphabet command they will
+produce the character in slot \m{slot} of that math alphabet's font.
+Symbols of other types will always produce the same symbol
+(within one math version).
+
+|\DeclareMathSymbol| allows a macro \m{symbol} to be redefined only if
+it was previously defined to be a math symbol. It also checks that
+the \m{sym-font} is a declared symbol font.
+
+Example:
+\begin{verbatim}
+ \DeclareMathSymbol{\alpha}{0}{letters}{"0B}
+ \DeclareMathSymbol{\lessdot}{\mathbin}{AMSb}{"0C}
+ \DeclareMathSymbol{\alphld}{\mathalpha}{AMSb}{"0C}
+\end{verbatim}
+
+\begin{decl}
+ |\DeclareMathDelimiter| \arg{cmd} \arg{type}
+ \arg{sym-font-1} \arg{slot-1}\\
+ \null\hfill \arg{sym-font-2} \arg{slot-2}
+\end{decl}
+Defines \m{cmd} to be a math delimiter where the small variant is in
+slot \m{slot-1} of symbol font \m{sym-font-1} and the large
+variant is in slot \m{slot-2} of symbol font \m{sym-font-2}.
+Both symbol fonts must have been declared previously.
+
+Checks that \m{sym-font-i} are both declared symbol fonts.
+
+If \TeX{} is not looking for a delimiter, \m{cmd} is treated just as
+if it had been defined with |\DeclareMathSymbol| using
+\m{type}, \m{sym-font-1} and \m{slot-1}. In other words, if a
+command is defined as a delimiter then this automatically defines it
+as a math symbol.
+
+\NEWdescription{1998/06/01}
+In case \m{cmd} is a single character such as `|[|', the same syntax is
+used. Previously the \arg{type} argument was not present (and thus the
+corresponding math symbol declaration had to be provided separately).
+
+Example:
+\begin{verbatim}
+ \DeclareMathDelimiter{\langle}{\mathopen}{symbols}{"68}
+ {largesymbols}{"0A}
+ \DeclareMathDelimiter{(} {\mathopen}{operators}{"28}
+ {largesymbols}{"00}
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareMathAccent| \arg{cmd} \arg{type} \arg{sym-font} \arg{slot}
+\end{decl}
+
+Defines \m{cmd} to act as a math accent.
+
+The accent character comes from slot \m{slot} in
+\m{sym-font}. The \m{type} can be either
+|\mathord| or |\mathalpha|; in the latter case the accent character
+changes font when used in a math alphabet.
+
+Example:
+\begin{verbatim}
+ \DeclareMathAccent{\acute}{\mathalpha}{operators}{"13}
+ \DeclareMathAccent{\vec}{\mathord}{letters}{"7E}
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareMathRadical| \arg{cmd}
+ \arg{sym-font-1} \arg{slot-1}\\
+ \null\hfill \arg{sym-font-2} \arg{slot-2}
+\end{decl}
+
+Defines \m{cmd} to be a radical where the small variant is in
+slot \m{slot-1} of symbol font \m{sym-font-1} and the
+large variant is in slot \m{slot-2} of symbol font
+\m{sym-font-2}. Both symbol fonts must have been declared
+previously.
+
+Example (probably the only use for it!):
+\begin{verbatim}
+ \DeclareMathRadical{\sqrt}{symbols}{"70}{largesymbols}{"70}
+\end{verbatim}
+
+\subsection{Declaring math sizes}
+
+\begin{decl}
+|\DeclareMathSizes| \arg{t-size} \arg{mt-size} \arg{s-size}
+ \arg{ss-size}
+\end{decl}
+
+Declares that \m{mt-size} is the (main) math text size, \m{s-size} is
+the `script' size and \m{ss-size} the `scriptscript' size to be used
+in math, when \m{t-size} is the current text size. For text sizes for
+which no such declaration is given the `script' and `scriptscript'
+size will be calculated and then fonts are loaded for the calculated
+sizes or the best approximation (this may result in a warning
+message).
+
+Normally, \m{t-size} and \m{mt-size} will be identical; however, if,
+for example, PostScript text fonts are mixed with bit-map math fonts
+then you may not have available a \m{mt-size} for every \m{t-size}.
+
+Example:
+\begin{verbatim}
+ \DeclareMathSizes{13.82}{14.4}{10}{7}
+\end{verbatim}
+
+\section{Font installation}
+\label{Sec:install}
+
+This section explains how \LaTeX's font attributes are turned into
+\TeX{} font specifications.
+
+\subsection{Font definition files}
+
+\NEWdescription{1997/12/01}
+The description of how \LaTeX{} font attributes are turned into \TeX{}
+fonts is usually kept in a \emph{font definition file} (|.fd|). The
+file for family \m{family} in encoding \m{ENC} must be
+called |<enc><family>.fd|: for example, |ot1cmr.fd| for Computer
+Modern Roman with encoding |OT1| or |t1ptm.fd| for Adobe Times with
+encoding |T1|. Note that encoding names are converted to lowercase
+when used as part of file names.
+
+Whenever \LaTeX{} encounters an encoding/family combination that it
+does not know (e.g.~if the document designer says
+|\fontfamily{ptm}\selectfont|) then \LaTeX{} attempts to load the
+appropriate |.fd| file. ``Not known'' means: there was no
+|\DeclareFontFamily| declaration issued for this encoding/family
+combination. If the |.fd| file could not be found, a warning is
+issued and font substitutions are made.
+
+The declarations in the font definition file are responsible for
+telling \LaTeX{} how to load fonts for that encoding/family
+combination.
+
+\subsection{Font definition file commands}
+
+\emph{Note}: A font definition file should contain only commands
+from this subsection.
+
+Note that these commands can also be used outside a font definition
+file: they can be put in package or class files, or even in the
+preamble of a document.
+
+\begin{decl}
+ |\ProvidesFile{<file-name>}[<release-info>]|
+\end{decl}
+The file should announce itself with a |\ProvidesFile| command,
+as described in \emph{\clsguide}. For example:
+\begin{verbatim}
+ \ProvidesFile{t1ptm.fd}[1994/06/01 Adobe Times font definitions]
+\end{verbatim}
+
+Spaces within the arguments specific to font definition files are
+ignored to avoid surplus spaces in the document. If a real space is
+necessary use |\space|.
+\NEWdescription{2004/02/10}However, note that this is only true if the
+declaration is made at top level! If used within the definition of
+another command, within |\AtBeginDocument|, option code or in similar
+places, then spaces within the argument will remain and may result in
+incorrect table entries.
+
+\begin{decl}
+|\DeclareFontFamily| \arg{encoding} \arg{family} \arg{loading-settings}
+\end{decl}
+
+Declares a font family \m{family} to be available in encoding scheme
+\m{encoding}.
+
+The \m{loading-settings} are executed immediately after loading any
+font with this encoding and family.
+
+Checks that \m{encoding} was previously declared.
+
+This example refers to the Computer Modern Typewriter font family in
+the Cork encoding:
+\begin{verbatim}
+ \DeclareFontFamily{T1}{cmtt}{\hyphenchar\font=-1}
+\end{verbatim}
+
+Each |.fd| file should contain exactly one |\DeclareFontFamily|
+command, and it should be for the appropriate encoding/family
+combination.
+
+\begin{decl}
+|\DeclareFontShape| \arg{encoding} \arg{family} \arg{series}
+ \arg{shape}\\
+ \null\hfill \arg{loading-info} \arg{loading-settings}
+\end{decl}
+
+Declares a font shape combination; here \m{loading-info} contains the
+information that combines sizes with external fonts. The syntax is
+complex and is described in Section~\ref{sec:loadinfo} below.
+
+The \m{loading-settings} are executed after loading any font with this
+font shape. They are executed immediately after the
+`loading-settings' which were declared by |\DeclareFontFamily| and so
+they can be used to overwrite the settings made at the family level.
+
+Checks that the combination \m{encoding}\m{family} was previously
+declared via |\DeclareFontFamily|.
+
+Example:
+\begin{verbatim}
+ \DeclareFontShape{OT1}{cmr}{m}{sl}{%
+ <<5-8>> sub * cmr/m/n
+ <<8>> cmsl8
+ <<9>> cmsl9
+ <<10>> <<10.95>> cmsl10
+ <<12>> <<14.4>> <<17.28>> <<20.74>> <<24.88>> cmsl12
+ }{}
+\end{verbatim}
+The file can contain any number of |\DeclareFontShape| commands,
+which should be for the appropriate \m{encoding} and \m{family}.
+
+\NEWfeature{1996/06/01}
+The font family declarations for the |OT1|-encoded fonts now all
+contain:
+\begin{verbatim}
+ \hyphenchar\font=`\-
+\end{verbatim}
+This enables the use of an alternative |\hyphenchar| in other encodings
+whilst maintaining the correct value for all fonts.
+
+\subsection{Font file loading information}
+\label{sec:loadinfo}
+
+The information which tells \LaTeX{} exactly which font (\texttt{.tfm})
+files to load is contained in the \m{loading-info} part of a
+|\DeclareFontShape| declaration. This part consists of one or more
+\m{fontshape-decl}s, each of which has the following form:
+
+\begin{center}
+\begin{tabular}{r@{ $::=$ }l}
+ \m{fontshape-decl} & \m{size-infos} \m{font-info} \\
+ \m{size-infos} & \m{size-infos} \m{size-info} $\mid$
+ \m{size-info} \\
+ \m{size-info} & ``|<<|'' \m{number-or-range} ``|>>|'' \\
+ \m{font-info} & $[$ \m{size-function} ``|*|'' $]$
+ $[$ ``|[|'' \m{optarg} ``|]|'' $]$ \m{fontarg} \\
+\end{tabular}
+\end{center}
+The \m{number-or-range} denotes the size or size-range
+for which this entry applies.
+
+If it contains a hyphen it is a
+range: lower bound on the left (if missing, zero implied), upper bound
+on the right (if missing, $\infty$ implied). For ranges, the
+upper bound is \emph{not} included in the range and the lower bound is.
+
+Examples:
+\begin{center}
+\begin{tabular}{lll}
+ |<<10>>| & simple size& 10pt only\\
+ |<<-8>>| & range& all sizes less than 8pt\\
+ |<<8-14.4>>| & range& all sizes greater than or equal to 8pt\\
+ & & \ but less than 14.4pt\\
+ |<<14.4->>| & range& all sizes greater than or equal 14.4pt
+\end{tabular}
+\end{center}
+If more than one \m{size-info} entry follows without any
+intervening \m{font-info}, they all share the next \m{font-info}.
+
+The \m{size-function}, if present, handles the use of \m{font-info}.
+If not present, the `empty' \m{size-function} is assumed.
+
+All the \m{size-info}s are inspected in the order in which they appear
+in the font shape declaration. If a \m{size-info} matches the
+requested size, its \m{size-function} is executed. If |\external@font|
+is non-empty afterwards this process stops, otherwise the next
+\m{size-info} is inspected. (See also |\DeclareSizeFunction|.)
+
+If this process does not lead to a non-empty |\external@font|,
+\LaTeX{} tries the nearest simple size. If the entry contains only
+ranges an error is returned.
+
+
+\subsection{Size functions}
+\label{sec:sizefunct}
+
+
+\LaTeX{} provides the following size functions, whose `inputs' are
+\m{fontarg} and \m{optarg} (when present).
+
+\begin{description}
+\item[`' (empty)]
+Load the external font \m{fontarg} at the user-requested size. If
+\m{optarg} is present, it is used as the scale-factor.
+
+\item[s]
+Like the empty function but without terminal warnings, only
+loggings.
+
+\item[gen]
+Generates the external font from \m{fontarg} followed by
+the user-requested size, e.g.~|<<8>> <<9>> <<10>> gen * cmtt|
+
+\item[sgen]
+Like the `gen' function but without terminal warnings, only loggings.
+
+\item[genb]
+\NEWfeature{1995/12/01}
+Generates the external font from \m{fontarg} followed by
+the user-requested size, using the conventions of the `ec' fonts.
+e.g.~|<<10.98>> genb * dctt| produces |dctt1098|.
+
+\item[sgenb]
+\NEWfeature{1995/12/01}
+Like the `genb' function but without terminal warnings, only loggings.
+
+\item[sub]
+Tries to load a font from a different font shape declaration given by
+\m{fontarg} in the form \m{family}|/|\m{series}|/|\m{shape}.
+
+\item[ssub]
+Silent variant of `sub', only loggings.
+
+\item[subf]
+Like the empty function but issues a warning that it has to substitute
+the external font \m{fontarg} because the desired font shape was not
+available in the requested size.
+
+\item[ssubf]
+Silent variant of `subf', only loggings.
+
+\item[fixed]
+Load font \m{fontarg} as is, disregarding the user-requested size.
+If present, \m{optarg} gives the ``at \ldots pt'' size to be used.
+
+\item[sfixed]
+Silent variant of `fixed', only loggings.
+
+\end{description}
+
+Examples for the use of most of the above size functions can be found
+in the file |cmfonts.fdd|---the source for the standard |.fd| files
+describing the Computer Modern fonts by Donald Knuth.
+
+
+\begin{decl}
+|\DeclareSizeFunction| \arg{name} \arg{code}
+\end{decl}
+
+Declares a size-function \m{name} for use in |\DeclareFontShape|
+commands. The interface is still under development but there should be
+no real need to a define new size functions.
+
+The \m{code} is executed when the size or size-range in
+|\DeclareFontShape| matches the user-requested size.
+
+The arguments of the size-function are automatically parsed and placed
+into |\mandatory@arg| and |\optional@arg| for use in \m{code}. Also
+available, of course, is |\f@size|, which is the user-requested size.
+
+To signal success \m{code} must define the command |\external@font|
+to contain the external name and any scaling options (if present) for
+the font to be loaded.
+
+This example sets up the `empty' size function (simplified):
+\begin{verbatim}
+ \DeclareSizeFunction{}
+ {\edef\external@font{\mandatory@arg\space at\f@size}
+\end{verbatim}
+
+
+\section{Encodings}
+\label{Sec:encode}
+
+This section explains how to declare and use new font encodings and
+how to declare commands for use with particular encodings.
+
+\subsection{The \textsf{fontenc} package}
+
+Users can select new font encodings using the |fontenc| package. The
+|fontenc| package has options for encodings; the last option becomes
+the default encoding. For example, to use the |OT2| (Washington
+University Cyrillic encoding) and |T1| encodings, with |T1| as the
+default, an author types:
+\begin{verbatim}
+ \usepackage[OT2,T1]{fontenc}
+\end{verbatim}
+
+\NEWdescription{1997/12/01}
+For each font encoding \m{ENC} given as an option, this package loads
+the \emph{encoding definition} (|<enc>enc.def|, with an all
+lower-case name) file; it also sets |\encodingdefault| to be the last
+encoding in the option list.
+
+The declarations in the encoding definition file |<enc>enc.def| for
+encoding \m{ENC} are responsible for declaring this encoding and
+telling \LaTeX{} how to produce characters in this encoding; this file
+should contain nothing else (see Section~\ref{Sec:encode.def}.
+
+The standard \LaTeX{} format declares the |OT1| and |T1| text
+encodings by inputting the files |ot1enc.def| and |t1enc.def|; it also
+sets up various defaults which require that |OT1|-encoded fonts are
+available.
+Other encoding set-ups might be added to the distribution at a
+later stage.
+
+Thus the example above loads the files |ot2enc.def| and |t1enc.def|
+and sets |\encodingdefault| to |T1|.
+
+\emph{Warning}: If you wish to use |T1|-encoded fonts other than the `cmr'
+family then you may need to load the package (e.g.~\texttt{times})
+that selects the fonts \emph{before} loading \texttt{fontenc} (this
+prevents the system from attempting to load any |T1|-encoded fonts from
+the `cmr' family).
+
+
+
+\subsection{Encoding definition file commands}
+\label{Sec:encode.def}
+
+\emph{Note}: An encoding definition file should contain only commands
+from this subsection.
+
+\NEWdescription{2019/07/10}
+As an exception it may also contain a |\DeclareFontsubstitution|
+declaration (described in \ref{sec:encoding-defaults}) to specify how
+font substitution for this encoding should be handled. In that case
+it is important that the values used point to a font that is guaranteed
+to be available on all \LaTeX{} installations.\footnote{If the font
+ encoding file is made available as part of a CTAN bundle, that could
+ be a font that is provided together with that bundle, but it should
+ not point to font which requires further installation steps and
+ therefore may or may not be installed.}
+
+
+\NEWdescription{1997/12/01}
+As with the font definition file commands, it is also possible
+(although normally not necessary) to use these declarations directly
+within a class or package file.
+
+\emph{Warning}: Some aspects of the contents of font definition files
+are still under development. Therefore, the current versions of the
+files |ot1enc.def| and |t1enc.def| are temporary versions and should
+not be used as models for producing further such files. For further
+information you should read the documentation in |ltoutenc.dtx|.
+
+\begin{decl}
+ |\ProvidesFile{<file-name>}[<release-info>]|
+\end{decl}
+The file should announce itself with a |\ProvidesFile|
+command, described in \emph{\clsguide}. For example:
+\begin{verbatim}
+ \ProvidesFile{ot2enc.def}
+ [1994/06/01 Washington University Cyrillic encoding]
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareFontEncoding| \arg{encoding} \arg{text-settings}
+ \arg{math-settings}
+\end{decl}
+
+Declares a new encoding scheme \m{encoding}.
+
+The \m{text-settings} are
+declarations which are executed every time |\selectfont| changes the
+encoding to be \m{encoding}.
+
+The \m{math-settings} are similar but are for math alphabets. They
+are executed whenever a math alphabet with this encoding is
+called.
+
+\NEWfeature{1998/12/01}
+It also saves the value of \m{encoding} in the macro
+|\LastDeclaredEncoding|.
+
+Example:
+\begin{verbatim}
+ \DeclareFontEncoding{OT1}{}{}
+\end{verbatim}
+
+Some author commands need to change their definition depending on
+which encoding is currently in use. For example, in the |OT1|
+encoding, the letter `\AE' is in slot |"1D|, whereas in the |T1|
+encoding it is in slot |"C6|. So the definition of |\AE| has to
+change depending on whether the current encoding is |OT1| or |T1|.
+The following commands allow this to happen.
+
+\begin{decl}
+ |\DeclareTextCommand| \arg{cmd} \arg{encoding}
+ \oarg{num} \oarg{default} \arg{definition}
+\end{decl}
+This command is like |\newcommand|, except that it defines a
+command which is specific to one encoding. For example, the
+definition of |\k| in the |T1| encoding is:
+\begin{verbatim}
+ \DeclareTextCommand{\k}{T1}[1]
+ {\oalign{\null#1\crcr\hidewidth\char12}}
+\end{verbatim}
+|\DeclareTextCommand| takes the same optional arguments as
+|\newcommand|.
+
+The resulting command is
+robust, even if the code in \m{definition} is fragile.
+
+It does not produce an error if the command has already
+been defined but logs the redefinition in the transcript file.
+
+\begin{decl}[1994/12/01]
+ |\ProvideTextCommand| \arg{cmd} \arg{encoding}
+ \oarg{num} \oarg{default} \arg{definition}
+\end{decl}
+This command is the same as |\DeclareTextCommand|, except that
+if \m{cmd} is already defined in encoding \m{encoding}, then the
+definition is ignored.
+
+\begin{decl}
+ |\DeclareTextSymbol| \arg{cmd} \arg{encoding} \arg{slot}
+\end{decl}
+This command defines a text symbol with slot \m{slot} in the
+encoding. For example, the definition of |\ss| in the |OT1| encoding
+is:
+\begin{verbatim}
+ \DeclareTextSymbol{\ss}{OT1}{25}
+\end{verbatim}
+It does not produce an error if the command has already
+been defined but logs the redefinition in the transcript file.
+
+\begin{decl}
+ |\DeclareTextAccent| \arg{cmd} \arg{encoding} \arg{slot}
+\end{decl}
+This command declares a text accent, with the accent taken from slot
+\m{slot} in the encoding. For example, the definition of |\"| in
+the |OT1| encoding is:
+\begin{verbatim}
+ \DeclareTextAccent{\"}{OT1}{127}
+\end{verbatim}
+It does not produce an error if the command has already
+been defined but logs the redefinition in the transcript file.
+
+\begin{decl}
+ |\DeclareTextComposite| \arg{cmd} \arg{encoding} \arg{letter}
+ \arg{slot}
+\end{decl}
+This command declares that the composite letter formed from applying
+\m{cmd} to \m{letter} is defined to be simply slot \m{slot} in the
+encoding. The \m{letter} should be a single letter (such as |a|) or
+a single command (such as |\i|).
+
+
+For example, the definition of |\'{a}|
+in the |T1| encoding could be declared like this:
+\begin{verbatim}
+ \DeclareTextComposite{\'}{T1}{a}{225}
+\end{verbatim}
+
+The \m{cmd} will normally have been previously declared
+for this encoding, either by using
+|\DeclareTextAccent|, or as a one-argument |\DeclareTextCommand|.
+
+\begin{decl}[1994/12/01]
+ |\DeclareTextCompositeCommand| \arg{cmd} \arg{encoding} \arg{letter}
+ \arg{definition}
+\end{decl}
+This is a more general form of |\DeclareTextComposite|, which allows
+for an arbitrary \m{definition}, not just a \m{slot}. The main use
+for this is to allow accents on |i| to act like accents on |\i|, for
+example:
+\begin{verbatim}
+ \DeclareTextCompositeCommand{\'}{OT1}{i}{\'\i}
+\end{verbatim}
+It has the same restrictions as |\DeclareTextComposite|.
+
+
+\begin{decl}[1998/12/01]
+ |\LastDeclaredEncoding|
+\end{decl}
+This holds the name of the last encoding declared via
+|\DeclareFontEncoding| (this should also be the currently most
+efficient encoding). It can be used in the \m{encoding} argument
+of the above declarations in place of explicitly mentioning the
+encoding, e.g.
+\begin{verbatim}
+ \DeclareFontEncoding{T1}{}{}
+ \DeclareTextAccent{\`}{\LastDeclaredEncoding}{0}
+ \DeclareTextAccent{\'}{\LastDeclaredEncoding}{1}
+\end{verbatim}
+This can be useful in cases where encoding files sharing common code
+are generated from one source.
+
+
+\subsection{Default definitions}
+
+\NEWdescription{1997/12/01}
+The declarations used in encoding definition files define
+encoding-specific commands but they do not allow those commands to be
+used without explicitly changing the encoding. For some commands,
+such as symbols, this is not enough. For example, the~|OMS| encoding
+contains the symbol~`\S', but we need to be able to use the
+command~|\S| whatever the current encoding may be, without explicitly
+selecting the encoding~|OMS|.
+
+\NEWdescription{1997/12/01}
+To allow this, \LaTeX{} has commands that declare default definitions
+for commands; these defaults are used when the command is not defined
+in the current encoding. For example, the default encoding for~|\S|
+is~|OMS|, and so in an encoding (such as |OT1|) which does not
+contain~|\S|, the~|OMS| encoding is selected in order to access this
+glyph. But in an encoding (such as~|T1|) which does contain~|\S|, the
+glyph in that encoding is used. The standard \LaTeXe{} format sets
+up several such defaults using the following encodings: |OT1|,~|OMS|
+and~|OML|.
+
+\emph{Warning}: These commands should \emph{not} occur in encoding
+definition files, since those files should declare only commands for use
+when that encoding has been selected. They should instead be placed
+in packages; they must, of course, always refer to encodings that are
+known to be available.
+
+\begin{decl}[1994/12/01]
+ |\DeclareTextCommandDefault| \arg{cmd} \arg{definition}
+\end{decl}
+This command allows an encoding-specific command to be given a default
+definition. For example, the default definition for |\copyright| is
+defined be be a circled `c' with:
+\begin{verbatim}
+ \DeclareTextCommandDefault{\copyright}{\textcircled{c}}
+\end{verbatim}
+\begin{decl}[1994/12/01]
+ |\DeclareTextAccentDefault| \arg{cmd} \arg{encoding} \\
+ |\DeclareTextSymbolDefault| \arg{cmd} \arg{encoding}
+\end{decl}
+These commands allow an encoding-specific command to be given a
+default encoding. For example, the default encoding for |\"| and
+|\ae| is set to be |OT1| by:
+\begin{verbatim}
+ \DeclareTextAccentDefault{\"}{OT1}
+ \DeclareTextSymbolDefault{\ae}{OT1}
+\end{verbatim}
+Note that |\DeclareTextAccentDefault| can be used on any one-argument
+encoding-specific command, not just those defined with
+|\DeclareTextAccent|. Similarly, |\DeclareTextSymbolDefault| can be
+used on any encoding-specific command with no arguments, not just
+those defined with |\DeclareTextSymbol|.
+
+For more examples of these definitions, see |ltoutenc.dtx|.
+
+\begin{decl}[1994/12/01]
+ |\ProvideTextCommandDefault| \arg{cmd} \arg{definition}
+\end{decl}
+This command is the same as |\DeclareTextCommandDefault|, except that
+if the command already has a default definition, then the definition
+is ignored. This is useful to give `faked' definitions of symbols
+which may be given `real' definitions by other packages. For example,
+a package might give a fake definition of |\textonequarter| by saying:
+\begin{verbatim}
+ \ProvideTextCommandDefault{\textonequarter}{$\m@th\frac14$}
+\end{verbatim}
+
+ \subsection{Encoding defaults} \label{sec:encoding-defaults}
+
+\begin{decl}
+|\DeclareFontEncodingDefaults| \arg{text-settings} \arg{math-settings}
+\end{decl}
+
+Declares \m{text-settings} and \m{math-settings} for all encoding
+schemes. These are executed before the encoding scheme dependent ones
+are executed so that one can use the defaults for the major cases and
+overwrite them if necessary using |\DeclareFontEncoding|.
+
+If |\relax| is used as an argument, the current setting of this default
+is left unchanged.
+
+This example is used by amsfonts.sty for accent positioning; it changes
+only the math settings:
+\begin{verbatim}
+ \DeclareFontEncodingDefaults{\relax}{\def\accentclass@{7}}
+\end{verbatim}
+
+
+\begin{decl}
+|\DeclareFontSubstitution| \arg{encoding} \arg{family} \arg{series}
+ \arg{shape}
+\end{decl}
+
+Declares the default values for font substitution which will be used
+when a font with encoding \m{encoding}
+should be loaded but no font can be found with the current
+attributes.
+
+These substitutions are local to the encoding scheme because the
+encoding scheme is never substituted! They are tried in the order
+\m{shape} then \m{series} and finally \m{family}.
+
+\NEWdescription{2019/07/10}
+This declaration is normally done in an encoding definition file
+(see~\ref{Sec:encode.def}), but can also be used in a class file or
+the document preamble to alter the default for a specific encoding.
+
+If no defaults are set up for an encoding, the values given by
+|\DeclareErrorFont| are used.
+
+The font specification for
+\m{encoding}\m{family}\m{series}\m{shape}
+must have been defined by |\DeclareFontShape|
+before the |\begin{document}| is reached.
+
+Example:
+\begin{verbatim}
+ \DeclareFontSubstitution{T1}{cmr}{m}{n}
+\end{verbatim}
+
+\subsection{Case changing}
+\label{sec:case}
+
+\begin{decl}
+ |\MakeUppercase| \arg{text} \\
+ |\MakeLowercase| \arg{text}
+\end{decl}
+
+\NEWfeature{1995/06/01}
+\TeX{} provides the two primitives |\uppercase| and |\lowercase| for
+changing the case of text. Unfortunately, these \TeX{} primitives do
+not change the case of characters accessed by commands like |\ae| or
+|\aa|. To overcome this problem, \LaTeX{} provides these two commands.
+
+In the long run, we would like to use all-caps fonts rather than any
+command like |\MakeUppercase| but this is not possible at the moment
+because such fonts do not exist.
+
+For further details, see \texttt{clsguide.tex}.
+
+\NEWdescription{1999/04/23}
+In order that upper/lower-casing will work reasonably well, and in
+order to provide any correct hyphenation, \LaTeXe{} \emph{must} use,
+throughout a document, the same fixed table for changing case. The
+table used is designed for the font encoding |T1|; this works well
+with the standard \TeX{} fonts for all Latin alphabets but will cause
+problems when using other alphabets. As an experiment, it has now
+been extended for use with some Cyrillic encodings.
+
+
+\section{Miscellanea}
+\label{Sec:misc}
+
+This section covers the remaining font commands in \LaTeX{} and some
+other issues.
+
+\subsection{Font substitution}
+
+\begin{decl}
+|\DeclareErrorFont| \arg{encoding} \arg{family} \arg{series}
+ \arg{shape} \arg{size}
+\end{decl}
+
+Declares \m{encoding}\m{family}\m{series}\m{shape} to be the font shape
+used in cases where the standard substitution mechanism fails
+(i.e.~would loop). For the standard mechanism see the command
+|\DeclareFontSubstitution| above.
+
+The font specification for
+\m{encoding}\m{family}\m{series}\m{shape}
+must have been defined by |\DeclareFontShape|
+before the |\begin{document}| is reached.
+
+Example:
+\begin{verbatim}
+ \DeclareErrorFont{OT1}{cmr}{m}{n}{10}
+\end{verbatim}
+
+\NEWdescription{2019/07/10}
+This declaration is a system wide fallback and it should normally not
+be changed, in particular it does not belong into font encoding
+definition files but rather into the \LaTeX{} format. It is normally
+set up in \texttt{fonttext.cfg}. Adjustments on a per encoding base
+should be made through |\DeclareFontSubstitution| instead!
+
+
+\begin{decl}
+|\fontsubfuzz|
+\end{decl}
+
+This parameter is used to decide whether or not to produce a terminal
+warning if a font size substitution takes place. If the difference
+between the requested and the chosen size is less than |\fontsubfuzz|
+the warning is only written to the transcript file. The default value
+is |0.4pt|. This can be redefined with |\renewcommand|, for example:
+\begin{verbatim}
+ \renewcommand{\fontsubfuzz}{0pt} % always warn
+\end{verbatim}
+
+\subsection{Preloading}
+
+\begin{decl}
+|\DeclarePreloadSizes| \arg{encoding} \arg{family} \arg{series}
+ \arg{shape}
+\arg{size-list}
+\end{decl}
+
+
+Specifies the fonts that should be preloaded by the format. These
+commands should be put in a |preload.cfg| file, which is read in when
+the \LaTeX{} format is being built.
+Read |preload.dtx| for more information on how to built such a
+configuration file.
+
+Example:
+\begin{verbatim}
+ \DeclarePreloadSizes{OT1}{cmr}{m}{sl}{10,10.95,12}
+\end{verbatim}
+
+\NEWdescription{2019/07/10}
+Preloading is really an artifact of the days when loading fonts while
+processing a document contributed substantially to the processing
+time. These days it is usually best not to use this mechanism any more.
+
+\subsection{Accented characters}
+
+\NEWdescription{1996/06/01}
+Accented characters in \LaTeX{} can be produced using commands such as
+|\"a| etc. The precise effect of such commands depends on the font
+encoding being used. When using a font encoding that contains the
+accented characters as individual glyphs (such as the |T1| encoding,
+in the case of |\"a|) words that contain such accented characters can
+be automatically hyphenated. For font encodings that do not contain
+the requested individual glyph (such as the |OT1| encoding) such a
+command invokes typesetting instructions that produce the accented
+character as a combination of character glyphs and diacritical marks
+in the font. In most cases this involves a call to the \TeX{}
+primitive |\accent|. Glyphs constructed as composites in this way
+inhibit hyphenation of the current word; this is one reason why the
+|T1| encoding is preferable to the original \TeX{} font encoding
+|OT1|.
+
+It is important to understand that commands like |\"a| in \LaTeXe{}
+represent just a name for a single glyph (in this case `umlaut a') and
+contain no information about how to typeset that glyph---thus it does
+\emph{not} mean `put two dots on top of the character a'. The
+decision as to what typesetting routine to use will depend on the
+encoding of the current font and so this decision is taken at the last
+minute. Indeed, it is possible that the same input will be typeset in
+more than one way in the same document; for example, text in section
+headings may also appear in table of contents and in running heads; and
+each of these may use a font with a different encoding.
+
+For this reason the notation |\"a| is \emph{not} equivalent to:
+\begin{verbatim}
+ \newcommand \chara {a} \"\chara
+\end{verbatim}
+In the latter case, \LaTeX{} does not expand the macro |\chara| but
+simply compares the notation (the string |\"\chara|) to its list of
+known composite notations in the current encoding; when it fails to
+find |\"\chara| it does the best it can and invokes the typesetting
+instructions that put the umlaut accent on top of the expansion of
+|\chara|. Thus, even if the font actually contains `\"a' as an
+individual glyph, it will not be used.
+
+The low-level accent commands in \LaTeX{} are defined in such a way
+that it is possible to combine a diacritical mark from one font with a
+glyph from another font; for example, |\"\textparagraph| will produce
+\"\textparagraph. The umlaut here
+is taken from the |OT1| encoded font |cmr10| whilst the paragraph sign
+is from the |OMS| encoded font |cmsy10|. (This example may be
+typographically silly but better ones would involve font encodings
+like |OT2| (Cyrillic) that might not be available at every
+site.)
+
+There are, however, restrictions on the font-changing commands that
+will work within the argument to such an accent command. These are
+\TeX{}nical in the sense that they follow from the way that \TeX{}'s
+|\accent| primitive works, allowing only a special class of commands
+between the accent and the accented character.
+
+The following are examples of commands that will not work correctly as
+the accent will appear above a space: the font commands with text
+arguments (|\textbf{...}| and friends); all the font size declarations
+(|\fontsize| and |\Large|, etc.); |\usefont| and declarations that
+depend on it, such as |\normalfont|; box commands (e.g.~|\mbox{...}|).
+
+The lower-level font declarations that set the attributes family,
+series and shape (such as |\fontshape{sl}\selectfont|) will produce
+correct typesetting, as will the default declarations such as
+|\bfseries|.
+
+
+\subsection{Naming conventions}
+
+\begin{itemize}
+\item
+Math alphabet commands all start with |\math...|: examples are
+|\mathbf|, |\mathcal|, etc.
+
+\item
+The text font changing commands with arguments all start with
+|\text...|: e.g.~|\textbf| and |\textrm|. The exception to this is
+|\emph|, since it occurs very commonly in author documents and so
+deserves a shorter name.
+
+\item
+Names for encoding schemes are strings of up to three letters (all
+upper case) plus digits.
+
+The \LaTeX3 project reserves the use of encodings starting with the
+following letters: |T| (standard 256-long text encodings), |TS|
+(symbols that are designed to extend a corresponding |T| encoding),
+|X| (text encodings that do not conform to the strict requirements for
+|T| encodings), |M| (standard 256-long math encodings), |S| (other
+symbol encodings), |A| (other special applications), |OT| (standard
+128-long text encodings) and |OM| (standard 128-long math encodings).
+
+Please do not use the above starting letters for non-portable
+encodings. If new standard encodings emerge then we shall add them in
+a later release of \LaTeX.
+
+Encoding schemes which are local to a site or a system should start
+with |L|, experimental encodings intended for wide distribution will
+start with |E|, whilst |U| is for Unknown or Unclassified encodings.
+
+\item
+Font family names should contain up to five lower case letters.
+Where possible, these should conform to the \emph{Filenames for fonts}
+font naming scheme.
+
+\item
+Font series names should contain up to four lower case letters.
+
+\item
+Font shapes should contain up to two letters lower case.
+
+\item
+Names for symbol fonts are built from lower and upper case letters
+with no restriction.
+\end{itemize}
+
+Whenever possible, you should use the series and shape names suggested
+in \emph{\LaTeXcomp} since this will make it easier to combine new
+fonts with existing fonts.
+
+\NEWdescription{1994/12/01}
+ Where possible, text symbols should be named as |\text| followed by
+ the Adobe glyph name: for example |\textonequarter| or
+ |\textsterling|. Similarly, math symbols should be named as
+ |\math| followed by the glyph name, for example |\mathonequarter|
+ or |\mathsterling|. Commands which can be used in text or math can
+ then be defined using |\ifmmode|, for example:
+\begin{verbatim}
+ \DeclareRobustCommand{\pounds}{%
+ \ifmmode \mathsterling \else \textsterling \fi
+ }
+\end{verbatim}
+ Note that commands defined in this way must be robust, in case they
+ get put into a section title or other moving argument.
+
+\section{If you need to know more \ldots}
+
+\NEWdescription{1996/06/01}
+The |tracefnt| package provides for tracing the actions concerned with
+loading, substituting and using fonts.
+The package accepts the following options:
+\begin{description}
+\item[errorshow] Write all information about font changes, etc.\ but
+ only to the transcript file unless an error occurs. This means that
+ information about font substitution will not be shown on the
+ terminal.
+
+\item[warningshow] Show all font warnings on the terminal. This
+ setting corresponds to the default behavior when this
+ \texttt{tracefnt} package is \emph{not} used!
+
+\item[infoshow] Show all font warnings and all font info messages
+ (that are normally only written to the transcript file) also on the
+ terminal. This is the default when this \texttt{tracefnt} package is
+ loaded.
+
+\item[debugshow] In addition to what is shown by \texttt{infoshow},
+ show also changes of math fonts (as far as possible): beware, this
+ option can produce a large amount of output.
+
+\item[loading] Show the names of external font files when they are
+ loaded. This option shows only `newly loaded' fonts, not those
+ already preloaded in the format or the class file before this
+ \texttt{tracefnt} package becomes active.
+
+\item[pausing]
+ Turn all font warnings into errors so that \LaTeX{} will stop.
+\end{description}
+
+\emph{Warning}: The actions of this package can change the layout of a
+document and even, in rare cases, produce clearly wrong output, so
+it should not be used in the final formatting of `real documents'.
+
+\begin{thebibliography}{1}
+
+\bibitem{A-W:MG2004}
+Frank Mittelbach and Michel Goossens.
+\newblock {\em The {\LaTeX} Companion second edition}.
+\newblock With Johannes Braams, David Carlisle, and Chris Rowley.
+\newblock Addison-Wesley, Reading, Massachusetts, 2004.
+
+\bibitem{tub:DKn89}
+Donald~E. Knuth.
+\newblock Typesetting concrete mathematics.
+\newblock {\em {TUG}boat}, 10(1):31--36, April 1989.
+
+\bibitem{A-W:LLa94}
+Leslie Lamport.
+\newblock {\em {\LaTeX:} A Document Preparation System}.
+\newblock Addison-Wesley, Reading, Massachusetts, second edition, 1994.
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/fontdef.dtx b/macros/latex-dev/base/fontdef.dtx
index 36a31ef19b..38d51411c3 100644
--- a/macros/latex-dev/base/fontdef.dtx
+++ b/macros/latex-dev/base/fontdef.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -39,7 +39,7 @@
%<driver, >\ProvidesFile{fontdef.drv}
% \fi
% \ProvidesFile{fontdef.dtx}
-%<-latexrelease> [2018/09/24 v3.0b LaTeX Kernel
+%<-latexrelease> [2019/08/27 v3.0c LaTeX Kernel
% \iftrue (\else
%<text, >(Text
%<math, >(Math
@@ -837,7 +837,6 @@
%
% \begin{macrocode}
\DeclareMathSymbol{\aleph}{\mathord}{symbols}{"40}
-\def\hbar{{\mathchar'26\mkern-9muh}}
\DeclareMathSymbol{\imath}{\mathord}{letters}{"7B}
\DeclareMathSymbol{\jmath}{\mathord}{letters}{"7C}
\DeclareMathSymbol{\ell}{\mathord}{letters}{"60}
@@ -849,13 +848,8 @@
\DeclareMathSymbol{\prime}{\mathord}{symbols}{"30}
\DeclareMathSymbol{\emptyset}{\mathord}{symbols}{"3B}
\DeclareMathSymbol{\nabla}{\mathord}{symbols}{"72}
-\def\surd{{\mathchar"1270}}
\DeclareMathSymbol{\top}{\mathord}{symbols}{"3E}
\DeclareMathSymbol{\bot}{\mathord}{symbols}{"3F}
-\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
- \not\mathrel{\mkern14mu}\crcr
- \noalign{\nointerlineskip}
- \mkern2.5mu\leaders\hrule \@height.34pt\hfill\mkern2.5mu\crcr}}}}
\DeclareMathSymbol{\triangle}{\mathord}{symbols}{"34}
\DeclareMathSymbol{\forall}{\mathord}{symbols}{"38}
\DeclareMathSymbol{\exists}{\mathord}{symbols}{"39}
@@ -869,6 +863,17 @@
\DeclareMathSymbol{\heartsuit}{\mathord}{symbols}{"7E}
\DeclareMathSymbol{\spadesuit}{\mathord}{symbols}{"7F}
% \end{macrocode}
+%
+% \changes{v3.0c}{2019/08/27}{Various commands made robust throughout
+% the file}
+% \begin{macrocode}
+\DeclareRobustCommand\hbar{{\mathchar'26\mkern-9muh}}
+\DeclareRobustCommand\surd{{\mathchar"1270}}
+\DeclareRobustCommand\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr
+ \not\mathrel{\mkern14mu}\crcr
+ \noalign{\nointerlineskip}
+ \mkern2.5mu\leaders\hrule \@height.34pt\hfill\mkern2.5mu\crcr}}}}
+% \end{macrocode}
%
%
% \subsubsection{Large Operators}
@@ -881,14 +886,14 @@
\DeclareMathSymbol{\bigcap}{\mathop}{largesymbols}{"54}
\DeclareMathSymbol{\bigcup}{\mathop}{largesymbols}{"53}
\DeclareMathSymbol{\intop}{\mathop}{largesymbols}{"52}
- \def\int{\intop\nolimits}
+ \DeclareRobustCommand\int{\intop\nolimits}
\DeclareMathSymbol{\prod}{\mathop}{largesymbols}{"51}
\DeclareMathSymbol{\sum}{\mathop}{largesymbols}{"50}
\DeclareMathSymbol{\bigotimes}{\mathop}{largesymbols}{"4E}
\DeclareMathSymbol{\bigoplus}{\mathop}{largesymbols}{"4C}
\DeclareMathSymbol{\bigodot}{\mathop}{largesymbols}{"4A}
\DeclareMathSymbol{\ointop}{\mathop}{largesymbols}{"48}
- \def\oint{\ointop\nolimits}
+ \DeclareRobustCommand\oint{\ointop\nolimits}
\DeclareMathSymbol{\bigsqcup}{\mathop}{largesymbols}{"46}
\DeclareMathSymbol{\smallint}{\mathop}{symbols}{"73}
% \end{macrocode}
@@ -961,7 +966,7 @@
\DeclareMathSymbol{\Leftrightarrow}{\mathrel}{symbols}{"2C}
\DeclareMathSymbol{\Leftarrow}{\mathrel}{symbols}{"28}
\DeclareMathSymbol{\Rightarrow}{\mathrel}{symbols}{"29}
-\def\neq{\not=} \let\ne=\neq
+\DeclareRobustCommand\neq{\not=} \let\ne=\neq
\DeclareMathSymbol{\leq}{\mathrel}{symbols}{"14}
\let\le=\leq
\DeclareMathSymbol{\geq}{\mathrel}{symbols}{"15}
@@ -987,7 +992,7 @@
\DeclareMathSymbol{\rightarrow}{\mathrel}{symbols}{"21}
\let\to=\rightarrow
\DeclareMathSymbol{\mapstochar}{\mathrel}{symbols}{"37}
- \def\mapsto{\mapstochar\rightarrow}
+ \DeclareRobustCommand\mapsto{\mapstochar\rightarrow}
\DeclareMathSymbol{\sim}{\mathrel}{symbols}{"18}
\DeclareMathSymbol{\simeq}{\mathrel}{symbols}{"27}
\DeclareMathSymbol{\perp}{\mathrel}{symbols}{"3F}
@@ -1051,9 +1056,9 @@
\DeclareRobustCommand
\Relbar{\mathrel{=}}
\DeclareMathSymbol{\lhook}{\mathrel}{letters}{"2C}
- \def\hookrightarrow{\lhook\joinrel\rightarrow}
+ \DeclareRobustCommand\hookrightarrow{\lhook\joinrel\rightarrow}
\DeclareMathSymbol{\rhook}{\mathrel}{letters}{"2D}
- \def\hookleftarrow{\leftarrow\joinrel\rhook}
+ \DeclareRobustCommand\hookleftarrow{\leftarrow\joinrel\rhook}
\DeclareRobustCommand
\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft}
% \end{macrocode}
@@ -1155,43 +1160,45 @@
% \subsubsection{Over and under something, etc}
%
% \begin{macrocode}
-\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
+\DeclareRobustCommand\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
+\DeclareRobustCommand\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@}%
+\DeclareRobustCommand\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
+\DeclareRobustCommand\underbrace[1]{\mathop{\vtop{\m@th\ialign{##\crcr
$\hfil\displaystyle{#1}\hfil$\crcr
\noalign{\kern3\p@\nointerlineskip}%
\upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
% \end{macrocode}
% (quite a waste of tokens, IMHO --- Frank)
% \begin{macrocode}
-\def\skew#1#2#3{{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@
+\DeclareRobustCommand\skew[3]
+ {{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@
#2{\mkern-\muskip\z@{#3}\mkern\muskip\z@}\mkern-\muskip\z@}{}}
% \end{macrocode}
%
% \changes{v2.2n}{1995/11/21}{Incorporate changed figures,
% as in plain.tex}
% \begin{macrocode}
-\def\rightarrowfill{$\m@th\smash-\mkern-7mu%
+\DeclareRobustCommand\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%
+\DeclareRobustCommand\leftarrowfill{$\m@th\mathord\leftarrow\mkern-7mu%
\cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
\mkern-7mu\smash-$}
\DeclareMathSymbol{\braceld}{\mathord}{largesymbols}{"7A}
\DeclareMathSymbol{\bracerd}{\mathord}{largesymbols}{"7B}
\DeclareMathSymbol{\bracelu}{\mathord}{largesymbols}{"7C}
\DeclareMathSymbol{\braceru}{\mathord}{largesymbols}{"7D}
-\def\downbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
+\DeclareRobustCommand\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$}%
+\DeclareRobustCommand\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$}
% \end{macrocode}
@@ -1295,8 +1302,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\mathsterling{\mathit{\mathchar"7024}}
-\def\mathunderscore{\kern.06em\vbox{\hrule\@width.3em}}
+\DeclareRobustCommand\mathsterling{\mathit{\mathchar"7024}}
+\DeclareRobustCommand\mathunderscore{\kern.06em\vbox{\hrule\@width.3em}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1307,7 +1314,7 @@
% \begin{macro}{\mathellipsis}
% This is plain \TeX's |\ldots|.
% \begin{macrocode}
-\def\mathellipsis{\mathinner{\ldotp\ldotp\ldotp}}%
+\DeclareRobustCommand\mathellipsis{\mathinner{\ldotp\ldotp\ldotp}}%
% \end{macrocode}
% \end{macro}
%
@@ -1321,13 +1328,13 @@
%<*math|latexrelease>
%<latexrelease>\IncludeInRelease{2018/12/01}%
%<latexrelease> {\Big}{Start LR-mode}%
-\def\big#1{\leavevmode@ifvmode
+\DeclareRobustCommand\big[1]{\leavevmode@ifvmode
{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}}
-\def\Big#1{\leavevmode@ifvmode
+\DeclareRobustCommand\Big[1]{\leavevmode@ifvmode
{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
-\def\bigg#1{\leavevmode@ifvmode
+\DeclareRobustCommand\bigg[1]{\leavevmode@ifvmode
{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
-\def\Bigg#1{\leavevmode@ifvmode
+\DeclareRobustCommand\Bigg[1]{\leavevmode@ifvmode
{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
%</math|latexrelease>
%<latexrelease>\EndIncludeInRelease
diff --git a/macros/latex-dev/base/format.ins b/macros/latex-dev/base/format.ins
index 3a7782a06e..5a1bf6e79c 100644
--- a/macros/latex-dev/base/format.ins
+++ b/macros/latex-dev/base/format.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2018
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -16,7 +16,7 @@
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2018
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
@@ -101,7 +101,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
@@ -123,7 +123,7 @@ extension .ins) which are part of the distribution.
This is a generated file.
-Copyright 1993-2018
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -136,7 +136,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/graphpap.dtx b/macros/latex-dev/base/graphpap.dtx
index 5442c287cc..7e4b322f32 100644
--- a/macros/latex-dev/base/graphpap.dtx
+++ b/macros/latex-dev/base/graphpap.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/graphpap.ins b/macros/latex-dev/base/graphpap.ins
index 253d89baf9..eb1d356edc 100644
--- a/macros/latex-dev/base/graphpap.ins
+++ b/macros/latex-dev/base/graphpap.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/graphpap.pdf b/macros/latex-dev/base/graphpap.pdf
index 027789f06d..99dc9adfd7 100644
--- a/macros/latex-dev/base/graphpap.pdf
+++ b/macros/latex-dev/base/graphpap.pdf
Binary files differ
diff --git a/macros/latex-dev/base/idx.tex b/macros/latex-dev/base/idx.tex
index 69b8af2c23..1d74b1fca0 100644
--- a/macros/latex-dev/base/idx.tex
+++ b/macros/latex-dev/base/idx.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ifthen.dtx b/macros/latex-dev/base/ifthen.dtx
index b538f895d0..1a289df1c3 100644
--- a/macros/latex-dev/base/ifthen.dtx
+++ b/macros/latex-dev/base/ifthen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ifthen.ins b/macros/latex-dev/base/ifthen.ins
index 6b3008e179..acfa2fcf43 100644
--- a/macros/latex-dev/base/ifthen.ins
+++ b/macros/latex-dev/base/ifthen.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/ifthen.pdf b/macros/latex-dev/base/ifthen.pdf
index b651c06508..e2355231fa 100644
--- a/macros/latex-dev/base/ifthen.pdf
+++ b/macros/latex-dev/base/ifthen.pdf
Binary files differ
diff --git a/macros/latex-dev/base/inputenc.dtx b/macros/latex-dev/base/inputenc.dtx
index 93f64577e2..65f260826d 100644
--- a/macros/latex-dev/base/inputenc.dtx
+++ b/macros/latex-dev/base/inputenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/inputenc.ins b/macros/latex-dev/base/inputenc.ins
index 80993e2819..0831576d76 100644
--- a/macros/latex-dev/base/inputenc.ins
+++ b/macros/latex-dev/base/inputenc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2019
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/inputenc.pdf b/macros/latex-dev/base/inputenc.pdf
index c1f4263834..113fd3879d 100644
--- a/macros/latex-dev/base/inputenc.pdf
+++ b/macros/latex-dev/base/inputenc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/kernel-external-commands.txt b/macros/latex-dev/base/kernel-external-commands.txt
deleted file mode 100644
index e4b7c726dc..0000000000
--- a/macros/latex-dev/base/kernel-external-commands.txt
+++ /dev/null
@@ -1,1356 +0,0 @@
-%%% list of externally accessible commands defined or used by the
-%%% kernel (not totally correct) --- these aren't necessarily
-%%% interface commands as primitives also have accessible names. This
-%%% is just a reference to help and was generated with some brute
-%%% force methods
-%%%
-%%% 2019/02
-
-\A
-\AA
-\AE
-\Alph
-\Arrowvert
-\AtBeginDocument
-\AtBeginDvi
-\AtEndDocument
-\AtEndOfClass
-\AtEndOfPackage
-\Big
-\Bigg
-\Biggl
-\Biggm
-\Biggr
-\Bigl
-\Bigm
-\Bigr
-\Box
-\CheckCommand
-\ClassError
-\ClassInfo
-\ClassWarning
-\ClassWarningNoLine
-\CountZero
-\CurrentOption
-\DH
-\DJ
-\DeclareCurrentRelease
-\DeclareErrorFont
-\DeclareFixedFont
-\DeclareFontEncoding
-\DeclareFontEncodingDefaults
-\DeclareFontFamily
-\DeclareFontShape
-\DeclareFontSubstitution
-\DeclareMathAccent
-\DeclareMathAlphabet
-\DeclareMathDelimiter
-\DeclareMathRadical
-\DeclareMathSizes
-\DeclareMathSymbol
-\DeclareMathVersion
-\DeclareOldFontCommand
-\DeclareOption
-\DeclarePreloadSizes
-\DeclareRelease
-\DeclareRelease:
-\DeclareRobustCommand
-\DeclareRobustCommand*
-\DeclareSizeFunction
-\DeclareSymbolFont
-\DeclareSymbolFontAlphabet
-\DeclareTextAccent
-\DeclareTextAccentDefault
-\DeclareTextCommand
-\DeclareTextCommandDefault
-\DeclareTextComposite
-\DeclareTextCompositeCommand
-\DeclareTextFontCommand
-\DeclareTextSymbol
-\DeclareTextSymbolDefault
-\DeclareUnicodeCharacter
-\Delta
-\Diamond
-\Downarrow
-\E
-\EndIncludeInRelease
-\ExecuteOptions
-\Gamma
-\GenericError
-\GenericInfo
-\GenericWarning
-\H
-\I
-\IJ
-\IeC
-\IfFileExists
-\IfTargetDateBefore
-\Im
-\IncludeInRelease
-\InputIfFileExists
-\J
-\Join
-\L
-\LaTeX
-\LaTeX2e
-\LaTeXe
-\Lambda
-\LastDeclaredEncoding
-\Leftarrow
-\Leftrightarrow
-\LoadClass
-\LoadClassWithOptions
-\Longleftarrow
-\Longleftrightarrow
-\Longrightarrow
-\MakeLowercase
-\MakeRobust
-\MakeUppercase
-\MessageBreak
-\NG
-\NeedsTeXFormat
-\O
-\OE
-\Omega
-\OptionNotUsed
-\P
-\PackageError
-\PackageInfo
-\PackageWarning
-\PackageWarningNoLine
-\PassOptionsToClass
-\PassOptionsToPackage
-\Phi
-\Pi
-\Pr
-\ProcessOptions
-\ProcessOptions*
-\ProvideTextCommand
-\ProvideTextCommandDefault
-\ProvidesClass
-\ProvidesFile
-\ProvidesPackage
-\Psi
-\Re
-\Relbar
-\RequirePackage
-\RequirePackageWithOptions
-\Rightarrow
-\Roman
-\S
-\SS
-\SetMathAlphabet
-\SetSymbolFont
-\Sigma
-\T
-\TH
-\TeX
-\TextOrMath
-\TextSymbolUnavailable
-\Theta
-\Umathchar
-\Umathcode
-\UndeclareTextCommand
-\Uparrow
-\Updownarrow
-\Upsilon
-\UseRawInputEncoding
-\UseTextAccent
-\UseTextSymbol
-\Vert
-\XeTeXcharclass
-\XeTeXdashbreakstate
-\XeTeXmathcode
-\XeTeXrevision
-\XeTeXuseglyphmetrics
-\XeTeXversion
-\Xi
-\Z
-\_
-\`
-\a
-\aa
-\abovedisplayshortskip
-\abovedisplayskip
-\accent
-\active
-\acute
-\addcontentsline
-\addpenalty
-\addtocontents
-\addtocounter
-\addtolength
-\addvspace
-\adjdemerits
-\advance
-\ae
-\afterassignment
-\aftergroup
-\aleph
-\allocationnumber
-\allowbreak
-\alph
-\alpha
-\amalg
-\and
-\angle
-\approx
-\arabic
-\arccos
-\arcsin
-\arctan
-\arg
-\array
-\arraycolsep
-\arrayrulewidth
-\arraystretch
-\arrowvert
-\asciispace
-\ast
-\asymp
-\atopwithdelims
-\attribute
-\attributedef
-\attributezero
-\author
-\b
-\backslash
-\backslashH
-\bar
-\baselineskip
-\baselineskip4
-\baselinestretch
-\batchmode
-\begin
-\begingroup
-\belowdisplayshortskip
-\belowdisplayskip
-\beta
-\bezier
-\bfdefault
-\bfseries
-\bgroup
-\bibcite
-\bibdata
-\bibitem
-\bibliography
-\bibliographystyle
-\bibstyle
-\big
-\bigbreak
-\bigcap
-\bigcirc
-\bigcup
-\bigg
-\biggl
-\biggm
-\biggr
-\bigl
-\bigm
-\bigodot
-\bigoplus
-\bigotimes
-\bigr
-\bigskip
-\bigskipamount
-\bigsqcup
-\bigtriangledown
-\bigtriangleup
-\biguplus
-\bigvee
-\bigwedge
-\binoppenalty
-\bmod
-\boldmath
-\bordermatrix
-\bot
-\botfigrule
-\botmark
-\bottomfraction
-\bowtie
-\box
-\boxmaxdepth
-\brace
-\braceld
-\braceld$
-\bracelu
-\bracerd
-\braceru
-\bracevert
-\brack
-\break
-\breve
-\brokenpenalty
-\buildrel
-\bullet
-\c
-\cap
-\caption
-\cases
-\catcode
-\catcodetable
-\cdot
-\cdotp
-\cdots
-\center
-\centering
-\centerline
-\char
-\chardef
-\charsubdef
-\charzero
-\check
-\chi
-\choose
-\circ
-\circle
-\citation
-\cite
-\cleaders
-\cleardoublepage
-\clearpage
-\cline
-\closein
-\closeout
-\clubpenalty
-\clubsuit
-\colon
-\columnsep
-\columnseprule
-\columnwidth
-\cong
-\contentsline
-\coprod
-\copy
-\copyright
-\cos
-\cosh
-\cot
-\coth
-\count
-\countdef
-\counterwithin
-\counterwithout
-\cr
-\crcr
-\csc
-\csname
-\cup
-\d
-\dag
-\dagger
-\dashbox
-\dashv
-\date
-\day
-\dblfigrule
-\dblfloatpagefraction
-\dblfloatsep
-\dbltextfloatsep
-\dbltopfraction
-\ddag
-\ddagger
-\ddot
-\ddots
-\deadcycles
-\def
-\defaulthyphenchar
-\defaultscriptratio
-\defaultscriptscriptratio
-\defaultskewchar
-\deg
-\delcode
-\delimiter
-\delimiterfactor
-\delimitershortfall
-\delta
-\depth
-\det
-\dh
-\diamond
-\diamondsuit
-\dim
-\dimen
-\dimendef
-\dimenzero
-\directlua
-\discretionary
-\displaylines
-\displaymath
-\displaystyle
-\displaywidowpenalty
-\displaywidth
-\div
-\divide
-\dj
-\do
-\document
-\documentclass
-\documentstyle
-\dospecials
-\dot
-\doteq
-\dotfill
-\dots
-\doublehyphendemerits
-\doublerulesep
-\downarrow
-\downbracefill
-\dp
-\dump
-\edef
-\egroup
-\eject
-\ell
-\else
-\em
-\emergencystretch
-\eminnershape
-\emph
-\empty
-\emptyset
-\encodingdefault
-\end
-\endarray
-\endcenter
-\endcsname
-\enddisplaymath
-\enddocument
-\endenumerate
-\endeqnarray
-\endequation
-\endfilecontents
-\endflushleft
-\endflushright
-\endgraf
-\endgroup
-\endinput
-\enditemize
-\endline
-\endlinechar
-\endlist
-\endlrbox
-\endmath
-\endminipage
-\endpicture
-\endsloppypar
-\endtabbing
-\endtabular
-\endtrivlist
-\endverbatim
-\enlargethispage
-\enskip
-\enspace
-\ensuremath
-\enumerate
-\epsilon
-\eqnarray
-\eqno
-\equation
-\equiv
-\errhelp
-\errmessage
-\errorcontextlines
-\errorstopmode
-\escapechar
-\eta
-\evensidemargin
-\everycr
-\everydisplay
-\everyjob
-\everymath
-\everypar
-\exhyphenpenalty
-\exists
-\exp
-\expandafter
-\extracolsep
-\extrafloats
-\fam
-\familydefault
-\fbox
-\fboxrule
-\fboxsep
-\fi
-\filbreak
-\filecontents
-\fill
-\finalhyphendemerits
-\firstmark
-\flat
-\floatingpenalty
-\floatpagefraction
-\floatsep
-\flushbottom
-\flushleft
-\flushright
-\fmtname
-\fmtversion
-\fnsymbol
-\font
-\fontdimen
-\fontdimen8
-\fontencoding
-\fontfamily
-\fontname
-\fontseries
-\fontshape
-\fontsize
-\fontsize2
-\fontsubfuzz
-\footins
-\footnote
-\footnotemark
-\footnoterule
-\footnotesep
-\footnotesize
-\footnotetext
-\footskip
-\forall
-\frac
-\frame
-\framebox
-\frenchspacing
-\frown
-\fussy
-\futurelet
-\gamma
-\gcd
-\gdef
-\gdef_
-\ge
-\geq
-\gets
-\gg
-\global
-\globaldefs
-\glossary
-\glossaryentry
-\goodbreak
-\grave
-\halign
-\hangindent
-\hat
-\hbadness
-\hbar
-\hbox
-\headheight
-\headsep
-\heartsuit
-\height
-\hfil
-\hfil$
-\hfill
-\hfuzz
-\hglue
-\hideoutput
-\hideskip
-\hidewidth
-\hline
-\hom
-\hookleftarrow
-\hookrightarrow
-\hphantom
-\hrule
-\hrulefill
-\hsize
-\hskip
-\hskip2em
-\hspace
-\hss
-\ht
-\hyphenchar
-\hyphenpenalty
-\i
-\ialign
-\if
-\ifb
-\ifcase
-\ifcsname
-\ifdim
-\ifeof
-\iff
-\iffalse
-\ifhmode
-\ifinner
-\ifmmode
-\ifnum
-\ifnum0
-\ifnum7
-\ifodd
-\iftrue
-\ifvbox
-\ifvmode
-\ifvoid
-\ifx
-\ifx!
-\ignorespaces
-\ignorespacesafterend
-\ij
-\imath
-\immediate
-\in
-\include
-\includeonly
-\indent
-\index
-\indexentry
-\inf
-\infty
-\initcatcodetable
-\input
-\inputencodingname
-\inputlineno
-\insert
-\int
-\interdisplaylinepenalty
-\interfootnotelinepenalty
-\interlinepenalty
-\intextsep
-\intop
-\iota
-\itdefault
-\item
-\itemindent
-\itemize
-\itemsep
-\iterate
-\itshape
-\j
-\jmath
-\jobname
-\joinrel
-\jot
-\kappa
-\ker
-\kern
-\kern-
-\kern2
-\kern3
-\kern6
-\kern7
-\kill
-\l
-\label
-\labelsep
-\labelwidth
-\lambda
-\land
-\langle
-\language
-\lastbox
-\lastnamedcs
-\lastnodetype
-\lastpenalty
-\lastskip
-\lbrace
-\lbrack
-\lccode
-\lccode`
-\lceil
-\ldotp
-\ldots
-\le
-\leaders
-\leadsto
-\leavevmode
-\left
-\leftarrow
-\leftarrowfill
-\lefteqn
-\leftharpoondown
-\leftharpoondown$
-\leftharpoonup
-\leftline
-\leftmargin
-\leftmargini
-\leftmarginii
-\leftmarginiii
-\leftmarginiv
-\leftmarginv
-\leftmarginvi
-\leftmark
-\leftrightarrow
-\leftskip
-\leq
-\let
-\lfloor
-\lg
-\lgroup
-\lhd
-\lhook
-\lim
-\liminf
-\limits
-\limsup
-\line
-\linebreak
-\linepenalty
-\lineskip
-\lineskip-
-\lineskiplimit
-\linespread
-\linethickness
-\linewidth
-\list
-\listfiles
-\listparindent
-\ll
-\llap
-\lmoustache
-\ln
-\lnot
-\log
-\loggingall
-\loggingoutput
-\long
-\longleftarrow
-\longleftrightarrow
-\longmapsto
-\longrightarrow
-\loop
-\lor
-\lower
-\lowercase
-\lq
-\lrbox
-\luabytecode
-\luachunk
-\luafunction
-\luatexversion
-\magstep
-\magstephalf
-\makeatletter
-\makeatother
-\makebox
-\makeglossary
-\makeindex
-\makelabel
-\mapsto
-\mapstochar
-\marginpar
-\marginparpush
-\marginparsep
-\marginparwidth
-\mark
-\markboth
-\markright
-\marks
-\math
-\mathaccent
-\mathalpha
-\mathbf
-\mathbin
-\mathcal
-\mathchar
-\mathchardef
-\mathcharzero
-\mathchoice
-\mathclose
-\mathcode
-\mathdollar
-\mathellipsis
-\mathgroup
-\mathhexbox
-\mathinner
-\mathit
-\mathnormal
-\mathop
-\mathopen
-\mathord
-\mathpalette
-\mathparagraph
-\mathpunct
-\mathrel
-\mathring
-\mathrm
-\mathsection
-\mathsf
-\mathsterling
-\mathstrut
-\mathsurround
-\mathtt
-\mathunderscore
-\mathversion
-\matrix
-\max
-\maxdeadcycles
-\maxdepth
-\maxdimen
-\mbox
-\mddefault
-\mdseries
-\meaning
-\medbreak
-\medmuskip
-\medskip
-\medskipamount
-\message
-\mho
-\mid
-\min
-\minipage
-\mkern
-\models
-\month
-\moveright
-\mp
-\mskip
-\mu
-\mubyte
-\multicolumn
-\multiply
-\multiput
-\multispan
-\muskip
-\muskipdef
-\muskipzero
-\nabla
-\narrower
-\natural
-\ne
-\nearrow
-\neg
-\negthinspace
-\neq
-\newXeTeXintercharclass
-\newattribute
-\newbox
-\newcatcodetable
-\newcommand
-\newcount
-\newcounter
-\newdimen
-\newenvironment
-\newfam
-\newfont
-\newhelp
-\newif
-\newinsert
-\newlabel
-\newlanguage
-\newlength
-\newline
-\newlinechar`
-\newluabytecode
-\newluachunkname
-\newluafunction
-\newmarks
-\newmuskip
-\newpage
-\newread
-\newsavebox
-\newskip
-\newtheorem
-\newtoks
-\newwhatsit
-\newwrite
-\ng
-\ni
-\noalign
-\nobreak
-\nobreakdashes
-\nobreakspace
-\nocite
-\nocorr
-\nocorrlist
-\noexpand
-\noexpandinvalid
-\noexpandis
-\noexpandnot
-\nofiles
-\noindent
-\nointerlineskip
-\nolimits
-\nolinebreak
-\nonfrenchspacing
-\nonscript
-\nonumber
-\nopagebreak
-\noprotrusion
-\normalbaselines
-\normalbaselineskip
-\normalcolor
-\normalfont
-\normallineskip
-\normallineskiplimit
-\normalmarginpar
-\normalsfcodes
-\normalsize
-\not
-\notin
-\nu
-\null
-\nulldelimiterspace
-\nullfont
-\number
-\numberline
-\numexpr
-\nwarrow
-\o
-\oalign
-\obeycr
-\obeylines
-\obeyspaces
-\oddsidemargin
-\odot
-\oe
-\of
-\offinterlineskip
-\oint
-\ointop
-\oldstylenums
-\omega
-\ominus
-\omit
-\onecolumn
-\ooalign
-\openin
-\openout
-\openup
-\oplus
-\or
-\oslash
-\otimes
-\output
-\outputpenalty
-\oval
-\over
-\overbrace
-\overfullrule
-\overleftarrow
-\overrightarrow
-\owns
-\pagebreak
-\pagenumbering
-\pageref
-\pageshrink
-\pagestyle
-\pagetotal
-\paperheight
-\paperwidth
-\par
-\paragraphmark
-\parallel
-\parbox
-\parfillskip
-\parindent
-\parsep
-\parseunicodedataI
-\parseunicodedataII
-\parseunicodedataIII
-\parseunicodedataIV
-\parseunicodedataV
-\parshape
-\parskip
-\partial
-\partopsep
-\penalty
-\perp
-\phantom
-\phi
-\pi
-\picture
-\pm
-\pmatrix
-\pmod
-\poptabs
-\postdisplaypenalty
-\pounds
-\prec
-\preceq
-\predisplaypenalty
-\pretolerance
-\prevdepth
-\prime
-\prod
-\propto
-\protect
-\protected
-\providecommand
-\psi
-\pushtabs
-\put
-\qbezier
-\qbeziermax
-\qquad
-\quad
-\r
-\radical
-\raggedbottom
-\raggedleft
-\raggedright
-\raise
-\raisebox
-\rangle
-\rbrace
-\rbrack
-\rceil
-\read
-\ref
-\refstepcounter
-\relax
-\relaxs
-\relbar
-\relpenalty
-\removelastskip
-\renewcommand
-\renewenvironment
-\repeat
-\requestedLaTeXdate
-\requestedpatchdate
-\restorecr
-\reversemarginpar
-\rfloor
-\rgroup
-\rhd
-\rho
-\rhook
-\right
-\rightarrow
-\rightarrow$
-\rightarrowfill
-\rightharpoondown
-\rightharpoonup
-\rightharpoonup$
-\rightleftharpoons
-\rightline
-\rightmargin
-\rightmark
-\rightskip
-\rlap
-\rmdefault
-\rmfamily
-\rmoustache
-\roman
-\romannumeral
-\root
-\rootbox
-\rq
-\rule
-\samepage
-\savebox
-\savecatcodetable
-\sb
-\sbox
-\scdefault
-\scriptfont
-\scriptscriptfont
-\scriptscriptstyle
-\scriptspace
-\scriptstyle
-\scshape
-\searrow
-\sec
-\secdef
-\sectionmark
-\selectfont
-\seriesdefault
-\setattribute
-\setbox
-\setcounter
-\setlength
-\setminus
-\setrangecatcode
-\settodepth
-\settoheight
-\settowidth
-\sfcode
-\sfdefault
-\sffamily
-\shapedefault
-\sharp
-\shipout
-\shortstack
-\showboxbreadth
-\showboxdepth
-\showhyphens
-\showoutput
-\showoverfull
-\sigma
-\sim
-\simeq
-\sin
-\sinh
-\skew
-\skip
-\skipdef
-\skipzero
-\slash
-\sldefault
-\sloppy
-\sloppypar
-\slshape
-\smallbreak
-\smallint
-\smallskip
-\smallskipamount
-\smash
-\smash,because
-\smile
-\sp
-\space
-\spacefactor
-\spaceskip
-\spadesuit
-\span
-\splitfirstmark
-\splitmaxdepth
-\splittopskip
-\sqcap
-\sqcup
-\sqrt
-\sqrtsign
-\sqsubset
-\sqsubseteq
-\sqsupset
-\sqsupseteq
-\ss
-\stackrel
-\star
-\stepcounter
-\stop
-\storedpar
-\stretch
-\string
-\stringallowed
-\strut
-\strutbox
-\subparagraphmark
-\subsectionmark
-\subset
-\subseteq
-\subsubsectionmark
-\succ
-\succeq
-\sum
-\sup
-\suppressfloats
-\supset
-\supseteq
-\surd
-\swarrow
-\symbol
-\symletters
-\symoperators
-\t
-\tabbing
-\tabbingsep
-\tabcolsep
-\tabskip
-\tabular
-\tabularnewline
-\tan
-\tanh
-\tau
-\tencirc
-\tencircw
-\tenln
-\tenlnw
-\textasciicircum
-\textasciitilde
-\textasteriskcentered
-\textbackslash
-\textbar
-\textbardbl
-\textbf
-\textbraceleft
-\textbraceright
-\textbullet
-\textcircled
-\textcommaabove
-\textcommabelow
-\textcompwordmark
-\textcopyright
-\textdagger
-\textdaggerdbl
-\textdollar
-\textellipsis
-\textemdash
-\textendash
-\textexclamdown
-\textfloatsep
-\textfont
-\textfont2
-\textfraction
-\textgreater
-\textheight
-\textit
-\textless
-\textmd
-\textnormal
-\textordfeminine
-\textordmasculine
-\textparagraph
-\textperiodcentered
-\textquestiondown
-\textquotedblleft
-\textquotedblright
-\textquoteleft
-\textquoteright
-\textregistered
-\textrm
-\textsc
-\textsection
-\textsf
-\textsl
-\textsterling
-\textstyle
-\textsubscript
-\textsuperscript
-\texttrademark
-\texttt
-\textunderscore
-\textup
-\textvisiblespace
-\textwidth
-\th
-\thanks
-\the
-\theequation
-\thefootnote
-\thempfn
-\thempfootnote
-\thepage
-\theta
-\thicklines
-\thickmuskip
-\thinlines
-\thinmuskip
-\thinspace
-\thispagestyle
-\tilde
-\time
-\times
-\title
-\to
-\today
-\toks
-\toksdef
-\tokszero
-\tolerance
-\top
-\topfigrule
-\topfraction
-\topmargin
-\topmark
-\topsep
-\topskip
-\totalheight
-\tracingall
-\tracingassigns
-\tracingcommands
-\tracingfonts
-\tracinggroups
-\tracingifs
-\tracinglostchars
-\tracingmacros
-\tracingnesting
-\tracingnone
-\tracingonline
-\tracingoutput
-\tracingpages
-\tracingparagraphs
-\tracingrestores
-\tracingscantokens
-\tracingstats
-\triangle
-\triangleleft
-\triangleright
-\trivlist
-\ttdefault
-\ttfamily
-\twocolumn
-\typein
-\typeout
-\u
-\uccode
-\uchyph
-\unboldmath
-\undefinedpagestyle
-\underbar
-\underbrace
-\underline
-\unexpanded
-\unhbox
-\unhcopy
-\unicodedataline
-\unicoderead
-\unitlength
-\unkern
-\unless
-\unlhd
-\unpenalty
-\unrhd
-\unsetattribute
-\unskip
-\unvbox
-\unvcopy
-\uparrow
-\upbracefill
-\updefault
-\updownarrow
-\uplus
-\uppercase
-\upshape
-\upsilon
-\usebox
-\usecounter
-\usefont
-\usepackage
-\v
-\vadjust
-\value
-\varbigtriangledown
-\varbigtriangleup
-\varepsilon
-\varphi
-\varpi
-\varrho
-\varsigma
-\vartheta
-\vbadness
-\vbox
-\vcenter
-\vdash
-\vdots
-\vec
-\vector
-\vee
-\verb
-\verbatim
-\verbvisiblespace
-\vert
-\vfil
-\vfilneg
-\vfuzz
-\vglue
-\vline
-\vphantom
-\vrule
-\vsize
-\vskip
-\vspace
-\vsplit
-\vss
-\vtop
-\wd
-\wedge
-\whatsit
-\widehat
-\widetilde
-\widowpenalties
-\widowpenalty
-\width
-\wlog
-\wp
-\wr
-\write
-\x
-\xdef
-\xi
-\year
-\z
-\zeta
-\|
-\~
diff --git a/macros/latex-dev/base/kernel-internal-commands.txt b/macros/latex-dev/base/kernel-internal-commands.txt
deleted file mode 100644
index acf20d96c5..0000000000
--- a/macros/latex-dev/base/kernel-internal-commands.txt
+++ /dev/null
@@ -1,1268 +0,0 @@
-%%% list of internal commands defined by the kernel (not totally correct)
-%%% 2019/02
-
-\@
-\@@
-\@@enc@update
-\@@end
-\@@endpbox
-\@@eqncr
-\@@fileswith@pti@ns
-\@@hyph
-\@@if@newlist
-\@@ifdefinable
-\@@input
-\@@italiccorr
-\@@line
-\@@math@bgroup
-\@@math@egroup
-\@@par
-\@@protect
-\@@startpbox
-\@@underline
-\@@unprocessedoptions
-\@@warning
-\@Alph
-\@DeclareMathDelimiter
-\@DeclareMathSizes
-\@Esphack
-\@IncludeInRele@se
-\@IncludeInRelease
-\@M
-\@MM
-\@Mi
-\@Mii
-\@Miii
-\@Miv
-\@Roman
-\@TeXversion
-\@acci
-\@accii
-\@acciii
-\@acol
-\@acolampacol
-\@activechar@info
-\@addamp
-\@addfield
-\@addmarginpar
-\@addtobot
-\@addtocurcol
-\@addtodblcol
-\@addtofilelist
-\@addtonextcol
-\@addtopreamble
-\@addtoreset
-\@addtotoporbot
-\@afterheading
-\@afterindentfalse
-\@afterindenttrue
-\@alph
-\@ampacol
-\@arabic
-\@argarraycr
-\@argdef
-\@argtabularcr
-\@array
-\@arrayacol
-\@arrayc
-\@arrayclassiv
-\@arrayclassz
-\@arraycr
-\@arrayparboxrestore
-\@arrayrule
-\@arstrut
-\@arstrutbox
-\@author
-\@auxout
-\@backslashchar
-\@badend
-\@badlinearg
-\@badmath
-\@badpoptabs
-\@badrequireerror
-\@badtab
-\@begin@tempboxa
-\@begindocumenthook
-\@begindvi
-\@begindvibox
-\@beginparpenalty
-\@begintheorem
-\@bezier
-\@bibitem
-\@biblabel
-\@bitor
-\@botlist
-\@botnum
-\@botnum>
-\@botroom
-\@boxfpsbit
-\@break@tfor
-\@bsphack
-\@caption
-\@captype
-\@car
-\@carcube
-\@cclv
-\@cclvi
-\@cdr
-\@centercr
-\@centering
-\@cflb
-\@cflt
-\@changed@cmd
-\@charlb
-\@charrb
-\@chclass
-\@check@IncludeInRelease
-\@check@c
-\@check@eq
-\@checkend
-\@chnum
-\@circ
-\@circle
-\@circlefnt
-\@cite
-\@cite@ofmt
-\@citea
-\@citeb
-\@citex
-\@classi
-\@classii
-\@classiii
-\@classiv
-\@classoptionslist
-\@classv
-\@classz
-\@cline
-\@clnht
-\@clnwd
-\@cls@pkg
-\@clsextension
-\@clubpenalty
-\@colht
-\@colnum
-\@colroom
-\@combinedblfloats
-\@combinefloats
-\@comdblflelt
-\@comflelt
-\@cons
-\@contfield
-\@ctrerr
-\@curfield
-\@curline
-\@curr@enc
-\@currbox
-\@currdir
-\@current@cmd
-\@currentlabel
-\@currenvir
-\@currenvline
-\@currext
-\@currlist
-\@currname
-\@currnamestack
-\@curroptions
-\@currsize
-\@currtype
-\@curtab
-\@curtabmar
-\@dashbox
-\@dashcnt
-\@dashdim
-\@date
-\@dbflt
-\@dblarg
-\@dbldeferlist
-\@dblfloat
-\@dblfloatplacement
-\@dblfpbot
-\@dblfpsep
-\@dblfptop
-\@dbltoplist
-\@dbltopnum
-\@dbltoproom
-\@dec@text@cmd
-\@declaredoptions
-\@declareoption
-\@defaultsubs
-\@defaultunits
-\@defdefault@ds
-\@deferlist
-\@definecounter
-\@depth
-\@dischyph
-\@doclearpage
-\@documentclasshook
-\@doendpe
-\@dofilelist
-\@donoparitem
-\@dot
-\@dotsep
-\@dottedtocline
-\@downline
-\@downvector
-\@eha
-\@ehb
-\@ehc
-\@ehd
-\@elt
-\@empty
-\@emptycol
-\@end@check@IncludeInRelease
-\@end@tempboxa
-\@enddocumenthook
-\@endfloatbox
-\@endparenv
-\@endparpenalty
-\@endpbox
-\@endpefalse
-\@endpetrue
-\@endtheorem
-\@enlargepage
-\@ensuredmath
-\@enumctr
-\@enumdepth
-\@eqcnt
-\@eqncr
-\@eqnnum
-\@eqnsel
-\@eqnswfalse
-\@eqnswtrue
-\@eqpen
-\@err@
-\@esphack
-\@evenfoot
-\@evenhead
-\@expandtwoargs
-\@expast
-\@failedlist
-\@fcolmadefalse
-\@fcolmadetrue
-\@filef@und
-\@filelist
-\@fileswfalse
-\@fileswith@pti@ns
-\@fileswith@ptions
-\@fileswithoptions
-\@fileswtrue
-\@finalstrut
-\@firstampfalse
-\@firstamptrue
-\@firstcolfirstmark
-\@firstcoltopmark
-\@firstcolumnfalse
-\@firstcolumntrue
-\@firstofone
-\@firstoftwo
-\@firsttab
-\@flcheckspace
-\@flfail
-\@float
-\@floatboxreset
-\@floatpenalty
-\@floatplacement
-\@flsetnum
-\@flsettextmin
-\@flstop
-\@flsucceed
-\@fltovf
-\@flupdates
-\@flushglue
-\@fnsymbol
-\@font@info
-\@font@warning
-\@fontswitch
-\@footnotemark
-\@footnotetext
-\@for
-\@forloop
-\@fornoop
-\@fortmp
-\@fpbot
-\@fpmin
-\@fps
-\@fpsadddefault
-\@fpsep
-\@fpstype
-\@fptop
-\@frameb@x
-\@framebox
-\@framepicbox
-\@freelist
-\@getcirc
-\@getfpsbit
-\@getlarrow
-\@getlinechar
-\@getpen
-\@getrarrow
-\@glossaryfile
-\@gnewline
-\@gobble
-\@gobble@IncludeInRelease
-\@gobblecr
-\@gobblefour
-\@gobbletwo
-\@gtempa
-\@halfwidth
-\@halignto
-\@hangfrom
-\@height
-\@highpenalty
-\@hightab
-\@hline
-\@holdpg
-\@hspace
-\@hspacer
-\@hvector
-\@icentercr
-\@iden
-\@if
-\@if@pti@ns
-\@if@ptions
-\@ifatmargin
-\@ifbothcounters
-\@ifclasslater
-\@ifclassloaded
-\@ifclasswith
-\@ifdefinable
-\@iffileonpath
-\@ifl@aded
-\@ifl@t@r
-\@ifl@ter
-\@ifnch
-\@ifnextchar
-\@iforloop
-\@ifpackagelater
-\@ifpackageloaded
-\@ifpackagewith
-\@iframebox
-\@iframeboxc
-\@iframepicbox
-\@ifstar
-\@ifundefin@d@i
-\@ifundefin@d@ii
-\@ifundefined
-\@ignorefalse
-\@ignoretrue
-\@iiiminipage
-\@iiiparbox
-\@iiminipage
-\@iinput
-\@iiparbox
-\@iirsbox
-\@imakebox
-\@imakeboxc
-\@imakepicbox
-\@iminipage
-\@include
-\@includeinreleasefalse
-\@includeinreleasetrue
-\@index
-\@indexfile
-\@inlabelfalse
-\@inlabeltrue
-\@inmatherr
-\@inmathwarn
-\@inpenc@test
-\@input
-\@input@
-\@inputcheck
-\@inputcheck0
-\@insertfalse
-\@inserttrue
-\@iparbox
-\@irsbox
-\@isavebox
-\@isavepicbox
-\@ishortstack
-\@istackcr
-\@itabcr
-\@item
-\@itemdepth
-\@itemfudge
-\@itemitem
-\@itemlabel
-\@itempenalty
-\@iwhiledim
-\@iwhilenum
-\@iwhilesw
-\@ixpt
-\@ixstackcr
-\@killglue
-\@kludgeins
-\@labels
-\@largefloatcheck
-\@lastchclass
-\@latex@error
-\@latex@info
-\@latex@info@no@line
-\@latex@warning
-\@latex@warning@no@line
-\@latexbug
-\@latexerr
-\@lbibitem
-\@leftcolumn
-\@leftmark
-\@let@token
-\@lign
-\@linechar
-\@linefnt
-\@linelen
-\@listctr
-\@listdepth
-\@listfiles
-\@loadwithoptions
-\@lowpenalty
-\@ltab
-\@m
-\@mainaux
-\@makebox
-\@makecaption
-\@makecol
-\@makefcolumn
-\@makefnmark
-\@makefntext
-\@makeother
-\@makepicbox
-\@makespecialcolbox
-\@marbox
-\@marginparreset
-\@markright
-\@maxdepth
-\@maxtab
-\@medpenalty
-\@midlist
-\@minipagefalse
-\@minipagerestore
-\@minipagetrue
-\@minus
-\@missingfileerror
-\@mkboth
-\@mklab
-\@mkpream
-\@mparbottom
-\@mpargs
-\@mparswitchfalse
-\@mpfn
-\@mpfootins
-\@mpfootnotetext
-\@mplistdepth
-\@multicnt
-\@multiplelabels
-\@multiput
-\@multispan
-\@namedef
-\@nameuse
-\@nbitem
-\@ne
-\@needsf@rmat
-\@needsformat
-\@negargfalse
-\@negargtrue
-\@newcommand
-\@newctr
-\@newenv
-\@newenva
-\@newenvb
-\@newl@bel
-\@newline
-\@newlistfalse
-\@newlisttrue
-\@next
-\@nextchar
-\@nil
-\@nmbrlistfalse
-\@nmbrlisttrue
-\@nnil
-\@no@lnbk
-\@no@pgbk
-\@nobreakfalse
-\@nobreaktrue
-\@nocnterr
-\@nocounterr
-\@nodocument
-\@noitemargfalse
-\@noitemargtrue
-\@noitemerr
-\@noligs
-\@nolnerr
-\@nomath
-\@noparitemfalse
-\@noparitemtrue
-\@noparlistfalse
-\@noparlisttrue
-\@normalcr
-\@normalsize
-\@noskipsecfalse
-\@noskipsectrue
-\@notdefinable
-\@notprerr
-\@nthm
-\@nxttabmar
-\@obsoletefile
-\@oddfoot
-\@oddhead
-\@onefilewithoptions
-\@onelevel@sanitize
-\@onlypreamble
-\@opargbegintheorem
-\@opcol
-\@options
-\@othm
-\@outerparskip
-\@outputbox
-\@outputdblcol
-\@outputpage
-\@oval
-\@ovbtrue
-\@ovdx
-\@ovdy
-\@ovhlinefalse
-\@ovhlinetrue
-\@ovhorz
-\@ovltrue
-\@ovri
-\@ovro
-\@ovrtrue
-\@ovttrue
-\@ovvert
-\@ovvert0
-\@ovvlinefalse
-\@ovvlinetrue
-\@ovxx
-\@ovyy
-\@p@pfilename
-\@pagedp
-\@pageht
-\@par
-\@parboxrestore
-\@parboxto
-\@parmoderr
-\@parse@version
-\@parse@version@
-\@parse@version@dash
-\@partaux
-\@partlist
-\@partswfalse
-\@partswtrue
-\@pass@ptions
-\@pboxswfalse
-\@pboxswtrue
-\@penup
-\@percentchar
-\@picbox
-\@picht
-\@picture
-\@picture@warn
-\@pkgextension
-\@plus
-\@pnumwidth
-\@popfilename
-\@pr@videpackage
-\@preamble
-\@preamblecmds
-\@preamerr
-\@process@pti@ns
-\@process@ptions
-\@protected@testopt
-\@providesfile
-\@ptionlist
-\@pushfilename
-\@put
-\@qend
-\@qrelax
-\@rc@ifdefinable
-\@reargdef
-\@refundefined
-\@reinserts
-\@removeelement
-\@removefromreset
-\@reqcolroom
-\@reset@ptions
-\@resetactivechars
-\@resethfps
-\@restorepar
-\@reversemarginfalse
-\@reversemargintrue
-\@rightmark
-\@rightskip
-\@rjfieldfalse
-\@rjfieldtrue
-\@roman
-\@rsbox
-\@rtab
-\@rule
-\@sanitize
-\@savebox
-\@savemarbox
-\@savepicbox
-\@savsf
-\@savsk
-\@scolelt
-\@sdblcolelt
-\@seccntformat
-\@secondoftwo
-\@secpenalty
-\@sect
-\@seqncr
-\@setckpt
-\@setfloattypecounts
-\@setfontsize
-\@setfpsbit
-\@setmarks
-\@setminipage
-\@setnobreak
-\@setpar
-\@setref
-\@setsize
-\@settab
-\@settodim
-\@settopoint
-\@setupverbvisiblespace
-\@sharp
-\@shortstack
-\@shortstackc
-\@sline
-\@slowromancap
-\@spaces
-\@specialoutput
-\@specialpagefalse
-\@specialpagetrue
-\@specialstyle
-\@sptoken
-\@sqrt
-\@ssect
-\@stackcr
-\@star@or@long
-\@startcolumn
-\@startdblcolumn
-\@startfield
-\@startline
-\@startpbox
-\@startsection
-\@starttoc
-\@stopfield
-\@stopline
-\@stpelt
-\@svector
-\@sverb
-\@svsec
-\@svsechd
-\@swaptwoargs
-\@sxverbatim
-\@tabacckludge
-\@tabacol
-\@tabarray
-\@tabclassiv
-\@tabclassz
-\@tabcr
-\@tabfbox
-\@tablab
-\@tabminus
-\@tabplus
-\@tabpush
-\@tabrj
-\@tabular
-\@tabularcr
-\@tempboxa
-\@tempcnta
-\@tempcntb
-\@tempdima
-\@tempdima&
-\@tempdimb
-\@tempdimc
-\@tempskipa
-\@tempskipb
-\@tempswafalse
-\@tempswatrue
-\@temptokena
-\@testdef
-\@testfalse
-\@testfp
-\@testopt
-\@testpach
-\@testtrue
-\@testwrongwidth
-\@text@composite
-\@text@composite@x
-\@textbottom
-\@textfloatsheight
-\@textmin
-\@textsubscript
-\@textsuperscript
-\@texttop
-\@tf@r
-\@tfor
-\@tfor:
-\@tforloop
-\@thanks
-\@thefnmark
-\@thefoot
-\@thehead
-\@themargin
-\@themark
-\@thirdofthree
-\@thm
-\@thmcounter
-\@thmcountersep
-\@title
-\@tocrmarg
-\@toodeep
-\@toplist
-\@topnewpage
-\@topnum
-\@toproom
-\@topsep
-\@topsepadd
-\@totalleftmargin
-\@trivlist
-\@tryfcolumn
-\@trylist
-\@twoclasseserror
-\@twocolumnfalse
-\@twocolumntrue
-\@twoloadclasserror
-\@twosidefalse
-\@typein
-\@typeset@protect
-\@uclclist
-\@undefined
-\@unexpandable@protect
-\@unknownoptionerror
-\@unprocessedoptions
-\@unused
-\@unusedoptionlist
-\@upline
-\@upordown
-\@upvector
-\@use@ption
-\@use@text@encoding
-\@verb
-\@verbatim
-\@verbvisiblespacebox
-\@vereq
-\@viiipt
-\@viipt
-\@vipt
-\@vline
-\@vobeyspaces
-\@vpt
-\@vspace
-\@vspacer
-\@vtryfc
-\@vvector
-\@warning
-\@wckptelt
-\@whiledim
-\@whilenum
-\@whilesw
-\@wholewidth
-\@width
-\@wrglossary
-\@wrindex
-\@writeckpt
-\@writefile
-\@wrong@font@char
-\@wtryfc
-\@x@protect
-\@x@sf
-\@xDeclareMathDelimiter
-\@xaddvskip
-\@xarg
-\@xargarraycr
-\@xargdef
-\@xarraycr
-\@xbitor
-\@xcentercr
-\@xdblarg
-\@xdblfloat
-\@xdim
-\@xeqncr
-\@xexnoop
-\@xexpast
-\@xexpast*
-\@xfloat
-\@xfootnote
-\@xfootnotemark
-\@xfootnotenext
-\@xhline
-\@xifnch
-\@xiipt
-\@xipt
-\@xivpt
-\@xmpar
-\@xnewline
-\@xnext
-\@xnthm
-\@xobeysp
-\@xprocess@ptions
-\@xpt
-\@xsect
-\@xtabcr
-\@xtabularcr
-\@xthm
-\@xtryfc
-\@xtypein
-\@xverbatim
-\@xviipt
-\@xxDeclareMathDelimiter
-\@xxpt
-\@xxvpt
-\@xxxii
-\@xympar
-\@yarg
-\@yargarraycr
-\@yargd@f
-\@yargdef
-\@ydim
-\@yeqncr
-\@ympar
-\@ynthm
-\@ythm
-\@ytryfc
-\@yyarg
-\@ztryfc
-\DeclareFontEncoding@
-\DeclareFontEncoding@saved
-\DeclareFontShape@
-\DeclareSymbolFontAlphabet@
-\G@refundefinedtrue
-\SetMathAlphabet@
-\SetSymbolFont@
-\UTFviii@four@octets
-\UTFviii@four@octets@@
-\UTFviii@invalid@err
-\UTFviii@invalid@err@@
-\UTFviii@three@octets
-\UTFviii@three@octets@@
-\UTFviii@two@octets
-\UTFviii@two@octets@@
-\UTFviii@undefined@err
-\UTFviii@undefined@err@@
-\accent@spacefactor
-\active@math@prime
-\add@accent
-\add@percent@to@temptokena
-\addto@hook
-\alloc@
-\alpha@elt
-\alpha@list
-\best@size
-\bm@b
-\bm@c
-\bm@l
-\bm@r
-\bm@s
-\bm@t
-\bx@A
-\bx@AA
-\bx@B
-\bx@BB
-\bx@C
-\bx@CC
-\bx@D
-\bx@DD
-\bx@E
-\bx@EE
-\bx@F
-\bx@FF
-\bx@G
-\bx@GG
-\bx@H
-\bx@HH
-\bx@I
-\bx@II
-\bx@J
-\bx@JJ
-\bx@K
-\bx@KK
-\bx@L
-\bx@LL
-\bx@M
-\bx@MM
-\bx@N
-\bx@NN
-\bx@O
-\bx@OO
-\bx@P
-\bx@PP
-\bx@Q
-\bx@QQ
-\bx@R
-\bx@RR
-\bx@S
-\bx@SS
-\bx@T
-\bx@TT
-\bx@U
-\bx@UU
-\bx@V
-\bx@VV
-\bx@W
-\bx@WW
-\bx@X
-\bx@XX
-\bx@Y
-\bx@YY
-\bx@Z
-\bx@ZZ
-\c@bottomnumber
-\c@dbltopnumber
-\c@equation
-\c@errorcontextlines
-\c@footnote
-\c@mpfootnote
-\c@ncel
-\c@page
-\c@secnumdepth
-\c@tocdepth
-\c@topnumber
-\c@totalnumber
-\calculate@math@sizes
-\catcodetable@atletter
-\catcodetable@initex
-\catcodetable@latex
-\catcodetable@string
-\cdp@elt
-\cdp@list
-\cf@encoding
-\ch@ck
-\chardef@text@cmd
-\check@command
-\check@icl
-\check@icr
-\check@mathfonts
-\check@nocorr@
-\check@range
-\check@single
-\cl@@ckpt
-\cl@page
-\col@number
-\color@begingroup
-\color@endbox
-\color@endgroup
-\color@hbox
-\color@setgroup
-\color@vbox
-\count@
-\counterwithin@s
-\counterwithin@x
-\counterwithout@s
-\counterwithout@x
-\curr@fontshape
-\curr@math@size
-\declare@robustcommand
-\default@M
-\default@T
-\default@ds
-\default@family
-\default@series
-\default@shape
-\define@newfont
-\dimen@
-\dimen@i
-\dimen@ii
-\displ@y
-\do@noligs
-\do@subst@correction
-\document@default@language
-\document@select@group
-\dorestore@version
-\ds@
-\dt@pfalse
-\dt@ptrue
-\e@alloc
-\e@alloc@attribute@count
-\e@alloc@bytecode@count
-\e@alloc@ccodetable@count
-\e@alloc@chardef
-\e@alloc@intercharclass@top
-\e@alloc@luachunk@count
-\e@alloc@luafunction@count
-\e@alloc@top
-\e@alloc@whatsit@count
-\e@ch@ck
-\e@insert@top
-\e@mathgroup@top
-\empty@sfcnt
-\enc@update
-\end@dblfloat
-\end@float
-\error@fontshape
-\every@math@size
-\execute@size@function
-\external@font
-\extract@alph@from@version
-\extract@font
-\extract@fontinfo
-\extract@rangefontinfo
-\extract@sizefn*
-\f@baselineskip
-\f@depth
-\f@encoding
-\f@family
-\f@linespread
-\f@series
-\f@shape
-\f@size
-\f@user@size
-\filec@ntents
-\filename@area
-\filename@base
-\filename@dot
-\filename@ext
-\filename@parse
-\filename@path
-\filename@simple
-\finph@nt
-\finsm@sh
-\fix@penalty
-\fixed@sfcnt
-\float@count
-\font@info
-\font@name
-\font@submax
-\frozen@everydisplay
-\frozen@everymath
-\g@addto@macro
-\gen@sfcnt
-\genb@sfcnt
-\genb@x
-\genb@y
-\get@cdp
-\get@external@font
-\getanddefine@fonts
-\glb@currsize
-\glb@settings
-\group@elt
-\group@list
-\h@false
-\h@true
-\hb@xt@
-\hexnumber@
-\hgl@
-\hmode@bgroup
-\hmode@start@before@group
-\if@afterindent
-\if@compatibility
-\if@endpe
-\if@eqnsw
-\if@fcolmade
-\if@filesw
-\if@firstamp
-\if@firstcolumn
-\if@ignore
-\if@includeinrelease
-\if@inlabel
-\if@insert
-\if@minipage
-\if@mparswitch
-\if@negarg
-\if@newlist
-\if@nmbrlist
-\if@nobreak
-\if@noitemarg
-\if@noparitem
-\if@noparlist
-\if@noskipsec
-\if@ovb
-\if@ovhline
-\if@ovl
-\if@ovr
-\if@ovt
-\if@ovvline
-\if@partsw
-\if@pboxsw
-\if@reversemargin
-\if@rjfield
-\if@specialpage
-\if@tempswa
-\if@test
-\if@twocolumn
-\if@twoside
-\ifdt@p
-\ifh@
-\ifin@
-\ifmath@fonts
-\ifmaybe@ic
-\ifnot@nil
-\ifv@
-\in@
-\in@@
-\in@false
-\in@true
-\init@restore@glb@settings
-\init@restore@version
-\input@path
-\input@path:
-\insc@unt
-\install@mathalphabet
-\is@range
-\kernel@ifnextchar
-\l@ngrel@x
-\l@nohyphenation
-\last@fontshape
-\leavevmode@ifvmode
-\load@onefilewithoptions
-\lower@bound
-\lower@bound0
-\ltx@sh@ft
-\m@ne
-\m@th
-\makeph@nt
-\makesm@sh
-\mandatory@arg
-\math@bgroup
-\math@egroup
-\math@fonts
-\math@fontsfalse
-\math@fontstrue
-\math@version
-\mathchar@type
-\mathph@nt
-\mathsm@sh
-\maybe@ic
-\maybe@ic@
-\maybe@icfalse
-\maybe@ictrue
-\mb@b
-\mb@l
-\mb@r
-\mb@t
-\n@space
-\new@command
-\new@environment
-\new@mathalphabet
-\new@mathgroup
-\new@mathversion
-\new@symbolfont
-\nfss@catcodes
-\nfss@text
-\no@alphabet@error
-\noaccents@
-\non@alpherr
-\not@base
-\not@math@alphabet
-\o@lign
-\on@line
-\operator@font
-\optional@arg
-\outer@nobreak
-\p@
-\p@equation
-\par@deathcycles
-\patch@level
-\ph@nt
-\pickup@font
-\pictur@
-\pkgcls@arg
-\pkgcls@candidate
-\pkgcls@debug
-\pkgcls@innerdate
-\pkgcls@mindate
-\pkgcls@name
-\pkgcls@parse@date@arg
-\pkgcls@parse@date@arg@
-\pkgcls@parse@date@arg@version
-\pkgcls@releasedate
-\pkgcls@rollbackdate@error
-\pkgcls@show@selection
-\pkgcls@targetdate
-\pkgcls@targetlabel
-\pkgcls@use@this@release
-\pr@@@s
-\pr@@@t
-\pr@m@s
-\prim@s
-\process@table
-\protected@edef
-\protected@file@percent
-\protected@write
-\protected@xdef
-\provide@command
-\ps@empty
-\ps@plain
-\r@@t
-\rem@pt
-\remove@angles
-\remove@star
-\remove@star*
-\remove@to@nnil
-\renew@command
-\renew@environment
-\reserved@a
-\reserved@b
-\reserved@c
-\reserved@d
-\reserved@e
-\reserved@f
-\reset@font
-\restglb@settings
-\restore@mathversion
-\restore@protect
-\rlh@
-\saved@space@catcode
-\scriptfont@name
-\select@group
-\set@@mathdelimiter
-\set@color
-\set@display@protect
-\set@fontsize
-\set@mathaccent
-\set@mathchar
-\set@mathdelimiter
-\set@mathsymbol
-\set@simple@size@args
-\set@size@funct@args
-\set@size@funct@args@
-\set@typeset@protect
-\sf@size
-\sh@ft
-\sixt@@n
-\size@update
-\sizefn@info
-\skip@
-\sp@n
-\split@name
-\ssf@size
-\strip@prefix
-\strip@pt
-\sub@sfcnt
-\subf@sfcnt
-\subst@correction
-\sw@slant
-\t@st@ic
-\text@command
-\textfont@name
-\tf@size
-\thr@@
-\toks@
-\try@load@fontshape
-\try@simple@size
-\try@simples
-\try@size@range
-\try@size@substitution
-\tryif@simple
-\tw@
-\two@digits
-\unrestored@protected@xdef
-\upper@bound
-\use@mathgroup
-\v@false
-\v@true
-\verb@balance@group
-\verb@egroup
-\verb@eol@error
-\verbatim@font
-\verbatim@nolig@list
-\version@elt
-\version@list
-\vgl@
-\voidb@x
-\wrong@fontshape
-\x@protect
-\xe@alloc@intercharclass
-\z@
-\z@skip
-\zap@space
diff --git a/macros/latex-dev/base/lablst.tex b/macros/latex-dev/base/lablst.tex
index 241090e53e..fd65579713 100644
--- a/macros/latex-dev/base/lablst.tex
+++ b/macros/latex-dev/base/lablst.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/latex209.dtx b/macros/latex-dev/base/latex209.dtx
index cc5563c632..10de2958ba 100644
--- a/macros/latex-dev/base/latex209.dtx
+++ b/macros/latex-dev/base/latex209.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/latex209.ins b/macros/latex-dev/base/latex209.ins
index f0834e83df..7bd0eed06a 100644
--- a/macros/latex-dev/base/latex209.ins
+++ b/macros/latex-dev/base/latex209.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/latexchanges.pdf b/macros/latex-dev/base/latexchanges.pdf
new file mode 100644
index 0000000000..e45784ec68
--- /dev/null
+++ b/macros/latex-dev/base/latexchanges.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexchanges.tex b/macros/latex-dev/base/latexchanges.tex
new file mode 100644
index 0000000000..43780d3cf8
--- /dev/null
+++ b/macros/latex-dev/base/latexchanges.tex
@@ -0,0 +1,836 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: latexchanges.tex
+
+\NeedsTeXFormat{LaTeX2e}
+
+\documentclass{ltxguide}
+
+\usepackage[T1]{fontenc}
+
+\usepackage{url}
+
+\title{Changes to the \LaTeXe{} format}
+
+\author{\copyright~Copyright 2015--2019, \LaTeX3 Project Team.\\
+ All rights reserved.}
+
+\date{2019-10-01}
+
+% a few commands from doc
+\newcommand\Lpack[1]{\mbox{\textsf{#1}}}
+\newcommand\DescribeMacro[1]{\texttt{\string#1}}
+
+\makeatletter % -- provide command introduced in new release
+ % so this typesets with an old format
+
+\DeclareTextCommandDefault\textcommabelow[1]
+ {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
+ \hbox{\check@mathfonts\fontsize\ssf@size\z@
+ \math@fontsfalse\selectfont,}\hidewidth}\egroup}
+\makeatother
+
+\ifx\href\undefined
+ \newcommand\ghissue[1]{github #1}
+ \newcommand\gnatsissue[1]{gnats #1}
+ \newcommand\ltnewsissue[1]{\LaTeX\ News~#1}
+ \newcommand\sxanswer[1]{\url{https://tex.stackexchange.com\slash a\slash #1}}
+ \newcommand\sxquestion[1]{\url{https://tex.stackexchange.com\slash q\slash #1}}
+\else
+ \newcommand\ghissue[1]{%
+ \href{https://github.com/latex3/latex2e/issues/#1}{github #1}}
+ \newcommand\gnatsissue[1]{%
+ \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=latex/#1}{gnats #1}}
+ \newcommand\ltnewsissue[1]{%
+ \href{https://www.latex-project.org/news/latex2e-news/ltnews#1.pdf}{\LaTeX\ News~#1}}
+ \newcommand\sxanswer[1]{%
+ \url{https://tex.stackexchange.com/a/#1}}
+ \newcommand\sxquestion[1]{%
+ \url{https://tex.stackexchange.com/q/#1}}
+\fi
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\newpage
+
+\section{Introduction}
+
+This document describes changes that have been made to the
+\LaTeX\ format since the 2014/05/01 \LaTeX\ release.
+
+
+As announced in \ltnewsissue{22}, the 2015 \LaTeX{} release adopts a new
+policy. Improvements and bug fixes will be made to the format sources,
+with the \Lpack{latexrelease} package being available to revert
+changes to use definitions from an earlier format.
+
+
+\section{Changes introduced in 2019-10-01}
+
+Introduced \LaTeX\texttt{-dev} formats for pre testing future \LaTeX{}
+releases. Now there's a \texttt{latex-base-dev} package on CTAN which
+contains a pre-release of the \LaTeXe{} kernel and both \TeX Live and
+MiK\TeX{} include the standard \LaTeX{} executables (\texttt{pdflatex},
+\texttt{lualatex}, etc.) with \texttt{-dev} appended, which use the
+pre-release format.
+
+The handling of Unicode characters was improved by making them safe
+inside \verb|\ref|s and \verb|\label|s, by using \verb|\ifincsname|
+to make these characters safe in these contexts (\ghissue{95}).
+
+In line with the better handling of Unicode characters, file names
+can now contain any Unicode character plus spaces, as these cases
+are now correctly handled by the kernel.
+
+An optional argument was added to the \texttt{filecontents} environment,
+to which a comma-separated list of options can be given. The options
+include \texttt{overwrite} (or \texttt{force}), \texttt{nosearch}, and
+\texttt{noheader} (which has the same effect as the starred form of the
+environment). The environment is now allowed anywhere in the document.
+
+A plethora of \LaTeX{} commands was made robust so that fewer
+\verb|\protect| are needed when using some commands in moving arguments.
+There are a few border cases where it's tricker to make the command
+robust or where it's not worth it to do so, but most reasonable use
+cases are covered. The most notable change was \verb|\begin| and
+\verb|\end|, which are now robust and won't break when used in moving
+arguments.
+
+An extra \verb|\hskip 1sp| was added to \verb|c|-column table cells to
+protect against the presence of an \verb|\unskip| in the table cell
+(\ghissue{102}).
+
+\texttt{U+012F} which is ``i with ogonek'' should produce an
+``i'' and not a ``dotless i''. This has been corrected
+(\ghissue{122}).
+
+The Unicode slots \texttt{27E8} and \texttt{27E9} have been mapped to
+\verb|textlangle| and \verb|textrangle| which is the recommended mapping
+(\ghissue{110}).
+
+Basic ligatures (ff, fi, fl, ffi, ffl, ft, st) can now be input as a
+single unicode character in pdf\TeX, which is useful when copy-pasting
+(\ghissue{154}).
+
+\verb|\InputIfFileExists{foo}{\input{bar}}{}|
+did not load the files \texttt{foo.tex} and \texttt{bar.tex} but
+would load \texttt{bar.tex} twice. This has been corrected (\ghissue{109}).
+
+The \textsf{fncylab} and \textsf{varioref} packages changed \LaTeX's internal
+counter prefix commands \verb|p@...| so that they would take the counter
+value as an argument instead of just acting as a prefix to them. These
+packages also provided the \verb|\labelformat| macro to change the prefix
+macro and \verb|\Ref| so that using counters defined that way in the
+beginning of sentences would have the proper capitalisation. These features
+were added to the \LaTeXe{} kernel.
+
+The kernel now says ``Trying to load\ldots''
+instead of ``Try loading \ldots'' in one of its informal
+messages to match style of similar messages (\ghissue{107}).
+
+\verb|\DeclareErrorFont| would change the font size to 10\,pt which, when
+used in the wrong place, would make incorrect font settings in the document.
+This has now been fixed (\gnatsissue{4399}).
+
+The default action of the file \texttt{nfssfont.tex} was set to produce a
+font table, so that one can simply hit enter instead of having to write
+\verb=\table\bye=.
+
+The \LaTeX{} kernel now provides dummy (empty) definitions for the
+commands \verb|\conditionally@traceoff| and
+\verb|\conditionally@traceon| from the \texttt{trace} package so they
+can be used by package developers without worrying about them being
+defined or not (\ghissue{164}).
+
+
+
+
+
+\section{Changes introduced in 2018-12-01}
+
+Further additions to the characters supported by default in UTF-8.
+The commands \verb|\guillemetleft| and \verb|\guillemetright| are
+provided as alias for the names based on the Adobe font names
+(\ghissue{65}).
+
+The use of potrusion in tables of contents is suppressed by default,
+see \sxquestion{172785}.
+
+The handling of visible space in verbation was adjusted for
+\ghissue{69} and \ghissue{70}.
+
+Spaces are removed from the argument passed to BiBTeX, \ghissue{88}.
+
+New commands \verb|\Hwithstroke| and \verb|\hwithstroke| added to T1 encoding support.
+
+The internal box structure for floats is adjusted to preserve box
+levels of split hyperlinks, avoiding a fatal pdftex error. \ghissue{94}.
+
+
+\section{Changes introduced in 2018-04-01 patch~5}
+Improved support for non ASCII filenames on the commandline on
+filesystems using legacy encodings.
+
+Adjusted the new package rollback code so that some edge cases where rollback
+can not be guaranteed become a warning not an error.
+
+\section{Changes introduced in 2018-04-01 patch~4}
+No changes to the format, but \texttt{docstrip} adjusted so that non-ASCII
+\texttt{.ins} files work with the new UTF-8 defaults.
+
+\section{Changes introduced in 2018-04-01 patch~3}
+Additional adjustments for GitHub issues \ghissue{34} and \ghissue{38}, adjustment to the
+location of some documentation files, such as \texttt{source2e.tex} to
+be installed in the documentation sources not the default \TeX\ input
+tree.
+
+
+\section{Changes introduced in 2018-04-01 patch~2}
+Additional adjustments for GitHub issues \ghissue{32} and \ghissue{33}.
+
+\section{Changes introduced in 2018-04-01 patch~1}
+Make \verb|\UseRawInputEncoding| and \Lpack{latexrelease} reset \verb|\inputencodingname|
+when disabling the UTF-8 input handling.
+
+\section{Changes introduced in 2018-04-01}
+Further details of changes at this release are given in \ltnewsissue{28}, but in brief
+the main changes are as listed below.
+
+The default encoding for files has been changed to UTF-8.
+
+A new possibility to refer to older versions of packages has been added.
+
+New commands previously available in \Lpack{remreset} and
+\Lpack{chngcntr} packages for controlling counters have been added.
+
+The definition of \verb|\@ifundefined| has been refined to use the e-\TeX \verb|\ifcsname|
+primitive when available, and to avoid defining the command being tested to be \verb|\relax|
+in the case that it was previously undefined.
+
+\section{Changes introduced in 2017-04-15}
+Optionally, \LaTeX{} format and package dates may use ISO style dates with
+\texttt{-} rather than \texttt{/}.
+
+For Unicode \TeX{}s, made further adjustments to the composite accent
+code in \texttt{tuenc.def}, and further updates tracking changes in
+Lua\TeX, now at 1.04.
+
+Previously defining an encoding-specific composite with an undeclared
+accent (or an accent declared later) gave no error, but did nothing useful.
+\LaTeX\ will now detect this and give the accent comamnd a default definition
+as an error, allowing the declared composite to work as intended.
+
+The definition of \verb|\-| is adjusted to match the comments in
+\gnatsissue{3855} to accomodate non standard settings of \verb|\hyphenchar|.
+
+In parboxes and similar settings, \verb|\lineskiplimit| is now
+reset (to the existing default value, \verb|\normallineskiplimit|).
+See \sxanswer{359934}.
+
+ The code for verb|\newpage| has been adjusted to add a test on the value of
+\verb|\prevdepth| so that the depth of the last line is preserved in
+forced page breaks.
+
+\section{Changes introduced in 2017/01/01 patch~3}
+Emergency patch to correct a typo in a change introduced in patch~2.
+
+\section{Changes introduced in 2017/01/01 patch~2}
+More adjustments for TU encoding, allowing for characters missing in
+common system fonts. Additional \texttt{fd} files
+for Latin Modern variants are included in the documented sources.
+
+\section{Changes introduced in 2017/01/01 patch~1}
+Fixes to TU encoding definitions for Lua\TeX\ and Xe\TeX.
+
+\section{Changes introduced in 2017/01/01}
+
+A new test is added during format making that e\TeX\ extensions are
+available. As noted in \LaTeX\ news, e\TeX\ will now be required to
+build \LaTeX.
+
+Further updates tracking changes for Lua\TeX~1.0.
+
+The definition of \verb|\showhyphens| is changed in formats built
+with Xe\TeX, as the original version, inherited from plain \TeX\ does
+not work with Xe-\TeX.
+
+Changes to the default encoding used by Lua\TeX\ and Xe\TeX\ formats to
+be TU (Unicode) rather than OT1 (7 bit legacy \TeX\ encoding).
+
+\section{Changes introduced in 2016/03/31 patch~3}
+Fixes to \verb|\newinsert| and \verb|\extrafloats|.
+
+\section{Changes introduced in 2016/03/31 patch~2}
+Adjustments to \verb|\c{g}| in OT1 encoding.
+
+\section{Changes introduced in 2016/03/31 patch~1}
+Adjust the upper limit for Character Class allocation in Xe-\TeX\ to
+4096 to match a change in Xe-\TeX.
+
+\section{Changes introduced in 2016/03/31}
+Modify picture mode as suggested in latex/4452 to avoid leaders of
+almost zero length.
+
+Modify the checks in \verb|\DeclareMathSymbol| and related commands
+so that they do not give errors with new Lua\TeX\ releases.
+
+\section{Changes introduced in 2016/02/01}
+Adjustments to Lua\TeX\ support to match changes to the Lua\TeX\ engine,
+and to the character class allocation in Xe\TeX.
+
+Load Unicode data from new generic \texttt{unicode-data} distribution.
+
+\section{Changes introduced in 2015/10/01 patch~2}
+
+This release fixes the behaviour of the allocation mechanism if the switch
+from the standard to extended pool takes place within a group.
+
+\section{Changes introduced in 2015/10/01 patch~1}
+This release allows \Lpack{latexrelease} to revert the
+Lua\TeX{}-specific
+changes, in particular fixing an incorrect date in part of the mechanism and
+adding a method to disable callback management entirely.
+
+\section{Changes introduced in \LaTeX\ 2015/10/01}
+
+\subsection{LuaTeX allocation}
+Almost all changes at this release relate to incorporating allocation macros for luatex into the format
+as done for etex and xetex in 2015/01/01. For details see |ltluatex.dtx| or \ltnewsissue{22}.
+|ltluatex.dtx| now forms a new chapter (N) in the documented sources, |source2e.tex|.
+
+
+\subsection{Increased number of floats}
+The default float list has been increased from 18 to 52 registers if
+e\TeX\ is available.
+The list can be increased further using |\extrafloats| however this
+default allocation uses classic registers below 256 so the registers are
+also available for |\newinsert| as described below.
+
+\subsection{Improved \texttt{\textbackslash newinsert}}
+The command |\newinsert| has been extended to take registers from the lists of free float
+registers once the classic register allocation is used up. This should make it highly unlikely
+to get ``no room'' errors on register allocation assuming the format is used with
+an e-\TeX\ based \TeX\ engine.
+
+\subsection{New accent, \texttt{\textbackslash textcommabelow} (pr/4414)}
+The command |\textcommabelow| has been added. This is mainly intended for Romanian letters
+\textcommabelow{S}\,\textcommabelow{s}\,\textcommabelow{T}\,\textcommabelow{t}.
+
+\subsection{Unicode 8}
+The file |unicode-letters.def| used to initialise character data in
+Unicode \TeX\ variants has been regenerated from data files updated
+to Unicode~8.
+
+\section{Changes introduced in 2015/01/01 patch~2}
+There were no changes to the format at this release, but the sources were fixed to fix bug latex/4434
+affecting bottom float positioning if the \Lpack{latexrelease} package was used.
+
+\section{Changes introduced in 2015/01/01 patch~1}
+This release re-introduces the ``Patch Level'' scheme for identifying
+releases between main ``dated'' releases. Early \LaTeXe\ releases
+included a mechanism whereby updates could be provided by a
+\emph{patch
+ file}. This was mainly intended to allow updates to be made without
+downloading the full sources again, which was an important
+consideration with download speeds and costs at the time.
+
+The new mechanism incorporates any changes directly into the sources,
+but having the patch level identified in the banner allows the
+\LaTeX\ release to be identified, even if (as in this case) most of the
+changes do not affect the format but affect other base packages such
+as \Lpack{latexrelease} and \Lpack{inputenc}. The patch level is shown
+in the banner at the start of the job, but does not affect the date
+handling of the |\IncludeInRelease| mechanism.
+
+Apart from re-arranging the version banner, the only change in the
+format is that |\newtoks| was accidentally defined twice, using the
+old and new allocation scheme described in Section \ref{e@alloc}.
+The old definition is now only in the \Lpack{latexrelease} package,
+for use when emulating old formats.
+
+
+
+
+\section
+[Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01]
+{Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01\footnote{Much of this text
+is taken from \Lpack{fixltx2e} package which was formerly used to make such changes available separately.}}
+
+\subsection{Support for \LaTeX\ version changes}
+\DescribeMacro{\includeInRelease}\arg{date}\oarg{date}\arg{label}\arg{message}\arg{code}
+
+\smallskip
+
+The |\includeInRelease| command has been added to support backward and
+forward compatibility for the \LaTeX\ format. It supports the
+declaration of conditional code that can be loaded based on options
+given to the \Lpack{latexrelease} package. Its use is described in
+detail in the \Lpack{latexrelease} package documentation.
+
+\subsection{New Allocation Code\label{e@alloc}}
+Previously |\newcount| and related commands were based on classic TeX
+and only allocated in the range 0--255. This was extended (in
+different ways) for e-\TeX\ in the |etex| package and in the
+|xelatex.ini| and |lualatex.ini| files used in those formats. Related
+to this the number of boxes allocated to store floats was
+limited. This was extended to a certain extent in the |morefloats|
+package (by Don Hosek and H.-Martin Muench) but the new allocation
+incorporates float allocation directly and supports much larger float
+lists using the extended registers.
+
+The new code allocates registers in the full extended range (
+$2^{15}-1$ for etex and xelatex, $2^{16}-1$ for lualatex.
+In addition a new command |\extrafloats| is provided.
+
+\DescribeMacro{\extrafloats}\arg{number}
+\smallskip
+
+This allocates additional registers for the \LaTeX\ float system to
+hold figures and tables etc. Similar functionality has been
+available via the \Lpack{morefloats} package but this is a different
+implementation using extended e-\TeX\ registers when available so
+allows many more registers to be reserved for floats as they are
+allocated from a pool of 32 or 64 thousand rather than 256 registers,
+depending on the engine in use.
+
+\DescribeMacro{\newmarks}\arg{command}
+\smallskip
+
+e-\TeX\ only, previously available via the \Lpack{etex} package.
+Allocates commands to use the extended e-\TeX\ mark mechanism.
+
+\DescribeMacro{\newXeTeXintercharclass}\arg{command}
+\smallskip
+
+Xe-\TeX\ only, previously in the Xe-\LaTeX\ format, but added via
+|xelatex.ini| not part of the core release.
+Allocates commands to use the Xe-\TeX\ character class mechanism.
+
+
+\subsection{e-\TeX\ tracing if available}
+|\loggingall| (Usually used via |\tracingall|) is extended to enable
+additional e-\TeX\ tracing if e-\TeX\ is available. (|\tracingall|
+extension has been available as part of the |etex| package previously).
+
+Also based on code from the |etex| package, a command |\tracingnone|
+is added to reverse the effects of |\tracingall| and turn off all primitive
+\TeX\ tracing. A new command |\hideoutput| has been added which resets the
+tracing parameters set by |\showoutput|.
+
+
+
+
+\subsection{\texttt{\textbackslash textsubscript} not defined in
+ latex.ltx (pr/3492)}
+
+\begin{verbatim}
+>>Number: 3492
+>>Category: latex
+>>Synopsis: \textsubscript not defined in latex.ltx
+>>Arrival-Date: Tue Jan 14 23:01:00 CET 2003
+>>Originator: Ionel Mugurel Ciobica
+
+I use \textsubscript much more often than \textsuperscript, and
+\textsubscript it is not defined in latex.ltx. Could you please
+consider including the definition of \textsubscript in the latex.ltx
+for the next versions of LaTeX. Thank you.
+\end{verbatim}
+
+\subsection{\texttt{\textbackslash @} discards spaces when moving
+ (pr/3039)}
+
+\begin{verbatim}
+>>Number: 3039
+>>Category: latex
+>>Synopsis: \@ discards spaces when moving
+>>Arrival-Date: Sat May 22 09:01:06 1999
+>>Originator: Donald Arseneau
+>>Description:
+The \@ command expands to \spacefactor\@m in auxiliary files,
+which then ignores following spaces when it is reprocessed.
+\end{verbatim}
+
+\subsection{1-col fig can come before earlier 2-col fig
+ (pr/2346)}
+
+\begin{verbatim}
+>>Number: 2346
+>>Category: latex
+>>Synopsis: 2-col: 1-col fig can come before earlier 2-col fig
+>>Arrival-Date: Wed Dec 18 15:41:07 1996
+>>Originator: bil kleb
+>>Description:
+as documented in Lamport's book, p. 198, concerning figure
+placement, "a figure will not be printed before an earlier
+figure, and a table will not be printed before an earlier
+table." however, there is a footnote stating, "However,
+in two-column page style, a single-column figure can come before
+an earlier double-column figure, and vice versa."
+
+This twocolumn behavior is undesirable---at least by me and
+most professional organizations i publish in. ed snyzter developed
+a hack fix for 2.09 several years ago which links the two
+counters, but i have not run across a similar "fix" for 2e...
+\end{verbatim}
+
+Originally fixed in package \Lpack{fix2col} which was merged into
+this package. Documentation and code from this package have been
+merged into this file.
+
+\subsubsection{Notes on the Implementation Strategy}
+
+The standard output routine maintains two lists of floats that have
+been `deferred' for later consideration. One list for single column
+floats, and one for double column floats (which are always
+immediately put onto their deferred list). This mechanism means
+that \LaTeX\ `knows' which type of float is contained in each box
+by the list that it is processing, but having two lists means
+that there is no mechanism for preserving the order between the
+floats in each list.
+
+The solution to this problem consists of two small changes to
+the output routine.
+
+Firstly, abandon the `double column float list' |\@dbldeferlist|
+and change every command where it is used so that instead the
+same |\@deferlist| is used as for single column floats.
+That one change ensures that double and single column floats
+stay in the same sequence, but as \LaTeX\ no longer `knows'
+whether a float is double or single column, it will happily
+insert a double float into a single column, overprinting the
+other column, or the margin.
+
+The second change is to provide an alternative mechanism for
+recording the two column floats. \LaTeX\ already has a compact
+mechanism for recording float information, an integer count register
+assigned to each float records information about the `type' of float
+`figure', `table' and the position information `htp' etc.
+
+The type information is stored in the `high' bits, one bit position
+(above `32') allocated to each float type. The `low' bits store
+information about the allowed positions, one bit each allocated for
+|h t b p|. In the \LaTeX2.09 system, the bit corresponding to `16'
+formed a `boundary' between these two sets of information, and it
+was never actually used by the system. Ed Sznyter's
+\Lpack{fixfloats} package not unreasonably used this position to
+store the double column information, setting the bit for double
+column floats. Then at each point in the output routine at which a
+float is committed to a certain region, an additional check must be
+made to check that the float is (or is not) double column. If it
+spans the wrong number of columns it is deferred rather than being
+added.
+
+Unfortunately the bit `16' is not available in \LaTeXe. It is used
+to encode the extra float position possibility `|!|' that was added
+in that system. It would be possible to use position `32' and to
+move the flags for `table', `figure',\ldots\ up one position, to
+start at 64, but this would mean that in principle one less float
+type would be supported, and more importantly is likely to break
+any other packages that assume anything about the output routine
+internals. So here I instead use another mechanism for flagging
+double column floats: By default all floats have depth 0pt.
+This package arranges that double column ones have depth 1sp.
+This information may then be used in the same manner as in
+the \Lpack{fixfloats} package, to defer any floats that are not of
+the correct column spanning type.
+
+
+
+\subsection{Infinite glue found (pr/4023 and pr/2346)}
+
+The fix for pr/2346 did not work as intended when used in conjunction
+with |\enlargethispage| as the latter introduced an infinite negative
+glue at the bottom of the page. That in turn make a |\vsplit|
+operation to get at the column marks invalid.
+
+\subsection{Wrong header for twocolumn (pr/2613)}
+
+\begin{verbatim}
+>>Number: 2613
+>>Category: latex
+>>Synopsis: wrong headline for twocolumn
+>>Arrival-Date: Mon Sep 22 16:41:09 1997
+>>Originator: Daniel Reischert
+>>Description:
+When setting the document in two columns
+the headline shows the top mark of the second column,
+but it should show the top mark of the first column.
+\end{verbatim}
+
+Originally fixed in package \Lpack{fix2col} which was merged into
+this package. Documentation and code from this package have been
+merged into this file.
+
+\subsubsection{Notes on the Implementation Strategy}
+
+The standard \LaTeX\ twocolumn system works internally by making
+each column a separate `page' that is passed independently to \TeX's
+page breaker. (Unlike say the \Lpack{multicol} package, where all
+columns are gathered together and then split into columns later,
+using |\vsplit|.) This means that the primitive \TeX\ marks that are
+normally used for header information, are globally reset after the
+first column. By default \LaTeX\ does nothing about this.
+A good solution is provided by Piet van Oostrum (building on earlier
+work of Joe Pallas) in his \Lpack{fixmarks} package.
+
+After the first column box has been collected the mark information
+for that box is saved, so that any |\firstmark| can be
+`artificially' used to set the page-level marks after the second
+column has been collected. (The second column |\firstmark| is not
+normally required.) Unfortunately \TeX\ does not provide a direct
+way of knowing if any marks are in the page, |\firstmark| always has a
+value from previous pages, even if there is no mark in this page.
+The solution is to make a copy of the box and then |\vsplit| it
+so that any marks show up as |\splitfirstmark|.
+
+The use of |\vsplit| does mean that the output routine will globally
+change the value of |\splitfirstmark| and
+|\splitbotmark|. The \Lpack{fixmarks} package goes to some trouble
+to save and restore these values so that the output routine does
+\emph{not} change the values. This part of \Lpack{fixmarks} is not
+copied here as it is quite costly (having to be run on every page) and
+there is no reason why anyone writing code using |\vsplit| should
+allow the output routine to be triggered before the split marks have
+been accessed.
+
+
+
+\subsection{\texttt{\textbackslash setlength} produces error if
+ used with registers like \texttt{\textbackslash dimen0} (pr/3066)}
+
+\begin{verbatim}
+>>Number: 3066
+>>Category: latex
+>>Synopsis: \setlength{\dimen0}{10pt}
+>>Arrival-Date: Tue Jul 6 15:01:06 1999
+>>Originator: Heiko Oberdiek
+>>Description:
+The current implementation of \setlength causes an error,
+because the length specification isn't terminated properly.
+More safe:
+\def\setlength#1#2{#1=#2\relax}
+\end{verbatim}
+
+\subsection{Fewer fragile commands}
+
+\begin{verbatim}
+>>Number: 3816
+>>Category: latex
+>>Synopsis: Argument of \@sect has an extra }.
+>>Arrival-Date: Sat Oct 22 23:11:01 +0200 2005
+>>Originator: Susanne Wunsch
+
+Use of a \raisebox in \section{} produces the error message
+mentioned in the subject.
+
+PR latex/1738 described a similar problem, which has been solved
+10 years ago. Protecting the \raisebox with \protect solved my
+problem as well, but wouldn't it make sense to have a similar fix
+as in the PR?
+
+It is particularly confusing, that an unprotected \raisebox in a
+\section*-environment works fine, while in a \section-environment
+produces error.
+\end{verbatim}
+
+While not technically a bug, in this day and age there are few
+reasons why commands taking optional arguments should not be robust.
+
+\subsubsection{Notes on the implementation strategy}
+
+Rather than changing the kernel macros to be robust, we have decided
+to add the macro \DescribeMacro{\MakeRobust}|\MakeRobust| in
+\Lpack{fixltx2e} so that users can easily turn fragile macros into
+robust ones. A macro |\foo| is made robust by doing the simple
+|\MakeRobust{\foo}|. \Lpack{fixltx2e} makes the following kernel
+macros robust: |\(|, |\)|, |\[|, |\]|,
+ |\makebox|, |\savebox|,
+|\framebox|, |\parbox|, |\rule| and |\raisebox|.
+
+\ldots TODO \ldots fleqn vesion of |\[\]|
+
+\subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom (pr/3073)}
+
+\begin{verbatim}
+>>Number: 3073
+>>Category: latex
+>>Synopsis: \addpenalty ruins flush-bottom
+>>Arrival-Date: Sat Jul 17 05:11:05 1999
+>>Originator: Donald Arseneau
+>>Description:
+Just to keep in mind for further development eh?
+A page break at an \addpenalty after \vspace does *not*
+give a flush-bottom page. (The intent of \addpenalty is
+apparently just to preserve the flush bottom by putting
+the breakpoint `above' the skip.)
+\end{verbatim}
+
+\subsection{Within counters only reset next level down (pr4393)}
+
+This is actually implicitly documented behavior in the \LaTeX{}
+Manual that states that |\stepcounter| resets all counters marked
+``within''. However it means that if, for example, theorems are
+numbered within sections and you start a new chapter in a book, the
+section counter is reset to zero but the theorem counter is not
+until the first section appears. Thus a theorem directly within the
+chapter body (without a new section) would show an incremented
+number relative to the last theorem of the previous chapter.
+
+
+For this reason we are now resetting all levels of within in one go
+even if that means that some of these resets may happen several times
+unnecessarily.
+
+
+\subsection{Check the optional arguments of floats}
+
+By default LaTeX silently ignores unknown letters in the optional
+arguments of floats. |\begin{figure}[tB]| the |B| is ignored so it
+acts like |\begin{figure}[t]| However |\begin{figure}[B]| does
+\emph{not} act like |\begin{figure}[]| as the check for an empty
+argument, or unsupplied argument, is earlier. |[]| causes the
+default float placement to be used, but |[B]| means that \emph{no}
+float area is allowed and so the float will not be placed until the
+next |\clearpage| or end of document, no warning is given.
+
+This package adds a check on each letter, and if it not one of
+|!tbhp| then an error is given and the code acts as if |p| had been
+used, so that the float may be placed somewhere.
+
+\subsection{\texttt{\textbackslash DeclareMathSizes} only take pts.
+ (pr/3693)}
+
+\begin{verbatim}
+>>Number: 3693
+>>Category: latex
+>>Synopsis: \DeclareMathSizes only take pts.
+>>Arrival-Date: Fri Jun 11 16:21:00 CEST 2004
+>>Originator: Morten Hoegholm
+
+The last three arguments of \@DeclareMathSizes cannot take a dimension
+as argument, making it inconsistent with the rest of the font changing
+commands and itself, as the second argument can take a dimension
+specification.
+\end{verbatim}
+
+\subsection{No hyphenation in first word after float environment (pr/3498)}
+
+\begin{verbatim}
+>>Number: 3498
+>>Category: latex
+>>Synopsis: No hyphenation in first word after float environment
+>>Arrival-Date: Thu Jan 30 13:21:00 CET 2003
+>>Originator: Harald Harders
+
+If a float environment (figure, table) is written within a paragraph,
+the first word after the environment is not hyphenated.
+\end{verbatim}
+
+\subsection{\texttt{\textbackslash fnsymbol} should use text symbols
+ (pr/3400)}
+
+\begin{verbatim}
+>>Number: 3400
+>>Category: latex
+>>Synopsis: \fnsymbol should use text symbols if possible
+>>Arrival-Date: Fri Jan 04 20:41:00 CET 2002
+>>Originator: Walter Schmidt
+
+The \fnsymbol command can be used in both text and math
+mode. The symbols produced are, however, always taken from
+the math fonts. As a result, they may not match the text
+fonts, even if the symbols are actually available, for
+instance from the TS1 encoding. Since \fnsymbol is
+primarily used for footnotes in text, this should be fixed,
+IMO.
+\end{verbatim}
+
+
+
+
+
+\subsection{\texttt{\textbackslash footnotemark}[x] crashes with fixltx2e.sty
+ (pr/3752)}
+
+\begin{verbatim}
+>>Number: 3752
+>>Category: tools
+>>Synopsis: feature \footnotemark[x] crashes with fixltx2e.sty
+>>Arrival-Date: Fri Dec 17 10:11:00 +0100 2004
+>>Originator: Stefan Pofahl
+
+ If I use /fnsymbol together with fixltx2e.sty I can not use
+ optional parameter [num]
+ \footnotemark[1] is not showing the mark number 1 but
+ the mark \value{footnote}.
+\end{verbatim}
+This bug was related to pr/3400, where |\@fnsymbol| was made robust.
+
+\subsubsection{Notes on the implementation strategy}
+
+Pr/3400 made |\@fnsymbol| decide between text-mode and math-mode,
+which requires a certain level of robustness somewhere as the
+decision between text and math must be made at typesetting time and
+not when inside |\protected@edef| or similar commands. One way of
+dealing with this is to make sure the value seen by |\@fnsymbol| is
+a fully expanded number, which could be handled by code such as
+\begin{verbatim}
+\def\fnsymbol#1{\expandafter\@fnsymbol
+ \expandafter{\the\csname c@#1\endcsname}}
+\end{verbatim}
+This would be a good solution if everybody used the high level
+commands only by writing code like |\fnsymbol{footnote}|. Unfortunately
+many classes (including the standard classes) and packages use the
+internal forms directly as in |\@fnsymbol\c@footnote| so the easy
+solution of changing |\fnsymbol| would break code that had worked for
+the past 20~years.
+
+Therefore the implementation here makes |\@fnsymbol| itself a
+non-robust command again and instead uses a new robust command
+\DescribeMacro{\TextOrMath}|\TextOrMath|, which will take care of
+typesetting either the math or the text symbol. In order to do so,
+we face an age old problem and unsolvable problem in \TeX: A
+reliable test for math mode that doesn't destroy
+kerning. Fortunately this problem can be solved when using e\TeX\ so
+if you use this as engine for your \LaTeX\ format, as recommended by
+the \LaTeX3 Project, you will get a fully functioning |\TextOrMath|
+command with no side effects. If you use regular \TeX\ as engine for
+your \LaTeX\ format then we have to choose between the lesser of two
+evils: 1)~breaking ligatures and preventing kerning or 2)~face the
+risk of choosing text-mode at the beginning of an alignment cell,
+which was supposed to be math-mode. We have decided upon 1) as is
+customary for regular robust commands in \LaTeX.
+
+
+
+\end{document}
diff --git a/macros/latex-dev/base/latexrelease.dtx b/macros/latex-dev/base/latexrelease.dtx
index 02194cee11..cfb1bff8aa 100644
--- a/macros/latex-dev/base/latexrelease.dtx
+++ b/macros/latex-dev/base/latexrelease.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/latexrelease.ins b/macros/latex-dev/base/latexrelease.ins
index 1ddcfc4c29..9358692a91 100644
--- a/macros/latex-dev/base/latexrelease.ins
+++ b/macros/latex-dev/base/latexrelease.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2018
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2018
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/latexrelease.pdf b/macros/latex-dev/base/latexrelease.pdf
index 44c83065ce..660142e7d0 100644
--- a/macros/latex-dev/base/latexrelease.pdf
+++ b/macros/latex-dev/base/latexrelease.pdf
Binary files differ
diff --git a/macros/latex-dev/base/latexsym.dtx b/macros/latex-dev/base/latexsym.dtx
index 58e88d6364..52b12e0c36 100644
--- a/macros/latex-dev/base/latexsym.dtx
+++ b/macros/latex-dev/base/latexsym.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -31,7 +31,7 @@
% \iffalse % this is a METACOMMENT !
%
% File `latexsym.dtx'.
-% Copyright 1994-1998 by Frank Mittelbach. All rights reserved.
+% Copyright (C) 1994-2019 by Frank Mittelbach. All rights reserved.
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{latexsym}
diff --git a/macros/latex-dev/base/latexsym.ins b/macros/latex-dev/base/latexsym.ins
index 031e1d4062..7b42cf9132 100644
--- a/macros/latex-dev/base/latexsym.ins
+++ b/macros/latex-dev/base/latexsym.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
@@ -87,7 +87,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -100,7 +100,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/latexsym.pdf b/macros/latex-dev/base/latexsym.pdf
index 242cf1725c..c9bf6447c1 100644
--- a/macros/latex-dev/base/latexsym.pdf
+++ b/macros/latex-dev/base/latexsym.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lb2.err b/macros/latex-dev/base/lb2.err
deleted file mode 100644
index fa8694c5e2..0000000000
--- a/macros/latex-dev/base/lb2.err
+++ /dev/null
@@ -1,1622 +0,0 @@
-\newcommand\erratafiledate{2014-09-30}
-
-\def\comando#1{\texttt{\string#1}}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% To produce a printed version of this errata file run this file through
-% LaTeX. It will unpack a small class file (if not already present) and
-% a configuration file with the extension .cfg. You might want to modify
-% the setting in this configuration file to print only a partial errata
-% suitable for your printed revision of this book, see details in the
-% .cfg file.
-%
-% The current version of this file can be found at:
-%
-% https://www.latex-project.org/guides/books.html
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-\begin{filecontents}{ttcterrata.cls}
-%%
-%% Copyright (C) 1997,2004,2005,2007, 2014 Frank Mittelbach
-%% This class file is licenced under LPPL latest version;
-%% see https://www.latex-project.org/lppl
-%
-%
-% It sets up a few commands used to format the errata entries for books in the
-% Addison-Wesley Series:
-%
-% Tools and Techniques for Computer Typesetting
-%
-% hence the name. However, anybody who likes to use it is free to apply it for
-% errata files of other books.
-%
-% Changes:
-%
-% v1.0a - changed name from errata.cls to ttcterrata.cls
-
-\ProvidesClass{ttcterrata}
- [2007/11/10 v1.0a Mini class for errata files; subject to change (FMi)]
-
-\LoadClass{article}
-
-\setcounter{secnumdepth}{-1}
-\addtolength\textwidth{5cm}
-\addtolength\oddsidemargin{-3cm}
-
-\addtolength\textheight{36pt}
-
-\RequirePackage{shortvrb}
-\MakeShortVerb{\|}
-
-\RequirePackage{array,longtable}
-\RequirePackage{multicol}
-
-
-\newcommand\erratagetnumber{}
-\def\erratagetnumber#1/#2/#3\erratagetnumber{#1#2#3}
-
-
-\newcommand\gobbleerrata{%
- \setbox\@tempboxa\vbox\bgroup
- \let\endgobble\egroup
- \let\hideamp\relax
- \let\\\relax\let\par\@@par}
-
-\newcommand*\hideamp{&}
-
-\let\endgobble\relax
-
-
-\newcommand\erratastartdate{}
-\newcommand\myprinting{1}
-
-
-\newcommand\doweprint[2]{%
- \ifnum \myprinting < \if!#2!1000 \else \ifx s#2 1000\else#2 \fi\fi
- \ifnum \expandafter\erratagetnumber\erratastartdate\erratagetnumber <
- \erratagetnumber#1\erratagetnumber \relax
- \@tempswatrue
- \else
- \@tempswafalse
- \fi
- \else
- \@tempswafalse
- \fi
-}
-
-
-
-\newcommand\includedentries{entries after = \erratastartdate}
-\newcommand\printedentries{between \erratastartdate\space and}
-
-\newcommand\showallerrors{%
- \renewcommand\includedentries{all errata entries}%
- \renewcommand\printedentries{up to}
- \renewcommand\doweprint[2]{\@tempswatrue}}
-
-
-\newcommand\displayrevisionfix[2]{%
- \if!#2!\textbf{#1}\else\textit{#1}\rlap{\textsuperscript{#2}}\fi}
-
-\newcommand\norevisionnumbers{%
- \renewcommand\displayrevisionfix[2]{\textbf{##1}}}
-
-\IfFileExists{\jobname.cfg}
- {
- \input{\jobname.cfg}
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* Configuration file for \jobname.err found }
- \typeout{*}
- \typeout{***************************************************}
- \AtEndDocument{
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* If you wish to generate an errata listing}
- \typeout{* containing only errors found after a certain revision}
- \typeout{* and/or only errors found after a certain date}
- \typeout{* modify the information stored in \jobname.cfg}
- \typeout{*}
- \typeout{* Current settings are:}
- \typeout{*}
- \typeout{* \@spaces printing of your book = \myprinting}
- \typeout{* \@spaces include \includedentries}
- \typeout{*}
- \typeout{***************************************************}
- }}
- {}
-
-%% \erroronpage <page> <line info> <contributor> <date> <fixed in revision>
-
-\newcommand\erroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\seriouserroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\CHAPTER[1]{\endgobble
- &\\[4pt]%
- \multicolumn{4}{l}{\framebox[10cm][l]{\textbf{\normalsize\strut#1}}} \\}
-
-\newenvironment{erratalist}
- {\begin{longtable}{r>{\raggedright}p{2cm}l>{\raggedright}p{10cm}l}}
- {\endgobble\end{longtable}}
-
-\newcommand\erratatitle[2]
- {\begin{center}\LARGE\bfseries
- Errata list for #1\\[5pt](\myprinting.\ printing)\\[10pt]
- \small Includes all entries found \printedentries\space #2\\
- (For other periods/print runs reprocess this document
- with different config settings)
- \end{center}%
- \markright{Errata for #1 (\printedentries\space #2)}%
- \thispagestyle{plain}%
- \vspace{20pt}}
-
-\pagestyle{myheadings}
-
-\AtBeginDocument{\small}
-
-\setlength\parindent{0pt}
-\setlength\parskip{2pt}
-
-\newcommand\contributor[2]{\makebox[1cm][l]{\sffamily#1} #2\par}
-
-% some special shortcuts overwriting existing commands:
-
-\let\u\underline
-\renewcommand\>{$\to$}
-
-%%% some code suggested by Thorsten Hansen to count the number of
-%%% contributions by individuals (will work only if we do not get
-%%% too many :-)
-
-\def\count@contributors#1/#2/#3\@nil{
- \@ifundefined{c@#1}{\newcounter{#1}}{}\stepcounter{#1}%
-%%% also count secondary:
-%%% \@ifundefined{c@#2}{\newcounter{#2}}{}\stepcounter{#2}%
-}
-
-\renewcommand\erroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\seriouserroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\contributor[2]{\makebox[1cm][l]{%
- \sffamily#1} #2\@ifundefined{c@#1}{}{ (\arabic{#1})}\par}
-
-\end{filecontents}
-
-
-\begin{filecontents}{\jobname.cfg}
-%
-%
-% Configuration file for the errata listing of
-%
-% Der LaTeX-Begleiter 2 Auflage
-%
-%
-% \erratastartdate
-%
-% Specifies the date from which on errata entries should be listed.
-%
-% The format is YYYY/MM/DD.
-%
-% The default below ensures that all entries for a particular
-% printing are typeset.
-%
-
-\renewcommand\erratastartdate{2005/09/01}
-
-
-%
-% \myprinting
-%
-% Specifies which (revised) printing you own. For example, if you
-% have the second printing set this to 2 so that errors already
-% corrected in that printing will not appear in your errata
-% listing.
-%
-% The default below ensures that all entries relevant to the second
-% printing are typeset.
-%
-%
-
-\renewcommand\myprinting{2}
-
-%
-% \norevisionnumbers
-%
-% Specifies that all page numbers in the errata are shown in the same
-% format (bold face) irregardless of whether or not they are fixed
-% in some revision. The default is to print corrected errors in
-% italic and add the revision number as a superscript.
-
-%
-% \showallerrors
-%
-% With this command you tell the program that all errata entries are
-% supposed to be generated. This makes \myprinting and
-% \erratastartdate basically obsolete so this isn't turned on by
-% default.
-%
-%
-\endinput
-\end{filecontents}
-
-
-\documentclass{ttcterrata}[2005/11/10] % we want new class
-
-\usepackage[T1]{fontenc}
-\let\u\underline % shortcut for this file
-
-\newcommand\meta[1]{$\langle$\textit{#1\/}$\rangle$}
-\newcommand\BibTeX{\textsc{Bib}\TeX}
-
-
-\usepackage{textcomp}
-
-\usepackage{url}
-
-\usepackage[ngerman]{babel}
-\usepackage[utf8]{inputenc}
-
-
-\renewcommand\erratatitle[2]
- {\begin{center}\LARGE\bfseries
- Errataliste f\"ur #1\\[5pt](\myprinting.\ Druck)\\[10pt]
- \small Enth\"alt alle Eintr\"age die \printedentries\space #2
- gemeldet wurden \\
- (F\"ur andere Zeitr\"aume/Druckausgaben \"andert man die \texttt{.cfg}
- Datei und formatiert erneut.)
- \end{center}%
- \markright{Errata für #1 (\printedentries\space #2)}%
- \thispagestyle{plain}%
- \vspace{20pt}}
-
-\renewcommand\printedentries{zwischen \erratastartdate\space und}
-
-
-
-\begin{document}
-
-\erratatitle{Der \LaTeX{}-Begleiter, zweite Auf\/lage}{\erratafiledate}
-
-
-\vspace*{-\baselineskip}
-
-Hardcover-Ausgabe:
-\begin{verbatim}
-@book(Pearson:MG05,
- author = {Frank Mittelbach and Michel Goossens},
- title = {Der {\LaTeX}-Begleiter}, edition = 2,
- note = {Unter Mitarbeit von Johannes Braams, David Carlisle, und Chris Rowley},
- publisher = {Pearson Studium}, address = {M\"unchen}, year = 2005,
- pagenums = {1180}, bibliography = {yes}, index = {yes},
- isbn = {3-8273-7166-X},
-)
-\end{verbatim}
-Bafög-Ausgabe (Softcover) die inhaltlich identisch ist:
-\begin{verbatim}
-@book(Pearson:MG10,
- author = {Frank Mittelbach and Michel Goossens},
- title = {Der {\LaTeX}-Begleiter Baf\"og-Ausgabe}, edition = 2,
- note = {Unter Mitarbeit von Johannes Braams, David Carlisle, und Chris Rowley},
- publisher = {Pearson Studium}, address = {M\"unchen}, year = 2010,
- pagenums = {1180}, bibliography = {yes}, index = {yes},
- isbn = {3-8689-4088-X},
-)
-\end{verbatim}
-
-
-\begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}}
-\item[]
-
-Diese Errata-Datei (\texttt{\jobname.err}) ist Teil der
-\LaTeX-Distribution und die neuste Version findet man auf der \LaTeX{}
-Project Webseite unter
-\url{https://www.latex-project.org/help/books/}\texttt{\jobname.err}. Dort
-findet man auch einige Abschnitte des Buches als PDF-Dateien.
-
-Die erste Spalte der Tabelle zeigt die Seitennummer des
-Errataeintrags. Hochgestellte Ziffern in der ersten Spalte verweisen
-auf den Nachdruck, in dem der beschriebene Fehler korrigiert wurde
-(ein \textit{s} zeigt, an, dass das Problem bisher nur in den
-"`S"'ourcen korrigiert wurde). Die zweite Spalte beschreibt die genaue
-Position (negative Zeilen- oder Absatznummern werden vom Fuß der Seite
-gezählt). Die dritte Spalte zeigt die Initialen der Person die den
-Fehler zuerst aufgespürt/gemeldet hat.
-
-
-Mithilfe der Konfigurationsdatei \texttt{\jobname.cfg} ist es möglich die
-Liste so anzupassen, dass nur Errataeinträge ab einem
-speziellen Nachdruck oder ab einem gewünschten Datum angezeigt werden.
-
-
-\begin{center}
- \Large \bfseries Irren ist menschlich -- Fehlerwettbewerb
-\end{center}
-
-
-Jeder gefundene und mitgeteilte Fehler ist ein Gewinn für alle Leser
-und Käufer unseres Buches. Aus diesem Grund schreiben wir, Pearson
-Studium und die Autoren, einen Preis aus -- halbjährlich, später (mehr)jährlich -- den
-die Person erhält, die die meisten Fehler innerhalb dieser Zeit findet
-(im Falle einer Ãœberschneidung wird das Los zwischen den "`besten"'
-Fehlersuchern entscheiden). Eine Person kann nur einmal einen Preis
-bekommen; Fehler die durch die Autoren gefunden werden, zählen nicht.
-\begin{center}
-Ihr Preis: Ein Lehrbuch Ihrer Wahl!
-\end{center}
-Auswählen können Sie dieses unter \url{http://www.pearson-studium.de}.
-(Bundles und mehrbändige Bücher sind davon ausgenommen).
-
-Wie üblich behalten sich die Autoren und der Verlag das Recht vor,
-selbst zu entscheiden ob ein Fehler tatsächlich als Fehler anzusehen
-ist oder ob ein wiederholt vorkommender Fehler als ein oder mehrere Fehler
-gezählt wird.
-
-- Viel Erfolg -
-
-\begin{center}
-\begin{tabular}{clr@{ Eingaben}}
-Ende der Wettbewerbsperiode & Gewinner \\[4pt]
-2006/04 & Jens Mandavid & 121 \\
-2006/10 & Ralf Heckmann & 61 \\
-2008/04 & --- \\
-\ldots & Termin einer weiteren Verlosung offen
-%2008/10 & \\
-\end{tabular}
-\end{center}
-\end{list}
-
-\newpage
-
-
-%<--------------------------
-
-\begin{erratalist}
-
-\CHAPTER{Allgemein}
-
-\iffalse
-\seriouserroronpage{general}{}{FMi}{2004/06/12}{}
-
- To help you in assessing this errata document we have placed
- exclamation marks in front of each entry that we consider essential
- for correctly understanding the book contents.
- \fi
-
-\erroronpage{}{}{RHe}{2006/06/10}{}
- Einzelne Teile mehrgliedriger Abkürzungen werden im deutschsprachigen
- Satz normalerweise durch einen kleinen Zwischenraum (Spatium) getrennt; nur in
- englischsprachigen Texten wird zwischen den Abkürzungsteilen kein
- Zwischenraum gesetzt.
- Beispiele: z.\,B., u.\,a.\ anstatt z.B., u.a.
-
- Dies wird im Buch \emph{vermutlich} nicht korrigiert werden.
-
-
-\CHAPTER{Titelei}
-
-
-\erroronpage{iii}{bottom}{MHo}{2005/10/10}{2}
-LB2 mentions the fabled city of ``San Franciso'' which of course
-should be ``Francis\u{c}o''.
-
-\CHAPTER{Kapitel 1}
-
-\erroronpage{3}{Abs.4, Z.4}{JMa}{2005/12/26}{2}
- Ersetze: (NFSS) \> (\textsf{NFSS})
-
-\erroronpage{15}{Abs.5, Z.2}{ESt}{2006/03/11}{2}
- \texttt{info/examples/lb2} wird nicht gefunden. Kein wirklicher Fehler im
- Buch, sondern ein Versehen auf CTAN.
-
-
-\CHAPTER{Kapitel 2}
-
-\erroronpage{24}{Abs.1, Z.1}{MLi}{2013/07/12}{}
- Das Kommando lautet \verb=\AskOption= (ohne ``s'')
-
-\erroronpage{26}{Abs.-3, Z.4}{JMa}{2006/01/03}{2}
- Zur schließenden Klammer in Zeile 5 gibt es keine öffnende; es sollte wohl
-heißen: (zum Beispiel \ldots{}
-
-\erroronpage{29}{Abs. nach 2-2-3, Z.7}{JMa}{2006/01/03}{2}
- Es muss ``mit unterschiedliche\u{n} Definitionen'' heißen.
-
-\erroronpage{31}{Abs.3, Z.3}{FMi}{2006/02/28}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{33}{Abs.2, Z.-2}{FMi}{2006/02/28}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{37}{Abs.1, Z.1}{JMa}{2006/01/03}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{39}{Abs.3, Z.4 und Z.7}{JMa}{2006/01/03}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{42}{Absatz \textit{rechts}, Z.2}{JMa}{2006/01/03}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{56}{Abs.3, Z.3}{JMa}{2006/01/03}{2}
-Hier fehlt ein Buchstabe: ``Das Beispiel zeigt, das\u{s} es
-wahrscheinlich''.
-
-\erroronpage{59}{2.3.6 Abs.\ 4, Z.\ 1}{RHe}{2006/06/10}{2}
- Füge Komma ein: "`Um das \textsf{minitoc}-System zu initialisieren,
-muss ein \dots{}"'
-
-\erroronpage{60}{Tab.2.3, rechte Spalte, Z.1}{JMa}{2006/01/03}{2}
-Hier fehlt zu einer schließenden Klammer die öffnende.
-
-\erroronpage{61}{Abs.3, Z.-1}{JMa}{2006/01/03}{2}
-\LaTeX-Trennfehler: Kapitel-eintr"age statt Kapite-leintr"age.
-
-\erroronpage{64}{Abs.3, Z.-2}{JMa}{2006/01/03}{2}
-\LaTeX-Trennfehler: Abschnitts-eintrag statt Abschnitt-seintrag.
-
-\erroronpage{65}{Abs.1, Z.1-2}{JMa}{2006/01/03}{2}
-Es muss ``Ein solcher Wechsel'' statt ``Eine solcher Wechsel'' heißen.
-
-\erroronpage{65}{Abs.-2, Z.1-2}{JMa}{2006/01/03}{2}
-\LaTeX-Trennfehler: Verzeichnis-eintr"age statt Verzeichni-seintr"age.
-
-\erroronpage{70}{Abs.-1, Z.1-2}{JMa}{2006/01/03}{2}
-Hier fehlt ein Komma am Ende der ersten Zeile und ein Punkt am Ende des
-ersten Satzes.
-
-\erroronpage{73}{Abs.2, Z.4}{JMa}{2006/01/03}{2}
-Im Deutschen steht bei einer Aufzählung kein Komma vor ``oder''.
-
-\erroronpage{74}{Abs.2, Z.12}{JMa}{2006/01/03}{2}
-Hier fehlt ein Komma vor ``wenn sie durch''.
-
-\erroronpage{75}{Abs.3, Z.1}{JMa}{2006/01/03}{2}
-Es fehlen zwei Buchstaben: ``ohne daf"ur einen eigen\u{en} Abstand
-einzuf"ugen''.
-
-
-\CHAPTER{Kapitel 3}
-
-\erroronpage{94}{Abs.-3, Z.-1}{JMa}{2006/01/06}{2}
-Lösche s aus Grau\u{s}wertproblem
-
-
-\erroronpage{101}{Abs.3, Z.3}{JMa}{2006/01/14}{2}
-Kein Komma vor und bei einer Aufzählung.
-
-\erroronpage{109}{Abs.\ 2, Z.\ 5}{RHe}{2006/06/10}{2}
- Streiche Kommata: "`Möglich\_ und absolut nicht unwahrscheinlich\_ ist
-beispielsweise, \dots{}"'
-
-\erroronpage{114}{para 3}{FMi/CBe}{2005/09/02}{2}
-Ersetze Absatz durch: "`Da es nicht empfehlenswert ist, die Einstellung von
-|\baselineskip|
-direkt zu ändern, verfügt \LaTeX{} über den Befehl |\lineskip|\,, mit
-dem sich |\baselineskip| global für alle Größen ändern lässt. Nach
-einer Anweisung wie etwa \verb!\linespread{1.5}\selectfont! tritt der neue
-Wert sofort in Kraft. [Fußnote: Die veraltete \LaTeX~2.09 Lösung
- \verb=\renewcommand\baselinestretch=\texttt{\textbraceleft
- 1.5\textbraceright} benötigt dagegen einen nachfolgenden
- Schriftgrößenwechsel (wie |\small| oder |\Large|), damit der neue
- Wert in Kraft tritt.]
-
-
-
-\erroronpage{117}{3.2.1 Abs.\ 2, Z.\ 7}{RHe}{2006/06/10}{2}
- Trennung der Hauptsätze: "`\dots{} der Zähler \texttt{footnote} wird
-weiter hochgesetzt, und die Darstellung erfolgt \dots{}"'
-
-\erroronpage{119}{Abs.\ 2, Z.\ 3}{RHe}{2006/06/10}{2}
- Da die Beispiele unmittelbar folgen: "`\dots{} schematisch
-dargestellt \u{und bedeuten}:"'
-
-%%Ebenfalls als Vorschlag zur Neuformulierung -- weil es um zwei
-%%unterschiedliche Aspekte geht, sollte durch Punkt oder Semikolon
-%%getrennt werden:
-%
-% -maybe differently
-\erroronpage{121}{3.2.3 Abs.\ 2, Z.\ 3}{RHe}{2006/06/10}{2}
- "`\u{Es wird ausreichend} Abstand zwischen
-Fußnoten und Text gelassen
-und die Fußnoten werden in einem kleineren Schriftgrad
-gesetzt."'
-
-
-\erroronpage{123}{2. Abs, Z.2}{JMa}{2006/01/14}{2}
-\ldots \u{auf denen} die Auswirkung\u{en} von \textsf{perpage} deutlich zu sehen sind.
-
-\erroronpage{143}{3. Abs, Z.1}{JMa}{2006/01/14}{2}
-Am Ende der Zeile fehlt ein Komma.
-
-\erroronpage{144}{1. Abs, Z.2}{JMa}{2006/01/14}{2}
-Es muss \u{kein} statt keinen hei\ss{}en.
-
-\erroronpage{147}{Bsp.3-3-19}{JMa}{2006/01/14}{2}
-Der \LaTeX{}-Begleiter sollte stets mit Bindestrich geschrieben werden.
-
-\erroronpage{149}{Abs.\ 1, Z.\ 1}{RHe}{2006/06/10}{2}
- Streiche Anführungszeichen bei "`theoremähnliche"'.
-
-
-\erroronpage{149}{Abs.\ 1, Z.\ 3}{RHe/FMi}{2006/06/10}{2}
-Ersetze: "`Bei vielen dieser Argumente wird der unten aufgeführte, voreingestellte
-Wert verwendet, wenn ein leeres Argument angegeben wird.
-\>
-"`Bei vielen dieser Argumente erhält man den unten aufgeführten voreingestellten
-Wert, wenn ein leeres Argument angegeben wird."'
-
-
-
-
-\erroronpage{149}{Argument \textit{kopf-nach-abstand}, Z.\
-2}{RHe}{2006/06/10}{2}
- Streiche Anführungszeichen bei "`Interpunktion"'.
-
-\erroronpage{155}{Bsp. 3-3-25}{RHe/FMi}{2006/06/10}{2}
- Benutze babel Paket und ersetze englische Anführungszeichen durch deutsche.
-
-\erroronpage{158}{Bsp.3-3-28}{FMi/JBez}{2005/09/02}{}
- The vertical space above ``Return values'' is too small.
-
- Das ist ein ziemlich versteckter \LaTeX-Fehler, mit dem man wohl
- leben muss.
-
-\erroronpage{159}{Abs.\ -1, Z.\ 1}{RHe}{2006/06/10}{2}
- "`\dots{} unverändert, also "`wie über die Tastatur eingegeben"'\u{,}
-darstellen."'
-
-\erroronpage{160}{Abs.\ 2, Z.\ 2}{RHe}{2006/06/10}{2}
- Anstelle "`extensiv"': "`\dots{} in der Vergangenheit \emph{intensiv}
-genutzt wurden, \dots{}"'
-
-\erroronpage{163}{Z.-3}{JMa}{2006/01/14}{2}
-Ersetze: "`fontenc"' \> "`\textsf{fontenc}"'
-
-\erroronpage{174}{3. Abs, Z.-2}{JMa}{2006/01/14}{2}
-Ersetze: "`diesen"' \> "`diesem"'
-
-\erroronpage{175}{Z. -4}{JMa}{2006/01/14}{2}
-Streiche einmal das Wort "`sich"'.
-
-\erroronpage{182}{Abs -1, Z.3}{JMa}{2006/01/14}{2}
-Es geht um eine Untermenge \u{von} \ldots
-
-\erroronpage{184}{Z.3}{JMa}{2006/01/14}{2}
-Streiche einmal das Wort "`Beispiel"'.
-
-\erroronpage{192}{3. Abs, Z.3}{JMa}{2006/01/14}{2}
-Es soll wohl "`von dieser \u{durch} das Resultat von \ldots"' hei\ss{}en.
-
-\erroronpage{195}{4. Abs, Z.5}{JMa}{2006/01/14}{2}
-Ersetze: "`ausgeben"' \> "`aus\u{ge}geben"'
-
-\erroronpage{197}{2. Abs, Z.1}{JMa}{2006/01/14}{2}
-Streiche das zweite t aus setz\u{t}en.
-
-
-
-
-\CHAPTER{Kapitel 4}
-
-% - but also a national one, so could stay
-%
-% \erroronpage{204}{Abs.\ 2, Z.\ -2}{RHe}{2006/06/15}{}
-% Streiche "`DIN"' in "`DIN A4"', da A4 nationaler (DIN 476),
-% europ\"{a}ischer (EN 20 216) und internationaler (ISO 216) Standard ist.
-
-\erroronpage{205}{Tab.\ 4.2}{YiL}{2012/05/07}{}
-
- Die in der Tabelle aufgelisteten Werte sind nur ann\"aherend korrekt
- -- einige Werte h\"angen von der gew\"ahlten Papier-Option (etwa |a4paper|) ab.
-
-
-
-\erroronpage{205}{4.2, Abs.\ 1, Z.\ 5}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} nicht v\"{o}llig unm\"{o}glich ist\u, sie
-\dots{} zu \"{a}ndern, \dots{}"'.
-
-\erroronpage{208}{Z. 1}{JMa}{2006/01/27}{2}
-Fehlendes Komma: "`zwei Pakete\u, mit deren"'
-
-\erroronpage{210}{Abs.\ 5, Z.\ 5}{RHe}{2006/06/15}{2}
- Streiche Komma vor der Klammer: "`\dots{} von Listen Verwendung
-finden\_ (\dots{})."'
-
-\erroronpage{210}{Abs.6, Z.-1}{JMa}{2006/01/27}{2}
-Fehlendes Komma: "`abliest), kann man"'
-
-\erroronpage{213}{Abs.\ 3, Z.\ -1}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} kann es angebracht sein, ihn
-einzubeziehen."'
-
-\erroronpage{213}{Abs.\ 2, Z.\-1}{FMi}{2006/09/25}{2}
- Ersetze "`muss die ein oder andere Einstellung"' \>
- "` müssen die Einstellungen"'
-
-\erroronpage{215}{Z.1}{ChB}{2006/06/29}{2}
- Es sollte wohl "`die ein\u{e} oder andere Einstellung"' hei"sen.
-
-\erroronpage{218}{Abs.\ 1, Z.\ 6}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} ist es jedoch besser,
-\texttt{ignorehead} \dots{} zu verwenden."'
-
-% Über das nächste Infinitivproblem kann man sich durchaus streiten:
-\erroronpage{218}{Abs.\ 2, Z.\ -2}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} liegt es beim Anwender,
-sicherzustellen, dass \dots{}"'
-
-\erroronpage{218}{Abs.\ -1, Z.\ -3}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`Da diese Option Fonts skaliert, anstatt
-Originalfonts \dots{} einzusetzen, \dots{}"'
-
-\erroronpage{219}{Abs.\ -1, Z.\ -4ff}{RHe}{2006/06/15}{2}
- F\"{u}ge "`werden"' ein und streiche Komma vor dem letzten Abschnitt
-der Aufz\"{a}hlung: "`Zun\"{a}chst wird das Paket geladen, alle
-R\"{a}nder \u{werden} auf einen Zoll gesetzt\_ und die Kolumnentitel \dots{}
-festgelegt; \dots{}"'
-
-\erroronpage{220}{Abs.\ 1, Z.\ 3}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma zwischen den Haupts\"{a}tzen ein: "`\dots{} des
-Paketes wieder her, und bei \verb"pass" wird das Paket deaktiviert."'
-
-\erroronpage{221}{Aufz. cam, Z.\ 1}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} welche die Ma{\ss}e der Nettoseite
-anzeigen, ohne sie zu ber\"{u}hren (\dots{})."'
-
-\erroronpage{221}{para 4, l.4}{FMi}{2006/09/09}{2}
- Option \texttt{b3} ist zweifach gelistet.
-
-\erroronpage{221}{Abs.\ -2, Z.\ 1}{RHe}{2006/06/15}{2}
- Entferne:
- "`Die Beschreibungen \dots{} sollten deutlich machen, dass \u{das}
-\textsf{crop} erst \dots{} geladen werden sollte."'
-
-\erroronpage{221}{Abs.\ -1, Z.\ 3}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} normalerweise ist es n\"{u}tzlich, ihn
-beizubehalten."'
-
-\erroronpage{222}{Abs.\ 1, Z.\ 3}{RHe}{2006/06/15}{2}
- F\"{u}ge Komma ein: "`\dots{} versucht das Paket, den Druckertreiber
-\dots{} zu bestimmen."'
-
-\erroronpage{223}{4.3, Abs.\ 1, Z.\ 2}{RHe}{2006/06/17}{2}
- Füge Komma ein: "`\dots{} sammelt genug Material, um gut eine Seite
-\dots{}"'
-
-\erroronpage{224}{Abs.\ -1, Z.\ 2}{RHe}{2006/06/17}{2}
- Füge Komma ein: "`\dots{} entspricht dem Inhalt von \verb"\thepage",
-wie er auf der \dots{}"'
-
-\erroronpage{225}{Abs.\ 1, Z.\ 1}{RHe}{2006/06/17}{2}
- Füge Komma ein: "`\dots{} mithilfe von \verb"\AtEndDocument", um
-sicherzugehen, dass \dots{}"'
-
-\erroronpage{229}{Abs.\ 2, Z.\ 8,10,-1}{RHe}{2006/06/17}{2}
- Füge Leerstellen nach der Ellipse ein: "`\dots{} geht weiter"'
-
-\erroronpage{229}{Bsp.\ 4-3-3}{FMi}{2006/06/17}{2}
- Füge Leerstelle nach der Ellipse ein: \verb=\dots geht=
- \> \verb=\dots{} geht=
-
-
-\erroronpage{233}{Abs.\ 2, Z.\ 5}{RHe}{2006/06/17}{2}
- Füge Komma ein: "`\dots{} um Längenparameter, sondern um Befehle
-\dots{}"'
-
-\erroronpage{234}{Abs.\ 1, Z.\ 7}{RHe}{2006/06/17}{2}
- Ersetze Semikolon durch Komma und füge Wort ein: "Der Seitentyp wird mit `\dots{}
-ausgewählt\u, der Bereich \u{dagegen} mit \dots{}"'
-
-
-
-\CHAPTER{Kapitel 5}
-
-
-\erroronpage{247}{Abs.\ 3, Z.\ 2}{RHe}{2006/06/17}{2}
- Füge Komma ein: "`\dots{} dass sie fähig sein müssen, innerhalb des
-Textes \dots{}"'
-
-\erroronpage{249}{Abs.3 in 5.1.1}{JMa}{2006/01/27}{2}
-Dieser Satz steht schon am Ende des ersten Absatzes dieses
-Abschnitts.
-
-\erroronpage{251}{Abs.\ -1}{FMi/CBe}{2005/09/02}{2}
- Ersetze Absatz: "`Dezimalwert, mit dem die voreingestellte Minimalhöhe von Tabellenzellen
- multipliziert wird. Ein Wert von 1.5 würde z.B. normalgroße
- Zeilen um 50\% weiter voneinander entfernen. Er wird mit
- dem Befehl \verb=\renewcommand= eingestellt (Standardwert \texttt{1.0})."'
-
-% -check
-\erroronpage{252}{Tabelle 5.2}{RHe}{2006/06/17}{2}
- Ersetze alle amerikanischen Auslassungszeichen \{..\} durch deutsche
-\{\dots{}\}.
-
-\erroronpage{253}{Z. -2}{JMa}{2006/01/27}{2}
-Kein Komma vor "`erzeugt wurden"'
-
-\erroronpage{267}{Abs.\ 2, Z.\ 2}{RHe}{2006/06/20}{2}
- "`Letztere"' ist klein zu schreiben
-
-\erroronpage{267}{Abs.\ 1, Z.\ 1}{RHe}{2006/06/20}{2}
- Füge Komma ein: "`\dots{} üblicher, Farben \dots{} einzusetzen"'
-
-\erroronpage{269}{Abs.5, Z.1}{JMa}{2006/01/27}{2}
-\LaTeX-Trennfehler: Standar-dumgebung. \> Standard-umgebung
-
-\erroronpage{277}{Abs.\ 1, Z.\ 1}{RHe}{2006/06/20}{2}
- Ersetze Anfang durch: "`Eine der Schwierigkeiten, \LaTeX{}-Tabellen mit außergewöhnlich
-großen Einträgen zu setzen, ist eine gute Raumverteilung um diese Einträge herum zu erreichen,
- \dots"'
-
-\erroronpage{277}{Abs.\ -2, Z.\ 2}{RHe}{2006/06/20}{2}
- Füge Komma ein: "`\dots{} optionales Argument, ähnlich dem von
-\verb"\\"\u, erweitert."'
-
-\erroronpage{277}{Abs.\ -1, Z.\ 1}{RHe}{2006/06/20}{2}
- Ersetze Anfang durch: "`Die vertikalen Linien in einer \texttt{tabular}-Umgebung
- werden aus einer Reihe von Linienelementen gebildet, jeweils eines pro
- Tabellenzelle."'
-
-\erroronpage{278}{editorial change}{FMi}{2006/06/20}{2}
-Änderung auf Seite 277 erzeugt neuen Zeilenverlauf.
-
-
-\CHAPTER{Kapitel 6}
-
-
-\erroronpage{292}{Abs.-1, Z.2}{MSch}{2006/01/04}{2}
- Füge hinzu: "`z.B. bedeutet \u{\texttt{0.2}}, dass 20\% von Gleitobjekten
- belegt sein darf"'
-
-\erroronpage{298}{Abs.\ 1, Z.\ 2}{RHe}{2006/08/07}{2}
- Füge Komma ein: "Das \textsf{afterpage}-Paket ermöglicht
-stattdessen\u{,} \verb"\afterpage{\clearpage}" zu verwenden."'
-
-\erroronpage{301}{Z.1}{JMa}{2006/02/04}{2}
-Fehlendes Komma: "`Hilfsdatei, in der"'
-
-\erroronpage{301}{Abs.-2,Z.3}{JMa}{2006/02/04}{2}
-Falsche Anf"uhrungszeichen bei "`eingerahmt"'
-
-\erroronpage{302}{exa 6-3-1}{FMi/CBe}{2005/09/02}{}
-The Euler constant must be typeset in roman type according
-to the ISO rules; $e$ is the charge of the electron.
-
-\erroronpage{304}{Z.2}{JMa}{2006/02/04}{2}
-Es muss "`in den Abschnitte\u{n} 6.2.1 bzw. 6.2.2"' hei\ss{}en.
-
-\erroronpage{304}{Z.-5}{JMa}{2006/02/04}{2}
-Es muss "`{}"uber ein zus"atzliche\u{s} obligatorisches Argument"'
-hei\ss{}en.
-
-\erroronpage{306}{Abs.\ -2, Z.\ 2}{RHe}{2006/08/07}{2}
- Füge Komma ein: "\dots{} manchmal günstiger\u{,} nur die Legende zu
-drehen."'
-
-\erroronpage{315}{Abs.-3,Z.-3}{JMa}{2006/02/04}{2}
-Streiche den letzten Buchstaben von "`Bed"urfnisse\u{n}"'.
-
-\erroronpage{315}{Abs.\ -2, Z.\ 2}{RHe}{2006/08/07}{2}
- Füge Komma ein: "\dots{} die es ermöglichen\u{,} Gleitobjekte \dots{}
-zu untergliedern."'
-
-\erroronpage{317}{6.5.1, Abs.\ 1, Z.\ 1}{RHe}{2006/08/07}{2}
- Füge Komma ein: "\dots{} das Paket \textsf{caption}\u{,} um Legenden
-\dots{} anzupassen."'
-
-\erroronpage{318}{Bsp.6-5-2, Abb.2}{JMa}{2006/02/04}{2}
-Fehlendes Komma: "`Eine Legende, die mehrere"'
-
-\erroronpage{319}{\texttt{font}}{RHe}{2006/06/11}{2}
- "`Diese Option legt die Fontcharakteristika \dots{} fest, sofern sie
-nicht \dots{} überschrieben \u{werden}."'
-
-\erroronpage{319}{Bsp.6-5-3, Tab.1}{JMa}{2006/02/04}{2}
-Fehlendes Komma: "`Eine Legende, die mehrere"'
-
-\erroronpage{321}{Option \texttt{position}}{FMi/JS}{2005/09/14}{2}
- Beschreibe, dass der Schlüssel \texttt{bottom} die Voreinstellung ist.
-
-\erroronpage{322}{Abs.-1, Z.2}{JMa}{2006/02/04}{2}
-Streiche ein "`es"'.
-
-\erroronpage{327}{Abs.-1, Z.3 und Z.5}{JMa}{2006/02/04}{2}
-Ersetze: \textsl{typ} \> \textsl{klasse}
-
-
-
-\CHAPTER{Kapitel 7}
-
-\erroronpage{337}{Abs.\ 2, Z.\ 2}{RHe}{2006/06/07}{2}
- Füge Komma ein: "`\dots{} Erscheinung, nachdem \dots {}"'
-
-\erroronpage{338}{Abs.\ 1, Z.\ 5}{RHe}{2006/06/07}{2}
- Füge Komma ein: "`(\dots{} sehr ähnlich, soweit es \dots {})"'
-
-\erroronpage{340}{Fußnote 2}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`verwandelt, ist dabei"'
-
-\erroronpage{344}{Abs.3, Z.4}{JMa}{2006/02/27}{2}
-Schließende Klammer nach "`Abbildung 7.3"' fehlt.
-
-\erroronpage{348}{Abs.-1, Z.3-4}{JMa}{2006/02/27}{2}
-Trennfehler: Es muss Pa-ketnamen statt Pak-etnamen hei\ss{}en.
-
-\erroronpage{349}{}{FMi}{2006/02/27}{2}
-Änderung auf Seite 348 ändert Seitenumbruch.
-
-\erroronpage{352}{Abs.-1, Z.1}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`einnimmt, ist der"'
-
-% - no, would break the example spacing
-%\erroronpage{356}{Bsp.7-3-7}{JMa}{2006/02/27}{}
-%Ersetze: NFSS \> \textsf{NFSS}
-%
-
-\erroronpage{358}{Abs.5, Z.6+7}{JS}{2006/11/08}{2}
- Ersetze:
- "`Die \u{Computer Modern Typewriter und} Computer Modern Sans Fonts
- verfügen nicht über \u{breite} sondern nur über breitfette"'
- \>
- "`Die Computer Modern Sans Fonts
- verfügen nicht über \u{fette} sondern nur über breitfette"'
-
-\erroronpage{361}{Tab 7.4}{AFV}{2008/08/08}{s}
-Die Tabelle zeigt |\mathtt| als Sans Serif Typewriter Font. Dies ist
-normalerweise nicht der Fall -- fast jede \LaTeX{} Installation verwendet
-Computer Modern Typewriter.
-
-\erroronpage{362}{Abs.-1, Z.4}{JMa}{2006/02/27}{2}
-Streiche das mittlere s in Symbol\u{s}fonts.
-
-\erroronpage{364}{Abs.-2, Z.-1}{JMa}{2006/02/27}{2}
-Ersetze: hinzu-f"ugt \> hinzu-\u{ge}f"ugt
-
-\erroronpage{367}{Ab.-2, Z.-1}{MSch}{2006/01/06}{2}
- Der Abstand vor dem Punkt am Satzende ("`T1-Kodierung ."') ist zu
- entfernen.
-
-\erroronpage{369}{Abs.-3, Z.-3}{PEb}{2006/05/12}{2}
-Ersetze "`Oktette (von Zahlen)"' \> "`Oktette (acht Bits)"'
-
-\erroronpage{371}{Abs. \texttt{cp437de}}{JMa}{2006/02/27}{2}
-Falsche Anführungszeichen beim \ss
-
-\erroronpage{371}{Abs \texttt{utf8}}{JMa}{2006/02/27}{2}
-Das Leerzeichen vor dem Punkt ist zu entfernen.
-
-\erroronpage{394}{letzte Z.}{MSch}{2006/01/06}{2}
- Der Abstand vor der schlie\ss enden Klammer "`(in Abschnitt 7.5.4\_)"'
- ist zu entfernen.
-
-\erroronpage{399}{Abs.-3, Z.2+3}{FMi}{2006/06/14}{2}
- Füge Bindestrich ein: "`AMS-Font"'
-
-\erroronpage{401}{Abs.-2, Z.4}{FMi}{2006/06/14}{2}
- Füge Bindestrich ein: "`AMS-Mathematikfont"'
-
-\erroronpage{404}{Abs.-1, Z.1}{JMa}{2006/02/27}{2}
-Streiche das n aus Name\u{n}.
-
-\erroronpage{406}{Abs.3, Z.-3}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`werden, normalerweise ohnehin"'
-
-\erroronpage{407}{Bsp. 7-7-21, 7-7-22}{TNdz}{2006/01/20}{2}
- Fehlendes Komma: "`\ldots ist ein Blindtext, an dem sich
- verschiedene \ldots"´
-
-\erroronpage{416}{Kapitel 7.8.6, Z.8}{RSi}{2005/12/07}{2}
- Leerzeichen nach dem kleinen Omega (|\textscomega|) fehlt.
-
-\erroronpage{420}{Abs.3, Z.-2}{JMa}{2006/02/27}{2}
-Ersetze: L"ander \> L"ander\u{n}
-
-\erroronpage{420}{Abs.4, Z.-1}{JMa}{2006/02/27}{2}
-Streiche eines der beiden "`auf"'.
-
-\erroronpage{422}{Abs.3, Z.2}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`zur Verf"ugung, um auf die"'
-
-\erroronpage{423}{Abs.1, Z.-2}{JMa}{2006/02/27}{2}
-Ersetze: zum \> zu
-
-\erroronpage{425}{Fu\ss note}{hv}{2008/10/30}{s}
-Der Befehl hei\ss t |\pscharpath| [das s fehlt] und |pst-char| existiert zwar
-noch, l\"adt aber gleich |pst-text|, dass die Funktionen von |pst-char|
-integriert hat.
-
-\erroronpage{428}{Tabelle 7.27, Z.~1}{MSch}{2005/12/31}{2}
- Ersetze: \dq`Cork\dq'-Kodierung durch "`Cork"'-Kodierung
-
-\erroronpage{428}{Abs1., Z.4-5}{JMa}{2006/02/27}{2}
-Trennfehler: Es muss Pro-zent statt Proz-ent hei\ss{}en.
-
-
-\erroronpage{435}{Abs.-2, Z.-1}{JMa}{2006/02/27}{2}
-Fehlendes Komma vor "`werden"'
-
-\erroronpage{445}{Abs.-3, Z.1}{JMa}{2006/02/27}{2}
-Streiche das s aus Namen\u{s}
-
-\erroronpage{445}{Abs.-3, Z.2}{RHe}{2006/06/11}{2}
- Füge Bindestrich ein: "`AMS-Font"'
-
-\erroronpage{454}{Abs.4, Z.-2}{JMa}{2006/02/27}{2}
-Ersetze: dass \> das
-
-\erroronpage{454}{Abs.5, Z.-3}{JMa}{2006/02/27}{2}
-Ersetze: dier \> die
-
-\erroronpage{456}{Abs.2, Z.2}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`Befehle, die"'
-
-\erroronpage{458}{Abs.2, Z.2}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`Zeichen, die in"'
-
-\erroronpage{458}{Abs.2, Z.2}{JMa}{2006/02/27}{2}
-Fehlendes Komma: "`solchen, die in"'
-
-\erroronpage{458}{Abs.4, Z.3}{JMa}{2006/02/27}{2}
-Fehlendes Komma vor "`wurden"'
-
-\erroronpage{464}{Abs.1, Z.3-4}{JMa}{2006/02/27}{2}
-Trennfehler: Es muss Ak-zentzeichen statt Akz-entzeichen hei\ss{}en.
-
-\erroronpage{468}{Tab.7.33}{FMi}{2006/05/12}{2}
-Die "`Tabellen"uberschrift"' ist nicht im \textsf{sf}-Format.
-
-
-\CHAPTER{Kapitel 8}
-
-\erroronpage{478}{Abs.\ 2, Z.\ 2}{FMi/RHe}{2008/09/19}{2}
-Ersetze: "`gültigen US-Praxis"' \> "`vorherrschenden Praxis"'
-
-\erroronpage{494}{8.2.12 Abs.\ 1, Z.\ 5}{RHe}{2008/09/19}{2}
- Füge Kommata ein: "`Die Schwierigkeit\u{,} eine abgesetzte Formel
-korrekt zu gestalten\u{,} kann \dots{}"'
-
-\erroronpage{496}{Abs.2, Z.1/2}{JMa}{2006/03/05}{2}
-Trennfehler: Mark-up sieht deutlich besser aus als Mar-kup.
-
-\erroronpage{496}{Abs.\ 3 (nach Bsp. 8-2-28), Z.\ 2}{RHe}{2008/09/19}{2}
- Füge Komma ein: "`\dots{} allerdings \emph{nur}\u{,} wenn sie \dots{}
-verschoben wurde."'
-
-\erroronpage{503}{8.4.4 Abs.\ 1, Z.\ 3}{RHe}{2008/09/19}{2}
- Lösche Komma (Regel §~72.2 "`gleichrangige Wortgruppen oder Wörter in
-Aufzählungen (entweder -- oder)"'): "`\dots{} können entweder \dots{}
-positioniert werden\u{ } oder \dots{} rechts der Operatoren."'
-
-\erroronpage{504}{Abs.-2,Z.3}{JMa}{2006/03/05}{2}
-Kein Komma vor "`oder"' bei einer Aufz"ahlung.
-
-
-\erroronpage{507}{Abs.-2, Z.1}{JMa}{2006/03/05}{2}
-Streiche die beiden letzten Buchstaben von Paket\u{es}.
-
-\erroronpage{510}{Abs.-1, Z.1}{JMa}{2006/03/05}{2}
-Streiche einmal das Wort "`Tabelle"'.
-
-\erroronpage{512}{Z.1}{FMi}{2006/09/19}{2}
-Füge folgenden Satz an: "`Im folgenden Beispiel wird |\sqrtsign| direkt
-verwendet:"'
-
-\erroronpage{515}{Abs.-3, Z.2}{HjG}{2006/10/19}{2}
-Ersetze: "`Bei den \u{Hauptversionen} ($D'$,~$T'$~usw.{})"' \>
- "`Bei den \u{Versionen mit Strich} ($D'$,~$T'$~usw.{})"'
-
-\erroronpage{516}{Abs.-3, Z.2}{JMa}{2006/03/05}{2}
-Streiche ein "`die"'.
-
-\erroronpage{518}{8.7.5 Abs.\ 3 , Z.\ 3}{RHe}{2008/09/19}{2}
- Füge Komma ein: "`\dots{} und verhält sich somit\u{,} als wären beide
-Maße gleich null."'
-
-\erroronpage{535}{Abs. 1, Z. 5}{RHe}{2008/09/19}{2}
-Ersetze: "`\ldots{} existierenden, neu belebten Mediävalschriften."'
- \> "\ldots{} existierenden Renaissance-Antiqua-Schriften."'
-
-\erroronpage{544}{Tab. 8-10/11}{FMi}{2006/08/09}{2}
- Fehlende Symbole aus amssymb hinzugef"ugt: |\circledR|, |\yen|,
- |\checkmark| und |\maltese|.
-
-\erroronpage{544}{Tab. 8.11}{LHe}{2008/02/08}{s}
- |\dag| und |\ddag| sind |\mathord|s und nicht |\mathbin| wie in Tabelle
- 8.13 behauptet.
-
-\erroronpage{546}{Tab. 8.13}{LHe}{2008/02/08}{s}
- |\dag| und |\ddag| sind keine |\mathbin|s. Sie geh"oren deshalb nicht in
- diese Tabelle und sind auch nicht (wie behauptet) Synonyme f"ur |\dagger|
- und |\ddagger|.
-
-\erroronpage{552}{8.9.6 Abs.\ 1 , Z.\ 4}{RHe}{2008/09/19}{2}
- Füge Komma ein: "`\dots{} nicht der Symbolklasse Punctuation\u{,}
-sondern Ordinary \dots{} zugeordnet sind."'
-
-\erroronpage{554}{Tab. 8-27}{DIs/FMi}{2006/08/09}{2}
- Fehlende Symbole aus amssymb hinzugef"ugt: |\llcorner|, |\lrcorner|,
- |\ulcorner| und |\urcorner|. Tabbellennotiz und Absatz unter der Tabelle
- entsprechend ge"andert.
-
-
-\CHAPTER{Kapitel 9}
-
-\erroronpage{556}{Nummer 1, Item 1}{RHe}{2008/09/20}{2}
-Ersetze: "`Unterstützung für den Satz \ldots{}"'
- \> "`Unterstützen des Setzens in` \ldots{}"'
-
-\erroronpage{560}{2. Snippet}{MSch/FMi}{2006/01/06}{2}
- Der vertikale Abstand vor dem Codebeispiel ist im Verh"altnis zum
- darauffolgenden Abstand erheblich zu gro\ss.
-
- Und zudem die Seite eine Zeile zu lang.
-
-\erroronpage{560}{Z.\ -5}{RHe/FMi}{2006/09/21}{2}
-Ersetze: "`der Übersetzungen \u{für} Texte"' \>
- "`der Ãœbersetzungen generierter Texte"'
-
-
-\erroronpage{563}{Abs.1, Z.4}{JMa}{2006/03/14}{2}
-Die "offnende Klammer fehlt vor "`zum Beispiel"'.
-
-\erroronpage{565}{Abs.-2, Z.1}{JMa}{2006/03/14}{2}
-Streiche den letzten Buchstaben von sprachspezifische\u{n}.
-
-
-\erroronpage{567}{tab 9.3}{FMi/CBe}{2005/09/27}{}
- I am surprised that in Russian there is no word for ``Glossary''.
-
- Frank: It most certainly exits :-), but right now Babel doesn't
- know about it---so there is nothing we can do about it at the
- moment. Actually the same problem exists with Polish, although here
- I got a translation ``s\l ownik termin{\'o}w'' which will eventually
- find its way into Babel.
-
- Tja, so gehts. Auch als das deutsche Buch gesetzt wurde, waren die Begriffe
- auch noch nicht bekannt.
-
-\erroronpage{570}{Abs. -4("`Die Tilde"' , Z. 2}{RHe}{2006/09/20}{2}
-Füge Komma ein: "`\dots{} nicht für ein geschütztes Leerzeichen\u{,}
-sondern für andere \dots{}"'
-
-\erroronpage{570}{Abs. -4("`Die Tilde"' , Item 1}{RHe}{2006/09/20}{2}
-Füge Komma ein: "`\dots{} niedriger gesetzt werden\u{,} als dies
-normalerweise \dots{}"'
-
-% "`Gemäß"' wird mit dem Dativ verwendet:
-\erroronpage{571}{Abs. 2 ("`Doppelpunkt usw."' , Z. -2}{RHe}{2006/09/20}{2}
-Ersetze: "`Gemäß der \ldots{} Konventionen \ldots{}"'
- \> "`Gemäß den \ldots{} Konventionen \ldots{}"'
-
-\erroronpage{579}{Abs.3, Z.3}{JMa}{2006/03/14}{2}
-Streiche die beiden letzten Buchstaben von ein\u{en}.
-
-\erroronpage{579}{Abs.2, Z.3}{RHe}{2006/06/11}{2}
- Streiche Komma: "Wie der Befehl \verb"\nombre"\_ verfügt er \dots{}"'
-
-\erroronpage{590}{Abs.1, Z.5/6}{JMa}{2006/03/14}{2}
-Wenn "`rumakeindex"' getrennt werden muss, sieht "`rumake-index"' deutlich
-besser aus.
-
-\erroronpage{599}{Abs.2, Z.2}{JMa}{2006/03/14}{2}
-Zu der schließenden Klammer gibt es keine "offnende.
-
-
-
-\CHAPTER{Kapitel 10}
-
-\erroronpage{612}{lfd. Nr. 1, Z. 1}{RHe}{2006/10/16}{2}
-Ersetze: "`ASCII-Zeichnung"'
- \> "`ASCII-Zeichnung\u{en}"'
-
-\erroronpage{628}{Abs.-3, Z.4}{JMa}{2006/03/23}{2}
-Der Bruch $\displaystyle\frac{\pi}{2}$ ragt in die Zeile darunter.
-
-\erroronpage{633}{Tab.\ 10.1}{FMi}{2006/10/21}{2}
-Es fehlt "`vtex"' als wichtiger Treiber; andererseits sind einige der
-aufgelisteten Treiber nur von historischer Bedeutung.
-
-\erroronpage{634}{Abs. 1, Z. 1}{RHe}{2006/10/16}{2}
-Füge Komma ein: "`\dots{} reelle Werte haben)\u{,} anstatt nach
-\dots{}"'
-
-\erroronpage{637}{Abs. 1, Z. 1}{RHe}{2006/10/16}{2}
-Füge Komma ein: "`Lässt \LaTeX{} nach \dots{} suchen\u{,} anstatt nach
-\dots{}"'
-
-\erroronpage{637}{viewport}{BMo/FMi}{2007/10/20}{s}
-Füge am Anfang ein: "` Definiert den Bereich der Graphik für den \LaTeX{} Platz reservieren
- soll. Material außerhalb wird auch gedruckt (falls nicht \texttt{clip}
- verwendet wird) und überdruckt dann gegebenenalls anderes Material auf der Seite."'
-
-\erroronpage{638}{}{FMi}{2007/10/20}{s}
- Setzer-Kommentar:
-Seite mu\ss{} neu gesetzt werden, da sich der Seitenumbruch ge\"andert hat.
-
-\erroronpage{638}{Abs.3, Z.-1}{JMa}{2006/03/23}{2}
-Streiche den letzten Buchstaben von ausf"uhrliche\u{n}.
-
-\erroronpage{647}{Abs.4, Z.1}{JMa}{2006/03/23}{2}
-Streiche den letzten Buchstaben von vertikale\u{r}.
-
-\erroronpage{649}{Abs.2, Z.8}{FMi/HjG}{2006/10/22}{2}
- Ersetze: "`\u{Dieser Punkt} ist in \ldots"' \>
- "`\u{Dies} ist in \ldots"'
-
-\seriouserroronpage{651}{Beispielmatrix}{HjG}{2006/10/21}{2}
- The first column shows incorrect output: instead of x=0mm it uses some
- internal default.
-
-\erroronpage{651}{Abs. -1, Z. 1}{RHe}{2006/10/16}{2}
-Ersetze: "`Die \dots{} Funktion ähnelt dem des \textsf{rotating}-Paketes
-\dots{}"'
- \>"`Die \dots{} Funktion ähnelt der des \textsf{rotating}-Paketes
-\dots{}"'
-
-\erroronpage{652}{editorial change}{FMi}{2006/10/21}{2}
- Fix on previous page will change page break.
-
-
-\erroronpage{661}{Abs.-3, Z.3}{JMa}{2006/03/23}{2}
-Ersetze: "`verf"ugt"' \> "`verf"ugen"'
-
-\erroronpage{661}{para -2, l.1}{FMi}{2005/11/11}{2}
- Leider ist Th\`anhs Name falsch geschrieben. Die korrekte Schreibweise
- ist "`H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh"'.
-
-\erroronpage{672}{letzte Zeile}{BvdW}{2014/02/19}{}
-Ersetze ``wir'' durch ``wird''.
-
-
-\CHAPTER{Kapitel 11}
-
-\erroronpage{686}{Abs.-2, Z.-2}{JMa}{2006/03/23}{2}
-Streiche das Komma vor "`und"'.
-
-\erroronpage{691}{Abs.4, Z.2}{JMa}{2006/03/23}{2}
-Ersetze: "`eigene"' \> "`eigenen"'
-
-\erroronpage{697}{Abs. \texttt{-o} \textsl{ind}}{JMa}{2006/03/23}{2}
-Streiche die letzten Buchstaben von Verwendung\u{Index}.
-
-\erroronpage{703}{Z.2}{AFe}{2006/01/13}{2}
- Extra Buchstabe: |\mark|\texttt{\u k}|both| \>
- |\markboth|
-
-\erroronpage{704}{Abs.1, Z.1}{JMa}{2006/03/23}{2}
-Streiche den letzten Buchstaben von Teil\u{s}.
-
-
-\CHAPTER{Kapitel 12}
-
-\erroronpage{709}{Abs.3, Z.-5}{JMa}{2006/03/31}{2}
-Entferne das Komma vor l"asst.
-
-\erroronpage{711}{Abs.2, Z.3/4}{JMa}{2006/03/31}{2}
-Trennfehler: Schreibe Layout-richtlinien statt Layou-trichtlinien.
-
-\erroronpage{717}{Abs.3, Z.2}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`definieren"' ein.
-
-\erroronpage{719}{Abs.-1, Z.2}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`mit dessen Hilfe"' ein.
-
-\erroronpage{721}{Abs.-1, Z.2}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`die nicht unterst"utzt"' ein.
-
-\erroronpage{728}{Abs.2, Z.-1}{JMa}{2006/03/31}{2}
-Es hei\ss{}t \u{der} Apostroph, nicht "`das"'.
-
-\erroronpage{734}{Abs.-3, Z.-3}{JMa}{2006/03/31}{2}
-F"uge ein "offnende Klammer vor "`zum Beispiel"' ein.
-
-\erroronpage{735}{Abs.3, Z.1}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`wo im"' ein.
-
-\erroronpage{737}{Abs.-3, Z.-2}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`die normalerweise"' ein.
-
-\erroronpage{740}{Abs.-3, Z.2}{JMa}{2006/03/31}{2}
-Streiche den letzten Buchstaben von wurde\u{n}.
-
-\erroronpage{745}{Abs.-1, Z.-2}{JMa}{2006/03/31}{2}
-Ersetze: "`ein solche"' \> "`eine solche"'
-
-\erroronpage{746}{Abs.-4, Z.1}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`wo im"' ein.
-
-\erroronpage{752}{Abs.1, Z.-2}{JMa}{2006/03/31}{2}
-Zur schlie\ss{}enden Klammer gibt es keine "offnende.
-
-\erroronpage{752}{Abs.3, Z.-2}{JMa}{2006/03/31}{2}
-Streiche die letzten drei Buchstaben von "`aufauf"'.
-
-\erroronpage{755}{Abs.-1, Z.2}{JMa}{2006/03/31}{2}
-Ersetze: "`eine vollst"andigen"' \> "`einen vollst"andigen"'
-
-\erroronpage{763}{Abs.3, Z.6}{JMa}{2006/03/31}{2}
-Streiche das Komma vor "`und"'.
-
-\erroronpage{767}{Abs.-3, Z.1}{JMa}{2006/03/31}{2}
-Ersetze: "`L"adt"' \> "`l"adt"'
-
-\erroronpage{772}{Tab.12.2}{JMa}{2006/03/31}{2}
-F"uge ein Komma vor "`die eine bestimmte Wahl"' ein.
-
-\erroronpage{777}{Abs.3, Z.-1}{JMa}{2006/03/31}{2}
-Füge einen Punkt nach "`zeigt"' ein.
-
-\erroronpage{781}{Abs.1, Z.1}{JMa}{2006/03/31}{2}
-Ersetze: "`Diese"' \> "`Dieses"'
-
-
-\CHAPTER{Kapitel 13}
-
-\erroronpage{791}{Tab.13.1, \texttt{inbook}}{JMa}{2006/04/11}{2}
-Streiche einmal das Wort "'oder"'.
-
-\erroronpage{792}{Tab13.2, \texttt{crossref}}{JMa}{2006/04/11}{2}
-F"uge ein Komma vor "`auf den"' ein.
-
-\erroronpage{795/796}{mehrere Stellen}{FMi/DAl}{2005/09/12}{2}
- Der Name "`Miguel Lopez Fernandez"' sollte durch "`Miguel Parra Benavides"'
- ersetzt werden, da der bisher verwendete eigentlich Akzente besitzen würde,
- die an der Stelle im Buch noch nicht diskutiert wurden.
-
-\erroronpage{796}{Abs.-5, Z.-1}{JMa}{2006/04/11}{2}
-F"uge einen Punkt nach "`erscheinen"' ein.
-
-\erroronpage{799}{Abs.-2, Z.3}{JMa}{2006/04/11}{2}
-Streiche das Komma vor "'und"'.
-
-\erroronpage{802}{Abs.-1, Z.-2}{JMa}{2006/04/11}{2}
-Streiche das Komma vor "'und"'.
-
-\erroronpage{819}{Abs.-1, Z.2}{JMa}{2006/04/11}{2}
-Ersetze: BibTexMng \> \textsf{BibTexMng}
-
-\erroronpage{820}{Abs.2, Z.2}{JMa}{2006/04/11}{2}
-Streiche das Komma nach \texttt{size}.
-
-\erroronpage{821}{Tab.13.4, Z.-4}{JMa}{2006/04/11}{2}
-F"uge ein Leerzeichen nach "`Fachzeitschriften"' ein. Ferner ist die
-"'Tabellen"uberschrift"' nicht im \textsf{sf}-Format.
-
-\erroronpage{828}{Tab. 13.5, Z. 1-2}{MSch}{2006/01/06}{2}
- Donald Ervin Knuths Name ist falsch geschrieben. Ersetze: "`Erwin"' \>
- "`Ervin"'
-
-\erroronpage{830}{Tab.13.6}{JMa}{2006/04/11}{2}
-Ersetze: Italienische \> Italienisch
-
-\erroronpage{832}{Abs.1, Z.2}{JMa}{2006/04/11}{2}
-Ersetze: Abschnitte \> Abschnitten
-
-\erroronpage{839}{Tab.13.8, \texttt{substring}}{JMa}{2006/04/11}{2}
-F"uge ein Leerzeichen vor "`hat"' ein.
-
-\erroronpage{842}{Abs.1, Z.-2}{JMa}{2006/04/11}{2}
-Entweder fehlt hier eine "offnende Klammer -- oder die schlie\ss{}ende ist
-zu viel.
-
-
-\CHAPTER{Kapitel 14}
-
-\erroronpage{853}{Tab.14.1}{FMi}{2006/05/12}{2}
-Die "`Tabellen"uberschrift"' ist nicht im \textsf{sf}-Format.
-
-\erroronpage{858}{Abs.4, Z.1}{JMa}{2006/05/03}{2}
-F"uge ein "`zu"' zwischen "`Kommentare"' und "`entfernen"' ein.
-
-\erroronpage{865}{1. Snippet, Z. 2}{MSch}{2006/01/06}{2}
- Ersetze: |text/latex/base| \> |tex/latex/base|
-
-\erroronpage{867}{Abs.5}{FMi}{2007/11/13}{s}
- Explain that |\cmd| can't be used with conditionals, e.g., those produced
- with |\newif| .
-
-\erroronpage{865}{l.-7}{FMi/HjG}{2005/09/02}{2}
- Underline, as it is command line input.
-
-\erroronpage{871}{Abs.2, Z.2}{JMa}{2006/05/03}{2}
-Ersetze entg"ultig \> endg"ultig
-
-\erroronpage{870-872}{}{FMi}{2007/01/08}{}
- Setzer-Kommentar:
- Beispiele m"ussen neu kompiliert werden und
- Seiten m"ussen immer dann neu gedruckt werden, wenn etwas am Kapitel ge"andert
- wird --- genauer auf \emph{einer} der drei Seiten (da sich das CVS-Tag in
- den Beispielen und im "`code"' auf
- Seite 871/Mitte "andert).
-
-
-\CHAPTER{Anhang A}
-
-
-\erroronpage{880}{Abs.1, Z.6}{VVo}{2008/09/02}{s}
-Ersetze: "`so wird eine Fehlermeldung ausgegeben."'
-\> "`so wird eine Warnung ausgegeben."'
-
-
-\erroronpage{882}{Abs.1, Z.2}{FMi}{2006/05/12}{2}
-Ersetze: Abschnitte \> Abschnitten
-
-\erroronpage{888}{fig A.1, l.4}{FMi/JAn}{2005/09/09}{2}
- ``Did\^ot'' \> ``Didot'' und entferne Komma nach "`Zoll"'
-
-\erroronpage{891}{Tab.A.3, Z.1}{JMa}{2006/05/03}{2}
-F"uge ein Komma vor "`der eine feste oder"' ein.
-
-\erroronpage{899}{A.2.3 Abs.\ 2, Z.\ 5}{RHe}{2006/06/10}{2}
- Füge Komma ein: "`Diese Struts sind sehr nützlich, um die Höhe oder
-\dots{}"'
-
-\erroronpage{903}{Abs.-2, Z.1}{FMi}{2006/06/14}{2}
-Füge Wort ein: "`nach der \u{letzten} Klammer \verb=}= und\ldots"'
-
-\erroronpage{906}{Abs.1, Z.1}{JMa}{2006/05/03}{2}
-Ersetze \textsl{text} \> \textsl{test}
-
-\erroronpage{909}{Abs.2, Z.1}{JMa}{2006/05/03}{2}
-F"uge ein Komma vor "`ob"' ein.
-
-\erroronpage{918}{Abs.-1, Z.3}{JMa}{2006/05/03}{2}
-F"uge ein Komma vor "`wird"' ein.
-
-
-\erroronpage{918}{Abs.-1, Z.4}{FMi}{2006/09/23}{2}
-Ersetze: "`und alle Prozesse angehalten. "'
-\> "`und \u{die Verarbeitung} angehalten."'
-
-
-
-\CHAPTER{Anhang B}
-
-\erroronpage{925}{Abs.-2, Z.-3}{JMa}{2006/05/28}{2}
-F"uge ein Komma vor "`\textit{geben Sie}"' ein.
-
-\erroronpage{960}{Abs.-2, Z.-1}{JMa}{2006/05/28}{2}
-Der Punkt am Ende des Absatzes fehlt.
-
-\erroronpage{969}{Abs.-3, Z.2}{JMa}{2006/05/28}{2}
-Ersetze das \> dass
-
-\erroronpage{971}{Abs.1, Z.1}{JMa}{2006/05/28}{2}
-Ersetze einen \> ein
-
-\erroronpage{973}{Abs.1, Z.2}{JMa}{2006/05/28}{2}
-Ersetze Seite 973 \> dieser Seite
-
-\erroronpage{973}{Abs.5, Z.1}{JMa}{2006/05/28}{2}
-Ersetze \TeX{}war \> \TeX\ war
-
-\erroronpage{977}{Z.3}{JMa}{2006/05/28}{2}
-Entferne das Komma vor "`\textit{wurde}"'.
-
-\erroronpage{977}{Z.5}{JMa}{2006/05/28}{2}
-Entferne das Komma vor "`als"'.
-
-\erroronpage{980}{Abs.1, Z.2}{JMa}{2006/05/28}{2}
-F"uge ein Komma nach "`wird"' ein.
-
-\erroronpage{987}{Abs.-2, Z.5}{JMa}{2006/05/28}{2}
-F"uge ein Komma vor "`wobei"' ein.
-
-\erroronpage{988}{Abs.-1, Z.-3}{JMa}{2006/05/28}{2}
-F"uge ein Komma vor "`gilt"' ein.
-
-
-\CHAPTER{Anhang C}
-
-\erroronpage{998}{Abs.2, Z.5}{FMi}{2006/09/12}{2}
-Ersetze: Abbildung C.\u{2} \> Abbildung C.\u{1}
-
-\erroronpage{998}{Abs.-1, Z.4}{JMa}{2006/05/28}{2}
-Streiche das Komma vor "`ausgew"ahlt"'.
-
-\erroronpage{1001}{Bsp.1, Z.1}{SNe}{2009/05/10}{s}
-Ersetze "\texttt{wgetftp}"' \> "`\texttt{wget ftp}"'
-
-\erroronpage{1003}{Abs.-1, Z.5/6}{JMa}{2006/05/28}{2}
-Streiche eines der beiden Worte "`eingeblendet"'.
-
-\erroronpage{1004}{\textbf{esc:}}{JMa}{2006/05/28}{2}
-Ersetze Kalanien \> Katalonien
-
-\erroronpage{1005}{\textbf{fra:}}{JMa}{2006/05/28}{2}
-Ersetze Orleans \> Orl\'{e}ans
-
-
-\CHAPTER{Bibliographie}
-
-\erroronpage{1017}{[57]}{RHe}{2006/06/07}{2}
-Ersetzte Erl\"auterung durch: "`Die
-\u{englische} erste Ausgabe dieses Buches."'
-
-\erroronpage{1017/1018}{[58]}{FMi}{2009/08/01}{s}
-Eintrag sollte auf die zweite (aktuelle) Ausgabe verweisen.
-(Ab dem korrigierten Nachdruck von 2010 befindet sich [58] ganz auf seite 1018.)
-
-\erroronpage{1019}{[67], Z.-2}{JMa}{2006/05/28}{2}
-Schreibe "`Sprachengetrennt"' getrennt.
-
-\erroronpage{1019}{[71]}{RHe}{2006/06/07}{2}
- streiche "`international"; ISO ist per se international
-
-\erroronpage{1020}{[74]}{FMi}{2006/09/18}{2}
- Füge ``Lars Hellstr\"om'' als Autor hinzu. Datum ``Dezember 2004''
-
-\erroronpage{1025}{[116, Z.\ 2]}{RHe}{2006/06/07}{2}
- Vergleich mit "`(eben)so \dots{} setzen kann, wie sonst \dots{}"'
-erfordert Komma
-
-\erroronpage{1026}{[127], Z.1}{JMa}{2006/05/28}{2}
-F"uge ein Komma vor "`welche"' ein.
-
-\erroronpage{1026}{[128]}{FMi}{2005/11/07}{2}
- Der Titel lautet: ``E-\TeX: Guidelines for Future \TeX{} Extensions''.
-
-\erroronpage{1028}{[140], Z.2}{JMa}{2006/05/28}{2}
-F"uge ein Komma vor "`die auf"' ein.
-
-\erroronpage{1028}{[140], Z.-5}{JMa}{2006/05/28}{2}
-Ersetze Tinagh \> Tifinagh
-
-
-\erroronpage{1030}{[162]-[163]}{FMi/RKo}{2005/11/11}{2}
-
- Leider ist Th\`anhs Name falsch geschrieben (Akzente) . Die
- korrekte Schreibweise ist "`H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}}
- Th\`anh"'.
-
-\erroronpage{1030}{[159]-[163]}{FMi/RKo}{2005/11/11}{}
-
- "`Han"' ist der Familienname, müsste also korrekterweise unter H
- einsortiert werden (letzteres lässt sich aber nur schwer korrigieren, da
- wegen der gänderten Nummerierung dann nahezu das gesamte Buch neu gesetzt
- werden müsste).
-
-
-\CHAPTER{Index}
-
-
-\erroronpage{1033}{2. Absatz, Z.4}{JMa}{2006/01/05}{2}
-Die Abkürzung NFSS sollte \textsf{NFSS} geschrieben werden.
-
-
-\erroronpage{1040}{rechte Spalte, Zeile 8}{BvdW}{2014/02/19}{}
-\verb=\AskOption= (ohne das ``s'' am Ende, siehe Errata Seite 2 zu Kapitel 2)
-
-
-
-\iffalse Nicht wirklich, aber auch nicht schoen so ... mal sehen
-
-\erroronpage{1068}{"`Gleichheits- und Relationszeichen"'}{MSch}{2005/12/31}{}
- Die beiden Einträge zu Gleichheits- und Relationszeichen sind durch
- die Verwendung unterschiedlicher Trennzeichen falsch sortiert;
- vertausche "`negierte, mathematische Symbole"' und "`mathematische
- Symbole"'.
-\fi
-
-
-
-
-
-\CHAPTER{Biographien}
-
-\erroronpage{1129}{Abs. 2, Z.3}{SZi}{2005/11/24}{2}
- l"osche g aus Dok\u{g}umente
-
-\end{erratalist}
-
-
-\setcounter{collectmore}{3}
-
-\begin{multicols}{3}[Dank an alle die Fehler oder Auslassungen
- gemeldet haben. Gelistet sind jeweils die Personen die ein Problem
- zuerst entdeckt haben. Einige Fehler wurden im englischen Original
- gefunden, weshalb auch ein paar Namen ohne Fehlerzahl auftauchen.]
-\contributor{AFe}{Alfonso Fernandez-Vazquez}
-\contributor{BvdW}{Berend G. van der Wall}
-\contributor{CBe}{Claudio Beccari}
-\contributor{ChB}{Christof B\"ockler}
-\contributor{DAl}{Daniel Alonso i Alemany}
-\contributor{DIs}{Daniel Isaacson}
-\contributor{ESt}{Eckhard Stein}
-\contributor{FMi}{Frank Mittelbach}
-\contributor{HjG}{Hubert G\"a\ss lein}
-\contributor{JAn}{Jacques Andr\'e}
-\contributor{JBez}{Javier Bezos}
-\contributor{JMa}{Jens Mandavid}
-\contributor{JS}{Joachim Schrod}
-\contributor{LHe}{Lars Hellstr\"om}
-\contributor{MHo}{Morten H\o gholm}
-\contributor{MLi}{Martin Liebmann}
-\contributor{MSch}{Michael Schutte}
-\contributor{PEb}{Paul Ebermann}
-\contributor{RHe}{Ralf Heckmann}
-\contributor{RKo}{Reinhard Kotucha}
-\contributor{RSi}{Roman Sigg}
-\contributor{SNe}{Stefan Neuhaus}
-\contributor{SZi}{Stefan Ziesemer}
-\contributor{TNdz}{Timo Niedenzu}
-\contributor{VVo}{Vladimir Volovich}
-\contributor{YiL}{Yiannis Lazarides}
-\end{multicols}
-
-
-Sollten Sie einen weiteren Fehler entdecken, melden Sie diesen bitte an
-\begin{quote}\ttfamily
- frank.mittelbach@latex-project.org
-\end{quote}
-wenn möglich gleich in der für diese Datei benötigte Form, d.h.
-\begin{flushleft}
-|\erroronpage{|\textit{Seitennummr}|}{|\textit{Zeilenidentifikation}|}{|%
- \textit{Initialen}|}{|\textit{JJJJ/MM/DD}|}{}| \\
- \hspace*{2em}\textit{Beschreibung des Fehlers}
-\end{flushleft}
-Hier ist ein Beispiel:
-\begin{verbatim}
-\erroronpage{5}{Abs.3, Z.1}{MOs}{2005/09/01}{}
- Ersetze: "`LaTeX"' \> "`\LaTeX{}"'
-\end{verbatim}
-Die Verwendung von Babelkommandos (etwa |"`|) ist möglich, aber Umlaute
-sollten möglichst nicht als 8-bit Zeichen eingegeben werden (also besser |"a|
-oder |\"a|) um Probleme mit der Kodierung zu verhindern.
-
-\end{document}
diff --git a/macros/latex-dev/base/lb2.pdf b/macros/latex-dev/base/lb2.pdf
deleted file mode 100644
index d6e8b8771e..0000000000
--- a/macros/latex-dev/base/lb2.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/base/legal.txt b/macros/latex-dev/base/legal.txt
index a82b14877d..8e7c8f4390 100644
--- a/macros/latex-dev/base/legal.txt
+++ b/macros/latex-dev/base/legal.txt
@@ -29,7 +29,7 @@ in the file lppl.txt.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
The use of LaTeX is unrestricted.
diff --git a/macros/latex-dev/base/letter.dtx b/macros/latex-dev/base/letter.dtx
index d3d3fa4e6a..b8a8f0a257 100644
--- a/macros/latex-dev/base/letter.dtx
+++ b/macros/latex-dev/base/letter.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/letter.ins b/macros/latex-dev/base/letter.ins
index 28d77dd3b5..b71c06b95a 100644
--- a/macros/latex-dev/base/letter.ins
+++ b/macros/latex-dev/base/letter.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/letter.pdf b/macros/latex-dev/base/letter.pdf
index 72c038d77b..56bb61c9f7 100644
--- a/macros/latex-dev/base/letter.pdf
+++ b/macros/latex-dev/base/letter.pdf
Binary files differ
diff --git a/macros/latex-dev/base/lgc2.err b/macros/latex-dev/base/lgc2.err
deleted file mode 100644
index 043c56d752..0000000000
--- a/macros/latex-dev/base/lgc2.err
+++ /dev/null
@@ -1,697 +0,0 @@
-\newcommand\erratafiledate{2008-06-13}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% To produce a printed version of this errata file run this file through
-% LaTeX. It will unpack a small class file (if not already present) and
-% a configuration file with the extension .cfg. You might want to modify
-% the setting in this configuration file to print only a partial errata
-% suitable for your printed revision of this book, see details in the
-% .cfg file.
-%
-% The current version of this file can be found at:
-%
-% https://www.latex-project.org/guides/books.html
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-\begin{filecontents}{ttcterrata.cls}
-%%
-%% Copyright (C) 1997,2004,2005,2007 Frank Mittelbach
-%% This class file is licenced under LPPL latest version;
-%% see https://www.latex-project.org/lppl
-%
-%
-% It sets up a few commands used to format the errata entries for books in the
-% Addison-Wesley Series:
-%
-% Tools and Techniques for Computer Typesetting
-%
-% hence the name. However, anybody who likes to use it is free to apply it for
-% errata files of other books.
-%
-% Changes:
-%
-% v1.0a - changed name from errata.cls to ttcterrata.cls
-
-\ProvidesClass{ttcterrata}
- [2007/11/10 v1.0a Mini class for errata files; subject to change (FMi)]
-
-\LoadClass{article}
-
-\setcounter{secnumdepth}{-1}
-\addtolength\textwidth{5cm}
-\addtolength\oddsidemargin{-3cm}
-
-\addtolength\textheight{36pt}
-
-\RequirePackage{shortvrb}
-\MakeShortVerb{\|}
-
-\RequirePackage{array,longtable}
-\RequirePackage{multicol}
-
-
-\newcommand\erratagetnumber{}
-\def\erratagetnumber#1/#2/#3\erratagetnumber{#1#2#3}
-
-
-\newcommand\gobbleerrata{%
- \setbox\@tempboxa\vbox\bgroup
- \let\endgobble\egroup
- \let\hideamp\relax
- \let\\\relax\let\par\@@par}
-
-\newcommand*\hideamp{&}
-
-\let\endgobble\relax
-
-
-\newcommand\erratastartdate{}
-\newcommand\myprinting{1}
-
-
-\newcommand\doweprint[2]{%
- \ifnum \myprinting < \if!#2!1000 \else \ifx s#2 1000\else#2 \fi\fi
- \ifnum \expandafter\erratagetnumber\erratastartdate\erratagetnumber <
- \erratagetnumber#1\erratagetnumber \relax
- \@tempswatrue
- \else
- \@tempswafalse
- \fi
- \else
- \@tempswafalse
- \fi
-}
-
-
-
-\newcommand\includedentries{entries after = \erratastartdate}
-\newcommand\printedentries{between \erratastartdate\space and}
-
-\newcommand\showallerrors{%
- \renewcommand\includedentries{all errata entries}%
- \renewcommand\printedentries{up to}
- \renewcommand\doweprint[2]{\@tempswatrue}}
-
-
-\newcommand\displayrevisionfix[2]{%
- \if!#2!\textbf{#1}\else\textit{#1}\rlap{\textsuperscript{#2}}\fi}
-
-\newcommand\norevisionnumbers{%
- \renewcommand\displayrevisionfix[2]{\textbf{##1}}}
-
-\IfFileExists{\jobname.cfg}
- {
- \input{\jobname.cfg}
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* Configuration file for \jobname.err found }
- \typeout{*}
- \typeout{***************************************************}
- \AtEndDocument{
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* If you wish to generate an errata listing}
- \typeout{* containing only errors found after a certain revision}
- \typeout{* and/or only errors found after a certain date}
- \typeout{* modify the information stored in \jobname.cfg}
- \typeout{*}
- \typeout{* Current settings are:}
- \typeout{*}
- \typeout{* \@spaces printing of your book = \myprinting}
- \typeout{* \@spaces include \includedentries}
- \typeout{*}
- \typeout{***************************************************}
- }}
- {}
-
-%% \erroronpage <page> <line info> <contributor> <date> <fixed in revision>
-
-\newcommand\erroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\seriouserroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\CHAPTER[1]{\endgobble
- &\\[4pt]%
- \multicolumn{4}{l}{\framebox[10cm][l]{\textbf{\normalsize\strut#1}}} \\}
-
-\newenvironment{erratalist}
- {\begin{longtable}{r>{\raggedright}p{2cm}l>{\raggedright}p{10cm}l}}
- {\endgobble\end{longtable}}
-
-\newcommand\erratatitle[2]
- {\begin{center}\LARGE\bfseries
- Errata list for #1\\[5pt](\myprinting.\ printing)\\[10pt]
- \small Includes all entries found \printedentries\space #2\\
- (For other periods/print runs reprocess this document
- with different config settings)
- \end{center}%
- \markright{Errata for #1 (\printedentries\space #2)}%
- \thispagestyle{plain}%
- \vspace{20pt}}
-
-\pagestyle{myheadings}
-
-\AtBeginDocument{\small}
-
-\setlength\parindent{0pt}
-\setlength\parskip{2pt}
-
-\newcommand\contributor[2]{\makebox[1cm][l]{\sffamily#1} #2\par}
-
-% some special shortcuts overwriting existing commands:
-
-\let\u\underline
-\renewcommand\>{$\to$}
-
-%%% some code suggested by Thorsten Hansen to count the number of
-%%% contributions by individuals (will work only if we do not get
-%%% too many :-)
-
-\def\count@contributors#1/#2/#3\@nil{
- \@ifundefined{c@#1}{\newcounter{#1}}{}\stepcounter{#1}%
-%%% also count secondary:
-%%% \@ifundefined{c@#2}{\newcounter{#2}}{}\stepcounter{#2}%
-}
-
-\renewcommand\erroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\seriouserroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\contributor[2]{\makebox[1cm][l]{%
- \sffamily#1} #2\@ifundefined{c@#1}{}{ (\arabic{#1})}\par}
-
-\end{filecontents}
-
-
-\begin{filecontents}{\jobname.cfg}
-%
-%
-% Configuration file for the errata listing of
-%
-% The LaTeX Graphics Companion, Second Edition
-%
-%
-% \erratastartdate
-%
-% Specifies the date from which on errata entries should be listed.
-%
-% The format is YYYY/MM/DD.
-%
-% The default below ensures that all entries for a particular
-% printing are typeset.
-%
-
-\renewcommand\erratastartdate{2007/06/30}
-
-
-%
-% \myprinting
-%
-% Specifies which (revised) printing you own. For example, if you
-% have the second printing set this to 2 so that errors already
-% corrected in that printing will not appear in your errata
-% listing.
-%
-% The default below ensures that all entries relevant to the x-th
-% printing are typeset.
-%
-%
-
-\renewcommand\myprinting{2}
-
-%
-% \norevisionnumbers
-%
-% Specifies that all page numbers in the errata are shown in the same
-% format (bold face) irregardless of whether or not they are fixed
-% in some revision. The default is to print corrected errors in
-% italic and add the revision number as a superscript.
-
-%
-% \showallerrors
-%
-% With this command you tell the program that all errata entries are
-% supposed to be generated. This makes \myprinting and
-% \erratastartdate basically obsolete so this isn't turned on by
-% default.
-%
-%
-\endinput
-\end{filecontents}
-
-
-\documentclass{ttcterrata}[2005/11/10] % we want new class
-
-\usepackage[T1]{fontenc}
-\let\u\underline % shortcut for this file
-\newcommand\meta[1]{$\langle$\textit{#1\/}$\rangle$}
-
-\usepackage{textcomp}
-
-\usepackage{url}
-
-\begin{document}
-
-\erratatitle{The \LaTeX{} Graphics Companion, Second Edition}{\erratafiledate}
-
-
-\begin{verbatim}
-@book(A-W:GMRRV07,
- author = {Michel Goossens and Frank Mittelbach and Sebastian Rahtz
- and Denis Roegel and Herbert Vo{\ss}},
- title = {The {\LaTeX} Graphics Companion},
- edition = 2,
- series = {Tools and Techniques for Computer Typesetting},
- publisher = {Addison-Wesley},
- address = {Boston, Massachusetts},
- year = 2007,
- pagenums = {976},
- bibliography = {yes},
- index = {yes},
- isbn = {978-0-321-50892-8},
-)
-\end{verbatim}
-
-
-\begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}}
-\item[]
-
-This file (\texttt{\jobname.err}) can be found as part of the \LaTeX{}
-distribution and its latest version is maintained on the \LaTeX{}
-project site at \texttt{https://www.latex-project.org/help/books/\jobname.err}
-where you will also find extracts of the book.
-
-The first column in the table shows the page number of the errata
-entry. Superscript numbers in the first column refer to the printed
-revision in which this entry was corrected (\textit{s} indicates a
-correction in the sources only). The second
-column gives the precise location (negative line or paragraph numbers
-are counted from the bottom of the page). The third column shows the
-first finder of the problem.
-
-You can customize this list to only show errata related to the printing
-you own by changing the configuration in the file \texttt{\jobname.cfg}.
-
-\begin{center}
- \Large \bfseries To Err is Human --- Bug Contest
-\end{center}
-
-Any mistake found and reported is a gain for all readers of our book.
-For this reason Addison-Wesley and the authors offer a prize (for 6
-periods) to the eligible person who finds the largest
-number of bugs during that period (in case of a draw a random choice
-will be made between all those with the largest number of findings).
-A person can receive at most one prize, ever; errors found by any of
-the authors do not count.
-
-Each prize is a free choice of any single computing book found on the
-AW Professional web site \texttt{http://www.awprofessional.com} (that
-is, no boxed sets or multiple volume offers).
-
-
-As usual, the authors and publisher reserve the right to make various
-decisions such as whether a reported feature is an error for
-competitive purposes or whether similar features count as a single or
-multiple errors. ---
-Good luck!
-
-\begin{center}
-\begin{tabular}{clr}
-Contest period ends & Winner \\[4pt]
-2008/05 & Milan Vujtek & 16 suggestions\\
-2010/05 & & \\
-\ldots
-\end{tabular}
-\end{center}
-\end{list}
-
-\newpage
-
-
-%<--------------------------
-
-\newcommand\BibTeX{\textsc{Bib}\TeX}
-
-\begin{erratalist}
-
-\CHAPTER{General }
-
-\seriouserroronpage{general}{}{FMi}{2007/07/01}{}
-
- To help you in assessing this errata document we have placed
- exclamation marks in front of each entry that we consider essential
- for correctly understanding the book contents.
-
-\erroronpage{general}{}{FMi}{2007/07/01}{}
-
- Due to the printing process there may be small alignment problems
- between blue and black text on some pages. These can vary from book
- to book depending on how the paper was handled between print
- runs---such is the analog nature of printing on a press.
-
-\CHAPTER{Front matter}
-
-\erroronpage{xxix}{para 4, l.1}{FMi/hv}{2007/08/23}{2}
-Add ``In case of \textsf{PSTricks} \u{and, for example, the \textsf{beamer}
-class} the syntax \ldots''
-
-\erroronpage{xxix}{para 5, code}{FMi}{2007/08/24}{2}
-There should be a bit more space in front of the code block
-
-\CHAPTER{Chapter 1}
-
-\erroronpage{2}{para 3, l.1}{MiV}{2008/05/22}{2}
- ``First.'' \> ``First,''
-
-\CHAPTER{Chapter 2}
-
-\CHAPTER{Chapter 3}
-
-\CHAPTER{Chapter 4}
-
-\seriouserroronpage{152}{exa 4-1-15}{HjG}{2007/08/17}{2}
- Output of example is missing! Oops \ldots\ it was there honest
-
-\erroronpage{177}{para 2, l.1}{MiV}{2008/05/22}{2}
-Missing interword space: ``Flowcharts\u{ }are''
-
-\CHAPTER{Chapter 5}
-
-
-\erroronpage{221}{last line}{RSh}{2008/02/13}{2}
-``down'' should be ``up''.
-
-\erroronpage{223}{}{hv}{2008/02/22}{2}
-Changed explanation for example 5-4-1 slightly (since example changed).
-
-\erroronpage{224}{exa. 5-4-1}{hv}{2008/02/22}{2}
-Coding changed to:
-\begin{verbatim}
-\begin{pspicture}(-1,-1)(2,2)
- \psaxes{->}(0,0)(-1,-1)(2,2)
- \parabola[linewidth=1.5pt](1,2)(-0.5,-0.5)
- \parabola[origin={0.25,-0.5},
- linestyle=dashed](1,2)(-0.5,-0.5)
- \psaxes[origin={0.25,-0.5},linestyle=dashed,
- linewidth=0.2pt]{->}(0,0)(-1,-1)(2,2)
-\end{pspicture}
-\end{verbatim}
-
-\erroronpage{240}{para 4, l.8}{MiV}{2008/05/22}{2}
-Remove backslash in:
- ``keyword setting \verb/\showpoints=true/''
-
-\erroronpage{254}{Ex 5-9-1}{MiV}{2008/05/22}{}
-The blue circle shouldn't be visible behind the black circle. This is a
-problem due to the printing process used for the book---it does not show up on
-all books.
-
-\erroronpage{290}{Ex 5-13-22}{MSh}{2008/06/11}{2}
-Inside |\pscustom| the |\psbezier| macro needs four arguments in case
-there exists no current point (always for the first macro) and three
-arguments if the bezier curve connects to an existing line
-or curve (path).
-
-\CHAPTER{Chapter 6}
-
-\erroronpage{335}{para 5, l.4}{JMi}{2008/06/23}{2}
-``\ldots{} summarized in \u{Table} 5.2 \ldots" \> ``\ldots{} summarized in
-\u{Figure} 5.2 \ldots''
-
-\erroronpage{406}{margin}{hv}{2007/08/20}{2}
- Missing interword space:
- ``The\u{ }plotpoints \ldots''.
-
-\erroronpage{416}{exa 6-6-34}{hv}{2007/08/20}{2}
- The filling (crosshatch) of the example isn't quite correct.
-
-\erroronpage{458}{para 2, l.1}{HjG}{2007/08/17}{2}
- Missing interword space:
- ``The\u{ }\textsf{pst-pdf} package \dots''
-
-
-\CHAPTER{Chapter 7}
-
-\erroronpage{491}{2nd line}{yhj}{2008/01/06}{2}
-The name of author of xytree package should be ``Koaunghi Un''
-but not ``Koaungli Un''. Sorry for the mistake.
-
-\CHAPTER{Chapter 8}
-
-\erroronpage{514}{tab. 8.3}{FMi}{2008/012/21}{2}
-Slightly increase spacing after hline.
-
-\erroronpage{515}{tab. 8.4}{MiV}{2008/05/22}{2}
-There should be vertical spacing in the first line (superscript $10^{24}$
-touches top line)
-
-\seriouserroronpage{579}{para 2, l.3}{MiV}{2008/05/22}{2}
- \verb=\ln= \> \verb=\nl= (this will also change the index entry)
-
-\erroronpage{583}{para 4, l.9}{MiV}{2008/05/22}{2}
-Replace: ``of the voltage $V_C$'' \> ``of the voltage $v_C$''
-
-\CHAPTER{Chapter 9}
-
-\erroronpage{598/599}{several}{FMi}{2007/08/19}{2}
- The text and the displayed logs talk about example 7-2-6 but afterwards two
- more chapters got added (without the logs being regenerated), i.e., this
- should now be 9-2-6.
-
-\CHAPTER{Chapter 10}
-
-\seriouserroronpage{683}{exa. 10-1-22}{FMi}{2007/08/26}{2}
-The example unfortunately highlights a bug in the current texmate package: a
-linebreak (in contrast to a space) is not recognized as a move separator
-resulting in all moves getting scrambled in the output, e.g., you see
-\texttt{dxe5 Bxf3 Qxf5} put together under move 4.
-
-Fix: use \texttt{;} to separate moves on linebreaks or wait for the next
-release of the package.
-
-\CHAPTER{Chapter 11}
-
-\erroronpage{720}{6th item}{MiV}{2008/05/22}{2}
-Replace: ``documentwide'' \> ``\u{D}ocumentwide''
-
-\erroronpage{726}{para 2, l.2}{MiV}{2008/05/22}{2}
-Extra space after
-parenthesis: ``( in practice''
-
-\erroronpage{740}{para 2, l.1}{MiV}{2008/05/22}{2}
-Replace: ``given
-by \textit{start\u{ row}}'' \> ``given by \textit{start} row''
-
-\seriouserroronpage{741}{Ex 11-3-5}{MiV}{2008/05/22}{2}
-Usage of
-\verb=\cellcolor= might introduce extra space in the output (as one can see in
-the example).
-
-This can be argued as being a bug in the \texttt{colortbl} package. Given that the
-basic \verb=\color= command ignores spaces after it, \verb=\cellcolor= should
-behave similarly.
-
-\seriouserroronpage{744}{line after Ex 11-3-9}{MiV}{2008/05/22}{2}
-Replace: ``This does \u{not}, of course, affect'' \>
-``This does, of course, \u{also} affect''
-
-\erroronpage{758}{para 3, l.2}{MiV}{2008/05/22}{2}
-Add small space between values and units in frame dimension
-
-\erroronpage{760}{fig. 11.1}{MiV}{2008/05/22}{2}
-
-why differs section names (``Introduction to encoding'' vs. ``Introduction''
-etc.)?
-
-Frank: because the author of this section used a real live example where he had
-used an optional argument to |\section| to make the toc have special text for
-some reason (should be mentioned in the source though).
-
-\erroronpage{774}{2nd snytax box}{hv}{2009/05/8}{2}
-The |\transduration| command takes ``time in seconds'' as mandatory argument
-(and not ``key/vals'')
-
-\erroronpage{779}{para 3, l.1}{MiV}{2008/05/22}{2}
-``in not shown''\>
-``\u{is} not shown''
-
-\erroronpage{794}{exa 11--4-36}{hv}{2009/05/12}{2}
-Replace ``pic2e'' \> ``pic\u{t}2e'' in output, corresponding input not
-displayed in the book.
-
-
-\CHAPTER{Appendix A}
-
-
-\CHAPTER{Appendix B}
-
-\erroronpage{809}{para -1, l.-1}{HjG}{2007/08/17}{2}
- Missing interword space before opening parenthesis:
- ``\dots \texttt{faq}\u{ }(or \dots''
-
-
-Frank: actually there is nothing missing in the source. It is a deficiency of
-the fonts.
-
-\CHAPTER{Appendix C}
-
-
-\CHAPTER{Bibliography}
-
-\erroronpage{822}{entry [32]}{MiV}{2008/05/22}{2}
-Use capital C in ``Lecture Notes in computer Science''
-
-\erroronpage{823}{entry [35]}{JPFD}{2007/09/05}{2}
- The author name ``Eitan M. Gurai'' should be ``Eitan M. Gurari''.
-
-\erroronpage{824}{entry [47]}{GTa}{2010/02/10}{}
- An updated version of the manual can be downloaded from
- \url{https://www.tug.org/docs/metapost/mpman.pdf}
-
-\erroronpage{825}{entry [50]}{FMi}{2008/12/21}{2}
-Use capital C in ``Lecture Notes in computer Science''
-
-\erroronpage{826}{entry [59]}{FMi}{2008/12/21}{2}
- Add web url: \url{http://archiv.dante.de/DTK/PDF/komoedie_2002_1.pdf}
-
-\erroronpage{826}{entry [60]}{FMi}{2008/12/21}{2}
- Add web url: \url{http://archiv.dante.de/DTK/PDF/komoedie_2002_2.pdf}
-
- \erroronpage{828}{entry [60]}{FMi}{2008/12/21}{2}
- Add web url: ``Sample chapter
- at: \url{https://www.latex-project.org/help/books/}''
-
- \erroronpage{829/830}{editorial change}{FMi}{2008/12/21}{2}
- Page breaks changed due to other changes
-
-\erroronpage{833}{entry [128]}{FMi}{2008/12/21}{2}
- Url changed to: \url{obsolete/graphics/pstricks/doc/code/pst-code.pdf}
-
-
-\erroronpage{833}{entry [129]}{FMi}{2008/12/21}{2}
- Url changed to: \url{macros/generic/multido/}
-
-
-\erroronpage{833}{entry [135]}{ADo}{2008/01/02}{2}
-An ``s'' is missing in ``using'' (end of the first line of comment)
-
-
-\CHAPTER{Index}
-
- \erroronpage{856/860/866}{editorial change}{FMi}{2008/12/21}{2}
- changed index entries due to changes above
-
-\erroronpage{886}{col.2, l.-7}{GTa}{2010/02/10}{}
- image(METAPOST) should also reference example on p.145
-
- \erroronpage{891}{editorial change}{FMi}{2008/12/21}{2}
- changed index entries due to changes above
-
- \erroronpage{910/911}{editorial change}{FMi}{2008/12/21}{2}
- changed index entries due to changes above
-
- \erroronpage{925}{editorial change}{FMi}{2008/12/21}{2}
- changed index entries due to changes above
-
-\end{erratalist}
-
-
-\setcounter{collectmore}{3}
-
-\begin{multicols}{3}[Thanks to all who have found errors or
- omissions. Listed are the people who found an errata entry first.]
-\contributor{ADo}{Alain Dondelinger}
-\contributor{FMi}{Frank Mittelbach}
-\contributor{GTa}{Gr\'egoire Taviot}
-\contributor{HjG}{Hubert G\"a\ss lein}
-\contributor{JPFD}{Jean-Pierre Drucbert}
-\contributor{JMi}{John Middlekauff}
-\contributor{MSh}{Michael Sharpe}
-\contributor{MiV}{Milan Vujtek}
-\contributor{RSh}{Richard Shepard}
-\contributor{hv}{Herbert Vo\ss}
-\contributor{yhj}{You Hyun Jo}
-\end{multicols}
-
-
-Other people have sent us corrections for errors already found.
-Thanks to all of you!
-
-If you find
-further
-errors please report them to one of the authors, e.g.,
-\begin{quote}\ttfamily
- frank.mittelbach@latex-project.org
-\end{quote}
-preferably in a form usable directly in this file, i.e.,
-\begin{flushleft}
-|\erroronpage{|\textit{page-number}|}{|\textit{line-identification}|}{|%
- \textit{your-initials}|}{|\textit{date}|}{}| \\
- \hspace*{2em}\textit{description of the the erratum}
-\end{flushleft}
-Here is an example:
-\begin{verbatim}
-\erroronpage{5}{para 3, l.1}{MOs}{2007/07/01}{}
- ``LaTeX'' should be typeset ``\LaTeX''.
-\end{verbatim}
-
-\end{document}
-
-
-> > In addition, with regards to content of Section 8.1 it would be nice
-> > to use Roman ``d'' in integrands in examples 3-2-3, 3-5-83, 3-5-84,
-> > 5-12-21, 6-5-6 and 6-5-11.
diff --git a/macros/latex-dev/base/lgc2.pdf b/macros/latex-dev/base/lgc2.pdf
deleted file mode 100644
index e96d0d47a6..0000000000
--- a/macros/latex-dev/base/lgc2.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/base/lppl.pdf b/macros/latex-dev/base/lppl.pdf
deleted file mode 100644
index dd5905ebfb..0000000000
--- a/macros/latex-dev/base/lppl.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/base/lppl.tex b/macros/latex-dev/base/lppl.tex
deleted file mode 100644
index bf0da5c7bb..0000000000
--- a/macros/latex-dev/base/lppl.tex
+++ /dev/null
@@ -1,511 +0,0 @@
-%
-% Copyright 1999 2002-2011 LaTeX3 Project
-% Everyone is allowed to distribute verbatim copies of this
-% license document, but modification of it is not allowed.
-%
-%
-% If you wish to load it as part of a ``doc'' source, you have to
-% ensure that a) % is a comment character and b) that short verb
-% characters are being turned off, i.e.,
-%
-% \DeleteShortVerb{\'} % or whatever was made a shorthand
-% \MakePercentComment
-% \input{lppl}
-% \MakePercentIgnore
-% \MakeShortVerb{\'} % turn it on again if necessary
-%
-%
-% By default the license is produced with \section* as the highest
-% heading level. If this is not appropriate for the document in which
-% it is included define the commands listed below before loading this
-% document, e.g., for inclusion as a separate chapter define:
-%
-% \providecommand{\LPPLsection}{\chapter*}
-% \providecommand{\LPPLsubsection}{\section*}
-% \providecommand{\LPPLsubsubsection}{\subsection*}
-% \providecommand{\LPPLparagraph}{\subsubsection*}
-%
-%
-% To allow cross-referencing the headings \label's have been attached
-% to them, all starting with ``LPPL:''. As by default headings without
-% numbers are produced, this will only allow page references.
-% However, you can use the titleref package to produce textual
-% references or you change the definitions of \LPPLsection, and
-% friends to generated numbered headings.
-%
-%
-% We want it to be possible that this file can be processed by
-% (pdf)LaTeX on its own, or that this file can be included in another
-% LaTeX document without any modification whatsoever.
-% Hence the little test below.
-%
-%
-\makeatletter
-\ifx\@preamblecmds\@notprerr
- % In this case the preamble has already been processed so this file
- % is loaded as part of another document; just enclose everything in
- % a group
- \let\LPPLicense\bgroup
- \let\endLPPLicense\egroup
-\else
- % In this case the preamble has not been processed yet so this file
- % is processed by itself.
- \documentclass{article}
- \let\LPPLicense\document
- \let\endLPPLicense\enddocument
-\fi
-\makeatother
-
-
-\begin{LPPLicense}
- \providecommand{\LPPLsection}{\section*}
- \providecommand{\LPPLsubsection}{\subsection*}
- \providecommand{\LPPLsubsubsection}{\subsubsection*}
- \providecommand{\LPPLparagraph}{\paragraph*}
- \providecommand*{\LPPLfile}[1]{\texttt{#1}}
- \providecommand*{\LPPLdocfile}[1]{`\LPPLfile{#1.tex}'}
- \providecommand*{\LPPL}{\textsc{lppl}}
-
- \LPPLsection{The \LaTeX\ Project Public License}
- \label{LPPL:LPPL}
-
- \emph{LPPL Version 1.3c 2008-05-04}
-
- \textbf{Copyright 1999, 2002--2008 \LaTeX3 Project}
- \begin{quotation}
- Everyone is allowed to distribute verbatim copies of this
- license document, but modification of it is not allowed.
- \end{quotation}
-
- \LPPLsubsection{Preamble}
- \label{LPPL:Preamble}
-
- The \LaTeX\ Project Public License (\LPPL) is the primary license
- under which the \LaTeX\ kernel and the base \LaTeX\ packages are
- distributed.
-
- You may use this license for any work of which you hold the
- copyright and which you wish to distribute. This license may be
- particularly suitable if your work is \TeX-related (such as a
- \LaTeX\ package), but it is written in such a way that you can use
- it even if your work is unrelated to \TeX.
-
- The section `WHETHER AND HOW TO DISTRIBUTE WORKS UNDER THIS
- LICENSE', below, gives instructions, examples, and recommendations
- for authors who are considering distributing their works under this
- license.
-
- This license gives conditions under which a work may be distributed
- and modified, as well as conditions under which modified versions of
- that work may be distributed.
-
- We, the \LaTeX3 Project, believe that the conditions below give you
- the freedom to make and distribute modified versions of your work
- that conform with whatever technical specifications you wish while
- maintaining the availability, integrity, and reliability of that
- work. If you do not see how to achieve your goal while meeting
- these conditions, then read the document \LPPLdocfile{cfgguide} and
- \LPPLdocfile{modguide} in the base \LaTeX\ distribution for suggestions.
-
-
- \LPPLsubsection{Definitions}
- \label{LPPL:Definitions}
-
- In this license document the following terms are used:
-
- \begin{description}
- \item[Work] Any work being distributed under this License.
-
- \item[Derived Work] Any work that under any applicable law is
- derived from the Work.
-
- \item[Modification] Any procedure that produces a Derived Work under
- any applicable law -- for example, the production of a file
- containing an original file associated with the Work or a
- significant portion of such a file, either verbatim or with
- modifications and/or translated into another language.
-
- \item[Modify] To apply any procedure that produces a Derived Work
- under any applicable law.
-
- \item[Distribution] Making copies of the Work available from one
- person to another, in whole or in part. Distribution includes
- (but is not limited to) making any electronic components of the
- Work accessible by file transfer protocols such as \textsc{ftp} or
- \textsc{http} or by shared file systems such as Sun's Network File
- System (\textsc{nfs}).
-
- \item[Compiled Work] A version of the Work that has been processed
- into a form where it is directly usable on a computer system.
- This processing may include using installation facilities provided
- by the Work, transformations of the Work, copying of components of
- the Work, or other activities. Note that modification of any
- installation facilities provided by the Work constitutes
- modification of the Work.
-
- \item[Current Maintainer] A person or persons nominated as such
- within the Work. If there is no such explicit nomination then it
- is the `Copyright Holder' under any applicable law.
-
- \item[Base Interpreter] A program or process that is normally needed
- for running or interpreting a part or the whole of the Work.
-
- A Base Interpreter may depend on external components but these are
- not considered part of the Base Interpreter provided that each
- external component clearly identifies itself whenever it is used
- interactively. Unless explicitly specified when applying the
- license to the Work, the only applicable Base Interpreter is a
- `\LaTeX-Format' or in the case of files belonging to the
- `\LaTeX-format' a program implementing the `\TeX{} language'.
- \end{description}
-
- \LPPLsubsection{Conditions on Distribution and Modification}
- \label{LPPL:Conditions}
-
- \begin{enumerate}
- \item Activities other than distribution and/or modification of the
- Work are not covered by this license; they are outside its scope.
- In particular, the act of running the Work is not restricted and
- no requirements are made concerning any offers of support for the
- Work.
-
- \item\label{LPPL:item:distribute} You may distribute a complete, unmodified
- copy of the Work as you received it. Distribution of only part of
- the Work is considered modification of the Work, and no right to
- distribute such a Derived Work may be assumed under the terms of
- this clause.
-
- \item You may distribute a Compiled Work that has been generated
- from a complete, unmodified copy of the Work as distributed under
- Clause~\ref{LPPL:item:distribute} above, as long as that Compiled Work is
- distributed in such a way that the recipients may install the
- Compiled Work on their system exactly as it would have been
- installed if they generated a Compiled Work directly from the
- Work.
-
- \item\label{LPPL:item:currmaint} If you are the Current Maintainer of the
- Work, you may, without restriction, modify the Work, thus creating
- a Derived Work. You may also distribute the Derived Work without
- restriction, including Compiled Works generated from the Derived
- Work. Derived Works distributed in this manner by the Current
- Maintainer are considered to be updated versions of the Work.
-
- \item If you are not the Current Maintainer of the Work, you may
- modify your copy of the Work, thus creating a Derived Work based
- on the Work, and compile this Derived Work, thus creating a
- Compiled Work based on the Derived Work.
-
- \item\label{LPPL:item:conditions} If you are not the Current Maintainer
- of the
- Work, you may distribute a Derived Work provided the following
- conditions are met for every component of the Work unless that
- component clearly states in the copyright notice that it is exempt
- from that condition. Only the Current Maintainer is allowed to
- add such statements of exemption to a component of the Work.
- \begin{enumerate}
- \item If a component of this Derived Work can be a direct
- replacement for a component of the Work when that component is
- used with the Base Interpreter, then, wherever this component of
- the Work identifies itself to the user when used interactively
- with that Base Interpreter, the replacement component of this
- Derived Work clearly and unambiguously identifies itself as a
- modified version of this component to the user when used
- interactively with that Base Interpreter.
-
- \item\label{LPPL:item:changelog} Every component of the Derived Work
- contains prominent
- notices detailing the nature of the changes to that component,
- or a prominent reference to another file that is distributed as
- part of the Derived Work and that contains a complete and
- accurate log of the changes.
-
- \item No information in the Derived Work implies that any persons,
- including (but not limited to) the authors of the original
- version of the Work, provide any support, including (but not
- limited to) the reporting and handling of errors, to recipients
- of the Derived Work unless those persons have stated explicitly
- that they do provide such support for the Derived Work.
-
- \item\label{LPPL:item:unmodifiedcopy} You distribute at least one of
- the following with the Derived Work:
- \begin{enumerate}
- \item A complete, unmodified copy of the Work; if your
- distribution of a modified component is made by offering
- access to copy the modified component from a designated place,
- then offering equivalent access to copy the Work from the same
- or some similar place meets this condition, even though third
- parties are not compelled to copy the Work along with the
- modified component;
-
- \item Information that is sufficient to obtain a complete,
- unmodified copy of the Work.
- \end{enumerate}
- \end{enumerate}
- \item If you are not the Current Maintainer of the Work, you may
- distribute a Compiled Work generated from a Derived Work, as long
- as the Derived Work is distributed to all recipients of the
- Compiled Work, and as long as the conditions of
- Clause~\ref{LPPL:item:conditions}, above, are met with regard to the
- Derived Work.
-
- \item The conditions above are not intended to prohibit, and hence
- do not apply to, the modification, by any method, of any component
- so that it becomes identical to an updated version of that
- component of the Work as it is distributed by the Current
- Maintainer under Clause~\ref{LPPL:item:currmaint}, above.
-
- \item Distribution of the Work or any Derived Work in an alternative
- format, where the Work or that Derived Work (in whole or in part)
- is then produced by applying some process to that format, does not
- relax or nullify any sections of this license as they pertain to
- the results of applying that process.
-
- \item
- \begin{enumerate}
- \item A Derived Work may be distributed under a different license
- provided that license itself honors the conditions listed in
- Clause~\ref{LPPL:item:conditions} above, in regard to the Work, though it
- does not have to honor the rest of the conditions in this
- license.
-
- \item If a Derived Work is distributed under a different license,
- that Derived Work must provide sufficient documentation as part
- of itself to allow each recipient of that Derived Work to honor
- the restrictions in Clause~\ref{LPPL:item:conditions} above, concerning
- changes from the Work.
- \end{enumerate}
- \item This license places no restrictions on works that are
- unrelated to the Work, nor does this license place any
- restrictions on aggregating such works with the Work by any means.
-
- \item Nothing in this license is intended to, or may be used to,
- prevent complete compliance by all parties with all applicable
- laws.
- \end{enumerate}
-
- \LPPLsubsection{No Warranty}
- \label{LPPL:Warranty}
-
- There is no warranty for the Work. Except when otherwise stated in
- writing, the Copyright Holder provides the Work `as is', without
- warranty of any kind, either expressed or implied, including, but
- not limited to, the implied warranties of merchantability and
- fitness for a particular purpose. The entire risk as to the quality
- and performance of the Work is with you. Should the Work prove
- defective, you assume the cost of all necessary servicing, repair,
- or correction.
-
- In no event unless required by applicable law or agreed to in
- writing will The Copyright Holder, or any author named in the
- components of the Work, or any other party who may distribute and/or
- modify the Work as permitted above, be liable to you for damages,
- including any general, special, incidental or consequential damages
- arising out of any use of the Work or out of inability to use the
- Work (including, but not limited to, loss of data, data being
- rendered inaccurate, or losses sustained by anyone as a result of
- any failure of the Work to operate with any other programs), even if
- the Copyright Holder or said author or said other party has been
- advised of the possibility of such damages.
-
- \LPPLsubsection{Maintenance of The Work}
- \label{LPPL:Maintenance}
-
- The Work has the status `author-maintained' if the Copyright Holder
- explicitly and prominently states near the primary copyright notice
- in the Work that the Work can only be maintained by the Copyright
- Holder or simply that it is `author-maintained'.
-
- The Work has the status `maintained' if there is a Current
- Maintainer who has indicated in the Work that they are willing to
- receive error reports for the Work (for example, by supplying a
- valid e-mail address). It is not required for the Current Maintainer
- to acknowledge or act upon these error reports.
-
- The Work changes from status `maintained' to `unmaintained' if there
- is no Current Maintainer, or the person stated to be Current
- Maintainer of the work cannot be reached through the indicated means
- of communication for a period of six months, and there are no other
- significant signs of active maintenance.
-
- You can become the Current Maintainer of the Work by agreement with
- any existing Current Maintainer to take over this role.
-
- If the Work is unmaintained, you can become the Current Maintainer
- of the Work through the following steps:
- \begin{enumerate}
- \item Make a reasonable attempt to trace the Current Maintainer (and
- the Copyright Holder, if the two differ) through the means of an
- Internet or similar search.
- \item If this search is successful, then enquire whether the Work is
- still maintained.
- \begin{enumerate}
- \item If it is being maintained, then ask the Current Maintainer
- to update their communication data within one month.
-
- \item\label{LPPL:item:intention} If the search is unsuccessful or
- no action to resume active maintenance is taken by the Current
- Maintainer, then announce within the pertinent community your
- intention to take over maintenance. (If the Work is a \LaTeX{}
- work, this could be done, for example, by posting to
- \texttt{comp.text.tex}.)
- \end{enumerate}
- \item {}
- \begin{enumerate}
- \item If the Current Maintainer is reachable and agrees to pass
- maintenance of the Work to you, then this takes effect
- immediately upon announcement.
-
- \item\label{LPPL:item:announce} If the Current Maintainer is not
- reachable and the Copyright Holder agrees that maintenance of
- the Work be passed to you, then this takes effect immediately
- upon announcement.
- \end{enumerate}
- \item\label{LPPL:item:change} If you make an `intention
- announcement' as described in~\ref{LPPL:item:intention} above and
- after three months your intention is challenged neither by the
- Current Maintainer nor by the Copyright Holder nor by other
- people, then you may arrange for the Work to be changed so as to
- name you as the (new) Current Maintainer.
-
- \item If the previously unreachable Current Maintainer becomes
- reachable once more within three months of a change completed
- under the terms of~\ref{LPPL:item:announce}
- or~\ref{LPPL:item:change}, then that Current Maintainer must
- become or remain the Current Maintainer upon request provided they
- then update their communication data within one month.
- \end{enumerate}
- A change in the Current Maintainer does not, of itself, alter the
- fact that the Work is distributed under the \LPPL\ license.
-
- If you become the Current Maintainer of the Work, you should
- immediately provide, within the Work, a prominent and unambiguous
- statement of your status as Current Maintainer. You should also
- announce your new status to the same pertinent community as
- in~\ref{LPPL:item:intention} above.
-
- \LPPLsubsection{Whether and How to Distribute Works under This License}
- \label{LPPL:Distribute}
-
- This section contains important instructions, examples, and
- recommendations for authors who are considering distributing their
- works under this license. These authors are addressed as `you' in
- this section.
-
- \LPPLsubsubsection{Choosing This License or Another License}
- \label{LPPL:Choosing}
-
- If for any part of your work you want or need to use
- \emph{distribution} conditions that differ significantly from those
- in this license, then do not refer to this license anywhere in your
- work but, instead, distribute your work under a different license.
- You may use the text of this license as a model for your own
- license, but your license should not refer to the \LPPL\ or
- otherwise give the impression that your work is distributed under
- the \LPPL.
-
- The document \LPPLdocfile{modguide} in the base \LaTeX\ distribution
- explains the motivation behind the conditions of this license. It
- explains, for example, why distributing \LaTeX\ under the
- \textsc{gnu} General Public License (\textsc{gpl}) was considered
- inappropriate. Even if your work is unrelated to \LaTeX, the
- discussion in \LPPLdocfile{modguide} may still be relevant, and authors
- intending to distribute their works under any license are encouraged
- to read it.
-
- \LPPLsubsubsection{A Recommendation on Modification Without Distribution}
- \label{LPPL:WithoutDistribution}
-
- It is wise never to modify a component of the Work, even for your
- own personal use, without also meeting the above conditions for
- distributing the modified component. While you might intend that
- such modifications will never be distributed, often this will happen
- by accident -- you may forget that you have modified that component;
- or it may not occur to you when allowing others to access the
- modified version that you are thus distributing it and violating the
- conditions of this license in ways that could have legal
- implications and, worse, cause problems for the community. It is
- therefore usually in your best interest to keep your copy of the
- Work identical with the public one. Many works provide ways to
- control the behavior of that work without altering any of its
- licensed components.
-
- \LPPLsubsubsection{How to Use This License}
- \label{LPPL:HowTo}
-
- To use this license, place in each of the components of your work
- both an explicit copyright notice including your name and the year
- the work was authored and/or last substantially modified. Include
- also a statement that the distribution and/or modification of that
- component is constrained by the conditions in this license.
-
- Here is an example of such a notice and statement:
-\begin{verbatim}
- %% pig.dtx
- %% Copyright 2005 M. Y. Name
- %
- % This work may be distributed and/or modified under the
- % conditions of the LaTeX Project Public License, either version 1.3
- % of this license or (at your option) any later version.
- % The latest version of this license is in
- % https://www.latex-project.org/lppl.txt
- % and version 1.3 or later is part of all distributions of LaTeX
- % version 2005/12/01 or later.
- %
- % This work has the LPPL maintenance status `maintained'.
- %
- % The Current Maintainer of this work is M. Y. Name.
- %
- % This work consists of the files pig.dtx and pig.ins
- % and the derived file pig.sty.
-\end{verbatim}
-
- Given such a notice and statement in a file, the conditions given in
- this license document would apply, with the `Work' referring to the
- three files `\LPPLfile{pig.dtx}', `\LPPLfile{pig.ins}', and
- `\LPPLfile{pig.sty}' (the last being generated from
- `\LPPLfile{pig.dtx}' using `\LPPLfile{pig.ins}'), the `Base
- Interpreter' referring to any `\LaTeX-Format', and both `Copyright
- Holder' and `Current Maintainer' referring to the person `M. Y.
- Name'.
-
- If you do not want the Maintenance section of \LPPL\ to apply to
- your Work, change `maintained' above into `author-maintained'.
- However, we recommend that you use `maintained' as the Maintenance
- section was added in order to ensure that your Work remains useful
- to the community even when you can no longer maintain and support it
- yourself.
-
- \LPPLsubsubsection{Derived Works That Are Not Replacements}
- \label{LPPL:NotReplacements}
-
- Several clauses of the \LPPL\ specify means to provide reliability
- and stability for the user community. They therefore concern
- themselves with the case that a Derived Work is intended to be used
- as a (compatible or incompatible) replacement of the original
- Work. If this is not the case (e.g., if a few lines of code are
- reused for a completely different task), then clauses
- \ref{LPPL:item:changelog} and \ref{LPPL:item:unmodifiedcopy}
- shall not apply.
-
- \LPPLsubsubsection{Important Recommendations}
- \label{LPPL:Recommendations}
-
- \LPPLparagraph{Defining What Constitutes the Work}
-
- The \LPPL\ requires that distributions of the Work contain all the
- files of the Work. It is therefore important that you provide a way
- for the licensee to determine which files constitute the Work. This
- could, for example, be achieved by explicitly listing all the files
- of the Work near the copyright notice of each file or by using a
- line such as:
-\begin{verbatim}
- % This work consists of all files listed in manifest.txt.
-\end{verbatim}
- in that place. In the absence of an unequivocal list it might be
- impossible for the licensee to determine what is considered by you
- to comprise the Work and, in such a case, the licensee would be
- entitled to make reasonable conjectures as to which files comprise
- the Work.
-
-\end{LPPLicense}
-\endinput
diff --git a/macros/latex-dev/base/ltalloc.dtx b/macros/latex-dev/base/ltalloc.dtx
index 5da3582e55..4932dc707b 100644
--- a/macros/latex-dev/base/ltalloc.dtx
+++ b/macros/latex-dev/base/ltalloc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltbibl.dtx b/macros/latex-dev/base/ltbibl.dtx
index 79505680c4..0823620f99 100644
--- a/macros/latex-dev/base/ltbibl.dtx
+++ b/macros/latex-dev/base/ltbibl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltboxes.dtx b/macros/latex-dev/base/ltboxes.dtx
index 6bfbc38af9..7e1c2c38b0 100644
--- a/macros/latex-dev/base/ltboxes.dtx
+++ b/macros/latex-dev/base/ltboxes.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2017
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltboxes.dtx}
- [2017/03/29 v1.3a LaTeX Kernel (Box Commands)]
+ [2019/08/27 v1.3b LaTeX Kernel (Box Commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltboxes.dtx}
@@ -53,6 +53,10 @@
%
%
% \changes{v1.1e}{1998/08/17}{(RmS) Minor Documentation fixes.}
+% \changes{v1.3b}{2019/08/27}{Various commands made robust}
+%
+%
+%
% \section{\LaTeX\ Box commands}
%
%
@@ -265,7 +269,7 @@
% {\cs{long} added}
% The basic horizontal box command for \LaTeX.
% \begin{macrocode}
-\long\def\mbox#1{\leavevmode\hbox{#1}}
+\DeclareRobustCommand\mbox[1]{\leavevmode\hbox{#1}}
% \end{macrocode}
% \end{macro}
%
@@ -483,7 +487,7 @@
% {\cs{long} added}
% Save |#1| in a box register.
% \begin{macrocode}
-\long\def\sbox#1#2{\setbox#1\hbox{%
+\DeclareRobustCommand\sbox[2]{\setbox#1\hbox{%
\color@setgroup#2\color@endgroup}}
% \end{macrocode}
% \end{macro}
@@ -579,7 +583,7 @@
% \begin{macro}{\usebox}
% unchanged
% \begin{macrocode}
-\def\usebox#1{\leavevmode\copy #1\relax}
+\DeclareRobustCommand\usebox[1]{\leavevmode\copy #1\relax}
% \end{macrocode}
% \end{macro}
%
@@ -589,7 +593,7 @@
% (Extra space removed 14 Jan 88)
% RmS 92/08/24: Replaced occurrence of |\@halfwidth| by |\@wholewidth|
% \begin{macrocode}
-\long\def\frame#1{%
+\DeclareRobustCommand\frame[1]{%
\leavevmode
\hbox{%
\hskip-\@wholewidth
@@ -631,7 +635,7 @@
% \changes{v1.0s}{1995/04/27}
% {Move \cs{leavevmode} for graphics/1512}
% \begin{macrocode}
-\long\def\fbox#1{%
+\DeclareRobustCommand\fbox[1]{%
\leavevmode
\setbox\@tempboxa\hbox{%
\color@begingroup
@@ -1140,7 +1144,7 @@
% \LaTeX\ version works outside math.
% \task{???}{why the second `relax in `underline ?}
% \begin{macrocode}
-\def\underline#1{%
+\DeclareRobustCommand\underline[1]{%
\relax
\ifmmode\@@underline{#1}%
\else $\@@underline{\hbox{#1}}\m@th$\relax\fi}
@@ -1274,9 +1278,9 @@
% right adjusted.
% \begin{macrocode}
\def\@@line{\hb@xt@\hsize}
-\def\leftline#1{\@@line{#1\hss}}
-\def\rightline#1{\@@line{\hss#1}}
-\def\centerline#1{\@@line{\hss#1\hss}}
+\DeclareRobustCommand\leftline[1]{\@@line{#1\hss}}
+\DeclareRobustCommand\rightline[1]{\@@line{\hss#1}}
+\DeclareRobustCommand\centerline[1]{\@@line{\hss#1\hss}}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -1290,8 +1294,8 @@
% reference point without taking up space.
% \end{macro}
% \begin{macrocode}
-\def\rlap#1{\hb@xt@\z@{#1\hss}}
-\def\llap#1{\hb@xt@\z@{\hss#1}}
+\DeclareRobustCommand\rlap[1]{\hb@xt@\z@{#1\hss}}
+\DeclareRobustCommand\llap[1]{\hb@xt@\z@{\hss#1}}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltclass.dtx b/macros/latex-dev/base/ltclass.dtx
index b3a2331013..3d19971701 100644
--- a/macros/latex-dev/base/ltclass.dtx
+++ b/macros/latex-dev/base/ltclass.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltclass.dtx}
- [2019/07/09 v1.3a LaTeX Kernel (Class & Package Interface)]
+ [2019/09/11 v1.3c LaTeX Kernel (Class & Package Interface)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltclass.dtx}
@@ -155,11 +155,27 @@
% verbatim to the file name given as the first argument, together with
% some comments about how it was produced.
%
-% The environment is allowed only before |\documentclass| to ensure
-% that all packages or options necessary for this particular run are
-% present when needed. The begin and end tags should each be on a
-% line by itself. There is also a star-form; this does not write
-% extra comments into the file.
+% The package can also be called with an optional argument which is
+% used to alter some of its behavior: option \texttt{force} or
+% \texttt{overwrite} will allow for overwriting existing files,
+% option \texttt{nosearch} will only check the current directory
+% when looking if the file exists. This can be useful if you want to
+% generate a local (modified) copy of some file that is already in the
+% search tree of \TeX{}. Finally, you can use \texttt{nopremable} to
+% prevent it from writing the standard blurb at the top of the file
+% (this is actually the same as using the star form of the environment).
+%
+% The environment is now allowed anywhere in the document, but to ensure
+% that all packages or options necessary are available when the
+% document is run, it is normally best to place it at the top of your
+% file (before \cs{documentclass}).
+% A possible use case for using it inside the document body is if you
+% want to reuse some text several times in the document you could then
+% write it and later use \cs{input} to retrieve it where needed.
+%
+%
+% The begin and end tags should each be on a
+% line by itself.
%
% \subsection{Option processing}
%
@@ -1580,8 +1596,8 @@
% \end{macrocode}
%
% \begin{macrocode}
-\def\AtBeginDocument{\g@addto@macro\@begindocumenthook}
-\def\AtEndDocument{\g@addto@macro\@enddocumenthook}
+\DeclareRobustCommand\AtBeginDocument{\g@addto@macro\@begindocumenthook}
+\DeclareRobustCommand\AtEndDocument{\g@addto@macro\@enddocumenthook}
\@onlypreamble\AtBeginDocument
% \end{macrocode}
% \end{macro}
@@ -1707,10 +1723,67 @@
% \begin{macrocode}
% \changes{v1.3a}{2019/07/01}{Support UTF8 and spaces in
% filecontents environment file name}
+% \changes{v1.3b}{2019/08/27}{Make various commands robust}
+% \changes{v1.3c}{2019/09/11}{Support optional argument for filecontents}
+%
%</2ekernel>
%<*2ekernel|latexrelease>
%<latexrelease>\IncludeInRelease{2019/10/01}%
-%<latexrelease> {\filec@ntents}{Spaces in file names}%
+%<latexrelease> {\filec@ntents}{Spaces in file names + optional arg}%
+%
+
+
+% \end{macrocode}
+% We use |@tempswa| to mean no preamble writing and reuse |@filesw|
+% to indicate no overwriting:
+% \begin{macrocode}
+\def\filecontents{\@tempswatrue\@fileswtrue
+ \@ifnextchar[\filec@ntents@opt\filec@ntents
+}
+\@namedef{filecontents*}{\@tempswafalse\@fileswtrue
+ \@ifnextchar[\filec@ntents@opt\filec@ntents
+}
+% \end{macrocode}
+% To handle the optional argument we execute for each option the
+% command \cs{filec@ntents@OPTION} if it exist or complain about
+% unknown option.
+% \begin{macrocode}
+\def\filec@ntents@opt[#1]{%
+ \@for\@tempa:=#1\do{%
+ \ifcsname filec@ntents@\@tempa\endcsname
+ \csname filec@ntents@\@tempa\endcsname
+ \else
+ \@latex@error{Unknown filecontents option #1}%
+ {Valid options are force (or overwrite), nosearch, noheader}%
+ \fi}%
+ \filec@ntents
+}
+% \end{macrocode}
+% Option \texttt{force}) (or \texttt{overwrite}) changes the
+% overwriting switch
+% \begin{macrocode}
+\let\filec@ntents@force\@fileswfalse
+\let\filec@ntents@overwrite\@fileswfalse % alternative name
+% \end{macrocode}
+% and option \texttt{noheader} the preamble switch (which is
+% equivalent to using the star form of the environment).
+% \begin{macrocode}
+\let\filec@ntents@noheader\@tempswafalse
+% \end{macrocode}
+% Option \texttt{nosearch} only checks the current directory not
+% the how \TeX{} tree for the existence of the file to write.
+% \begin{macrocode}
+\def\filec@ntents@nosearch{%
+ \let\filec@ntents@checkdir\@currdir
+ \def\filec@ntents@where{in current directory}}
+% \end{macrocode}
+% By default we search the whole tree:
+% \begin{macrocode}
+\let\filec@ntents@checkdir\@empty
+\def\filec@ntents@where{exists on the system}
+% \end{macrocode}
+%
+% \begin{macrocode}
\begingroup%
\@tempcnta=1
\loop
@@ -1725,15 +1798,10 @@
% \end{macrocode}
%
% \begin{macrocode}
-\gdef\filecontents{\@tempswatrue\filec@ntents}%
-\gdef\filecontents*{\@tempswafalse\filec@ntents}%
-% \end{macrocode}
-%
-% \begin{macrocode}
\gdef\filec@ntents#1{%
- \set@curr@file{#1}%
- \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}%
- \openin\@inputcheck\q@curr@file \space %
+ \set@curr@file{\filec@ntents@checkdir#1}%
+ \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}%
+ \openin\@inputcheck\q@curr@file \space %
\ifeof\@inputcheck%
\@latex@warning@no@line%
{Writing file `\@currdir\@curr@file'}%
@@ -1751,13 +1819,54 @@
% \changes{v1.0y}{1997/10/10}
% {Use \cs{@gobbletwo}}
% \begin{macrocode}
- \closein\@inputcheck%
- \@latex@warning@no@line%
- {File `\@curr@file' already exists on the system.\MessageBreak%
+ \if@filesw%
+ \@latex@warning@no@line%
+ {File `\@curr@file' already \filec@ntents@where.\MessageBreak%
Not generating it from this source}%
- \let\write\@gobbletwo%
- \let\closeout\@gobble%
+ \let\write\@gobbletwo%
+ \let\closeout\@gobble%
+ \else%
+% \end{macrocode}
+% If we are overwriting, we try to make sure that the user is not
+% by mistake overwriting the input file (\cs{jobname}). Of course,
+% this only works for input files ending in \texttt{.tex}. If a
+% different extension is used there is no way to see that we are
+% overwriting outselves!
+% \begin{macrocode}
+ \edef\reserved@a{#1}%
+ \edef\reserved@a{\detokenize\expandafter{\reserved@a}}%
+ \edef\reserved@b{\detokenize\expandafter{\jobname}}%
+ \ifx\reserved@a\reserved@b%
+ \@fileswtrue%
+ \else%
+ \edef\reserved@b{\reserved@b\detokenize{.tex}}%
+ \ifx\reserved@a\reserved@b
+ \@fileswtrue%
+ \fi%
+ \fi%
+% \end{macrocode}
+% We allocate a write channel but we open it only if it is
+% (hopefully) safe. If not opened that means we are going to write
+% on the terminal.
+% \begin{macrocode}
+ \chardef\reserved@c15 %
+ \ch@ck7\reserved@c\write%
+ \if@filesw% % Foul ... trying to overwrite \jobname!
+ \@latex@error{Trying to overwrite `\jobname.tex'}{You can't %
+ write to the file you a reading from!\MessageBreak%
+ Data is written to screen instead.}%
+ \else%
+ \@latex@warning@no@line%
+ {Writing or overwriting file `\@currdir\@curr@file'}%
+ \immediate\openout\reserved@c#1\relax%
+ \fi%
+ \fi%
\fi%
+% \end{macrocode}
+% Closing the \cs{@inputcheck} is done here ot avoid having to do
+% this in each branch.
+% \begin{macrocode}
+ \closein\@inputcheck%
\if@tempswa%
% \end{macrocode}
%
@@ -1848,7 +1957,16 @@
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}%
-%<latexrelease> {\filec@ntents}{Spaces in file names}%
+%<latexrelease> {\filec@ntents}{Spaces in file names + optional arg}%
+%<latexrelease>
+%<latexrelease>\let\filec@ntents@opt \@undefined
+%<latexrelease>\let\filec@ntents@force \@undefined
+%<latexrelease>\let\filec@ntents@overwrite \@undefined
+%<latexrelease>\let\filec@ntents@noheader \@undefined
+%<latexrelease>\let\filec@ntents@nosearch \@undefined
+%<latexrelease>\let\filec@ntents@checkdir \@undefined
+%<latexrelease>\let\filec@ntents@where \@undefined
+%<latexrelease>
%<latexrelease>\begingroup%
%<latexrelease>\@tempcnta=1
%<latexrelease>\loop
@@ -1948,12 +2066,16 @@
\T\I{Tab}{Spac}|
\immediate\write\@unused{}}
\global\let\endfilecontents*\endfilecontents
-\@onlypreamble\filecontents
-\@onlypreamble\endfilecontents
-\@onlypreamble\filecontents*
-\@onlypreamble\endfilecontents*
+% \end{macrocode}
+% We no longer prevent the code to be used after begin document (no
+% rollback needed for this change).
+% \begin{macrocode}
+%\@onlypreamble\filecontents
+%\@onlypreamble\endfilecontents
+%\@onlypreamble\filecontents*
+%\@onlypreamble\endfilecontents*
\endgroup
-\@onlypreamble\filec@ntents
+%\@onlypreamble\filec@ntents
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -2559,7 +2681,7 @@
%
% Most often the second argument (before-date-code) will be empty.
% \begin{macrocode}
-\long\def\IfTargetDateBefore#1{%
+\DeclareRobustCommand\IfTargetDateBefore[1]{%
\ifnum\pkgcls@innerdate <%
\expandafter\@parse@version\expandafter0#1//00\@nil
\typeout{Exclude code introduced on #1}%
diff --git a/macros/latex-dev/base/ltcntrl.dtx b/macros/latex-dev/base/ltcntrl.dtx
index c4e755eca7..eb1b931957 100644
--- a/macros/latex-dev/base/ltcntrl.dtx
+++ b/macros/latex-dev/base/ltcntrl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltcounts.dtx b/macros/latex-dev/base/ltcounts.dtx
index 8158ef7c61..8217b3f91b 100644
--- a/macros/latex-dev/base/ltcounts.dtx
+++ b/macros/latex-dev/base/ltcounts.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltdefns.dtx b/macros/latex-dev/base/ltdefns.dtx
index 3a7d6f06ea..44d7bfde64 100644
--- a/macros/latex-dev/base/ltdefns.dtx
+++ b/macros/latex-dev/base/ltdefns.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltdefns.dtx}
- [2018/09/26 v1.5e LaTeX Kernel (definition commands)]
+ [2019/08/27 v1.5f LaTeX Kernel (definition commands)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltdefns.dtx}
@@ -1046,7 +1046,7 @@
%
% \emph{Note}: setting |\protect| to any value other than |\relax|
% whilst in `typesetting' mode will cause commands to go into an
-% infinite loop! In particular, setting |\relax| to |\@empty| will
+% infinite loop! In particular, setting |\protect| to |\@empty| will
% cause |\_| to loop forever. It will also break lots of other
% things, such as protected |\ifmmode|s inside |\halign|s. If you
% really really have to do such a thing, then please set
@@ -1101,7 +1101,9 @@
% \end{macro}
%
% \begin{macro}{\@typeset@protect}
-%
+% We set \cs{@typeset@protect} to \cs{relax} rather than \cs{@empty}
+% to make sure that the protection mechanism stops the look-ahead
+% and expansion performed at the start of \cs{halign} cells.
% \begin{macrocode}
\let\@typeset@protect\relax
% \end{macrocode}
@@ -1166,12 +1168,27 @@
%
% \begin{macro}{\MakeRobust}
% \changes{v1.4a}{2015/01/08}{Added macro}
-%
-% The macro firstly checks if the controls sequence in question exists
-% at all.
+% \changes{v1.5f}{2019/08/27}{Make the assignments global as we may
+% need to apply them inside a group}
+%
+% This macro makes an existing fragile macro robust, but only if it
+% hasn't been robust in the past, i.e., it checks for the existence
+% of the macro
+% \verb*=\<name> = and if that exists it assumes that
+% \verb=\<name>= is already robust. In that case either undefine
+% the inner macro first or use \cs{DeclareRobustCommand} to
+% define it in a robust way directly. We could probably test the
+% top-level definition to have the right kind of structure, but
+% this is somewhat problematical as we then have to distinguish
+% between \cs{long} macros and others and also take into account
+% that sometimes the top-level is deliberately dones manually (like
+% with \cs{begin}).
+%
+% The macro firstly checks if the control sequence in question exists
+% at all.
% \begin{macrocode}
%</2ekernel>
-%<latexrelease>\IncludeInRelease{2015/01/01}{\MakeRobust}{\MakeRobust}%
+%<latexrelease>\IncludeInRelease{2019/10/01}{\MakeRobust}{\MakeRobust}%
%<*2ekernel|latexrelease>
\def\MakeRobust#1{%
\@ifundefined{\expandafter\@gobble\string#1}{%
@@ -1189,12 +1206,12 @@
{%
\@ifundefined{\expandafter\@gobble\string#1\space}%
{%
- \expandafter\let\csname
+ \global\expandafter\let\csname
\expandafter\@gobble\string#1\space\endcsname=#1%
\edef\reserved@a{\string#1}%
\def\reserved@b{#1}%
\edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
- \edef#1{%
+ \xdef#1{%
\ifx\reserved@a\reserved@b
\noexpand\x@protect\noexpand#1%
\fi
@@ -1206,6 +1223,32 @@
}%
%</2ekernel|latexrelease>
%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{2015/01/01}{\MakeRobust}{\MakeRobust}%
+%<latexrelease>\def\MakeRobust#1{%
+%<latexrelease> \@ifundefined{\expandafter\@gobble\string#1}{%
+%<latexrelease> \@latex@error{The control sequence `\string#1' is undefined!%
+%<latexrelease> \MessageBreak There is nothing here to make robust}%
+%<latexrelease> \@eha
+%<latexrelease> }%
+%<latexrelease> {%
+%<latexrelease> \@ifundefined{\expandafter\@gobble\string#1\space}%
+%<latexrelease> {%
+%<latexrelease> \expandafter\let\csname
+%<latexrelease> \expandafter\@gobble\string#1\space\endcsname=#1%
+%<latexrelease> \edef\reserved@a{\string#1}%
+%<latexrelease> \def\reserved@b{#1}%
+%<latexrelease> \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}%
+%<latexrelease> \edef#1{%
+%<latexrelease> \ifx\reserved@a\reserved@b
+%<latexrelease> \noexpand\x@protect\noexpand#1%
+%<latexrelease> \fi
+%<latexrelease> \noexpand\protect\expandafter\noexpand
+%<latexrelease> \csname\expandafter\@gobble\string#1\space\endcsname}%
+%<latexrelease> }%
+%<latexrelease> {\@latex@info{The control sequence `\string#1' is already robust}}%
+%<latexrelease> }%
+%<latexrelease>}%
+%<latexrelease>\EndIncludeInRelease
%<latexrelease>\IncludeInRelease{0000/00/00}{\MakeRobust}{\MakeRobust}%
%<latexrelease>\let\MakeRobust\@undefined
%<latexrelease>\EndIncludeInRelease
@@ -1213,6 +1256,49 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+
+% \begin{macro}{\kernel@make@fragile}
+% The opposite of |\MakeRobust| execpt that it doesn't do many
+% checks as it is internal to the kernel. Why does one want such a
+% thing?
+% Only for compatibility reasons if \texttt{latexrelease} requests
+% a rollback of the kernel. For this reason we pretend that this
+% command existed in all earler versions of \LaTeX{} i.e., we are
+% not rolling it back since we need it precisely then. But we have
+% to get it into the \texttt{latexrelease} file so that a roll
+% forward is possible too.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\kernel@make@fragile}{Undo robustness}%
+\def\kernel@make@fragile#1{%
+ \@ifundefined{\expandafter\@gobble\string#1\space}%
+% \end{macrocode}
+% If not robust do nothing.
+% \begin{macrocode}
+ {}%
+% \end{macrocode}
+% Otherwise copy \verb*=\foo = back to \verb=\foo= and then undefine
+% the payload command.
+% \begin{macrocode}
+ {%
+ \global\expandafter\let\expandafter #1\csname
+ \expandafter\@gobble\string#1\space\endcsname
+ \global\expandafter\let\csname
+ \expandafter\@gobble\string#1\space\endcsname\@undefined
+ }%
+}
+%<latexrelease>\EndIncludeInRelease
+%</2ekernel|latexrelease>
+%<*2ekernel>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
% \subsection{Internal defining commands}
%
% These commands are used internally to define other \LaTeX{}
@@ -1392,19 +1478,6 @@
\def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch}
% \end{macrocode}
% \end{macro}
-
-% \changes{v1.0n}{1994/05/10}{Added \cs{makeatletter} and
-% \cs{makeatother} ASAJ.}
-%
-% \begin{macro}{\makeatletter}
-% \begin{macro}{\makeatother}
-% Make internal control sequences accessible or inaccessible.
-% \begin{macrocode}
-\def\makeatletter{\catcode`\@11\relax}
-\def\makeatother{\catcode`\@12\relax}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
%
%
% \begin{macro}{\@ifstar}
@@ -1459,6 +1532,22 @@
% \end{macrocode}
% \end{macro}
%
+%
+%
+% \begin{macro}{\makeatletter}
+% \begin{macro}{\makeatother}
+% \changes{v1.0n}{1994/05/10}{Added \cs{makeatletter} and
+% \cs{makeatother} ASAJ.}
+% Make internal control sequences accessible or inaccessible.
+% \begin{macrocode}
+\DeclareRobustCommand\makeatletter{\catcode`\@11\relax}
+\DeclareRobustCommand\makeatother{\catcode`\@12\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+
+%
% \section{Discretionary Hyphenation}
% \begin{macro}{\-}
% \changes{1.2x}{1995/12/13}{Documentation changed.}
@@ -1535,6 +1624,56 @@
\@includeinreleasefalse
% \end{macrocode}
%
+% \changes{v1.5f}{2019/08/27}{Make various commands robust}
+%
+% Delayed from |ltplain.dtx|
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\allowbreak}{Make various commands robust}%
+\MakeRobust\allowbreak
+\MakeRobust\bigbreak
+\MakeRobust\break
+\MakeRobust\dotfill
+\MakeRobust\frenchspacing
+\MakeRobust\goodbreak
+\MakeRobust\hrulefill
+\MakeRobust\medbreak
+\MakeRobust\nobreak
+\MakeRobust\nonfrenchspacing
+\MakeRobust\obeylines
+\MakeRobust\obeyspaces
+\MakeRobust\slash
+\MakeRobust\smallbreak
+\MakeRobust\strut
+\MakeRobust\underbar
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\allowbreak}{Make various commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\allowbreak
+%<latexrelease>\kernel@make@fragile\bigbreak
+%<latexrelease>\kernel@make@fragile\break
+%<latexrelease>\kernel@make@fragile\dotfill
+%<latexrelease>\kernel@make@fragile\frenchspacing
+%<latexrelease>\kernel@make@fragile\goodbreak
+%<latexrelease>\kernel@make@fragile\hrulefill
+%<latexrelease>\kernel@make@fragile\medbreak
+%<latexrelease>\kernel@make@fragile\nobreak
+%<latexrelease>\kernel@make@fragile\nonfrenchspacing
+%<latexrelease>\kernel@make@fragile\obeylines
+%<latexrelease>\kernel@make@fragile\obeyspaces
+%<latexrelease>\kernel@make@fragile\slash
+%<latexrelease>\kernel@make@fragile\smallbreak
+%<latexrelease>\kernel@make@fragile\strut
+%<latexrelease>\kernel@make@fragile\underbar
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
% \begin{macrocode}
%</2ekernel>
% \end{macrocode}
diff --git a/macros/latex-dev/base/ltdirchk.dtx b/macros/latex-dev/base/ltdirchk.dtx
index 75f9e1d532..b9db177f19 100644
--- a/macros/latex-dev/base/ltdirchk.dtx
+++ b/macros/latex-dev/base/ltdirchk.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/lterror.dtx b/macros/latex-dev/base/lterror.dtx
index daf645b8b8..3f6c436970 100644
--- a/macros/latex-dev/base/lterror.dtx
+++ b/macros/latex-dev/base/lterror.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{lterror.dtx}
- [2018/08/05 v1.2p LaTeX Kernel (errors)]
+ [2019/08/30 v1.2q LaTeX Kernel (errors)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{lterror.dtx}
@@ -87,7 +87,7 @@
% \changes{v1.2p}{2016/10/15}
% {Require e\TeX{}}
%
-% \section{Error handling}
+% \section{Error handling and tracing}
%
% This section defines \LaTeX's error commands.
%
@@ -738,7 +738,6 @@ Type H <return> for immediate help.}%
% out, since we decided to use catcode 15 instead.
% \begin{macrocode}
%\def\@invalidchar{\@latex@error{Invalid character in input}\@ehc}
-%</2ekernel>
% \end{macrocode}
% \end{macro}
%
@@ -759,5 +758,44 @@ Type H <return> for immediate help.}%
% In output routine, caused by a float environment or
% |\marginpar| occurring in inner vertical mode.
%
+%
+% \subsection{Tracing}
+%
+% The \texttt{trace} package implements the commands \cs{traceon}
+% and \cs{traceoff} that work similar to \cs{tracingall} but skip
+% certain code blocks that produce a lot of tracing output being of no
+% interest during debugging (for example loading a font).
+% Code blocks that should be hidden during tracing need
+% to be surrounded by the macros \cs{conditionally@traceoff}
+% and \cs{contionally@traceon}.
+%
+% For the kernel code the \texttt{trace} package then redefines a
+% number of macros to include this tracing support.
+%
+% However, in order to allow any macro package to react to
+% \cs{traceon} we also provide dummy definitions for the two
+% commands in the kernel so that they can be used by external
+% packages without the
+% need to distinguish between \texttt{trace} being loaded or not.
+%
+
+% \begin{macro}{\conditionally@traceon}
+% \changes{v1.2q}{2019/08/30}{Macro added}
+% \begin{macro}{\conditionally@traceoff}
+% \changes{v1.2q}{2019/08/30}{Macro added}
+% These are only dummy definitions. For details see the
+% \texttt{trace} package.
+% \begin{macrocode}
+\let\conditionally@traceon\@empty
+\let\conditionally@traceoff\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+%
%\Finale
\endinput
diff --git a/macros/latex-dev/base/ltfiles.dtx b/macros/latex-dev/base/ltfiles.dtx
index 7d628f52e1..afb085a417 100644
--- a/macros/latex-dev/base/ltfiles.dtx
+++ b/macros/latex-dev/base/ltfiles.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfiles.dtx}
- [2019/07/01 v1.2a LaTeX Kernel (File Handling)]
+ [2019/08/27 v1.2b LaTeX Kernel (File Handling)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfiles.dtx}
@@ -750,8 +750,9 @@
% \begin{macro}{\IfFileExists}
%
% \changes{v1.2a}{2019/07/01}{Support UTF-8}
+% \changes{v1.2b}{2019/08/27}{Make command robust}
% \begin{macrocode}
-\def\IfFileExists#1{%
+\DeclareRobustCommand\IfFileExists[1]{%
\set@curr@file{#1}%
\edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}%
\expandafter\IfFileExists@\expandafter{\q@curr@file}}
@@ -761,8 +762,7 @@
% \begin{macro}{\IfFileExists@}
% \changes{v0.9b}{1993/12/04}{Macro added}
% \changes{v0.9p}{1994/01/18}{New Definition}
-% \changes{v1.0t}{1995/05/25}
-% {(CAR) added \cs{long}}
+% \changes{v1.0t}{1995/05/25}{(CAR) added \cs{long}}
%
% \begin{macrocode}
\long\def \IfFileExists@#1#2#3{%
@@ -857,13 +857,14 @@
% {(CAR) added \cs{long}}
% \changes{v1.1o}{2019/02/07}{Expand \cs{@filef@und} before executing
% second argument (github/109)}
+% \changes{v1.2b}{2019/08/27}{Make command robust}
% \begin{macrocode}
%</2ekernel>
%<latexrelease>\IncludeInRelease{2019/10/01}%
%<latexrelease> {\InputIfFileExists}{Don't lose the file name}%
%<*2ekernel|latexrelease>
% \begin{macrocode}
-\long\def \InputIfFileExists#1#2{%
+\DeclareRobustCommand \InputIfFileExists[2]{%
\IfFileExists{#1}%
{%
\expandafter\@swaptwoargs\expandafter
diff --git a/macros/latex-dev/base/ltfinal.dtx b/macros/latex-dev/base/ltfinal.dtx
index db98a9cb8f..de161a777e 100644
--- a/macros/latex-dev/base/ltfinal.dtx
+++ b/macros/latex-dev/base/ltfinal.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltfinal.dtx}
- [2019/04/09 v2.1g LaTeX Kernel (Final Settings)]
+ [2019/08/27 v2.1g LaTeX Kernel (Final Settings)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltfinal.dtx}
@@ -709,6 +709,7 @@
\let\UseRawInputEncoding\relax
% \end{macrocode}
%
+% This ends the skipped code in Unicode engines:
% \begin{macrocode}
\fi
%</2ekernel|latexrelease>
diff --git a/macros/latex-dev/base/ltfloat.dtx b/macros/latex-dev/base/ltfloat.dtx
index ac1e37688e..7e0c35df22 100644
--- a/macros/latex-dev/base/ltfloat.dtx
+++ b/macros/latex-dev/base/ltfloat.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltfntcmd.dtx b/macros/latex-dev/base/ltfntcmd.dtx
index e500ed871a..e214057bc4 100644
--- a/macros/latex-dev/base/ltfntcmd.dtx
+++ b/macros/latex-dev/base/ltfntcmd.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltfssbas.dtx b/macros/latex-dev/base/ltfssbas.dtx
index 11abbae112..da9dab5d38 100644
--- a/macros/latex-dev/base/ltfssbas.dtx
+++ b/macros/latex-dev/base/ltfssbas.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -35,7 +35,7 @@
%
%
\ProvidesFile{ltfssbas.dtx}
- [2019/07/09 v3.2c LaTeX Kernel (NFSS Basic Macros)]
+ [2019/08/27 v3.2d LaTeX Kernel (NFSS Basic Macros)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -145,21 +145,11 @@
% substitution font/shape macro.}
% \changes{v1.0a}{1989/04/10}{Starting with version numbers!!
% \cs{ifmmode} added in \cs{math@group}}
-% \changes{v2.1w}{1994/11/17}
-% {\cs{@tempa} to \cs{reserved@a}}
-% \changes{v3.0z}{2015/02/21}
-% {Removed autoload code}
+% \changes{v2.1w}{1994/11/17}{\cs{@tempa} to \cs{reserved@a}}
+% \changes{v3.0z}{2015/02/21}{Removed autoload code}
+% \changes{v3.2d}{2019/08/27}{Make various commands robust}
%
%
-% The `2ekernel' code ensures that a |\usepackage{autofss1}| is
-% essentially ignored if a `full' format is being used that has
-% picture mode already in the format.
-%
-% Note the |autofss2| loading is currently disabled.
-%
-% \begin{macrocode}
-%<2ekernel>\expandafter\let\csname ver@autofss1.sty\endcsname\fmtversion
-% \end{macrocode}
%
%
% \section{Preliminary macros}
@@ -817,7 +807,7 @@
% in the current size. If also the size should change one has to
% issue a |\fontsize| command first.
% \begin{macrocode}
-\def\usefont#1#2#3#4{\fontencoding{#1}\fontfamily{#2}%
+\DeclareRobustCommand\usefont[4]{\fontencoding{#1}\fontfamily{#2}%
\fontseries{#3}\fontshape{#4}\selectfont
\ignorespaces}
% \end{macrocode}
@@ -1838,7 +1828,7 @@
% \end{macrocode}
% Version for engines other than Xe\TeX.
% \begin{macrocode}
-\gdef\showhyphens#1{%
+\DeclareRobustCommand\showhyphens[1]{%
\setbox0\vbox{%
\color@begingroup
\everypar{}%
@@ -1862,7 +1852,7 @@
% suppressed from the terminal output by ensuring that
% |\tracingonline| is locally zero.
% \begin{macrocode}
-\long\def\showhyphens#1{%
+\DeclareRobustCommand\showhyphens[1]{%
\setbox0\vbox{%
\usefont{TU}{lmr}{m}{n}%
\hsize 1sp %
diff --git a/macros/latex-dev/base/ltfsscmp.dtx b/macros/latex-dev/base/ltfsscmp.dtx
index 8157428fde..d62eeb6f47 100644
--- a/macros/latex-dev/base/ltfsscmp.dtx
+++ b/macros/latex-dev/base/ltfsscmp.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltfssdcl.dtx b/macros/latex-dev/base/ltfssdcl.dtx
index cca3df4693..d1284a08e8 100644
--- a/macros/latex-dev/base/ltfssdcl.dtx
+++ b/macros/latex-dev/base/ltfssdcl.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssdcl.dtx}
- [2016/02/18 v3.0r LaTeX Kernel (NFSS Declarative Interface)]
+ [2019/08/27 v3.0s LaTeX Kernel (NFSS Declarative Interface)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -1078,12 +1078,17 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\DeclareMathAlphabet}
-% could do with more checks like allowing single number in |#4|
-% lowercase in |#4| etc
+% \begin{macro}{\DeclareMathAccent}
+% Could do with more checks like allowing single number in |#4|
+% lowercase in |#4| etc
% \changes{v3.0r}{2016/02/18}
% {Check for mathaccent not \cs{mathaccemt}}
+% \changes{v3.0s}{2019/08/27}{Make math accents robust}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {DeclareMathAccent}{Make math accents robust}%
\def\DeclareMathAccent#1#2#3#4{%
\expandafter\in@\csname sym#3\expandafter\endcsname
\expandafter{\group@list}%
@@ -1097,9 +1102,14 @@
\advance\count\tw@-\count@
\if\relax\noexpand#1% is command?
\edef\reserved@a{\noexpand\in@
- {\expandafter\@gobble\string\mathaccent}{\meaning#1}}%
+ {\expandafter\@gobble\string\mathaccent}
+ {\expandafter\meaning
+ \csname\expandafter\@gobble\string#1\space\endcsname}}%
\reserved@a
\ifin@
+ \expandafter\let
+ \csname\expandafter\@gobble\string#1\space\endcsname
+ \@undefined
\expandafter\set@mathaccent
\csname sym#3\endcsname#1#2%
{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
@@ -1123,21 +1133,87 @@
\@latex@error{Symbol font `#3' is not defined}\@eha
\fi
}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {DeclareMathAccent}{Make math accents robust}%
+%<latexrelease>\def\DeclareMathAccent#1#2#3#4{%
+%<latexrelease> \expandafter\in@\csname sym#3\expandafter\endcsname
+%<latexrelease> \expandafter{\group@list}%
+%<latexrelease> \ifin@
+%<latexrelease> \begingroup
+%<latexrelease> \count\z@=#4\relax
+%<latexrelease> \count\tw@\count\z@
+%<latexrelease> \divide\count\z@\sixt@@n
+%<latexrelease> \count@\count\z@
+%<latexrelease> \multiply\count@\sixt@@n
+%<latexrelease> \advance\count\tw@-\count@
+%<latexrelease> \if\relax\noexpand#1% is command?
+%<latexrelease> \edef\reserved@a{\noexpand\in@
+%<latexrelease> {\expandafter\@gobble\string\mathaccent}{\meaning#1}}%
+%<latexrelease> \reserved@a
+%<latexrelease> \ifin@
+%<latexrelease> \expandafter\set@mathaccent
+%<latexrelease> \csname sym#3\endcsname#1#2%
+%<latexrelease> {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
+%<latexrelease> \@font@info{Redeclaring math accent \string#1}%
+%<latexrelease> \else
+%<latexrelease> \expandafter\ifx
+%<latexrelease> \csname\expandafter\@gobble\string#1\endcsname
+%<latexrelease> \relax
+%<latexrelease> \expandafter\set@mathaccent
+%<latexrelease> \csname sym#3\endcsname#1#2%
+%<latexrelease> {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Command `\string#1' already defined}\@eha
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Not a command name: `\noexpand#1'}\@eha
+%<latexrelease> \fi
+%<latexrelease> \endgroup
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Symbol font `#3' is not defined}\@eha
+%<latexrelease> \fi
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
\@onlypreamble\DeclareMathAccent
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\set@mathaccent}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\set@mathaccent}{makemath accents robust}%
\def\set@mathaccent#1#2#3#4{%
- \xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}}
+ \xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}%
+ \MakeRobust#2%
+}
\@onlypreamble\set@mathaccent
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\set@mathaccent}{makemath accents robust}%
+%<latexrelease>
+%<latexrelease>\def\set@mathaccent#1#2#3#4{%
+%<latexrelease> \xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\DeclareMathSymbol}
% \changes{v3.0r}{2016/02/18}
% {Check for mathchar not \cs{mathchar}}
+% \changes{v3.0s}{2019/09/09}{Allow definition if the math symbol was
+% a command already robust}
% \begin{macrocode}
\def\DeclareMathSymbol#1#2#3#4{%
\expandafter\in@\csname sym#3\expandafter\endcsname
@@ -1151,17 +1227,30 @@
\multiply\count@\sixt@@n
\advance\count\tw@-\count@
\if\relax\noexpand#1% is command?
+% \end{macrocode}
+% Store the command name with a space attached inside
+% \cs{reserved@@b} in case we look at a robust definition.
+% \begin{macrocode}
+ \edef\reserved@b{\expandafter\noexpand
+ \csname\expandafter\@gobble\string#1\space\endcsname}%
+% \end{macrocode}
+% Test both \verb=#1= and \verb*=#1 = for containing \texttt{mathchar}.
+% \begin{macrocode}
\edef\reserved@a
{\noexpand\in@{\expandafter\@gobble\string\mathchar}%
- {\meaning#1}}%
+ {\meaning#1\expandafter\meaning\reserved@b}}%
\reserved@a
+% \end{macrocode}
+% Drop \verb*=#1 = in case it was defined before.
+% \begin{macrocode}
+ \global\expandafter\let\reserved@b\@undefined
\ifin@
\expandafter\set@mathsymbol
\csname sym#3\endcsname#1#2%
{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
\@font@info{Redeclaring math symbol \string#1}%
\else
- \expandafter\ifx
+ \expandafter\ifx
\csname\expandafter\@gobble\string#1\endcsname
\relax
\expandafter\set@mathsymbol
@@ -1278,7 +1367,12 @@
% \begin{macro}{\@DeclareMathDelimiter}
% \changes{v3.0r}{2016/02/18}
% {Check for delimiter not \cs{delimiter}}
+% \changes{v3.0s}{2019/08/27}{Make math delimiters robust}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\@DeclareMathDelimiter}{Make math delimiters robust}%
\def\@DeclareMathDelimiter#1#2#3#4#5#6{%
\expandafter\in@\csname sym#3\expandafter\endcsname
\expandafter{\group@list}%
@@ -1304,9 +1398,11 @@
\edef\reserved@d{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
%
\edef\reserved@a{\noexpand\in@
- {\expandafter\@gobble\string\delimiter}{\meaning#1}}%
+ {\expandafter\@gobble\string\delimiter}%
+ {\expandafter\meaning\csname\expandafter\@gobble\string#1\space\endcsname}}%
\reserved@a
\ifin@
+ \expandafter\let\csname\expandafter\@gobble\string#1\space\endcsname\@undefined
\expandafter\set@mathdelimiter
\csname sym#3\expandafter\endcsname
\csname sym#5\endcsname#1#2%
@@ -1332,6 +1428,68 @@
\@latex@error{Symbol font `#3' is not defined}\@eha
\fi
}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\@DeclareMathDelimiter}{Make math delimiters robust}%
+%<latexrelease>\def\@DeclareMathDelimiter#1#2#3#4#5#6{%
+%<latexrelease> \expandafter\in@\csname sym#3\expandafter\endcsname
+%<latexrelease> \expandafter{\group@list}%
+%<latexrelease> \ifin@
+%<latexrelease> \expandafter\in@\csname sym#5\expandafter\endcsname
+%<latexrelease> \expandafter{\group@list}%
+%<latexrelease> \ifin@
+%<latexrelease> \begingroup
+%<latexrelease> \count\z@=#4\relax
+%<latexrelease> \count\tw@\count\z@
+%<latexrelease> \divide\count\z@\sixt@@n
+%<latexrelease> \count@\count\z@
+%<latexrelease> \multiply\count@\sixt@@n
+%<latexrelease> \advance\count\tw@-\count@
+%<latexrelease> \edef\reserved@c{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
+%<latexrelease> %
+%<latexrelease> \count\z@=#6\relax
+%<latexrelease> \count\tw@\count\z@
+%<latexrelease> \divide\count\z@\sixt@@n
+%<latexrelease> \count@\count\z@
+%<latexrelease> \multiply\count@\sixt@@n
+%<latexrelease> \advance\count\tw@-\count@
+%<latexrelease> \edef\reserved@d{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}%
+%<latexrelease> %
+%<latexrelease> \edef\reserved@a{\noexpand\in@
+%<latexrelease> {\expandafter\@gobble\string\delimiter}{\meaning#1}}%
+%<latexrelease> \reserved@a
+%<latexrelease> \ifin@
+%<latexrelease> \expandafter\set@mathdelimiter
+%<latexrelease> \csname sym#3\expandafter\endcsname
+%<latexrelease> \csname sym#5\endcsname#1#2%
+%<latexrelease> \reserved@c\reserved@d
+%<latexrelease> \@font@info{Redeclaring math delimiter \string#1}%
+%<latexrelease> \else
+%<latexrelease> \expandafter\ifx
+%<latexrelease> \csname\expandafter\@gobble\string#1\endcsname
+%<latexrelease> \relax
+%<latexrelease> \expandafter\set@mathdelimiter
+%<latexrelease> \csname sym#3\expandafter\endcsname
+%<latexrelease> \csname sym#5\endcsname#1#2%
+%<latexrelease> \reserved@c\reserved@d
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Command `\string#1' already defined}\@eha
+%<latexrelease> \fi
+%<latexrelease> \fi
+%<latexrelease> \endgroup
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Symbol font `#5' is not defined}\@eha
+%<latexrelease> \fi
+%<latexrelease> \else
+%<latexrelease> \@latex@error{Symbol font `#3' is not defined}\@eha
+%<latexrelease> \fi
+%<latexrelease>}
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+% \begin{macrocode}
\@onlypreamble\@DeclareMathDelimiter
% \end{macrocode}
% \end{macro}
@@ -1384,10 +1542,27 @@
%
% \changes{v2.1q}{1995/04/02}{fix pr/1329}
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\set@mathdelimiter}{make delimiters robust}%
\def\set@mathdelimiter#1#2#3#4#5#6{%
\xdef#3{\delimiter"\mathchar@type#4\hexnumber@#1#5%
- \hexnumber@#2#6 }}
+ \hexnumber@#2#6 }%
+ \MakeRobust#3%
+}
\@onlypreamble\set@mathdelimiter
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\set@mathdelimiter}{make delimiters robust}%
+%<latexrelease>
+%<latexrelease>\def\set@mathdelimiter#1#2#3#4#5#6{%
+%<latexrelease> \xdef#3{\delimiter"\mathchar@type#4\hexnumber@#1#5%
+%<latexrelease> \hexnumber@#2#6 }}
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltfssini.dtx b/macros/latex-dev/base/ltfssini.dtx
index 4d545f2240..b073a5cc37 100644
--- a/macros/latex-dev/base/ltfssini.dtx
+++ b/macros/latex-dev/base/ltfssini.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -36,7 +36,7 @@
%
%
\ProvidesFile{ltfssini.dtx}
- [2019/07/09 v3.1c LaTeX Kernel (NFSS Initialisation)]
+ [2019/08/27 v3.1d LaTeX Kernel (NFSS Initialisation)]
% \iffalse
\documentclass{ltxdoc}
\begin{document}
@@ -80,6 +80,7 @@
% {(DPC) Make file from previous file, lfonts.dtx 1995/05/23 v2.2e}
% \changes{v3.1b}{2016/10/15}
% {Require e\TeX{}}
+% \changes{v3.1d}{2019/08/27}{Make various commands robust}
%
%
% \section{NFSS Initialisation}
@@ -268,9 +269,9 @@
% Finally we provide two abbreviations to switch to the \LaTeX{}
% \emph{versions}.
% \begin{macrocode}
-\def\boldmath{\@nomath\boldmath
+\DeclareRobustCommand\boldmath{\@nomath\boldmath
\mathversion{bold}}
-\def\unboldmath{\@nomath\unboldmath
+\DeclareRobustCommand\unboldmath{\@nomath\unboldmath
\mathversion{normal}}
% \end{macrocode}
% Here we switch to the default math version by defining the internal
@@ -293,7 +294,10 @@
% without changes to the source.
% \begin{macrocode}
\def\newfont#1#2{\@ifdefinable#1{\font#1=#2\relax}}
-\def\symbol#1{\char #1\relax}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\symbol[1]{\char #1\relax}
% \end{macrocode}
% \end{macro}
% \end{macro}
@@ -332,7 +336,7 @@
% assume that the standard math fonts are used. Thus it needs
% changing in case other math encodings are used.
% \begin{macrocode}
-\def\oldstylenums#1{%
+\DeclareRobustCommand\oldstylenums[1]{%
\begingroup
% \end{macrocode}
% Provide spacing using the interword space of the current font.
diff --git a/macros/latex-dev/base/ltfsstrc.dtx b/macros/latex-dev/base/ltfsstrc.dtx
index 0270fcb066..05dafa20c6 100644
--- a/macros/latex-dev/base/ltfsstrc.dtx
+++ b/macros/latex-dev/base/ltfsstrc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/lthyphen.dtx b/macros/latex-dev/base/lthyphen.dtx
index 32b73bf892..ba4b018dce 100644
--- a/macros/latex-dev/base/lthyphen.dtx
+++ b/macros/latex-dev/base/lthyphen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltidxglo.dtx b/macros/latex-dev/base/ltidxglo.dtx
index cb46fde90a..19349c17dc 100644
--- a/macros/latex-dev/base/ltidxglo.dtx
+++ b/macros/latex-dev/base/ltidxglo.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltidxglo.dtx}
- [1996/01/20 v1.1e LaTeX Kernel (Index and Glossary)]
+ [2019/08/27 v1.1f LaTeX Kernel (Index and Glossary)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltidxglo.dtx}
@@ -76,6 +76,7 @@
% \changes{v1.1a}{1994/05/19}{Initial version of ltidxglo.dtx,
% split from ltidxbib.dtx}
% \changes{v1.1d}{1995/10/25}{Doc cleanup}
+% \changes{v1.1f}{2019/08/27}{Make \cs{index} and \cs{gloassary} robust}
%
%
% \begin{oldcomments}
diff --git a/macros/latex-dev/base/ltlength.dtx b/macros/latex-dev/base/ltlength.dtx
index fab7c6fdd2..7b72946d6e 100644
--- a/macros/latex-dev/base/ltlength.dtx
+++ b/macros/latex-dev/base/ltlength.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltlength.dtx}
- [2015/01/08 v1.1c LaTeX Kernel (Lengths)]
+ [2019/08/27 v1.1d LaTeX Kernel (Lengths)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltlength.dtx}
@@ -59,10 +59,9 @@
%
% \changes{v1.0c}{1994/03/29}
% {Create file ltcntlen from parts of ltmiscen and ltherest.}
-% \changes{v1.1a}{1994/05/19}
-% {Extract file ltlength from ltcntlen.}
-% \changes{v1.1b}{1995/08/11}
-% {Doc typos fixed for latex/753}
+% \changes{v1.1a}{1994/05/19}{Extract file ltlength from ltcntlen.}
+% \changes{v1.1b}{1995/08/11}{Doc typos fixed for latex/753}
+% \changes{v1.1d}{2019/08/27}{Make various command robust}
%
% \section{Lengths}
%
@@ -141,9 +140,9 @@
% Clear the memory afterwards (which might be a lot).
% \begin{macrocode}
\setbox\@tempboxa\box\voidb@x}
-\def\settoheight{\@settodim\ht}
-\def\settodepth {\@settodim\dp}
-\def\settowidth {\@settodim\wd}
+\DeclareRobustCommand\settoheight{\@settodim\ht}
+\DeclareRobustCommand\settodepth {\@settodim\dp}
+\DeclareRobustCommand\settowidth {\@settodim\wd}
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex-dev/base/ltlists.dtx b/macros/latex-dev/base/ltlists.dtx
index d59b7ac4f4..4dcbb8b56a 100644
--- a/macros/latex-dev/base/ltlists.dtx
+++ b/macros/latex-dev/base/ltlists.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltlogos.dtx b/macros/latex-dev/base/ltlogos.dtx
index 1754d06630..ab20b60c59 100644
--- a/macros/latex-dev/base/ltlogos.dtx
+++ b/macros/latex-dev/base/ltlogos.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltlogos.dtx}
- [1998/08/17 v1.1i LaTeX Kernel (Logos)]
+ [2019/08/27 v1.1j LaTeX Kernel (Logos)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltlogos.dtx}
@@ -70,9 +70,10 @@
% \begin{macro}{\TeX}
% The \TeX{} logo, adjusted so that a full stop after the logo
% counts as ending a sentence.
+% \changes{v1.1j}{2019/08/27}{Make \cs{TeX} command robust}
% \begin{macrocode}
%<*2ekernel>
-\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
+\DeclareRobustCommand\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltluatex.pdf b/macros/latex-dev/base/ltluatex.pdf
index 85bb4aec90..68b2eff34c 100644
--- a/macros/latex-dev/base/ltluatex.pdf
+++ b/macros/latex-dev/base/ltluatex.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltmath.dtx b/macros/latex-dev/base/ltmath.dtx
index d7c283f9ef..c38f42b4f9 100644
--- a/macros/latex-dev/base/ltmath.dtx
+++ b/macros/latex-dev/base/ltmath.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -38,7 +38,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmath.dtx}
- [2018/09/24 v1.2b LaTeX Kernel (Math Setup)]
+ [2019/08/27 v1.2c LaTeX Kernel (Math Setup)]
% \iffalse
%</driver>
%
@@ -95,49 +95,50 @@
% \changes{v1.0r}{1995/05/07}{Use \cs{hb@xt@}}
% \changes{v1.0r}{1995/05/21}{Update some plain macros}
% \changes{v1.0t}{1995/06/28}{minor doc edits}
+% \changes{v1.2c}{2019/08/27}{Make various commands robust}
%
% \begin{macro}{\log}
% The standard operators:
% \begin{macrocode}
-\def\log{\mathop{\operator@font log}\nolimits}
-\def\lg{\mathop{\operator@font lg}\nolimits}
-\def\ln{\mathop{\operator@font ln}\nolimits}
-\def\lim{\mathop{\operator@font lim}}
-\def\limsup{\mathop{\operator@font lim\,sup}}
-\def\liminf{\mathop{\operator@font lim\,inf}}
-\def\sin{\mathop{\operator@font sin}\nolimits}
-\def\arcsin{\mathop{\operator@font arcsin}\nolimits}
-\def\sinh{\mathop{\operator@font sinh}\nolimits}
-\def\cos{\mathop{\operator@font cos}\nolimits}
-\def\arccos{\mathop{\operator@font arccos}\nolimits}
-\def\cosh{\mathop{\operator@font cosh}\nolimits}
-\def\tan{\mathop{\operator@font tan}\nolimits}
-\def\arctan{\mathop{\operator@font arctan}\nolimits}
-\def\tanh{\mathop{\operator@font tanh}\nolimits}
-\def\cot{\mathop{\operator@font cot}\nolimits}
-\def\coth{\mathop{\operator@font coth}\nolimits}
-\def\sec{\mathop{\operator@font sec}\nolimits}
-\def\csc{\mathop{\operator@font csc}\nolimits}
-\def\max{\mathop{\operator@font max}}
-\def\min{\mathop{\operator@font min}}
-\def\sup{\mathop{\operator@font sup}}
-\def\inf{\mathop{\operator@font inf}}
-\def\arg{\mathop{\operator@font arg}\nolimits}
-\def\ker{\mathop{\operator@font ker}\nolimits}
-\def\dim{\mathop{\operator@font dim}\nolimits}
-\def\hom{\mathop{\operator@font hom}\nolimits}
-\def\det{\mathop{\operator@font det}}
-\def\exp{\mathop{\operator@font exp}\nolimits}
-\def\Pr{\mathop{\operator@font Pr}}
-\def\gcd{\mathop{\operator@font gcd}}
-\def\deg{\mathop{\operator@font deg}\nolimits}
+\DeclareRobustCommand\log{\mathop{\operator@font log}\nolimits}
+\DeclareRobustCommand\lg{\mathop{\operator@font lg}\nolimits}
+\DeclareRobustCommand\ln{\mathop{\operator@font ln}\nolimits}
+\DeclareRobustCommand\lim{\mathop{\operator@font lim}}
+\DeclareRobustCommand\limsup{\mathop{\operator@font lim\,sup}}
+\DeclareRobustCommand\liminf{\mathop{\operator@font lim\,inf}}
+\DeclareRobustCommand\sin{\mathop{\operator@font sin}\nolimits}
+\DeclareRobustCommand\arcsin{\mathop{\operator@font arcsin}\nolimits}
+\DeclareRobustCommand\sinh{\mathop{\operator@font sinh}\nolimits}
+\DeclareRobustCommand\cos{\mathop{\operator@font cos}\nolimits}
+\DeclareRobustCommand\arccos{\mathop{\operator@font arccos}\nolimits}
+\DeclareRobustCommand\cosh{\mathop{\operator@font cosh}\nolimits}
+\DeclareRobustCommand\tan{\mathop{\operator@font tan}\nolimits}
+\DeclareRobustCommand\arctan{\mathop{\operator@font arctan}\nolimits}
+\DeclareRobustCommand\tanh{\mathop{\operator@font tanh}\nolimits}
+\DeclareRobustCommand\cot{\mathop{\operator@font cot}\nolimits}
+\DeclareRobustCommand\coth{\mathop{\operator@font coth}\nolimits}
+\DeclareRobustCommand\sec{\mathop{\operator@font sec}\nolimits}
+\DeclareRobustCommand\csc{\mathop{\operator@font csc}\nolimits}
+\DeclareRobustCommand\max{\mathop{\operator@font max}}
+\DeclareRobustCommand\min{\mathop{\operator@font min}}
+\DeclareRobustCommand\sup{\mathop{\operator@font sup}}
+\DeclareRobustCommand\inf{\mathop{\operator@font inf}}
+\DeclareRobustCommand\arg{\mathop{\operator@font arg}\nolimits}
+\DeclareRobustCommand\ker{\mathop{\operator@font ker}\nolimits}
+\DeclareRobustCommand\dim{\mathop{\operator@font dim}\nolimits}
+\DeclareRobustCommand\hom{\mathop{\operator@font hom}\nolimits}
+\DeclareRobustCommand\det{\mathop{\operator@font det}}
+\DeclareRobustCommand\exp{\mathop{\operator@font exp}\nolimits}
+\DeclareRobustCommand\Pr{\mathop{\operator@font Pr}}
+\DeclareRobustCommand\gcd{\mathop{\operator@font gcd}}
+\DeclareRobustCommand\deg{\mathop{\operator@font deg}\nolimits}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\bmod}
% And some operators have to be done by hand:
% \begin{macrocode}
-\def\bmod{%
+\DeclareRobustCommand\bmod{%
\nonscript\mskip-\medmuskip\mkern5mu%
\mathbin{\operator@font mod}\penalty900\mkern5mu%
\nonscript\mskip-\medmuskip}
@@ -146,7 +147,7 @@
%
% \begin{macro}{\pmod}
% \begin{macrocode}
-\def\pmod#1{%
+\DeclareRobustCommand\pmod[1]{%
\allowbreak\mkern18mu({\operator@font mod}\,\,#1)}
% \end{macrocode}
% \end{macro}
@@ -156,18 +157,18 @@
% \begin{macro}{\big}
% Variants on |\big| and friends for use with delimiters:
% \begin{macrocode}
-\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}
+\DeclareRobustCommand\bigl{\mathopen\big}
+\DeclareRobustCommand\bigm{\mathrel\big}
+\DeclareRobustCommand\bigr{\mathclose\big}
+\DeclareRobustCommand\Bigl{\mathopen\Big}
+\DeclareRobustCommand\Bigm{\mathrel\Big}
+\DeclareRobustCommand\Bigr{\mathclose\Big}
+\DeclareRobustCommand\biggl{\mathopen\bigg}
+\DeclareRobustCommand\biggm{\mathrel\bigg}
+\DeclareRobustCommand\biggr{\mathclose\bigg}
+\DeclareRobustCommand\Biggl{\mathopen\Bigg}
+\DeclareRobustCommand\Biggm{\mathrel\Bigg}
+\DeclareRobustCommand\Biggr{\mathclose\Bigg}
% \end{macrocode}
% \end{macro}
%
@@ -252,23 +253,55 @@
% {(DPC) use \cs{expandafter} instead of \cs{next}}
% \changes{v1.0p}{1994/11/18}
% {(DPC) colour support}
+
% \begin{macro}{\hphantom}
% \begin{macro}{\vphantom}
% \begin{macrocode}
\newif\ifv@
\newif\ifh@
% \end{macrocode}
+%
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\vphantom}{Make commands robust}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\vphantom{\v@true\h@false\ph@nt}
+% \end{macrocode}
%
% \begin{macrocode}
-\def\vphantom{\v@true\h@false\ph@nt}
+\DeclareRobustCommand\hphantom{\v@false\h@true\ph@nt}
% \end{macrocode}
%
% \begin{macrocode}
-\def\hphantom{\v@false\h@true\ph@nt}
+\DeclareRobustCommand\phantom{\v@true\h@true\ph@nt}
% \end{macrocode}
%
+% \begin{macro}{\mathstrut}
+% \begin{macrocode}
+\DeclareRobustCommand\mathstrut{\vphantom(}
+% \end{macrocode}
+% \end{macro}
+%
% \begin{macrocode}
-\def\phantom{\v@true\h@true\ph@nt}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\vphantom}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\vphantom
+%<latexrelease>\kernel@make@fragile\hphantom
+%<latexrelease>\kernel@make@fragile\phantom
+%<latexrelease>\kernel@make@fragile\mathstrut
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
%
% \begin{macrocode}
@@ -318,11 +351,6 @@
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\mathstrut}
-% \begin{macrocode}
-\def\mathstrut{\vphantom(}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\smash}
% \changes{v1.0p}{1994/11/18}
@@ -330,7 +358,7 @@
% \changes{v1.0p}{1994/11/18}
% {(DPC) colour support}
% \begin{macrocode}
-\def\smash{%
+\DeclareRobustCommand\smash{%
\relax % \relax, in case this comes first in \halign
\ifmmode
\expandafter\mathpalette\expandafter\mathsm@sh
@@ -368,19 +396,26 @@
% \end{macrocode}
% \end{macro}
%
-%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\cases}{Make commands robust}%
+% \end{macrocode}
+%
% \begin{macro}{\cases}
% \changes{LaTeX2.09}{1991/08/14}
% {(RmS) inserted extra braces around entry for NFSS}
% \begin{macrocode}
-\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
+\DeclareRobustCommand\cases[1]{\left\{\,\vcenter{\normalbaselines\m@th
\ialign{$##\hfil$&\quad{##}\hfil\crcr#1\crcr}}\right.}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\matrix}
% \begin{macrocode}
-\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
+\DeclareRobustCommand\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}}}\,}
@@ -389,10 +424,24 @@
%
% \begin{macro}{\pmatrix}
% \begin{macrocode}
-\def\pmatrix#1{\left(\matrix{#1}\right)}
+\DeclareRobustCommand\pmatrix[1]{\left(\matrix{#1}\right)}
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\cases}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\cases
+%<latexrelease>\kernel@make@fragile\matrix
+%<latexrelease>\kernel@make@fragile\pmatrix
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
%
% \begin{macro}{\bordermatrix}
% \changes{LaTeX2e}{1994/01/25}{Removed \cs{p@renwd}.}
@@ -475,7 +524,7 @@
%
% \begin{macro}{\*}
% \begin{macrocode}
-\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
+\DeclareRobustCommand\*{\discretionary{\thinspace\the\textfont2\char2}{}{}}
% \end{macrocode}
% \end{macro}
%
@@ -712,7 +761,7 @@
% \begin{macro}{\stackrel}
% A disguise for plain \TeX's buildrel.
% \begin{macrocode}
-\def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}}
+\DeclareRobustCommand\stackrel[2]{\mathrel{\mathop{#2}\limits^{#1}}}
% \end{macrocode}
% \end{macro}
%
@@ -724,7 +773,7 @@
% \begin{macro}{\frac}
% A disguise for plain \TeX's |\over|.
% \begin{macrocode}
-\def\frac#1#2{{\begingroup#1\endgroup\over#2}}
+\DeclareRobustCommand\frac[2]{{\begingroup#1\endgroup\over#2}}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltmiscen.dtx b/macros/latex-dev/base/ltmiscen.dtx
index 122ef3b39b..8cd6120751 100644
--- a/macros/latex-dev/base/ltmiscen.dtx
+++ b/macros/latex-dev/base/ltmiscen.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltmiscen.dtx}
- [2018/10/11 v1.1o LaTeX Kernel (Misc. Environments)]
+ [2019/08/29 v1.1p LaTeX Kernel (Misc. Environments)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltmiscen.dtx}
@@ -72,6 +72,7 @@
% \changes{v1.1d}{1996/06/03}{Move setting of verbatim font and
% \cs{@noligs}.}
% \changes{v1.1g}{1998/08/17}{(RmS) Minor documentation fixes.}
+% \changes{v1.1p}{2019/08/27}{Make various commands robust}
%
% \section{Miscellaneous Environments}
% This section implements the basic environment mechanism, and also
@@ -505,8 +506,13 @@
% remember line number. Used by \cs{@badend} to display
% position of non-matching \cs{begin}.}
% \changes{v1.1e}{1996/07/26}{remove \cs{global} before \cs{@ignore...}}
+% \changes{v1.1p}{2019/08/27}{Make command robust}
% \begin{macrocode}
-\def\begin#1{%
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\begin}{Making \begin/\end robust}%
+\DeclareRobustCommand\begin[1]{%
\@ifundefined{#1}%
{\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
{\def\reserved@a{\def\@currenvir{#1}%
@@ -515,17 +521,123 @@
\@ignorefalse
\begingroup\@endpefalse\reserved@a}
% \end{macrocode}
-% \end{macro}
+% A version that doesn't start out with \cs{relax} when in
+% typesetting mode would be the following, but since \cs{begin}
+% issues a \cs{begingroup} it wouldn't help much with respect to
+% allowing things like \cs{noalign} or \cs{multicolumn} inside.
+% \begin{macrocode}
+%\edef\begin
+% {\unexpanded{%
+% \ifx\protect\@typeset@protect
+% \expandafter\@gobble
+% \fi
+% \protect
+% }%
+% \expandafter\noexpand\csname begin \endcsname
+% }
+%\@namedef{begin }#1{%
+% \@ifundefined{#1}%
+% {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}%
+% {\def\reserved@a{\def\@currenvir{#1}%
+% \edef\@currenvline{\on@line}%
+% \csname #1\endcsname}}%
+% \@ignorefalse
+% \begingroup\@endpefalse\reserved@a}
+% \end{macrocode}
%
% \begin{macro}{\end}
+% While \cs{begin} was made robust simply by using
+% \cs{DeclareRobustCommand} we need to be a bit more subtle with
+% \cs{end} as there are packages out there that try to look into
+% the top-level contents of \verb=\end{foo}= (that is at the expansion
+% of \verb=\endfoo=) to see if it contains certain macros. This is
+% done by hitting \verb=\end{foo}= with three \cs{expandafter}s,
+% the first to get
+%\begin{verbatim}
+% \csname endfoo\endcsname \@checkend{foo}% etc.
+%\end{verbatim}
+% the second to expand the \cs{csname}, i.e., to get to
+%\begin{verbatim}
+% \endfoo \@checkend{foo}% etc.
+%\end{verbatim}
+% and the third to finally get to the top-level content of
+% \verb=\endfoo=, i.e.
+%\begin{verbatim}
+% <top-level content of \endfoo> \@checkend{foo}% etc.
+%\end{verbatim}
+% Therefore a robust replacement should produce the same results
+% after three expansions (there first is obviously different).
+%
+% Basically the definition of \cs{end} should either produce
+% \verb*=\protect\end = (when not doing typesetting) or it should
+% produce \verb*=\end = (without the \cs{protect}) when doing typesetting.
+% Furthermore, it should (when in typesetting mode) show exactly the
+% same result as
+% \verb*=\end = (which is the original fragile definition
+% of \cs{end}) when you expand either of them twice, i.e.,
+%\begin{verbatim}
+% \endfoo \@checkend{foo}% etc.
+%\end{verbatim}
+% That is achieved with the code below (which is worth studying
+% carefully).
+%
+% There is some trickery involved here: in particular we use
+% \cs{romannumeral} to change a single expansion into three
+% successive expansions in one go. That primitive expands until it
+% has scanned a number (0 in this case, so it doesn't produce any
+% output) and so it allows us to place arbitrary many
+% \cs{expandafter}s inside that are all going to be executed when
+% \cs{romannumeral} is hit by a single \cs{expandafter}.
+%
% \changes{v1.1e}{1996/07/26}{remove \cs{global} before \cs{@ignore...}}
+% \changes{v1.1p}{2019/08/27}{Make command robust}
+%
+% \begin{macrocode}
+\edef\end
+ {\unexpanded{%
+ \romannumeral
+ \ifx\protect\@typeset@protect
+ \expandafter %1
+ \expandafter %2
+ \expandafter %1
+ \expandafter %3 expands the \csname inside \end<space>
+ \expandafter %1
+ \expandafter %2 expands \end<space>
+ \expandafter %1 expands the \else
+ \z@
+ \else
+ \expandafter\z@\expandafter\protect
+ \fi
+ }%
+ \expandafter\noexpand\csname end \endcsname
+ }
+% \end{macrocode}
+% And here is the original definition of \cs{end} the way it was in
+% \LaTeX{} for several decades now hidden in \verb*=\end =.
% \begin{macrocode}
-\def\end#1{%
+\@namedef{end }#1{%
\csname end#1\endcsname\@checkend{#1}%
\expandafter\endgroup\if@endpe\@doendpe\fi
\if@ignore\@ignorefalse\ignorespaces\fi}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+% \end{macrocode}
+% An here the rollback in case that is ever needed.
+% \begin{macrocode}
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\begin}{Making \begin/\end robust}%
+%<latexrelease>\kernel@make@fragile\begin
+%<latexrelease>\kernel@make@fragile\end
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
% \end{macrocode}
% \end{macro}
+% \end{macro}
+%
+%
+%
+%
%
% \begin{macro}{\@checkend}
% \begin{macrocode}
@@ -598,6 +710,7 @@
% \begin{macrocode}
\def\@icentercr[#1]{\vskip #1\ignorespaces}
% \end{macrocode}
+%
% \end{macro}
%
%
@@ -615,15 +728,57 @@
% \end{macrocode}
% \end{environment}
%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\centering}{Make commands robust}%
+% \end{macrocode}
+%
% \begin{macro}{\centering}
% \begin{macrocode}
-\def\centering{%
+\DeclareRobustCommand\centering{%
\let\\\@centercr
\rightskip\@flushglue\leftskip\@flushglue
\parindent\z@\parfillskip\z@skip}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\raggedright}
+% \begin{macrocode}
+\DeclareRobustCommand\raggedright{%
+ \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
+ \leftskip\z@skip
+ \parindent\z@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\raggedleft}
+% \begin{macrocode}
+\DeclareRobustCommand\raggedleft{%
+ \let\\\@centercr
+ \rightskip\z@skip\leftskip\@flushglue
+ \parindent\z@\parfillskip\z@skip}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\centering}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\centering
+%<latexrelease>\kernel@make@fragile\raggedright
+%<latexrelease>\kernel@make@fragile\raggedleft
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
% \begin{macro}{\@rightskip}
% \begin{macrocode}
\newskip\@rightskip \@rightskip \z@skip
@@ -644,14 +799,6 @@
% \end{macrocode}
% \end{environment}
%
-% \begin{macro}{\raggedright}
-% \begin{macrocode}
-\def\raggedright{%
- \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip
- \leftskip\z@skip
- \parindent\z@}
-% \end{macrocode}
-% \end{macro}
%
% \begin{environment}{flushright}
% \changes{v0.9h}{1993/12/13}{Removed optional argument of \cs{item}}
@@ -667,15 +814,6 @@
% \end{macrocode}
% \end{environment}
%
-% \begin{macro}{\raggedleft}
-% \begin{macrocode}
-\def\raggedleft{%
- \let\\\@centercr
- \rightskip\z@skip\leftskip\@flushglue
- \parindent\z@\parfillskip\z@skip}
-% \end{macrocode}
-% \end{macro}
-%
%
% \subsection{Verbatim}
%
diff --git a/macros/latex-dev/base/ltnews.cls b/macros/latex-dev/base/ltnews.cls
index 9aa72c53da..1ef6529746 100644
--- a/macros/latex-dev/base/ltnews.cls
+++ b/macros/latex-dev/base/ltnews.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2017
+% Copyright 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltnews.pdf b/macros/latex-dev/base/ltnews.pdf
new file mode 100644
index 0000000000..d14e8afada
--- /dev/null
+++ b/macros/latex-dev/base/ltnews.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews.tex b/macros/latex-dev/base/ltnews.tex
new file mode 100644
index 0000000000..3b351448b7
--- /dev/null
+++ b/macros/latex-dev/base/ltnews.tex
@@ -0,0 +1,277 @@
+% \iffalse meta-comment
+%
+% Copyright 2006, 2009, 2011, 2014 Heiko Oberdiek
+% Copyright (C) 2014-2019 The LaTeX3 Project
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% 2006/06/02 v1.0: First version.
+% 2009/09/25 v1.1: \usepackage disabled.
+% 2011/07/01 v1.2: Fixes.
+% 2014/02/30 v1.3:
+% * Update for LaTeX 2014/05/01.
+% * Fix for anchor positions of issue titles.
+% 2014/05/15 v1.4:
+% * Updates for ltnews21.tex.
+% 2014/11/14 v1.4a:
+% * LaTeX Project version
+% 2015/02/16 v1.4b:
+% * Fix TOC issue
+% \fi
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{ltnews.tex}%
+ [2015/02/16 v1.4b Master file for ltnews*.tex (LaTeX Project)]
+\providecommand*{\lastissue}{30}
+\InputIfFileExists{ltnews-lastissue.cfg}{}{}
+
+
+\ifx\pdfoutput\undefined
+\let\pdfoutput\outputmode
+\protected\def\pdfinfo{\pdfextension info }
+\fi
+
+\RequirePackage{ifpdf}
+\ifpdf
+ % overwrite nasty stuff of ltnews.cfg
+ % (use of hyperref for this would also support other drivers)
+ \pdfinfo{%
+ /Title(LaTeX News)%
+ /Subject(Issues 1--\lastissue)%
+ /Author(The LaTeX Project)%
+ /Creator(LaTeX)%
+ }
+ \newtoks\pdfinfo
+\else
+ \AtBeginDocument{%
+ \hypersetup{%
+ pdftitle={LaTeX News},%
+ pdfsubject={Issues 1\textendash\lastissue},%
+ pdfauthor={The LaTeX Project},%
+ pdfcreator={LaTeX}%
+ }%
+ }%
+\fi
+
+\RequirePackage{lmodern}
+\RequirePackage[T1]{fontenc}
+\RequirePackage{hologo}
+\RequirePackage{graphicx}
+
+
+\documentclass{ltnews}
+
+\RequirePackage{url,csquotes}
+
+% \small already robust so better not ...
+%\expandafter
+%\DeclareRobustCommand\expandafter*\expandafter\small\expandafter{\small}
+
+\RequirePackage{hyperref}
+\hypersetup{colorlinks}
+\RequirePackage{bookmark}
+
+\makeatletter
+
+\newcounter{issue}
+\renewcommand*{\theissue}{%
+ \ifnum\value{issue}<10 0\fi
+ \number\value{issue}%
+}
+
+\newcommand*{\MonthJanuary}{01}
+\newcommand*{\MonthFebruary}{02}
+\newcommand*{\MonthMarch}{03}
+\newcommand*{\MonthApril}{04}
+\newcommand*{\MonthMay}{05}
+\newcommand*{\MonthJune}{06}
+\newcommand*{\MonthJuly}{07}
+\newcommand*{\MonthAugust}{08}
+\newcommand*{\MonthSeptember}{09}
+\newcommand*{\MonthOctober}{10}
+\newcommand*{\MonthNovember}{11}
+\newcommand*{\MonthDecember}{12}
+\newcommand*{\printissue}{%
+ Issue %
+ \texorpdfstring{\number\value{issue}}{\theissue}, %
+ \texorpdfstring{\@month\space\@year}{\@year/\@nameuse{Month\@month}}%
+}
+\let\l@part\l@section
+\let\l@section\l@subsection
+\let\l@subsection\l@subsubsection
+\let\l@subsubsection\l@paragraph
+\let\l@paragraph\l@subparagraph
+
+\newcommand*{\makefirsttitle}{%
+ \twocolumn[{%
+ \parbox[t][4\baselineskip]{\textwidth}{%
+ \@titlefont\@title, Issues 1--\lastissue
+ }%
+ }]%
+}
+
+% table of contents with underlined links
+\iffalse % disable if option colorlinks is used
+\@ifpackagelater{hyperref}{2006/06/01}{%
+ \newcommand*{\saved@tableofcontents}{}%
+ \let\saved@tableofcontents\tableofcontents
+ \renewcommand*{\tableofcontents}{%
+ \begingroup
+ \hypersetup{pdfborderstyle={/S/U/W 1}}%
+ \saved@tableofcontents
+ \endgroup
+ }%
+}{}
+\fi
+
+% -- provide command introduced in new release
+% so this typesets with an old format
+\DeclareTextCommandDefault\textcommabelow[1]
+ {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
+ \hbox{\check@mathfonts\fontsize\ssf@size\z@
+ \math@fontsfalse\selectfont,}\hidewidth}\egroup}
+\DeclareTextCommandDefault\textcommaabove[1]{%
+ \hmode@bgroup
+ \ooalign{%
+ \hidewidth
+ \raise.7ex\hbox{%
+ \check@mathfonts\fontsize\ssf@size\z@\math@fontsfalse\selectfont`%
+ }%
+ \hidewidth\crcr
+ \null#1\crcr
+ }%
+ \egroup
+ }
+
+\makeatother
+
+\begin{document}
+
+%%% Title and Table of Contents
+
+\makefirsttitle
+\pdfbookmark[0]{\contentsname}{toc}
+\tableofcontents
+\clearpage
+
+%%% Issues
+
+\begingroup
+ \makeatletter
+ \renewcommand*{\usepackage}[2][]{%
+ \begingroup
+ \def\x{#1|#2}%
+ \def\y{T1|fontenc}%
+ \ifx\x\y
+ \else
+ \def\y{|lmodern,url}%
+ \ifx\x\y
+ \else
+ \def\y{|lmodern,url,hologo}%
+ \ifx\x\y
+ \else
+ \def\y{|csquotes}%
+ \ifx\x\y
+ \else
+ \def\y{|graphicx}%
+ \ifx\x\y
+ \else
+ \@latex@error{ltnews.tex: \string\usepackage[#1]{#2} found}\@ehc
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \endgroup
+ }%
+ \renewcommand*{\documentclass}[2][]{%
+ \setcounter{footnote}{0}%
+ \gobbleopt
+ }%
+ \newcommand*{\gobbleopt}[1][]{}%
+ \let\org@twocolumn\twocolumn
+ \renewenvironment{document}{%
+ \clearpage
+ \ifnum\@issue=20 %
+ \addtocontents{toc}{\protect\setcounter{tocdepth}{5}}%
+ \addtocontents{toc}{%
+ \protect\makeatletter
+ }%
+ \addtocontents{toc}{%
+ \let\protect\saved@l@paragraph\protect\l@paragraph
+ }%
+ \addtocontents{toc}{%
+ \let\protect\l@paragraph\protect\l@subsection
+ }%
+ \fi
+ \ifnum\@issue=\lastissue\space
+ \addtocontents{toc}{%
+ \let\protect\l@paragraph\protect\saved@l@paragraph
+ }%
+ \def\toclevel@subsection{1}%
+ \def\toclevel@subsubsection{2}%
+ \addtocontents{toc}{\protect\setcounter{tocdepth}{4}}%
+ \renewcommand*{\tableofcontents}{%
+ \section*{\contentsname}%
+ \@starttoc{toc\lastissue}%
+ }%
+ \let\saved@addtocontents\addtocontents
+ \renewcommand*{\addtocontents}[2]{%
+ \saved@addtocontents{##1}{##2}%
+ \def\temp@toc{toc}%
+ \def\temp@param{##1}%
+ \ifx\temp@toc\temp@param
+ \saved@addtocontents{toc\lastissue}{##2}%
+ \fi
+ }%
+ \let\l@subsubsection\l@subsection
+ \let\l@subsection\l@section
+ \let\l@section\l@part
+ \let\l@part\@gobbletwo
+ \fi
+ \def\twocolumn[{%
+ \let\twocolumn\org@twocolumn
+ \org@twocolumn[%
+ {% because of optional argument of \twocolumn
+ \pdfbookmark[0]{\printissue}{issue\theissue}%
+ }%
+ \begingroup
+ \let\WriteBookmarks\relax
+ \@firstofone{% inside opt. arg. of \twocolumn: protect "]"
+ \renewcommand*{\Hy@writebookmark}[5]{}%
+ }%
+ \phantomsection
+ \addcontentsline{toc}{part}{\printissue}%
+ \endgroup
+ }%
+ }{%
+ \clearpage
+ }%
+ \makeatother
+ \loop
+ \ifnum\value{issue}<\lastissue
+ \stepcounter{issue}%
+ \input{ltnews\theissue}%
+ \repeat
+ \stepcounter{issue}%
+ \makeatletter
+ \IfFileExists{ltnews\theissue}{%
+ \@latex@error{\jobname.tex is out of date,\MessageBreak
+ there is `ltnews\theissue.tex'%
+ }\@ehc
+ }{}%
+ \makeatother
+\endgroup
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews01.pdf b/macros/latex-dev/base/ltnews01.pdf
new file mode 100644
index 0000000000..365827c623
--- /dev/null
+++ b/macros/latex-dev/base/ltnews01.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews01.tex b/macros/latex-dev/base/ltnews01.tex
new file mode 100644
index 0000000000..9df213931f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews01.tex
@@ -0,0 +1,152 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews01.tex
+
+% This is issue 1 of LaTeX News.
+
+\documentclass
+% [type1fonts]
+ {ltnews}
+
+\publicationmonth{June}
+\publicationyear{1994}
+\publicationissue{1}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews}
+
+An issue of \emph{\LaTeXNews} will accompany every future release of
+\LaTeX. It will tell you about important events, such as major bug
+fixes, newly available packages, or any other \LaTeX{} news.
+
+\section{\LaTeXe---the new \LaTeX{} release}
+
+The most important news is the release of \LaTeXe, the new version of
+the \LaTeX{} software. This version has better support for fonts,
+graphics and colour, and will be actively maintained by the \LaTeX3
+project team. Upgrades will be issued every six months, in June and
+December.
+
+\section{Why a new \LaTeX?}
+
+Over the years many extensions have been developed for \LaTeX. This
+is, of course, a sure sign of its continuing popularity but it has had
+one unfortunate result: incompatible \LaTeX{} formats came into use at
+different sites. Thus, to process documents from various places, a
+site maintainer was forced to keep \LaTeX{} (with and without \NFSS),
+\SLiTeX, \AmSLaTeX, and so on. In addition, when looking at a source
+file it was not always clear for which format the document was written.
+
+To put an end to this unsatisfactory
+situation a new release of \LaTeX{} was produced.
+It brings all such extensions back under a single format and thus
+prevents the proliferation of mutually incompatible dialects of
+\LaTeX~2.09. The new release was available for several months as a
+test version, and the final release of 1~June officially
+replaces the old version.
+
+\section{Processing documents with \LaTeXe}
+
+Documents written for \LaTeX~2.09 will
+still be read by \LaTeXe. Any such document is run in
+\emph{\LaTeX~2.09 compatibility mode}.
+
+Unfortunately, compatibility mode comes with a price: it can run
+up to 50\% slower than \LaTeX~2.09 did. If you want to run your document
+in the faster \emph{native mode}, you should try replacing the line:
+\begin{verbatim}
+ \documentstyle[<options>,<packages>]{<class>}
+\end{verbatim}
+with:
+\begin{verbatim}
+ \documentclass[<options>]{<class>}
+ \usepackage{latexsym,<packages>}
+\end{verbatim}
+Unfortunately, this will not always work, because some \LaTeX~2.09
+packages will only work in \LaTeXe{} compatibility mode. You should find
+out if there is a \LaTeXe{} version of the package available.
+
+\LaTeXe{} native mode also gives access to the new features of \LaTeXe,
+described in \emph{\LaTeXe{} for authors}.
+
+\section{New packages}
+
+\LaTeXe{} has much better support for graphics, colour, fonts, and
+multi-lingual typesetting. The following software should be available
+from the distributor who brought you \LaTeXe:
+
+\begin{citations}
+\item[babel] for typesetting in many languages.
+\item[color] for colour support.
+\item[graphics] for including images.
+\item[mfnfss] for using bitmap fonts.
+\item[psnfss] for using Type~1 fonts.
+\item[tools] other packages by the \LaTeX3 team.
+\end{citations}
+The packages come with full documentation, and are also described in
+\emph{\LaTeX: A Document Processing System} or
+\emph{The \LaTeX{} Companion}.
+
+\section{Further information}
+
+More information about \LaTeXe{} is to be found in:
+
+\begin{citations}
+\item[\LaTeX: A Document Preparation System]
+ Leslie Lamport, \AW, 2nd ed, 1994.
+\item[The \LaTeX{} Companion]
+ Goossens, Mittelbach and Samarin, \AW, 1994.
+\end{citations}
+The \LaTeX{} distribution comes with documentation on the new features of
+\LaTeX:
+
+\begin{citations}
+\item[\LaTeXe{} for authors]
+ describes the new features of \LaTeX{} documents,
+ in the file \verb|usrguide.tex|.
+\item[\LaTeXe{} for class and package writers]
+ describes the new features of \LaTeX{} classes and packages,
+ in the file \verb|clsguide.tex|.
+\item[\LaTeXe{} font selection]
+ describes the new features of \LaTeX{} fonts for
+ class and package writers,
+ in the file \verb|fntguide.tex|.
+\end{citations}
+For more information on \TeX{} and \LaTeX, get in touch with your local
+\TeX{} Users Group, or the international \TeX{} Users Group,
+P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358,
+EMail:~tug@tug.org.
+
+\end{document}
+
+
+
diff --git a/macros/latex-dev/base/ltnews02.pdf b/macros/latex-dev/base/ltnews02.pdf
new file mode 100644
index 0000000000..38eede9d40
--- /dev/null
+++ b/macros/latex-dev/base/ltnews02.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews02.tex b/macros/latex-dev/base/ltnews02.tex
new file mode 100644
index 0000000000..ee386cb2e0
--- /dev/null
+++ b/macros/latex-dev/base/ltnews02.tex
@@ -0,0 +1,154 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews02.tex
+
+% This is issue 2 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+\publicationmonth{December}
+\publicationyear{1994}
+\publicationissue{2}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews~2}
+
+An issue of \emph{\LaTeXNews} will accompany every future release of
+\LaTeX. It will tell you about important events, such as major bug
+fixes, newly available packages, or any other \LaTeX{} news.
+
+\section{December 1994 release of \LaTeX}
+
+December 1994 sees the second release of \LaTeXe. We are on schedule
+to deliver a release of \LaTeX{} every six months, in December and
+June.
+
+This release has seen quite a lot of activity, which is not too
+surprising as it's only been a year since the first test release of
+\LaTeXe. We don't expect so much activity in the next six months.
+
+Many of the changes are minor improvements and bug-fixes---see
+\emph{\LaTeXe{} for authors} (\verb|usrguide.tex|), \emph{\LaTeXe{}
+font selection} (\verb|fntguide.tex|) and our change log
+(\verb|changes.txt|) for more details.
+
+However, there are two important new packages available for \LaTeX:
+\texttt{inputenc} and AMS-\LaTeX.
+
+\section{Accented input}
+
+One of the problems with writing non-English documents in \LaTeX{} is
+the accent commands. Reading documents containing text like
+\verb|na\"\i ve| is frustrating, especially if your keyboard allows
+you to type \texttt{na\"\i ve}.
+
+In the past, \LaTeX{} has not supported input containing accented
+characters such as \texttt{\"\i}, because Windows, Macintosh and Unix
+all have different ways of dealing with accented input, called
+\emph{input encodings}.
+
+However, the \verb|inputenc| package allows you to specify which input
+encoding your document is written with, for example to use the ISO
+Latin-1 encoding, you type:
+\begin{verbatim}
+ \usepackage[latin1]{inputenc}
+\end{verbatim}
+At the moment, \verb|inputenc| supports the \verb|ascii| and
+\verb|latin1| input encodings, but more will be added with future
+releases.
+
+The \verb|inputenc| package is
+currently a test release. The user interface for the full release will
+be upwardly compatible with the test version.
+
+\section{AMS-\LaTeX{}}
+
+ AMS-\LaTeX{} is a set of miscellaneous extensions for \LaTeX{}
+ distributed by the American Mathematical Society. They provide superior
+ information structure and superior printed output for mathematical
+ documents.
+
+ There are far too many features of AMS-\LaTeX{} to list here.
+ AMS-\LaTeX{} is described in the accompanying documentation,
+ and in \emph{The \LaTeX{} Companion}.
+
+ Version 1.2beta of AMS-\LaTeX{} was released for testing by intrepid
+ users in October 1994. The full release of AMS-\LaTeX{}~1.2 is expected
+ in early January 1995.
+
+ It will be divided into two bundles:
+ \begin{itemize}
+
+ \item the \verb|amsfonts| packages, which give access to
+ hundreds of new mathematical symbols, and new math fonts
+ such as blackboard bold and fraktur.
+
+ \item the \verb|amsmath| packages, which provide finer control over
+ mathematical typesetting, such as multi-line subscripts,
+ enhanced theorem and proof environments,
+ and improved displayed equations,
+
+ \end{itemize}
+ For compatibility with older documents, an \verb|amstex| package will be
+ provided.
+
+\section{\LaTeX{} on the internet}
+
+\LaTeX{} has its own home page on the World Wide Web, with the URL:
+\begin{verbatim}
+ http://www.tex.ac.uk/CTAN/latex/
+\end{verbatim}
+This page describes \LaTeX{} and the \LaTeX3 project, and contains
+pointers to other \LaTeX{} resources, such as the user guides, the
+\TeX{} Frequently Asked Questions, and the \LaTeX{} bugs database.
+
+The electronic home of anything \TeX-related is the Comprehensive
+\TeX{} Archive Network (CTAN). This is a network of cooperating ftp
+sites, with over a gigabyte of \TeX{} material:
+\begin{verbatim}
+ ftp://ftp.tex.ac.uk/tex-archive/
+ ftp://ftp.shsu.edu/tex-archive/
+ ftp://ftp.dante.de/tex-archive/
+\end{verbatim}
+For more information, see the \LaTeX{} home page.
+
+\section{Further information}
+
+For more information on \TeX{} and \LaTeX, get in touch with your local
+\TeX{} Users Group, or the international \TeX{} Users Group,
+P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358,
+EMail:~tug@tug.org.
+
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews03.pdf b/macros/latex-dev/base/ltnews03.pdf
new file mode 100644
index 0000000000..b133016eb8
--- /dev/null
+++ b/macros/latex-dev/base/ltnews03.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews03.tex b/macros/latex-dev/base/ltnews03.tex
new file mode 100644
index 0000000000..8784c3b8e0
--- /dev/null
+++ b/macros/latex-dev/base/ltnews03.tex
@@ -0,0 +1,145 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews03.tex
+
+% This is issue 3 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+\publicationmonth{June}
+\publicationyear{1995}
+\publicationissue{3}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews~3}
+
+An issue of \emph{\LaTeXNews} will accompany every future release of
+\LaTeX. It will tell you about important events, such as major bug
+fixes, newly available packages, or any other \LaTeX{} news.
+
+\section{June 1995 release of \LaTeX}
+
+June 1995 sees the third release of \LaTeXe. We are on schedule
+to deliver a release of \LaTeX{} every six months, in December and
+June.
+
+In the last \emph{\LaTeXNews}, we said ``we don't expect so much
+activity in the next six months,'' which has turned out not to be
+true!
+
+\section{Additional input encodings}
+
+In the last release of \LaTeX{} we distributed a test version of the
+\texttt{inputenc} package which allows the use of input characters
+other than just a--z and A--Z. The package has proved to be robust,
+so we are now distributing an expanded version.
+The new release comes with a number of input encodings:
+
+\begin{itemize}
+\item \texttt{ascii} the standard encoding,
+\item \texttt{latin1} the ISO Western European alphabet,
+\item \texttt{latin2} the ISO Eastern European alphabet,
+\item \texttt{cp437} the IBM codepage 437,
+\item \texttt{cp850} the IBM codepage 850, and
+\item \texttt{applemac} the Apple Macintosh encoding.
+\end{itemize}
+These can be used by specifying an option to the \texttt{inputenc}
+package, for example:
+\begin{verbatim}
+ \usepackage[latin1]{inputenc}
+\end{verbatim}
+The new input encodings are currently being tested, but we don't
+expect any major changes.
+
+\section{\LaTeX\ getting smaller}
+
+In the past releases of \LaTeXe, the amount of memory \LaTeX{}
+requires has increased, but we are pleased to say that this trend has
+been reversed. We hope that future releases of \LaTeX{} will continue
+to get smaller.
+
+For example, on this document, the December 1994 release used 52,622
+words of memory, and the June 1995 release uses 51,216 words of
+memory, which is a 2.7\% reduction.
+
+We are currently experimenting with other ways of reducing the size of
+\LaTeX. For example, we are experimenting with an option to remove
+the \texttt{picture} and \texttt{tabbing} environments from the
+\LaTeX{} kernel, and to load them from a file the first time they are
+used. This should help \LaTeX{} to run on machines with limited
+memory. See \texttt{autoload.txt} for details.
+
+\section{Distribution and modification}
+
+One topic of discussion that has kept us busy is the distribution and
+modification conditions of \LaTeX. We are committed to keeping
+\LaTeX{} as free reliable software, and ensuring that (as far as
+possible) \LaTeX{} documents will produce the same results on all
+systems.
+
+The modification conditions are currently under discussion, and we
+would like to hear from anyone interested. Please read
+\texttt{modguide.tex} for more information.
+
+\section{AMS-\LaTeX\ full release}
+
+The AMS-\LaTeX\ packages were still in beta test in the December 1994
+release of \LaTeX, and the full release came out in January 1995.
+
+AMS-\LaTeX\ is described in the \emph{User's Guide}
+(\texttt{amsldoc.tex}) and in \emph{The \LaTeX{} Companion}.
+
+\section{PostScript fonts}
+
+There is a new test release of the PSNFSS packages for accessing
+PostScript fonts in \LaTeXe. This includes an update to all of the
+fonts, to remove many of the underfull and overfull \verb|\hbox|
+warnings, and improve the setting of non-English languages.
+
+The new release of \LaTeX{} removes all of the `hidden' uses of
+Computer Modern mathematics. For example, the footnote markers used
+to use math mode, so always used Computer Modern digits rather than
+ones from the current text font. This has now been fixed.
+
+\section{Further information}
+
+For more information on \TeX{} and \LaTeX, get in touch with your local
+\TeX{} Users Group, or the international \TeX{} Users Group,
+P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358,
+EMail:~tug@tug.org.
+
+The \LaTeX{} home page is \verb|http://www.tex.ac.uk/ctan/latex/|
+and contains links to other WWW resources for \LaTeX.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews04.pdf b/macros/latex-dev/base/ltnews04.pdf
new file mode 100644
index 0000000000..0b29d3441d
--- /dev/null
+++ b/macros/latex-dev/base/ltnews04.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews04.tex b/macros/latex-dev/base/ltnews04.tex
new file mode 100644
index 0000000000..b42e10da57
--- /dev/null
+++ b/macros/latex-dev/base/ltnews04.tex
@@ -0,0 +1,143 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews04.tex
+
+% This is issue 4 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+
+\publicationmonth{December}
+\publicationyear{1995}
+\publicationissue{4}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews~4}
+
+An issue of \emph{\LaTeXNews} will accompany every future release of
+\LaTeX. It will tell you about important events, such as major bug
+fixes, newly available packages, or any other \LaTeX{} news.
+This issue accompanies the fourth release of \LaTeXe.
+
+
+\section{\LaTeX\ getting smaller}
+
+The last release in June started a trend of \LaTeX\ becoming
+smaller, we are pleased to announce that this has continued with this
+release. In particular the experimental `autoload' version described in
+\texttt{autoload.txt} is much smaller as more parts of \LaTeX\ are
+autoloaded.
+
+\section{New `concurrent' docstrip}
+
+The time taken to `unpack' this release from the documented sources
+should be much reduced (roughly half the time, depending on
+installation conditions). This is due to an improved version of the
+docstrip program that has been contributed by Marcin Woli\'nski.
+This can write up to 16 files at once. The
+previous version could only write one file at a time which meant that
+it was very slow when producing many small files from the same source
+file as the source needed to be re-read for each file written.
+
+\section{New T1 encoded fonts}
+
+This year J\"org Knappen has completed a new release of the `Cork'
+(T1) encoded Computer Modern fonts: the dc fonts release 1.2.
+
+This release of the dc fonts fixes many bugs (including the missing
+\verb|?`| (?`) and \verb|!`| (!`) ligatures) and improves the fonts in
+many other ways. It is strongly recommended that you upgrade as soon as
+possible if currently you are using the old dc fonts, release 1.1 or
+earlier. The new fonts are available from the CTAN archives, in
+\texttt{tex-archive/fonts/dc}.
+
+The names of the font files are \emph{different}. This does not affect
+\LaTeX\ documents but \emph{does} affect the installation procedure as
+it assumes that you have the \emph{new} fonts, and will write suitable
+`fd' files for those fonts. If you have not yet upgraded your dc fonts
+then, after unpacking the distribution, you \emph{must}
+\verb|latex olddc.ins| to produce `fd' files for the old dc fonts.
+This must be done \emph{before} the format is made. Running the test
+document at \texttt{ltxcheck.tex} the end of the installation will
+inform you if the wrong set of `fd' files has been installed.
+
+Note that this change does not affect the standard `OT1' Computer
+Modern fonts that \LaTeX\ uses by default.
+
+\section{More robust commands}
+
+The commands \verb|\cite| and \verb|\sqrt| are now robust.
+
+Although most commands with optional arguments are fragile, as
+documented, such commands defined using the second optional argument
+of \verb|\newcommand| and its derivatives are now \emph{robust}.
+
+\section{New Interface to building `extension' classes}
+
+The mechanism provided by \verb|\DeclareOption|, \verb|\ProcessOptions|
+and \verb|\LoadClass| has proved to be a powerful and expressive means
+of defining one class in terms of another `base' class. However there
+have been some requests to simplify the declaration of the common case
+where you want the `base' class to be called with \emph{all} the
+options that were specified to the extension class. This is now
+provided by the new command \verb|\LoadClassWithOptions|. A similar
+command \verb|\RequirePackageWithOptions| is provided for package use.
+More details of this feature are provided in \texttt{clsguide.tex} and
+\texttt{ltclass.dtx}.
+
+\section{More Input Encodings}
+
+The experimental \texttt{inputenc} package allows a more natural style
+of input of accented and other characters.
+
+Three new input encodings are now supported.
+\begin{itemize}
+\item \texttt{ansinew} the Windows ansi encoding,
+ as used in Microsoft Windows 3.x.
+\item \texttt{cp437de} a variant of \texttt{cp437}, which uses \ss\
+ rather than $\beta$ in the appropriate slot.
+\item \texttt{next} the encoding used on Next computers.
+\end{itemize}
+
+\section{Further information}
+
+For more information on \TeX{} and \LaTeX, get in touch with your local
+\TeX{} Users Group, or the international \TeX{} Users Group,
+1850 Union Street, \#1637, San Francisco, CA~94123, USA,
+Fax:~+1~415~982~8559,
+EMail:~tug@tug.org.
+The \LaTeX{} home page is \verb|http://www.tex.ac.uk/ctan/latex/|
+and contains links to other WWW resources for \LaTeX.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews05.pdf b/macros/latex-dev/base/ltnews05.pdf
new file mode 100644
index 0000000000..b6f50612d4
--- /dev/null
+++ b/macros/latex-dev/base/ltnews05.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews05.tex b/macros/latex-dev/base/ltnews05.tex
new file mode 100644
index 0000000000..dfa9e23d78
--- /dev/null
+++ b/macros/latex-dev/base/ltnews05.tex
@@ -0,0 +1,158 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews05.tex
+
+% This is issue 5 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{1996}
+\publicationissue{5}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews~5}
+This issue of \emph{\LaTeXNews} accompanies the fifth release of the
+new standard \LaTeX{}, \LaTeXe.
+
+\section{Extra possibilities for section headings}
+Most \LaTeX\ sectioning commands are defined using
+\verb|\@startsection|.
+For example, the \textsf{article} class defines:
+\begin{small}
+\begin{verbatim}
+\newcommand\section{\@startsection
+ {section}{1}{0pt}{-3.5ex plus-1ex minus-.2ex}%
+ {2.3ex plus.2ex}{\normalfont\Large\bfseries}}
+\end{verbatim}
+\end{small}
+The last argument specifies the style in which the section heading is
+to be typeset.
+
+The new feature added at this release is that at the \emph{end} of
+this argument you may specify a command that \emph{takes an argument}.
+This command will be applied to the section number and heading.
+For example, one could use the \verb|\MakeUppercase| command to
+produce uppercase headings. A package or class file could contain:
+\begin{small}
+\begin{verbatim}
+\renewcommand\section{\@startsection
+ {section}{1}{0pt}{-3.5ex plus-1ex minus-.2ex}%
+ {2.3ex plus.2ex}{\normalfont\Large\MakeUppercase}}
+\end{verbatim}
+\end{small}
+to produce section headings using uppercase medium weight text, rather
+than the bold text used by \textsf{article}. Note that, like the font
+choice, the uppercasing applies only to the actual heading (including
+any automatically generated section number), not to the text as it may
+appear in the running head or table of contents.
+
+\section{The `openany' option in the `book' class}
+The \textsf{openany} option allows chapter and similar openings to
+occur on left hand pages. Previously this option only affected
+\verb|\chapter| and \verb|\backmatter|. It now also affects
+\verb|\part|, \verb|\frontmatter| and \verb|\mainmatter|.
+
+\section{More font (output) encodings}
+The font encoding name \texttt{T3} has been allocated to the encoding
+used in the new 256-character \textsc{IPA} fonts (for the phonetic
+alphabet) produced by Rei Fukui. His package, \textsf{tipa},
+gives access to these fonts and should soon be available. (The
+encoding named \texttt{OT3} is the 128-character encoding used in the
+\textsc{IPA} fonts produced by Washington State University.)
+
+
+
+\section{More input encodings supported}
+The \textsf{inputenc} package now supports the IBM codepage~852 used
+in Eastern Europe, with the option~\texttt{[cp852]} contributed by
+Petr~Sojka.
+
+Also, the \textsf{inputenc} package now activates most `control codes'
+with \textsc{ascii} values below 32.
+Currently none of the encodings in the standard distribution makes use
+of these positions.
+
+\section{Fixes and improvements}
+The \LaTeX\ kernel has only had minor changes, apart from
+\verb|\@startsection| mentioned above.
+However, some small fixes have been incorporated removing the
+following problems:
+
+\begin{itemize}
+\item
+ In tabular and array, previous versions of \LaTeX\ `lost' the
+ inter-column space from an `\texttt{l}'-column, when that column
+ was completely empty.
+
+\item
+ Previously, the use of the \verb|\nofiles| command could change
+ the \emph{vertical spacing} in a document.\\ A side effect of fixing
+ this is that when \verb|\nofiles| is used, \verb|\label| puts a
+ blank line in the log file.
+
+\item
+ \LaTeX~often loads fonts `on demand'. Previously, this could
+ happen inside the argument of an accent command and this would
+ cause the accent to appear in the wrong place.
+
+\end{itemize}
+
+\section{Changes to the `tools' packages}
+
+\begin{itemize}
+\item
+ The \textsf{longtable} package now uses a modified algorithm,
+ contributed by David Kastrup, to align the `chunks' of a table.
+ It is now unnecessary to edit the document to add
+ \verb|\setlongtables| before the final run of \LaTeX.
+ In certain cases of overlapping \verb|\multicolumn| entries, the new
+ algorithm will produce better column widths than the old (at the
+ price of extra passes through \LaTeX).
+
+\item
+ The \textsf{dcolumn} package now has the extra possibility of
+ specifying the number of digits both \emph{before} and after the
+ `decimal point'. This makes it easy to centre the column of numbers
+ under a wide heading.
+\end{itemize}
+
+\section{New copy of the \LaTeX\ bug database}
+\verb|http://www.tex.ac.uk/ctan/latex/bugs.html| will soon have links
+to a copy of the searchable \LaTeX\ bugs database at Mainz (Germany)
+as well as the original copy at Sussex (England).
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews06.pdf b/macros/latex-dev/base/ltnews06.pdf
new file mode 100644
index 0000000000..e9cf712595
--- /dev/null
+++ b/macros/latex-dev/base/ltnews06.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews06.tex b/macros/latex-dev/base/ltnews06.tex
new file mode 100644
index 0000000000..250675ea2e
--- /dev/null
+++ b/macros/latex-dev/base/ltnews06.tex
@@ -0,0 +1,149 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews06.tex
+
+% This is issue 6 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{1996}
+\publicationissue{6}
+
+\begin{document}
+
+\maketitle
+
+\section{Welcome to \LaTeXNews~6}
+This issue of \emph{\LaTeXNews} accompanies the sixth release of the
+new standard \LaTeX{}, \LaTeXe.
+
+\section{Mono-case file names}
+Previously \LaTeX\ has used some files with `mixed-case' file names
+such as \texttt{T1cmr.fd} and \texttt{T1enc.def}.
+
+These file names cause problems on some systems (in particular they
+are illegal on the ISO 9660 CDROM format) and so in this release
+all file names have been made lowercase (for example
+\texttt{t1cmr.fd} and \texttt{t1enc.def}).
+
+This change should \emph{not} affect any document. Within \LaTeX,
+encodings still have the usual uppercase names in uses such as
+\verb|\usepackage[T1]{fontenc}| and \verb|\fontencoding{T1}|.
+\LaTeX\ will automatically convert to the lowercase form while
+constructing the file name.
+\LaTeX\ will input the `fd' file under the old name if it fails to
+find the file with the new name, so existing collections of fd files
+should still work with this new release.
+
+The change \emph{does} affect the configuration files that may be used
+to make the \LaTeX\ format with initex. For example, the file
+\texttt{fonttext.ltx} previously specified \verb|\input{T1cmr.fd}|.
+It now has \verb|\input{t1cmr.fd}|.
+If you use a local file \texttt{fonttext.cfg}
+you will need to make similar changes, as \verb|\input{T1cmr.fd}|
+will not work as \texttt{T1cmr.fd} is no longer in the distribution.
+
+The files affected by this change all have names of the form
+\verb|*.fd| or \verb|*enc.def|.
+
+\section{Another input encoding}
+Thanks to work by S\o ren Sandmann, the \textsf{inputenc} package now
+supports the IBM codepage~865 used in Scandinavia.
+
+\section{Better user-defined math display environments}
+Suppose that you want to define an environment for displaying text
+that is numbered as an equation. A straightforward way to do this is
+as follows:
+\begin{verbatim}
+ \newenvironment{texteqn}
+ {\begin{equation}
+ \begin{minipage}{0.9\linewidth}}
+ {\end{minipage}
+ \end{equation}}
+\end{verbatim}
+However, if you have tried this then you will probably have noticed
+that it does not work perfectly when used in the middle of a paragraph
+because an inter-word space appears at the beginning of the first
+line after the environment.
+
+There is now an extra command (with a very long name) available that
+you can use to avoid this problem; it should be inserted as shown here:
+\begin{verbatim}
+ \newenvironment{texteqn}
+ {\begin{equation}
+ \begin{minipage}{0.9\linewidth}}
+ {\end{minipage}
+ \end{equation}
+ \ignorespacesafterend}
+\end{verbatim}
+
+\section{Docstrip improvements}
+The \textsf{docstrip} program that is used to unpack the \LaTeX\
+sources has undergone further development. The new version should be
+able to process all old `batchfiles' but it allows a simpler syntax in
+new `batchfiles' (no need to define \verb|\def\batchfile{|\ldots).
+
+It also allows `target' directories to be specified when writing
+files. This directory support is disabled by default unless activated
+in a local \texttt{docstrip.cfg} configuration file.
+See \texttt{docstrip.dtx} for details.
+
+\section{AMS \LaTeX\ update}
+Since the last \LaTeX\ release in June, the American Mathematical
+Society have re-issued the `AMS\LaTeX' classes and packages, fixing
+several reported problems.
+
+\section{Graphics package update}
+The \LaTeX\ color and graphics packages have been updated slightly,
+principally to support more dvi drivers, see the readme file in the
+\textsf{graphics} distribution.
+
+\section{EC Fonts released}
+The first release of the Extended Computer Modern fonts has just been
+made. (In January 1997.)
+
+This release of \LaTeX\ does \emph{not} default to these `ec' fonts
+as its T1 encoded fonts. By default it will
+use the `dc' fonts if the T1 encoding is requested.
+
+As noted in \texttt{install.txt} you may run \TeX\ on the install file
+\texttt{ec.ins} \emph{after} unpacking the base distribution but
+\emph{before} making the \LaTeX\ format. This will produce
+suitable `fd' files making \LaTeX\ (including, for the first time, the
+\textsf{slides} class) use the `ec' fonts as the default T1 encoded
+font set.
+
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews07.pdf b/macros/latex-dev/base/ltnews07.pdf
new file mode 100644
index 0000000000..4537142858
--- /dev/null
+++ b/macros/latex-dev/base/ltnews07.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews07.tex b/macros/latex-dev/base/ltnews07.tex
new file mode 100644
index 0000000000..6c08629d67
--- /dev/null
+++ b/macros/latex-dev/base/ltnews07.tex
@@ -0,0 +1,146 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews07.tex
+
+% This is issue 7 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{1997}
+\publicationissue{7}
+
+\begin{document}
+
+\maketitle
+
+\section{T1 encoded Computer Modern fonts}
+As in the last release the base \LaTeX\ distribution contains
+three different sets of `fd' files for T1 encoded fonts.
+
+In this release the default installation uses \texttt{ec.ins}
+and so installs files suitable for the current `EC fonts'
+distribution. If you have still not updated to the EC fonts and
+are using the earlier test versions, known as DC then you should
+unpack \texttt{newdc.ins} (for DC release 1.2 or later) or
+\texttt{olddc.ins} (for the original releases of the DC fonts).
+This should be done after unpacking \texttt{unpack.ins} but
+before making the format by running ini\TeX{} on \texttt{latex.ltx}.
+There are further details in \texttt{install.txt}.
+
+
+\section{T1 encoded Concrete fonts}
+The Metafont sources for T1 encoded `Concrete' fonts have been
+removed from the \textsf{mfnss} distribution as they were based
+on the now obsolete DC fonts release 1.1. Similarly the
+\textsf{cmextra.ins} install file in the \textsf{base} distribution no
+longer generates fd files for the `Concrete' fonts.
+To use these fonts in either T1 or OT1 encoding it is
+recommended that you obtain Walter Schmidt's \textsf{ccfonts} package
+and fonts from CTAN \texttt{macros/latex/contrib/supported/ccfonts}.
+
+
+\section{Further input encodings}
+Two more \textsf{inputenc} packages have been added: for latin5,
+thanks to H. Turgut Uyar; and for latin3, thanks to J\"org Knappen.
+
+
+\section{Normalising spacing after punctuation}
+The command \verb|\normalsfcodes| was introduced at the last patch
+release. This is normally given the correct definition automatically
+and so need not be explicitly set. It is used to correct a problem,
+reported by Donald Arseneau, that punctuation in page headers has
+always (in all known \TeX\ formats) been potentially incorrect if the
+page break happens while a local setting of the space codes (for
+instance by the command \verb|\frenchspacing|) is in effect. A common
+example of this happening in \LaTeX\ is in the \textsf{verbatim}
+environment.
+
+
+\section{Accessing Bold Math Symbols}
+The \textsf{tools} distribution contains a new package, \textsf{bm},
+which defines a command \verb|\bm| that allows individual bold symbols
+to be accessed within a math expression (in contrast to
+\verb|\boldmath| which makes whole math expressions default to bold
+fonts). It is more general than the existing \textsf{amsbsy} package;
+however, to ease the translation of documents between these two
+packages, \textsf{bm} makes \verb|\boldsymbol| an alias for
+\verb|\bm|.
+
+This package was previously made available from the `contrib' area of
+the CTAN archives, and as part of Y\&Y's \LaTeX\ support for the
+MathTime fonts.
+
+
+\section{Policy on standard classes}
+
+Many of the problem reports we receive concerning the standard classes
+are not concerned with bugs but are suggesting, more or less politely,
+that the design decisions embodied in them are `not optimal' and
+asking us to modify them.
+
+There are several reasons why we have decided not to make such changes
+to these files.
+\begin{itemize}
+\item
+ However misguided, the current behaviour is clearly what was
+ intended when these classes were designed.
+\item
+ It is not good practice to change such aspects of `standard classes'
+ because many people will be relying on them.
+\end{itemize}
+
+We have therefore decided not to even consider making such
+modifications, nor to spend time justifying that decision. This does
+not mean that we do not agree that there are many deficiencies in the
+design of these classes, but we have many tasks with higher priority
+than continually explaining why the standard classes for \LaTeX{}
+cannot be changed.
+
+We would, of course, welcome the production of better classes, or of
+packages that can be used to enhance these classes.
+
+
+\section{New addresses for TUG}
+For information about joining the \TeX{} Users Group, and about lots
+of other \LaTeX-related matters, please contact
+them at their new address:
+\begin{quote}\small
+ \TeX{} Users Group, P.O. Box 1239,\\
+ Three Rivers, CA~93271-1239, USA\\
+ Fax:~+1~209~561~4584\\
+ E-mail: \texttt{tug@mail.tug.org}\\
+ URL: \texttt{http://www.tug.org/}
+\end{quote}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews08.pdf b/macros/latex-dev/base/ltnews08.pdf
new file mode 100644
index 0000000000..0c20b376fb
--- /dev/null
+++ b/macros/latex-dev/base/ltnews08.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews08.tex b/macros/latex-dev/base/ltnews08.tex
new file mode 100644
index 0000000000..891d13b302
--- /dev/null
+++ b/macros/latex-dev/base/ltnews08.tex
@@ -0,0 +1,154 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews08.tex
+
+% This is issue 8 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{1997}
+\publicationissue{8}
+
+\begin{document}
+
+\maketitle
+
+\section{New supported font encodings}
+
+Two new font encodings are supported as options to the \textsf{fontenc}
+package:
+\begin{description}
+\item [OT4]
+This is a seven-bit encoding designed for Polish. The \LaTeX\ support
+was developed by Mariusz Olko.
+\item [TS1] This is the `Text Companion Encoding'; it contains symbols
+designed to be used in text, as opposed to mathematical formulas, and
+some accents designed for uppercase letters. It is currently
+supported by the `tc' fonts, which match the T1 encoded `ec' text
+fonts. A subset of the glyphs in this encoding is supported by
+virtual fonts distributed with the PostScript font metrics on the
+\textsc{ctan} archives. (This is the `8c' encoding in Karl Berry's
+fontname scheme.) The \textsf{textcomp} package provides access to
+this encoding but here is a warning to current users of that package:
+some of the internal names for the characters have changed.
+\end{description}
+
+
+\section{New input encodings}
+
+These additions to the \textsf{inputenc} package are
+\texttt{decmulti} (the DEC Multinational
+Character Set, contributed by M.~Y.~Chartoire)
+and \texttt{cp1250} (an MS-Windows encoding for Central and Eastern
+Europe, contributed by Marcin Woli\'nski). There is also a
+\texttt{cp1252} encoding that is identical to \texttt{ansinew}.
+
+
+\section{Tools}
+
+The \textsf{calc} package (used in many examples in \emph{The \LaTeX\
+Companion}) has been contributed to this distribution by Kresten Krab
+Thorup and Frank Jensen. This is essentially the same as the version
+that has been available from the \textsc{ctan} archives for some time,
+with one minor change: to use \LaTeX-style error messages. It enables
+the use of arithmetic expressions within arguments to standard
+\LaTeX{} commands where a length or a counter value is required. For
+example:
+\begin{verbatim}
+ \setcounter {page} { \value{page} * 2 + 1 }
+ \parbox { 3in - ( 2mm + \textwidth / 9 ) }
+\end{verbatim}
+
+There have also been some improvements to several other packages in
+this collection. In particular, \textsf{bm} now works correctly with
+constructions such as \verb|\bm{f'}| involving \texttt{'} or other
+characters which use \TeX's special ``\verb|\mathcode"8000|''
+feature. Also, \textsf{multicol} sets the length \verb|\columnwidth|
+to an appropriate value; this enables it to work with classes that
+support two-column setting, e.g.,~the AMS classes.
+
+
+\section{Graphics}
+
+The special \verb|oztex.def| driver file has been removed, and Oz\TeX\
+support has been merged with dvips, following advice from
+Andrew Trevorrow about Oz\TeX~3.x.
+
+The \textsf{keyval} package has had some internal improvements: to
+use \LaTeX\ format error messages; and to avoid `\verb|#| doubling'.
+This latter change means that the \verb|command| key for the
+\textsf{graphicx} version of \verb|\includegraphics| should now be used
+with one \verb|#| rather than two. For example, \verb|command = `gunzip #1|.
+Fortunately this key is almost never used in practice, so few if any
+documents should be affected by this change.
+
+
+\section{\LaTeX3 experimental programming conventions}
+
+As announced at the \TeX\ Users Group meeting (Summer 1997), a group of
+highly experimental packages will soon be released to allow experienced\\
+\TeX\ programmers to experiment with, and comment on, a proposed set
+of syntax conventions and basic data-types that might form
+the basis for programming large scale projects in \TeX.
+They will be located in\\
+this CTAN directory:
+\begin{verbatim}
+ CTAN:macros/latex/packages/expl3
+\end{verbatim}
+The documentation of this material is as follows: individual package
+files provide outline, draft documentation; there is an article that
+gives an overview of the syntax and related concepts; there is a
+\texttt{readme.txt} file containing a brief description of the
+collection.
+
+All aspects of these packages are liable, indeed likely, to change.
+They should not be used at this stage for anything
+that requires a stable system. However, we do encourage people to
+experiment with these packages, and to send comments on them to the
+\texttt{LaTeX-L} mailing list.
+To subscribe to this list, mail to:
+\begin{verbatim}
+ listserv@urz.uni-heidelberg.de
+\end{verbatim}
+the following one line message:
+\begin{verbatim}
+ subscribe LATEX-L <<first-name>> <<second-name>>
+\end{verbatim}
+
+% Revert to this if gets too full.
+% See \texttt{modguide.tex} for
+% information on how to subscribe to \texttt{LaTeX-L}.
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews09.pdf b/macros/latex-dev/base/ltnews09.pdf
new file mode 100644
index 0000000000..54635ff25f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews09.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews09.tex b/macros/latex-dev/base/ltnews09.tex
new file mode 100644
index 0000000000..61cb8ced9c
--- /dev/null
+++ b/macros/latex-dev/base/ltnews09.tex
@@ -0,0 +1,142 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews09.tex
+
+% This is issue 9 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}[1999/02/23]
+
+%\usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{1998}
+\publicationissue{9}
+
+\begin{document}
+
+\maketitle
+
+
+\section{New math font encodings}
+
+A joint working group of the \TeX{} Users Group and the \LaTeX3
+Project is developing a new 8-bit math font encoding for \TeX{}.
+It is designed to overcome several limitations and implementation
+problems of the old math font encodings and to simplify switching
+between different sets of math fonts, much as the \LaTeX{} font
+selection interface has simplified switching between text fonts.
+
+Since the work on this project relies entirely on volunteer work, we
+cannot give a specific release date yet. However, a prototype
+implementation already exists. This contains several sets of virtual
+fonts, some \LaTeX{} packages and a kernel module; we hope to
+integrate it into the main \LaTeX{} distribution for the next
+release.
+
+Documents using only standard \LaTeX{} commands for math symbols
+should not be affected by switching to the new math font encodings
+However, documents, classes or packages making specific assumptions
+about the encoding of math symbol fonts are likely to break.
+
+Further information about the Math Font Group may be found on
+the World Wide Web at \texttt{http://www.tug.org/twg/mfg/}.
+
+
+\section{A new math accent}
+
+A new math accent, \verb|\mathring|, has been added. This is a math mode
+version of the ring accent (\r{}) which is available in text
+mode with the command \verb|\r|.
+
+\section{Extended \cs{DeclareMathDelimiter}}
+
+The command \verb|\DeclareMathDelimiter| has been extended.
+Normally this command takes six arguments. Previously, when being used
+to declare a character (such as \texttt{[}) as a delimiter, a variant
+form was used with only five arguments. The argument specifying the
+default `math class' was omitted. Now the full six-argument form may be
+used in this case. The extra information is used to implicitly declare
+the character via \verb|\DeclareMathSymbol| for use when the symbol is
+not used with \verb|\left| or \verb|\right|.
+
+The old five-argument form is detected and will work as before.
+
+\newpage
+
+\section{Tools distribution}
+
+The \texttt{multicol} package now supports the production of multiple
+columns without balancing the last page. To get this effect use the
+\texttt{multicols*} environment.
+
+The \texttt{layout} package was partly recoded by Hideo Umeki to
+display page layout effects in a better way.
+
+As suggested by Donald Arseneau, the \texttt{calc} package was extended
+to support the new commands \verb|\widthof{<text>}|,
+\verb|\heightof{<text>}|, and \verb|\depthof{<text>}| within a
+\texttt{calc}-expression. At the same time we modified a few kernel
+commands so that \texttt{calc}-expressions can now be used in various
+useful places such as the dimension arguments to the \texttt{tabular}
+environment and the \verb|\rule| command. For many other standard
+\LaTeX{} commands this was already possible.
+
+
+\section{Support for Cyrillic encodings}
+
+We are very pleased that, after a lengthy period of development, a set
+of fonts, encodings and support files for using \LaTeX\ with Cyrillic
+characters will soon be available.
+
+Test versions of the `LH' fonts for these Cyrillic encodings, based on
+the Computer Modern design, are available from CTAN archives in the
+directory \texttt{fonts/cyrillic/lh-test}. The \LaTeX\ support files
+(by Werner Lemberg and Vladimir Volovich) are also available from CTAN
+archives in\\
+ \texttt{macros/latex/contrib/supported/t2}
+
+
+\section{Default docstrip header}
+
+Many \LaTeX\ users now distribute packages in documented source form
+using the \textsf{docstrip} system. Docstrip allows a header to be
+placed on generated package files, suitable for giving copyright
+information, or distribution conditions.
+
+We have changed the default version of this header so that it allows
+stripped files to be distributed in ready-to-run installations such as
+the \TeX{}Live CD\@. If you use the default header for distributing
+your files you should check that the new copyright text is acceptable
+to you. The file \texttt{docstrip.dtx} explains how to produce your own
+header if you wish to do so.
+
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews10.pdf b/macros/latex-dev/base/ltnews10.pdf
new file mode 100644
index 0000000000..3c2ca517a0
--- /dev/null
+++ b/macros/latex-dev/base/ltnews10.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews10.tex b/macros/latex-dev/base/ltnews10.tex
new file mode 100644
index 0000000000..3214260a6a
--- /dev/null
+++ b/macros/latex-dev/base/ltnews10.tex
@@ -0,0 +1,153 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews10.tex 12/01/1998
+
+% This is issue 10 of LaTeX News.
+
+\documentclass
+% [lw35fonts]
+ {ltnews}[1999/02/23]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{1998}
+\publicationissue{10}
+
+\begin{document}
+
+\maketitle
+
+
+\section{Five years of \LaTeXe}
+
+Since this is the 10th edition of \LaTeX{} News, the (no longer) New
+Standard \LaTeX{} must have hit the streets almost this long ago. In
+fact it was only the beta-version that some people got just in time for
+Christmas~1993, and since then there has been a lot of tidying-up and
+smoothing of rough edges (not to mention a few bug fixes!).
+
+Maybe it is time for something more radically different to emerge and
+be hungrily adopted by the world; but don't panic, we shall be
+maintaining what you have now for a long time yet. Amongst the more
+polite things that have been written about our efforts, we found that this
+quote (somewhat censored to protect the guilty) well reflects some of
+our feelings about working on \LaTeX{} over the years: \textit{the mere
+existence of \LaTeXe{} is a great miracle}.
+
+
+ \section{Restructuring the \LaTeX{} distribution}
+
+ Since the (once) `new' standard \LaTeX{} has reached such a venerable
+ age, we are reviewing the way in which the system is presented to the
+ world.
+
+ An early intention is to define, given the wide variety of good
+ packages now available, what now constitutes a useful installation of
+ \LaTeX{}. We also hope that such a definition will help document
+ portability if it leads to a future in which a \LaTeX{} class
+ designer can reasonably assume that a known list of
+ facilities will be there for all users (so that each class
+ need not supply them).
+
+ As a first small step towards this definition, we shall replace the
+ \texttt{latex/packages} subdirectory on \ctan{}.
+ This directory was a curious mixture of the important, such as the
+ \LaTeX{} \texttt{tools}, that any self-respecting \LaTeX{}
+ installation ought to have, and the esoteric or experimental.
+
+ The esoterica from \texttt{packages} will be moved to
+ new locations, as follows:
+ \begin{quote}
+ \texttt{expl3} to \texttt{latex/exptl/project}\\
+ \texttt{mfnfss} to \texttt{latex/contrib/supported/mfnfss}
+ \end{quote}
+
+ The subdirectory that replaces \texttt{packages} will be called
+ \texttt{latex/required}; all the other sub-directories of
+ \texttt{packages} will be moved there.
+
+\vspace{17pt}
+\pagebreak
+
+ \section{\LaTeX\ Project on the Internet}
+A new \texttt{latex-project.org} domain has been registered.
+The web site is not yet fully functional but the old \LaTeX\ pages from
+\ctan\ are available at \texttt{http://www.latex-project.org/} and the
+\LaTeX\ bug reporting address has been changed to
+\texttt{latex-bugs@latex-project.org}.
+
+ \section{Restructuring the \LaTeX{} package licenses}
+
+Several people have requested an easy mechanism for the distribution
+of \LaTeX\ packages and other software ``under the same conditions as
+\LaTeX''. The old \texttt{legal.txt} file was unsuitable as a general
+licence as it referred to specific \LaTeX\ authors, and to specific
+files.
+
+Therefore, in this release \texttt{legal.txt} contains just the
+copyright notice and a reference to the new \emph{\LaTeX\ Project
+Public License} (LPPL) for the distribution and modification
+conditions. The \texttt{tools}, \texttt{graphics}, and \texttt{mfnfss}
+packages also now refer to this license in their distribution notices.
+
+ \section{Support for Cyrillic encodings}
+
+Basic Cyrillic support, as announced in \LaTeX{} News~9, is now
+finally an official part of \LaTeX{}. It includes support for the
+following standard Cyrillic font encodings (this list may
+grow):~\mbox{\texttt{T2A T2B T2C X2}}.
+
+It also includes various Cyrillic input encodings (20~in total,
+including commonly used variants and Mongolian Cyrillic
+encodings). This provides platform independent and
+sophisticated basic support for high-quality typesetting in various
+Cyrillic-based languages.
+
+For further information see the file \texttt{cyrguide.tex}.
+
+\section{Tools distribution}
+
+The \texttt{varioref} package has been extended to support textual
+page references to a range of objects: e.g.,~if \texttt{eq-first}
+and \texttt{eq-last} are the label names for the first and last
+equation in a sequence, then you can now write
+\begin{verbatim}
+ see~\vrefrange{eq-first}{eq-last}
+\end{verbatim}
+This results in different text depending on whether both
+labels fall on the same page.
+
+Some additional user commands, as well as building-blocks for writing
+private extensions, are described in the accompanying documentation.
+
+
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews11.pdf b/macros/latex-dev/base/ltnews11.pdf
new file mode 100644
index 0000000000..bfb51f7055
--- /dev/null
+++ b/macros/latex-dev/base/ltnews11.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews11.tex b/macros/latex-dev/base/ltnews11.tex
new file mode 100644
index 0000000000..e39ff4cc86
--- /dev/null
+++ b/macros/latex-dev/base/ltnews11.tex
@@ -0,0 +1,141 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews11.tex 01/06/1999
+% This is issue 11 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Times
+ {ltnews}
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{1999}
+\publicationissue{11}
+
+\begin{document}
+
+\maketitle
+
+\section{Back in sync}
+
+The last release of \LaTeX{} was delayed even longer than you have
+come to expect. We hope that it proved worth waiting for. It
+required a major integration of the code from several people and,
+independently, the introduction of the LPPL (see \LaTeX{} News~10) plus
+several related changes to our internal systems. It therefore seemed
+sensible to wait until everything was complete rather than do things
+in too much hurry.
+
+This seem to have been a successful strategy as
+the recent patch release was related to an isolated change that was
+done many months previously. If this release does not appear a lot
+closer to its nominal date then \ldots~well, you will not be reading
+this sentence!
+
+\section{Yearly release cycles}
+
+With the year 2000 rapidly approaching, we intend to switch to a
+release frequency of just one per year (with patches if necessary) for
+the core of \LaTeXe{}. These days the system is sufficiently stable
+that the original update policy is costing everybody more time than is
+now warranted.
+
+\section{LPPL update}
+
+Thanks to extensive and valuable input from Matt Swift
+(\email{swift@alum.mit.edu}) we now have a clearer and more detailed
+form of the \LaTeX{} Project Public Licence. This release contains
+both the original version (in \file{lppl-1-0.txt}) and the updated
+version, LPPL~1.1.
+
+\section{The future of Sli\TeX{}}
+
+We still get a very small trickle of reports about this part of the
+system (if you are no longer able to recall \LaTeX~2.09 then you will
+know it as the \class{slides} class). We have not classified them (in
+our minds at least) as bugs since we have always known that there are
+many problems with this class. It is clear to us that the only
+sensible action would be to redesign the system completely; in
+particular, to remove much of its complexity whose purpose is to
+support 10-year-old overlay technology. However, this would take a
+lot too much time and would be completely out of proportion to its
+current usage.
+
+We are therefore planning to make the \class{slides} class
+unsupported in the sense that any problem related to the use of
+invisible fonts is considered to be a feature (The \LaTeXe{} manual by
+Leslie Lamport doesn't even describe this part of the class any more).
+Of course, if it still has its enthusiasts then we are happy to cede
+it to their loving care (somewhat like a preserved steam locomotive,
+in some parts of the world).
+
+\section{Fontenc package peculiarities}
+
+The \verb=\usepackage= interface normally ensures that a package is
+loaded only once. The \pkg{fontenc} package has become an
+exception to this rule: it can be loaded several times using different
+options, e.g., allowing the user to add a font encoding in the
+preamble. This comes at a price for package writers: the low-level
+commands (see \file{ltclass.dtx}) used to check if a package was
+loaded, and with which options, do not work for the \pkg{fontenc}
+package.
+
+\section{New math font encodings}
+
+As we announced in \LaTeX{} News~9, a joint working group of the
+\TeX{} Users Group and the \LaTeX3 Project has developed a new
+\mbox{8-bit} math font encoding for \TeX{}.
+The reason why this work is not yet released is because of other
+exciting developments in the world of math fonts and math characters.
+It is obviously wise to ensure that the encoding work is fully
+integrated with the available fonts.
+
+Those interested are reminded that further information about the Math
+Font Group may be found on the World Wide Web at:\\
+\url{http://www.tug.org/twg/mfg/}.
+
+\section{Tools distribution}
+
+The \pkg{multicol} package has now got a small but useful extension
+which allows you to force a column break where this is really
+necessary. This is done with the command \verb=\columnbreak=, which
+can be used like \verb=\pagebreak= (e.g.,~within paragraphs) except
+that it cannot have an optional argument and thus it always forces a
+new column.
+
+\section{Coming soon}
+
+Major work on a new class file structure to support flexible
+designs is well under way; some of this work will be presented at the
+TUG'99 conference in Vancouver, Canada. With a bit of luck much of
+this work could be ready for integration into the next release---so
+watch this space!
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews12.pdf b/macros/latex-dev/base/ltnews12.pdf
new file mode 100644
index 0000000000..1fe0d9d532
--- /dev/null
+++ b/macros/latex-dev/base/ltnews12.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews12.tex b/macros/latex-dev/base/ltnews12.tex
new file mode 100644
index 0000000000..ede8bb5362
--- /dev/null
+++ b/macros/latex-dev/base/ltnews12.tex
@@ -0,0 +1,154 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews12.tex
+%
+% This is issue 12 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Times
+ {ltnews}[1999/12/01]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{1999}
+\publicationissue{12}
+
+% Should go to .cls:
+\newcommand{\acro}[1]{\textsc{\MakeLowercase{#1}}}
+
+\begin{document}
+
+\maketitle
+
+\section{LPPL update}
+
+Since the release of the \LaTeX{} Project Public Licence version~1.1,
+we have received a small number of queries which resulted in some
+minor changes to improve the wording or explain the intentions better.
+As a consequence this release now contains LPPL~1.2 in the file
+\file{lppl.txt} and the previous versions as \file{lppl-1-0.txt} and
+\file{lppl-1-1.txt}.
+
+\section{fixltx2e package}
+
+ This package provides fixes to \LaTeXe{} which are desirable but
+ cannot be integrated into the \LaTeXe{} kernel directly as they
+ would produce a version incompatible to earlier releases (either
+ in formatting or functionality).
+
+ By having these fixes in the form of a package, users can benefit
+ from them without the danger that their documents will fail, or
+ produce unexpected results, at other sites; this works because a
+ document will contain a clear indication (the \verb=\usepackage=
+ line, preferably with a required date) that at least some of these
+ fixes are required to format it.
+
+\section{Outcome of TUG '99 (Vancouver)}
+
+The slides from the \acro{TUG}'99 presentation we gave on \emph{a
+new interface for \LaTeX\ class designers} are available from the
+\LaTeX\ Project website; look for the file \verb|tug99.pdf| at:
+\begin{quote}
+ \url{http://www.latex-project.org/talks/}
+\end{quote}
+
+Please note that this document was intended only to be informal
+``speaker's notes'' for our own use. We decided to make them available (the
+speaker's notes as well as the slides that were presented) because several
+people requested copies after the talk. However, they are \emph{not} in
+a polished copy-edited form and are not intended for publication.
+
+Prototype implementations of parts of this interface are now available from:
+\begin{quote}
+ \url{http://www.latex-project.org/code/experimental/}
+\end{quote}
+
+We are continuing to add new material at this location so as to
+stimulate further discussion of the underlying concepts. As of
+December 1, 1999
+the following parts can be downloaded.
+\begin{description}
+
+ \item[xparse] Prototype implementation of the interface for declaring
+ document command syntax. See the \texttt{.dtx} files for
+ documentation.
+
+ \item[template] Prototype implementation of the template interface
+ (needs parts of \texttt{xparse}).
+
+ The file \texttt{template.dtx} in that directory has a large section
+ of documentation at the front describing the commands in the
+ interface and giving a `worked example' building up some templates
+ for caption formatting.
+
+ \item[xcontents] Interface description for table of contents data (no
+ code yet). Coding examples have been thoroughly discussed on the
+ \texttt{latex-l} list.
+
+ \item[xfootnote] Working examples for generating footnotes,
+ etc. Needs \texttt{xparse} and \texttt{template}.
+
+ \end{description}
+All examples are organised in subdirectories and additionally
+ available as \texttt{gzip} \texttt{tar} files.
+
+ Please remember
+that this material is intended only for experimentation and comments;
+thus any aspect of it, e.g., the user interface or the functionality,
+may change and, in fact, is very likely to change.
+For this reason it is explicitly forbidden to place this material on
+\acro{CD-ROM} distributions or public servers.
+
+These concepts, as well as their implementation, are under discussion
+on the list \texttt{LATEX-L}. You can join this list, which is
+intended solely for discussing ideas and concepts for future versions
+of \LaTeX, by sending mail to
+%\begin{quote}
+ \email{listserv@URZ.UNI-HEIDELBERG.DE}
+%\end{quote}
+containing the line
+ \begin{quote}
+ \texttt{SUBSCRIBE LATEX-L} \textit{Your Name}
+ \end{quote}
+
+This list is archived and, after subscription, you can retrieve older
+posts to it by sending mail to the above address, containing a command
+such as:
+\begin{quote}
+\texttt{GET LATEX-L LOGyymm}
+\end{quote}
+where \texttt{yy}=Year and \texttt{mm}=Month, e.g.
+\begin{quote}
+\texttt{GET LATEX-L LOG9910}
+\end{quote}
+for all messages sent in October 1999.
+
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews13.pdf b/macros/latex-dev/base/ltnews13.pdf
new file mode 100644
index 0000000000..0270c5d725
--- /dev/null
+++ b/macros/latex-dev/base/ltnews13.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews13.tex b/macros/latex-dev/base/ltnews13.tex
new file mode 100644
index 0000000000..65e09b9871
--- /dev/null
+++ b/macros/latex-dev/base/ltnews13.tex
@@ -0,0 +1,201 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews13.tex
+%
+% This is issue 13 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2000/07/21]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{2000}
+\publicationissue{13}
+
+
+\begin{document}
+
+\maketitle
+
+\raisefirstsection
+\section{Yearly release cycle}
+
+We announced in \textit{\LaTeX{} News~11} that we intended to switch
+to a 12-monthly release schedule. With the present (June~2000)
+release, this switch is being made: thus the next release of \LaTeX{}
+will be dated June~2001. We shall of course continue, as in the past,
+to release patches as needed to fix significant bugs.
+
+
+\section{PSNFSS: \small Quote of the Month}
+
+\begin{quote}
+ You should say in the \LaTeX{} News that Walter Schmidt has taken over
+ \PSNFSS{} from me. It gives me a certain pleasure to be able to draw a
+ line under that part of my life\ldots
+
+ \begin{latexonly}
+ \vspace{-\baselineskip}
+ \end{latexonly}
+
+ \begin{flushright}
+ Sebastian Rahtz
+ \end{flushright}
+\end{quote}
+
+\begin{latexonly}
+ \vspace{-\baselineskip}
+\end{latexonly}
+
+\noindent
+The \PSNFSS{} material, which supports the use\latex{\\}
+of common PostScript fonts with \LaTeX{}, has been thoroughly updated.
+Most noticeably, the \package{mathpple} package, which used to be
+distributed separately, is now part of the basic \PSNFSS{} bundle;
+this package provides mathematical typesetting with the Palatino
+typeface family. In addition, numerous bugs and flaws have been fixed
+and the distribution has been `cleaned up'. The file
+\file{changes.txt} contains a detailed list of these changes.
+\latex{\looseness=-1} %%!!!!! It worked!
+
+The documentation (in \file{psnfss2e.pdf}) has been completely
+rewritten to provide a comprehensive introduction to the use
+of PostScript fonts.
+
+Notice that the new \PSNFSS{} needs updated files for font metrics,
+virtual fonts and font definitions. If you received the new
+version~(8.1) as part of a complete \TeX{} system then these new font
+files should also have been installed. However, if you intend to
+install or update \PSNFSS{} yourself, please read the instructions in
+the file \file{00readme.txt} of the new \PSNFSS{} distribution.
+
+Support for commercial PostScript fonts, such as
+Lucida~Bright, has been removed from the basic distribution;
+it is now available from \ctan{}:
+\begin{latexonly}
+ \file{\ctanhttp macros/latex/\\
+ contrib/supported/psnfssx}.
+\end{latexonly}
+\begin{htmlonly}
+ \url{http://www.tex.ac.uk/tex-archive/macros/latex/contrib/supported/psnfssx}.
+\end{htmlonly}
+
+\section{New AMS-\LaTeX{}}
+
+Version 2.0 of AMS-\LaTeX{} was released on December 1, 1999. It can
+be obtained via \url{ftp://ftp.ams.org/pub/tex/} or
+\url{http://www.ams.org/tex/amslatex.html}, as well from \ctan{}:
+\begin{latexonly}
+ \file{\ctanhttp macros/latex/\\
+ required/amslatex}.
+\end{latexonly}
+\begin{htmlonly}
+ \url{http://www.tex.ac.uk/tex-archive/macros/latex/required/amslatex}.
+\end{htmlonly}
+
+This release consists chiefly of bug fixes and consolidation of the
+existing features. The division of AMS-\LaTeX{} into two main parts
+(the math packages;\latex{\\}
+the AMS document classes) has been made more pronounced.
+The files \file{diffs-m.txt}, \file{diffs-c.txt},
+\file{amsmath.faq}, and \file{amsclass.faq} describe the\latex{\\}
+changes and address some common questions.
+
+The primary documentation files remain \file{amsldoc.tex}, for the
+\package{amsmath} package, and \file{instr-l.tex}, for the AMS
+document classes.\latex{\\}
+The documentation for the \package{amsthm} package,\latex{\\}
+however, has been moved from \file{amsldoc.tex}\latex{\\}
+to a separate document \file{amsthdoc.tex}.
+
+\begin{latexonly}
+ \vfill
+\end{latexonly}
+
+\section{New input encoding \package{latin4}}
+
+The package \package{inputenc} has, thanks to Hana Skoumalov\'a,
+been extended to cover the \package{latin4} input encoding; this
+covers Baltic and Scandinavian languages as well as Greenland
+Inuit and Lappish.
+
+\begin{latexonly}
+ \vfill
+\end{latexonly}
+
+\section{New experimental code}
+
+In \textit{\LaTeX{} News~12} we announced some ongoing work towards a
+`Designer Interface for \LaTeX' and we presented some early results
+thereof. Since then, at Gutenberg\,2000 in Toulouse and TUG\,2000 in
+Oxford, we described a new output routine and an improved method of
+handling vertical mode material between paragraphs. In combination
+these support higher quality \emph{automated}\footnote
+ {The stress here is on automated!}
+page-breaking and page make-up\latex{\\}
+for complex pages---the best yet achieved with \TeX{}!
+
+A paper describing the new output routine is
+\begin{latexonly}
+ at\\
+ \file{http://www.latex-project.org/papers/xo-pfloat.pdf%
+ \hspace*{-16pt}}\\
+\end{latexonly}
+\begin{htmlonly}
+ at \url{http://www.latex-project.org/papers/xo-pfloat.pdf}.
+\end{htmlonly}
+All code examples and documentation are available
+\begin{latexonly}
+ at\\
+ \file{http://www.latex-project.org/code/experimental/%
+ \latex{\hspace*{-5pt}}}.\\[3pt]
+\end{latexonly}
+\begin{htmlonly}
+ at \url{http://www.latex-project.org/code/experimental/}.
+
+\end{htmlonly}
+This directory has been extended to contain
+\begin{description}
+ \item[galley] Prototype implementation of the interface\latex{\\}
+ for manipulating vertical material in galleys.
+ \item[xinitials] Prototype implementation of the interface\latex{\\}
+ for paragraph initials (needs the \texttt{galley} package.
+ \item[xtheorem] Contributed example using the \texttt{template}
+ package to provide a designer interface for theorem environments.
+ \item[xoutput] A prototype implementation of the new output routine
+ as described in the \texttt{xo-pfloat.pdf} paper. Expected
+ availability: at or shortly after\latex{\\}
+ the TUG\,2000 conference.
+\end{description}
+
+\end{document}
+
+
diff --git a/macros/latex-dev/base/ltnews14.pdf b/macros/latex-dev/base/ltnews14.pdf
new file mode 100644
index 0000000000..db7782644b
--- /dev/null
+++ b/macros/latex-dev/base/ltnews14.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews14.tex b/macros/latex-dev/base/ltnews14.tex
new file mode 100644
index 0000000000..0444d75689
--- /dev/null
+++ b/macros/latex-dev/base/ltnews14.tex
@@ -0,0 +1,169 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews14.tex
+%
+% This is issue 14 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2001/07/12]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{June}
+\publicationyear{2001}
+\publicationissue{14}
+
+
+\begin{document}
+
+\maketitle
+
+\raisefirstsection
+\section{Future releases}
+
+We are currently exploring how to best support the very large
+community of individuals, organisations and enterprises that depend on
+the robustness and availability of the current standard \LaTeX{}
+distribution. The results of this may lead to some changes in the
+regular release schedule and the handling of bug reports during the
+next year.
+
+\section{New release of \textsf{Babel} (required)}
+
+Earlier this year a new release of \textsf{Babel} (3.7) became
+available. You can read about its new features in
+\begin{latexonly}
+ \file{http://www.ctan.org/tex-archive/macros/}\\
+ \hspace*{4em}\file{latex/required/babel/announce.txt}
+\end{latexonly}
+\begin{htmlonly}
+ \url{http://www.ctan.org/tex-archive/macros/latex/required/babel/announce.txt}
+\end{htmlonly}
+
+One of the bugs that got fixed in this release deals with how labels
+are handled by \LaTeX{}. Because this part of the kernel is modified
+by \textsf{babel}, the relevant changes need to be coordinated.
+Therefore to use \textsf{Babel} with this release of \LaTeX{} you will
+need to update your version of \textsf{babel} to at least 3.7.
+
+\section{New input encoding \package{latin9}}
+
+The package \package{inputenc} has, thanks to Karsten Tinnefeld, been
+extended to cover the \package{latin9} input encoding. The
+ISO-Latin~9 encoding is a useful modern replacement for ISO-Latin~1
+that contains a few characters needed for French and Finnish. Of wider
+interest, it also contains the euro currency sign; this could be the
+killer argument for many 8-bit texts to use Latin-9 in the future.
+
+According to a Linux manpage, ISO~Latin-9 supports Albanian, Basque,
+Breton, Catalan, Danish, Dutch, English, Estonian, Faroese, Finnish,
+French, Frisian, Galician, German, Greenlandic, Icelandic, Irish
+Gaelic, Italian, Latin, Luxembourgish, Norwegian, Portuguese,
+Rhaeto-Romanic, Scottish Gaelic, Spanish and Swedish.\\
+The characters added in \package{latin9} are (in \LaTeX{} notation):\\
+\begin{small}
+\verb| \texteuro \v S \v s \v Z \v z \OE \oe \" Y |
+\end{small}\\
+They displace the following characters from \package{latin1}:\\
+\begin{small}
+\verb| \textcurrency \textbrokenbar \"{} \'{} \c{} |\\
+\verb| \textonequarter \textonehalf \textthreequarters |
+\end{small}
+
+
+\section{New tools}
+
+The new package \package{trace} provides many commands to control
+\LaTeX{}'s tracing and debugging output, including the excellent new
+information available with \eTeX{} such as the extremely useful
+tracing of local assignments. You will find it in the tools
+distribution.
+
+It offers the command \verb|\traceon|, which is similar to
+\verb|\tracingall| but suppresses uninteresting stuff such as font
+loading by NFSS (which can go on for pages if you are unlucky). It
+also offers \verb|\traceoff| to \ldots\ guess what! Full details are
+in the documented source file, \file{trace.dtx}.
+
+In the base \package{ifthen} package we have added
+the uppercase synonyms \verb|\NOT| \verb|\AND| and \verb|\OR|.
+
+\section{New experimental code}
+
+In \textit{\LaTeX{} News~12} we announced some ongoing work towards a
+`Designer Interface for \LaTeX' and we presented some early results
+thereof. Since then, at Gutenberg\,2000 in Toulouse and TUG\,2000 in
+Oxford, we described a new output routine and an improved method of
+handling vertical mode material between paragraphs. In combination
+these support higher quality \emph{automated}\footnote
+ {The stress here is on automated!}
+page-breaking and page make-up\latex{\\}
+for complex pages---the best yet achieved with \TeX{}!
+
+More recently we have added material to handle the complex front
+matter requirements of journal articles; this was presented at
+Gutenberg\,2001 in Metz.
+
+A paper describing the new output routine is
+\begin{latexonly}
+ at\\
+\begin{small}
+ \file{http://www.latex-project.org/papers/xo-pfloat.pdf}\\
+\end{small}
+\end{latexonly}
+\begin{htmlonly}
+ at \url{http://www.latex-project.org/papers/xo-pfloat.pdf}.
+\end{htmlonly}
+All code examples and documentation are available
+\begin{latexonly}
+ at\\
+\begin{small}
+ \file{http://www.latex-project.org/code/experimental}
+\end{small}
+\end{latexonly}
+\begin{htmlonly}
+ at \url{http://www.latex-project.org/code/experimental/}.
+\end{htmlonly}
+
+This directory has been extended to contain the following.
+\begin{description}
+ \item[galley] Prototype implementation of the interface\latex{\\}
+ for manipulating vertical material in galleys.
+ \item[xinitials] Prototype implementation of the interface\latex{\\}
+ for paragraph initials (needs the \texttt{galley} package).
+ \item[xtheorem] Contributed example using the \texttt{template}
+ package to provide a designer interface for theorem environments.
+ \item[xor] A prototype implementation of the new output routine
+ as described in the \texttt{xo-pfloat.pdf} paper.
+ \item[xfrontm] A prototype version of
+ the new font matter interface.
+\end{description}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews15.pdf b/macros/latex-dev/base/ltnews15.pdf
new file mode 100644
index 0000000000..6161b1011f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews15.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews15.tex b/macros/latex-dev/base/ltnews15.tex
new file mode 100644
index 0000000000..9c2d393c6b
--- /dev/null
+++ b/macros/latex-dev/base/ltnews15.tex
@@ -0,0 +1,169 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews15.tex
+%
+% This is issue 15 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2004/02/28]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{2003}
+\publicationissue{15}
+
+\begin{document}
+
+\maketitle
+
+%\raisefirstsection
+
+\section{Anniversary release}
+
+Yes, it's now 10~years since the first release in this series and, for
+Knuthists, this release also contains \textit{Issue 16}\,!
+
+Meanwhile this \textit{Issue~15} describes the major new features in
+the current release whilst \textit{Issue~16} looks\newline
+a little way into the future of \LaTeX{}.
+
+
+\section{LPPL -- new version}
+
+Most importantly, there is now a new version, 1.3, of the \LaTeX{}
+Project Public Licence. Many of you will\newline
+be thrilled to know that, following the exchange of over 1600 e-mail
+messages dissecting various aspects of its philosophy such as `how
+many angels can appear in the name of a file before it becomes
+non-free', this version\newline
+is now officially a DFSG (Debian Free Software Guidelines) approved license.
+The discussions start at
+\url{http://lists.debian.org/debian-legal/2002/debian-legal-200207/threads.html}
+with high traffic throughout August to October~2002 and further
+heated discussions starting in April~2003 and concluding
+around June at
+\url{http://lists.debian.org/debian-legal/2003/debian-legal-200306/msg00206.html}.
+
+The important features of the new version are useful clarifications in
+the wording, and revised procedures\newline
+for making a change to the Current Maintainer of a package. Special
+thanks to all those people from\newline Debian Legal who worked
+constructively with us\newline
+on this onerous task, especially but not exclusively\newline
+Jeff Licquia and Branden Robinson.
+
+
+\section{Small updates to varioref}
+
+The English has been corrected in \verb|\reftextbefore|
+(an incompatible change). There are other extensions
+such as \verb|\labelformat|, \verb|\Ref|, \verb|\Vref| and \verb|\vpagerefnum|.
+Some Dutch text has also been changed and two\newline
+new options added: \package{slovak} and \package{slovene}.
+
+
+\section{New and more robust commands}
+
+Many of the math mode commands for compound symbols have been made
+robust and a new robust command has been added: \verb|\nobreakdashes|.
+This last is a low-level command, borrowed from the \package{amsmath}
+package, for use only before hyphens or dashes. It prevents the line
+break that is normally allowed\newline
+after the following sequence of dashes.
+
+
+\section{Fixing font sizes}
+
+The new \package{fix-cm} package, by Walter Schmidt, changes the CM font
+definition (\texttt{.fd}) files so that similar design sizes are used
+in both the \texttt{OT1} and \texttt{T1} encodings.
+
+
+\section{Font encodings}
+
+A number of options have been added to the \package{textcomp} package,
+enabling only available glyphs to be used.
+Also, the `NFSS font families' are now divided into five different groups
+according to the subset of glyphs each provides from the full
+collection of symbols in the TS1 encoding.
+Given sufficient information about a font family
+\package{textcomp} will use this in order to limit the\newline
+typesetting to those glyphs that are available.
+
+Use of this mechanism has also enhanced \verb|\oldstylenums|
+to use the current font if possible.
+
+
+\section{Displaying font tables}
+
+With the \package{nfssfont} package you can now
+specify the font to display by giving its `NFSS classification',
+rather than needing to know its external font file's name.
+It is also now possible to generate large collections of font
+tables in batch mode by providing a suitable input file.
+
+
+\section{New input encodings}
+
+The \package{inputenc} package has been extended as follows:
+\package{macce} input encoding
+(Apple Central European),
+thanks to Radek Tryc and Marcin Wolinski; \package{cp1257}\newline
+for Baltic languages; \package{latin10},
+thanks to Ionel Ciob\^{i}c\u{a}.\newline
+The euro symbol has by
+now been added to several encodings:
+\package{ansinew}, \package{cp1250}
+and \package{cp1252} (which also\newline
+has another addition), whilst \package{cp858}
+adds it to \package{cp850}.
+
+
+\section{Unicode input}
+
+Partial, experimental support for text files that use the Unicode
+encoding form UTF-8 is now provided by the option \package{utf8} for
+the \package{inputenc} package.
+
+The only Unicode text file characters supported by the current version
+are those based on the most common inputs for glyphs from the small
+collection\newline
+of standard \LaTeX{} Latin encodings.
+
+
+\section{And finally \ldots\ pict2e}
+
+The old, non-functional version of this package has been removed
+ as there is now a fully working version from Hubert G\"a{\ss}lein
+ and Rolf Niepraschk. It is described
+ in \textit{The \LaTeX{} Manual}.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews16.pdf b/macros/latex-dev/base/ltnews16.pdf
new file mode 100644
index 0000000000..2e27478aa4
--- /dev/null
+++ b/macros/latex-dev/base/ltnews16.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews16.tex b/macros/latex-dev/base/ltnews16.tex
new file mode 100644
index 0000000000..96ca1ddf68
--- /dev/null
+++ b/macros/latex-dev/base/ltnews16.tex
@@ -0,0 +1,161 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews16.tex
+%
+% This is issue 16 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2004/02/28]
+
+% \usepackage[T1]{fontenc}
+
+\publicationmonth{December}
+\publicationyear{2003}
+\publicationissue{16}
+
+\begin{document}
+
+\maketitle
+
+%\raisefirstsection
+
+\section{Anniversary news}
+
+This anniversary \textit{Issue~16} takes a brief look into the future work of
+the \LaTeX3 Project Team, both short and and longer range. Please let
+us know if you want %\newline
+to get involved with us in any of this work (see below).
+
+An overview of the 10th Anniversary Release, dated 2003/12/01, is
+can be found in \textit{Issue~15}.
+
+
+\section{TLC2: The \LaTeX{} Companion -- 2nd edition!}
+
+Since you are reading this newsletter, there is a good chance that
+you, or a friend, has already bought this encyclopedic volume: the
+incomparable Second\newline
+Edition of this work that is every \LaTeX{}ie's\newline
+ultimate lucky charm.
+
+If by some chance you have not yet purchased your own copy then get
+into training, get shopping, and get flexing your muscles (both
+physical---it's $1100+$~pages,\newline
+and intellectual) by using it to discover
+masses of invaluable `insider information' about:
+\begin{itemize}
+\item the latest release of Standard \LaTeX{};
+\item over~200~extension packages;
+\item plus related software and systems.
+\end{itemize}
+For more information on this all new (??\ldots OK,\newline
+not \emph{all}, but over 90\%!!),
+all accurate (we hope!)\newline
+10th~Anniversary Edition, check out\newline
+ \mbox{\url{http://www.awprofessional.com/titles/0201362996}}.
+
+
+\section{Future maintenance}
+
+We are currently exploring how best to support the very large and
+rapidly growing community of individuals, organisations and
+enterprises that depend on the robustness and availability of the
+current standard \LaTeX{} distribution. Although we remain firmly\newline
+resolved not to make changes in the base distribution (the kernel) of
+Standard \LaTeX{}, there is still much that needs doing to maintain
+its reliability and utility and to keep up the necessary level of
+communication with users and supporters. Also, as with all advanced
+software systems, bugs are still turning up occasionally so %\newline
+some fixes are still essential.
+
+One major impediment to providing adequate service levels in this area
+is, of course, the difficulties inherent in obtaining the time and
+commitment of skilled minds---hence the appeal above to anyone
+interested %\newline
+in getting involved.
+
+
+\section{LPPL certification}
+
+There are still some outstanding diplomatic tasks around the
+\LaTeX{} Project Public Licence: these include
+e.g.,~getting it `OSF certified' and ensuring that it gains
+more support and wider use, even in the FSF world\newline
+where it has long been tolerated.
+
+
+\section{Use of \eTeX/pdf\TeX}
+
+We expect that within the next two years, releases of \LaTeX{} will
+change modestly in order to run best under an extended \TeX{} engine
+that contains the \eTeX{} primitives, e.g., \eTeX{} or pdf\TeX{}.
+The details of this possible upgrade need further work so we are not
+making a definite announcement yet.
+
+Although the current release does not \emph{require} \eTeX{} features,
+we certainly recommend using an extended \TeX{}, especially if you
+need to debug macros.
+
+
+\section{End of `autoload' support}
+
+As computer systems generally grow in capacity, requirements change
+and so we believe that the \package{autoload} variant of \LaTeX{} is
+no longer required. Thus, although the code remains it is no longer
+supported. We hope this does not cause any problems.
+
+
+\section{New models, new code}
+
+In the period 1999--2001 we published many results of our work over
+the previous decade on the development of new concepts and models
+for automated typesetting based on \TeX{} as the underlying platform.
+These can be found at \url{http://www.latex-project.org/papers/}
+and
+\mbox{\url{http://www.latex-project.org/code/experimental/}}.
+
+Since then a very large proportion of the The Team's efforts have been
+diverted to provide the core author team for TLC2, which provides
+over 1000 pages of carefully researched and tested documentation of
+many aspects of the vast world of \LaTeX{} related software that
+was developed over that same time period and that continues
+to grow and improve prodigiously.
+
+Completion of that task \ldots\ until TLC3!! \ldots\ presents the
+possibility of getting back to this more exciting development work,
+or even to more radical work on non-\TeX{}-based models and
+implementations.
+
+Of course, any such ideas are predicated on our ability to organise
+(with you, we hope) an efficient\newline
+but responsive maintenance and support system\newline
+for Standard \LaTeX{}.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews17.pdf b/macros/latex-dev/base/ltnews17.pdf
new file mode 100644
index 0000000000..ca3807fc63
--- /dev/null
+++ b/macros/latex-dev/base/ltnews17.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews17.tex b/macros/latex-dev/base/ltnews17.tex
new file mode 100644
index 0000000000..f55300f447
--- /dev/null
+++ b/macros/latex-dev/base/ltnews17.tex
@@ -0,0 +1,230 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews17.tex
+%
+% This is issue 17 of LaTeX News.
+
+\documentclass
+% [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2004/02/28]
+
+% \usepackage[T1]{fontenc}
+
+
+\publicationmonth{December}
+\publicationyear{2005}
+\publicationissue{17}
+
+\begin{document}
+
+\maketitle
+
+% \raisefirstsection
+
+\section{Project licence news}
+
+The \LaTeX{} Project Public License has been updated slightly so that
+it is now version 1.3c. In the warranty section the
+phrase ``unless required by applicable law'' has been reinstated,
+having got lost at some point. Also,
+it now contains three clarifications: of the difference between
+``maintained'' and ``author-maintained''; of the
+term ``Base Interpreter''; and when clause 6b and 6d shall not apply.
+
+Following requests, we now also provide the text of the licence as a
+\LaTeX{} document (in the file \texttt{lppl.tex}). This file can be
+processed either as a stand-alone document or it can be included
+(without any modification) into another \LaTeX{} document, e.g., as an
+appendix, using \verb|\input| or \verb|\include|.
+
+
+\section{New guide on font encodings}
+
+Way back in 1995 work was started on a guide to document the
+officially allocated \LaTeX{} font encoding names. However, for one
+reason or another this guide (named \textit{\LaTeX{} font encodings})
+was, until now, not added to the distribution. It describes the major
+7-bit and 8-bit font encodings used in the \LaTeX{} world and explains
+the restrictions required of conforming text font encodings. It also
+lists all the `encoding specific commands' (the LICR or \LaTeX{}
+Internal Character Representation) for characters supported by the
+encodings \texttt{OT1} and \texttt{T1}.
+
+When the file \texttt{encguide.tex} is processed by \LaTeX{}, it will
+attempt to typeset an encoding table for each encoding it describes.
+For this to be possible, \LaTeX{} must be able to find \texttt{.tfm}
+files for a representative example font for each encoding. If
+\LaTeX{} cannot find such a file then a warning is issued and the
+corresponding table is omitted.
+
+
+\section{Robust commands in math}
+
+The font changing commands in text-mode have been robust commands for years,
+but the same has not been true for the math versions such as
+\verb|\mathbf|. While the math-mode commands worked correctly in
+section heads, they could cause problems in other places such as index
+entries. With this release, these math-mode commands are now robust in
+the same way as their text-mode counterparts.
+
+%%
+\pagebreak
+%%
+
+
+\section{Updates of required packages}
+
+Several of the packages in the \package{tools} bundle have been updated
+for this release.
+
+The \package{xspace} package has some new features. One is an
+interface for adding and removing the exceptions it knows about and
+another is that it works with active characters. These remove problems
+of incompatibility with the \package{babel} system.
+
+In \textit{\LaTeX\ News~16} we announced that some packages might
+begin to take advantage of \eTeX{} extensions on systems where these
+are available: and the latest version of \package{xspace} does just
+that. Note also that \package{fixltx2e} will make use of the
+facilities in \eTeX{} whenever these are present (see below).
+
+The \package{calc} package has also been given an update with a few
+extra commands.
+The commands \verb|\maxof| and \verb|\minof|, each with two
+brace-delimited arguments, provide the usual numeric $\max$ and $\min$
+operations. The commands \verb|\settototalheight| and
+\verb|\totalheightof| work like \verb|\settoheight| and
+\verb|\heightof|. There are also some internal improvements to make
+\package{calc} work with some more primitive \TeX\ constructs, such as
+\verb|\ifcase|.
+
+The \package{varioref} package has acquired a few more default
+strings but there are still a number of languages for
+which good strings are still missing.
+
+The \package{showkeys} package has also been updated slightly to work
+with more recent developments in \package{varioref}. Also, it now
+provides an easy way to define the look of the printed labels with
+the command \verb|\showkeyslabelformat|.
+
+\section{Work on \LaTeX{} fixes}
+
+The package known as \package{fixltx2e} has three new additions. A new
+command \verb|\textsubscript| has been added as a complement to the
+command \verb|\textsuperscript| in the kernel. Secondly, a new form of
+\verb|\DeclareMathSizes| that allows all of its arguments to have a
+dimension suffix. This means you can now use expressions such as
+\verb|\DeclareMathSizes{9.5dd}{9.5dd}{7.4dd}{6.6dd}|.
+
+The third new
+addition is the robust command \verb|\TextOrMath| which takes two
+arguments and executes one of them when typesetting in text or math
+mode respectively. This command also takes advantage of \eTeX{}
+extensions if available; more specifically,
+%%
+%%\pagebreak
+%%
+when the \eTeX{} extensions are available, it does not
+destroy kerning between previous letters and the text to be typeset.
+The command is also used
+internally in \package{fixltx2e} to resolve a problem with
+\verb|\fnsymbol|.
+
+Also, further work has been done on reimplementing
+the command \verb|\addpenalty|, which is used internally in several
+places: we hope it is an improvement!
+
+\section{The graphics bundle}
+
+The \package{graphics} bundle now supports the
+\package{dvipdfmx} post-processor and Jonathan Kew's XE\TeX\
+program. By support we mean that the graphics packages recognize the
+new options \texttt{xetex} and \texttt{dvipdfmx} but we do not
+distribute the respective driver files.
+
+This leads elegantly to a description of the
+new policy concerning such driver files in the \package{graphics} bundle.
+Most driver files for our graphics packages are maintained by the
+developers of the associated post-processor or \TeX\ programs.
+The teams developing these packages are working very hard: their rapid
+development offers a stark contrast to the current schedule of \LaTeX\
+releases. It is therefore no longer practical
+for the \LaTeX\ Team to be responsible for distributing the
+latest versions of these driver files.
+
+Therefore the installation files for \package{graphics} have been
+split: there is now \file{graphics.ins} to install the package files and
+\file{graphics-drivers.ins} for the driver files (located in
+\file{drivers.dtx}).
+There is no need
+to install all those provided in the file \file{drivers.dtx}.
+
+Please also note that, as requested by the maintainers of
+\package{PStricks}, we have removed the package \package{pstcol} as
+current versions of \package{PSTricks} make it obsolete.
+
+%%
+\newpage
+%%
+
+
+\section{Future development}
+
+The title of this section is a little misleading as it actually
+describes \emph{current} development. In 1998 the \package{expl3}
+bundle of packages was put on \ctan\ to demonstrate a possible \LaTeX3
+programming environment. These packages have been lying dormant for some
+time while the \LaTeX\ Project Team were preoccupied by other things
+such as developing the experimental packages \package{xor},
+\package{template}, etc., (and also writing that indispensable
+and encyclopaedic volume,\\
+The \LaTeX{} Companion -- 2nd edition).
+
+In October 2004 work on this code base was resumed with the goal of
+some day turning it into a kernel for \LaTeX3. This work can now
+also make full use of the widely accepted \eTeX\ extensions. Currently
+two areas are central to this work.
+
+\begin{itemize}
+\item Extending the
+ kernel code of \LaTeX3.
+\item Converting the experimental packages
+ such as \package{xor}, \package{template} to use the new
+ syntax internally.
+\end{itemize}
+
+Beware! Development of
+\package{expl3} is happening so fast that the descriptions above might
+be out of date when you read this! If you wish to see what's going on
+then go to
+\url{http://www.latex-project.org/code.html} where you can download
+ fully working code (we hope!).
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews18.pdf b/macros/latex-dev/base/ltnews18.pdf
new file mode 100644
index 0000000000..f228a5bcfb
--- /dev/null
+++ b/macros/latex-dev/base/ltnews18.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews18.tex b/macros/latex-dev/base/ltnews18.tex
new file mode 100644
index 0000000000..33f0d7310d
--- /dev/null
+++ b/macros/latex-dev/base/ltnews18.tex
@@ -0,0 +1,51 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews18.tex
+%
+% This is issue 18 of LaTeX News.
+
+\documentclass
+ [lw35fonts] % uncomment this line to get Palatino
+ {ltnews}[2004/02/28]
+
+% \usepackage[T1]{fontenc}
+
+
+\publicationmonth{December}
+\publicationyear{2007}
+\publicationissue{18}
+
+\begin{document}
+
+\maketitle
+
+\noindent This news never existed.
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews19.pdf b/macros/latex-dev/base/ltnews19.pdf
new file mode 100644
index 0000000000..0cb16a872d
--- /dev/null
+++ b/macros/latex-dev/base/ltnews19.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews19.tex b/macros/latex-dev/base/ltnews19.tex
new file mode 100644
index 0000000000..af99d329dd
--- /dev/null
+++ b/macros/latex-dev/base/ltnews19.tex
@@ -0,0 +1,116 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews19.tex
+%
+% This is issue 19 of LaTeX News.
+
+\documentclass{ltnews}
+
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url}
+
+\publicationmonth{September}
+\publicationyear{2009}
+
+\publicationissue{19}
+
+\begin{document}
+
+\maketitle
+
+\section{New \LaTeX\ release}
+
+This issue of \LaTeX~News marks the first release of a new version of
+\LaTeXe\ since the publication of The \LaTeX\ Companion in 2005--2006.
+
+Just in time for \TeX\ Live 2009, this version is a maintenance
+release and introduces no new features. A number of small changes have
+been made to correct minor bugs in the kernel, slightly extend the Unicode
+support, and improve various
+aspects of some of the \texttt{tools} packages.
+
+\section{New code repository}
+
+Since the last \LaTeX\ release, the entire code base has been moved
+to a public \textsc{svn} repository%
+\footnote{\url{http://www.latex-project.org/svnroot/latex2e-public/}}
+and the entire build architecture re-written. In fact, it has only
+been possible for us to consider a new \LaTeX\ release since earlier
+this year when the test suite was finally set up with the new system.
+In the process, a bug in the \LaTeX\ picture fonts distributed with
+\TeX\ Live was discovered, proving that the
+tests are working and are still very valuable.
+
+Now that we can easily generate new packaged versions of the \LaTeXe\
+distribution, we expect to be able to roll out bug fixes in a much
+more timely manner than over the last few years. New versions should
+be distributed yearly with \TeX\ Live. Having said this, the
+maintenance of the \LaTeXe\ kernel is slowing down as the bugs become
+fewer and more subtle. Remember that we cannot change any of the
+underlying architecture of the kernel or any design decisions of the
+standard classes because we must preserve backwards compatibility with
+legacy documents at all costs.
+
+Even new features cannot be added, because any new documents using
+them will not compile in systems (such as journal production engines)
+that are generally not updated once they've been proven to work as
+necessary.
+
+None of this is to say that we consider \LaTeXe\ to be any less
+relevant for document production than in years past: a stable system
+is a useful one.
+Moreover, the package system continues to provide a flourishing and stable
+means
+for the development of a wide range of extensions.
+
+\newpage
+
+\section{Babel}
+
+One area of the \LaTeXe\ code base that is still receiving feedback to
+be incorporated into the main distribution is the Babel system for
+multilingual typesetting.
+While the Babel sources have already been added to the \textsc{svn} repository the
+integration of the test system for Babel is still outstanding.
+
+
+\section{The future}
+
+While work on \LaTeXe\ tends to maintenance over active development,
+the \LaTeX3 project is
+seeing new life. Our goals here are to provide a transition from the
+\LaTeXe\ document processing model to one with a more flexible
+foundation. Work is continuing in the \textsf{expl3} programming
+language and the \textsf{xpackages} for document design. Future
+announcements
+about \LaTeX3 will be available via the \LaTeX\ Project
+website and in TUGboat.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews20.pdf b/macros/latex-dev/base/ltnews20.pdf
new file mode 100644
index 0000000000..82321e19e3
--- /dev/null
+++ b/macros/latex-dev/base/ltnews20.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews20.tex b/macros/latex-dev/base/ltnews20.tex
new file mode 100644
index 0000000000..a43aa37b7c
--- /dev/null
+++ b/macros/latex-dev/base/ltnews20.tex
@@ -0,0 +1,153 @@
+% \iffalse meta-comment
+%
+% Copyright 1993--2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews20.tex
+%
+% This is issue 20 of LaTeX News.
+
+\documentclass{ltnews}
+
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url}
+
+\publicationmonth{June}
+\publicationyear{2011}
+
+\publicationissue{20}
+
+\begin{document}
+
+\maketitle
+
+\section{Scheduled \LaTeX\ bug-fix release}
+
+This issue of \LaTeX~News marks the first bug-fix release of
+\LaTeXe\ since shifting to a new build system in 2009.
+Provided sufficient changes are made each year, we expect to
+repeat such releases once per year to stay in sync with \TeX\ Live.
+Due to the excitement of \TeX's $2^5$-th birthday last year,
+we missed our window of opportunity to do so for 2010.
+This situation has been rectified this year!
+
+\section{Continued development}
+
+The \LaTeXe\ program is no longer being actively developed, as any non-negligible changes now could have dramatic backwards compatibility issues with old documents. Similarly, new features cannot be added to the kernel since any new documents written now would then be incompatible with legacy versions of \LaTeX.
+
+The situation on the package level is quite different though. While most of us have stopped developing packages for \LaTeXe{} there are many contributing developers that continue to enrich \LaTeXe{} by providing or extending add-on packages with new or better functionality.
+
+However, the \LaTeX\ team certainly recognises that there are improvements to be made to the kernel code; over the last few years we have been working on building, expanding, and solidifying the \textsf{expl3} programming layer for future \LaTeX\ development. We are using \textsf{expl3} to build new interfaces for package development and tools for document design. Progress here is continuing.
+
+\section{Release notes}
+
+In addition to a few small documentation fixes, the following changes have been made to the \LaTeXe\ code; in accordance with the philosophy of minimising forwards and backwards compatibility problems, most of these will not be noticeable to the regular \LaTeX\ user.
+
+\paragraph{Font subsets covered by Latin Modern and \TeX\ Gyre}
+
+The Latin Modern and \TeX\ Gyre fonts are a modern suite of families based
+on the well-known Computer Modern and `PostScript 16' families with many additional
+characters for high-quality multilingual typesetting.%
+\footnote{%
+ See their respective TUGboat articles for more information:\\
+ \url{http://www.tug.org/TUGboat/tb24-1/jackowski.pdf}\\
+ \url{http://www.tug.org/TUGboat/tb27-2/tb87hagen-gyre.pdf}%
+}
+
+Information about their symbol coverage in the \verb|TS1| encoding is now included
+in \texttt{textcomp}'s default font definitions.
+
+% \paragraph{Private conditional switch in italic correction}
+% negligible improvement/only useful to LaTeX programmers: not worth documenting I think?
+
+% \paragraph{Improve formatting in \texttt{doc} for filenames with some punctuation}
+% negligible improvement, again?
+
+\paragraph{Redefinition of \cs{enddocument}}
+
+Inside the definition of \verb=\end{document}= the \texttt{.aux} file is read back in to resolve cross-references and build the table of contents etc. From 2.09 days this was done using \verb=\input= without any surrounding braces which could lead to some issues in boundary cases, especially if \verb=\input= was redefined by some package. It was therefore changed to use \LaTeXe{}'s internal name for this function. As a result, packages that modify \verb=\enddocument= other than through the officially provided hooks may need to get updated.
+
+\paragraph{Small improvement with split footnotes in \texttt{ftnright}}
+
+If in the first column there is more than a full column worth of footnote
+material the material will be split resulting in footnotes out of
+order. This issue is now at least detected and generates an error but the algorithm used by the package is
+unable to gracefully handle it in an automated fashion (some alternatives for resolving the problem if it happens are given in the package documentation).
+
+\paragraph{Improvement in \texttt{xspace} and font-switching}
+
+The \texttt{xspace} package provides the command \verb|\xspace|
+which attempts to be clever about inserting spaces automatically
+after user-defined control sequences.
+An important bug fix has been made to this command to correct its
+behaviour when used in conjunction with font-switching commands
+such as \verb|\emph| and \verb|\textbf|.
+Previously, writing
+\begin{verbatim}
+ \newcommand\foo{foo\xspace}
+ ... \emph{\foo} bar baz
+ ... \emph{\foo}, bar baz
+\end{verbatim}
+would result in an extraneous space being inserted after `foo' in
+both cases; this has now been corrected.
+
+
+\paragraph{RTL in \texttt{multicol}}
+
+ The 1.7 release of \texttt{multicol} adds support for languages that are typeset
+ right-to-left. For those languages the order of the columns on the page
+ also needs to be reversed---something that wasn't possible in earlier releases.
+
+The new feature is supported through the
+commands \verb|\RLmulticolcolumns| (switching to right-to-left typesetting)
+and \verb|\LRmulticolcolumns| (switching to left-to-right typesetting) the
+latter being the default.
+
+\paragraph{Improve French \texttt{babel} interaction with \texttt{varioref}}
+
+ Extracting and saving the page number turned out to be a source of subtle
+ bugs. Initially it was done through an \verb"\edef" with a bunch of
+\verb"\expandafter" commands inside. This posed a problem if the page number
+ itself contained code which needed protection (e.g., pr/4080) so this got
+ changed in the last release to use \verb"\protected@edef". However, that in turn failed with Babel
+(bug report/4093) if the label contained active characters, e.g., a ``:'' in French. So now
+we use (after one failed attempt pr/4159) even more \verb"\expandafter" commands and \verb"\romannumeral" trickery to avoid any expansion other
+ than what is absolutely required---making the code in that space absolutely unreadable.
+\begin{verbatim}
+ \expandafter\def\expandafter#1\expandafter{%
+ \romannumeral
+ \expandafter\expandafter\expandafter
+ \z@
+ \expandafter \@cdr
+ \romannumeral
+ \expandafter\expandafter\expandafter
+ \z@
+ \csname r@#2\endcsname\@nil}%
+\end{verbatim}
+Code like this nicely demonstrates the limitations in the programming layer of \LaTeXe{} and the advantages that \textsf{expl3} will offer on this level.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews21.pdf b/macros/latex-dev/base/ltnews21.pdf
new file mode 100644
index 0000000000..b4d610ee25
--- /dev/null
+++ b/macros/latex-dev/base/ltnews21.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews21.tex b/macros/latex-dev/base/ltnews21.tex
new file mode 100644
index 0000000000..f9416b58e1
--- /dev/null
+++ b/macros/latex-dev/base/ltnews21.tex
@@ -0,0 +1,255 @@
+% \iffalse meta-comment
+%
+% Copyright 2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews21.tex
+%
+% This is issue 21 of LaTeX News.
+
+\documentclass{ltnews}
+\def\ConTeXt{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\publicationmonth{May}
+\publicationyear{2014}
+
+\publicationissue{21}
+
+\begin{document}
+
+\maketitle
+
+\section{Scheduled \LaTeX\ bug-fix release}
+
+This issue of \LaTeX~News marks the second bug-fix release of
+\LaTeXe\ (standard \LaTeX) since shifting to a new build system in 2009.
+Provided sufficient changes are made, we expect to
+make such releases yearly or every two years, in sync with \TeX\ Live.
+
+
+
+\subsection{Release notes}
+
+This release makes no changes to the core code in the \LaTeXe\ format
+but there are a small number of documentation fixes (not listed
+here). In addition several packages in the \textsf{base} and
+\textsf{required} areas have been updated as detailed below.
+
+
+This has been done in accordance with the philosophy of minimising
+problems in both forwards and backwards compatibility, so most of
+these changes should not be noticed by the regular \LaTeX\ user.
+
+References in the text below of the form ``graphics/3873'' are to
+bug reports listed
+at:\\ \url{http://latex-project.org/cgi-bin/ltxbugs2html}
+
+
+\let\paragraph\subsubsection
+
+\paragraph{\textsf{fixltx2e} updates}
+
+
+
+There are a number of bugs and faulty design decisions in \LaTeXe{}
+that should have been corrected long ago in the kernel code. However,
+such corrections cannot be done as this would break backwards
+compatibility in the following sense. A large number of documents
+exist by now that have worked around the bug or have even made use of
+a particular misfeature. Thus changing the kernel code would break
+too many existing documents.
+
+The corrections for these types of bug have therefore been collected together
+in a package that can be loaded only when needed; its name is \textsf{fixltx2e}.
+For this release we made the following changes to this package:
+\begin{itemize}
+\item
+ Misspelled float placement specifiers such as
+ \verb=\begin{figure}[tv]= instead of \texttt{tb} are silently
+ ignored by the kernel code. Now we test for such letters and issue
+ an error message.
+\item
+ \LaTeX's float handling algorithm can get out of sync if you mix
+ single and double-column floats (as they are placed independently
+ of each other). This was corrected in \textsf{fixltx2e} a few years ago
+ but the fix was not perfect as one situation using
+ \verb=\enlargethispage= generated a low-level \TeX{} error.
+ This behaviour of the package is now improved.
+\end{itemize}
+
+
+
+
+\paragraph{New \textsf{fltrace} package}
+
+For years the file \texttt{ltoutput.dtx} contained some hidden code to
+trace the detailed behaviour of the float placement algorithm of
+\LaTeX. Prompted by questions on StackExchange we now extract this
+code into a new \textsf{fltrace} package. To see the float algorithm
+in action (or to understand why it decides to place all your floats at
+the very end of the document) use
+\begin{verbatim}
+ \usepackage{fltrace} \tracefloats
+\end{verbatim}
+To stop tracing somewhere in the document use
+\verb=\tracefloatsoff= and to see the current value of various float
+parameters use \verb=\tracefloatvals=. As the package is identical to
+the kernel code with tracing added, it may or may not work if you load any
+other package that manipulates that part of the kernel code. In such a
+case your best bet is to load \textsf{fltrace} first.
+
+\paragraph{\textsf{inputenc} package updates}
+
+The \textsf{inputenc} package allows different input encodings for
+\LaTeX\ documents to be specified including the important
+\texttt{utf8} option used to specify the Unicode UTF-8 encoding. A
+common mistake in documents has been to also include this option when
+using the Unicode-based \TeX\ engines \hologo{LuaTeX} and \hologo{XeTeX}
+producing strange errors as these engines natively deal with UTF-8
+characters.
+
+If a document stored in an 8bit encoding is processed by
+\hologo{pdfTeX}, it needs the \textsf{inputenc} package to work
+correctly. However, if such a document is processed unchanged by
+\hologo{LuaTeX} or \hologo{XeTeX}, then accented characters may
+silently get dropped from the output.
+
+The package has been modified so that if used with \hologo{LuaTeX} or
+\hologo{XeTeX}, then it just issues a warning if \texttt{utf8} or
+\texttt{ascii} is specified, and stops with an error for any other
+encoding requested.
+
+
+
+One further improvement has been made to the encoding definition files
+(\texttt{.def}) used by \textsf{inputenc}: the catcode of \texttt{@}
+is now saved and restored when reading them instead of always using
+\verb=\makeatother= inside the files (latex/4192).
+
+
+
+\paragraph{The tools directory}
+
+In the past each of the sub-directories in the ``required'' section of
+the \LaTeX{} distribution contained a single \texttt{.ins} file to
+generate the code files from the source files. We have now
+started to provide individual \texttt{.ins} files for each of those
+packages that are likely to require updates outside a major
+\LaTeX{} release.
+
+\paragraph{\textsf{multicol} updates}
+
+Version 1.8 of \textsf{multicol} implements some improvements/fixes
+and one extension. In the past the balancing algorithm enlarged the
+column height until it found a solution that satisfied all
+constraints. If there were insufficient break points then the final
+column height could have been much larger than expected and if that
+happened near the end of the page it resulted in the text overflowing
+into the bottom margin. This situation is now detected and in that
+case a normal page is cut and balancing is resumed on the next
+page. Some overflow is still allowed and controlled via the parameter
+\verb=\maxbalancingoverflow=.
+
+The use of \verb=\enlargethispage= is now properly supported within
+the environment. Finally a new command \verb=\docolaction= was added
+to allow the execution of code depending on the column in which the
+command is executed. See the documentation for details.
+
+Bug fixes: the new version fixes both a color leak that could happen
+in certain situations and the problem that \texttt{multicols} could
+mess up the positioning of \verb=\marginpar=s that followed the
+environment.
+
+
+\paragraph{\textsf{tabularx} updates}
+
+The restrictions on embedding \verb|\tabularx| \verb|\endtabularx|
+into the definition of a new environment have been relaxed
+slightly. See the package documentation for details.
+
+\paragraph{\textsf{showkeys} updates}
+
+The \textsf{showkeys} package has been updated to fix problems if used
+at the start of list items, and to work if brace groups (\verb|{| and
+\verb|}|) are used in the optional argument of
+\verb|\cite|. (tools/4162, tools/4173)
+
+
+\paragraph{\textsf{color} updates}
+
+The \verb|\nopagecolor| command suggested by Heiko Oberdiek,
+available for some years in the \textsf{pdftex} option, has been
+added to the core package as suggested in graphics/3873. Currently
+this is supported in the driver files for \textsf{dvips} and
+\textsf{pdftex}. Patches to support other drivers are welcome.
+
+ \paragraph{\textsf{graphicx} updates}
+
+The \textsf{graphicx} version of \verb|\rotatebox| now allows
+\verb|\par| (and blank lines) in values, to match the change made
+to the \textsf{graphics} version some years ago. See graphics/4296.
+
+
+\paragraph{\textsf{keyval} updates}
+
+All parsing used in the \textsf{keyval} package has been changed
+to allow \verb|\par| (and blank lines) in values.
+(A second change, to parsing of brace groups
+in a construct such as \texttt{key=\{\{\{value\}\}\}}, was reverted in v1.15.)
+See graphics/3446.
+
+
+
+
+\vfill
+
+\section{Standard \LaTeX\ (\LaTeXe) and \textsf{expl3}}
+
+The substantial collection of innovative code in \textsf{expl3}
+implements a new programming language that has for a while now been
+used by some writers of \LaTeXe\ packages. This code has recently
+also been made available for use on top of plain \TeX\ or {\ConTeXt},
+largely to support generic packages that are supposed to work with
+different flavours of \TeX. These uses in no way affect authors of
+\LaTeX\ documents and such \LaTeXe\ packages will continue to work as
+advertised by their authors with standard \LaTeX.
+
+This code base will also become an important foundation for the kernel
+of \LaTeX3 and so the new programming language can be described as
+`The \LaTeX3 Programming Language'. However, if you see or hear that a
+package `uses \LaTeX3' then it remains very unlikely (as yet) to mean
+that the package is part of some `new version of \LaTeX'.
+
+News about the development and use of \textsf{expl3} and about other
+developments in the \LaTeX3 code base is reported regularly in the
+\LaTeX3~News series (\url{http://latex-project.org/l3news/}), the most
+recent issue of which was published in March 2014.
+
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews22.pdf b/macros/latex-dev/base/ltnews22.pdf
new file mode 100644
index 0000000000..c9c528a69f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews22.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews22.tex b/macros/latex-dev/base/ltnews22.tex
new file mode 100644
index 0000000000..65d7db900a
--- /dev/null
+++ b/macros/latex-dev/base/ltnews22.tex
@@ -0,0 +1,244 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews22.tex
+%
+% This is issue 22 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\publicationmonth{January}
+\publicationyear{2015}
+
+\publicationissue{22}
+
+\begin{document}
+
+\maketitle
+
+\section{New \LaTeXe\ bug-fix policy}
+
+\subsection{Introduction}
+
+For some years we have supplied bug fixes to the \LaTeXe\ kernel via the
+\textsf{fixltx2e} package. This
+kept the kernel stable, but at the expense of meaning that most users did not
+benefit from bug fixes, and that some compromises
+which were made to save space in the
+machines of the time are still affecting most users today.
+
+In this release we have started a new update policy. All the fixes previously
+available via \textsf{fixltx2e} are now enabled \emph{by default} in the
+format, as are some further extensions for extended \TeX\ engines, \eTeX,
+\hologo{XeTeX} and \hologo{LuaTeX}. Compatibility and stability are still
+important considerations, and while most users will not notice these
+improvements, or will want to benefit from them, a new \textsf{latexrelease}
+package is provided that will revert all the changes and re-instate the
+definitions from earlier releases. The package can also be used with older
+releases to effectively \emph{update} the kernel to be equivalent to this 2015
+release.
+
+A new document, \textsf{latexchanges}, is distributed with the release
+that documents all the changes to documented commands since the 2014
+\LaTeX\ release, and will be updated in future releases if further
+changes have been made.
+
+\subsection{The \textsf{latexrelease} package}
+
+As noted above a new package is available to manage differences between \LaTeX\
+releases. If you wish to revert all changes back to the definitions as they
+were in previous releases you may start your document requesting the \LaTeX{} release from May~2014:
+\begin{verbatim}
+\RequirePackage[2014/05/01]{latexrelease}
+\documentclass{article}
+\end{verbatim}
+Conversely if you start a large project now and want to protect yourself
+against possible future changes, you may start your document
+\begin{verbatim}
+\RequirePackage[2015/01/01]{latexrelease}
+\documentclass{article}
+\end{verbatim}
+Then the version of \textsf{latexrelease} distributed with any future \LaTeX\
+release will revert any changes made in that format, and revert to the
+definitions as they where at the beginning of 2015.
+
+If you wish to share a document using the latest features with a
+user restricted to using an older
+format, you may use the form above and make the \textsf{latexrelease} package
+available on the older installation. The package will then update the format
+definitions as needed to enable the older format to work as if dated on the date
+specified in the package option.
+
+\subsection{The \cs{IncludeInRelease} command}
+
+The mechanism used in the \textsf{latexrelease} package is available for use in
+package code. If in your \textsf{zzz} package you have
+\begin{verbatim}
+\RequirePackage{latexrelease}
+\IncludeInRelease{2015/06/01}
+ {\zzz}{\zzz definition}
+ \def\zzz......new code
+\EndIncludeInRelease
+\IncludeInRelease{0000/00/00}
+ {\zzz}{\zzz definition}
+ \def\zzz....original
+\EndIncludeInRelease
+\end{verbatim}
+then in a document using a format dated 2015/06/01 or later, the ``new code''
+will be used, and for documents being processed with an older format, the
+``original'' code will be used. Note the format date here may be the original
+format date as shown at the start of every \LaTeX\ run, or a format date
+specified as a package option to the \textsf{latexrelease} package.
+
+So if the document has
+\begin{verbatim}
+\RequirePackage[2014/05/01]{latexrelease}
+\documentclass{article}
+\usepackage{zzz}
+\end{verbatim}
+then it will use the \emph{original} definition of \verb|\zzz| even if
+processed with the current format, as the format acts as if dated 2014/05/01.
+
+
+\subsection{Limitations of the approach}
+
+The new concept provides full backward and forward compatibility for
+the \LaTeX{} format, i.e., with the help of a current
+\textsf{latexrelease} package the kernel can emulate all released
+formats (starting with 2014/06/01\footnote{Patching an older format
+ most likely works too, given that the changes in the past have been
+ minimal, though this isn't guaranteed and hasn't been tested.}).
+
+
+However, this is not necessarily true for all packages.
+ Only if a package makes use of the \cs{IncludeInRelease}
+functionality will it adjust to the
+requested \LaTeX{} release date. Initially this will only be true for
+a few selected packages and in general it may not even be advisable for packages
+that have their own well-established release cycles and methods.
+
+Thus, to regenerate a document with 100\,\% compatible behavior
+it will still be necessary
+to archive it together with all its inputs, for example, by archiving
+the base distribution trees (and any modifications made). However, the
+fact that a document requests a specific \LaTeX{} release date should
+help identifying what release tree to use to achieve perfect accuracy.
+
+
+\section{Updates to the kernel}
+
+\subsection{Updates incorporated from \textsf{fixltx2e}}
+
+The detailed list of changes incorporated from \textsf{fixltx2e} is
+available in the new \textsf{latexchanges} document that is
+distributed with this release. The main changes are that $2$-column
+floats are kept in sequence with one column floats, corrections are
+made to the \verb|\mark| system to ensure correct page headings in
+$2$-column documents, several additional commands are made robust.
+
+\subsection{\eTeX\ register allocation}
+
+\LaTeX\ has traditionally used allocation routines inherited from plain \TeX\
+that allocated registers in the range $0$--$255$. Almost all distributions have
+for some years used \eTeX\ based formats (or \hologo{XeTeX} or \hologo{LuaTeX})
+which have $2^{15}$ registers of each type ($2^{16}$ in the case of
+\hologo{LuaTeX}). The \textsf{etex} package has been available to provided an
+allocation mechanism for these extended registers but now the format will by
+default allocate in a range suitable for the engine being used. The new
+allocation mechanism is different than the \textsf{etex} package mechanism, and
+supports \hologo{LuaTeX}'s full range and an allocation mechanism for \LaTeX\
+floats as described below.
+
+On \eTeX\ based engines, an additional command, \verb|\newmarks| is available
+(as with the \textsf{etex} package) that allocates extended \eTeX\ marks, and
+similarly if \hologo{XeTeX} is detected a new command
+\verb|\newXeTeXintercharclass| is available, this is similar to the command
+previously defined in the \texttt{xelatex.ini} file used to build the
+\texttt{xelatex} format.
+
+\subsection{Additional \LaTeX{} float storage}
+
+\LaTeX's float placement algorithm needs to store floats (figures and tables)
+until it finds a suitable page to output them. It allocates $18$ registers for
+this storage, but this can often be insufficient.
+ The contributed \textsf{morefloats} package has
+been available to extend this list; however, it also only allocates from the
+standard range $0$--$255$ so cannot take advantage of the extended registers.
+The new allocation mechanism in this release incorporates a new command
+\verb|\extrafloats|. If you get the error:
+\mbox{\texttt{Too many unprocessed floats.}}
+then you can add (say) \verb|\extrafloats{500}| to the document preamble to
+make many more boxes available to hold floats.
+
+
+\subsection{Built-in support for Unicode engines}
+
+The kernel sources now detect the engine being used and adjust definitions
+accordingly, this reduces the need for the ``\texttt{.ini}'' files used to make
+the formats to patch definitions defined in \texttt{latex.ltx}.
+
+As noted above the format now includes extended allocation routines.
+
+The distribution includes a file \textsf{unicode-letters.def} derived from the
+Unicode Consortium's Unicode Character Data files that details the upper and
+lower case transformation data for the full Unicode range. This is used to set
+the \verb|lccode| and \verb|uccode| values if a Unicode engine is being used,
+rather than the values derived from the T1 font encoding which are used with
+8-bit engines.
+
+Finally \verb|\typein| is modified if \hologo{LuaTeX} is detected
+such that it works with this engine.
+
+\section{l3build}
+
+This release has been tested and built using a new build system implemented in
+\textsf{Lua}, intended to be run on the \textsf{texlua} interpreter distributed
+with modern \TeX\ distributions. It is already separately available
+from CTAN. This replaces earlier build systems (based at various times on
+\textsf{make}, \textsf{cons}, and Windows \textsf{bat} files). It allows the
+sources to be tested and packaged on a range of platforms (within the team,
+OS X, Windows, Linux and Cygwin platforms are used). It also allows the
+format to be tested on \hologo{XeTeX} and \hologo{LuaTeX} as well as the
+standard \hologo{pdfTeX}/\eTeX\ engines.
+
+\section{Hyperlinked documentation and TDS zip files}
+
+As well as updating the build system, the team have looked again at exactly
+what gets released to \textsc{ctan}. Taking inspiration from Heiko Oberdiek's
+\textsf{latex-tds} bundle, the PDF documentation provided now includes
+hyperlinks where appropriate. This has been done without modifying the sources
+such that users without \textsf{hyperref} available can still typeset the
+documentation using only the core distribution. At the same time, the release
+now includes ready-to-install TDS-style zip files. This will be of principal
+interest to \TeX\ system maintainers, but end users with older machines who
+wish to manually update \LaTeX\ will also benefit.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews23.pdf b/macros/latex-dev/base/ltnews23.pdf
new file mode 100644
index 0000000000..464b6e0b78
--- /dev/null
+++ b/macros/latex-dev/base/ltnews23.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews23.tex b/macros/latex-dev/base/ltnews23.tex
new file mode 100644
index 0000000000..693e22de83
--- /dev/null
+++ b/macros/latex-dev/base/ltnews23.tex
@@ -0,0 +1,257 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews23.tex
+%
+% This is issue 23 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\makeatletter % -- provide command introduced in new release
+ % so this typesets with an old format
+
+% Check we are not in the preamble of a composite document
+\def\@tempa{\@latex@error{Can be used only in preamble}\@eha}
+\ifx\DeclareTextCommandDefault\@tempa
+\else
+ \DeclareTextCommandDefault\textcommabelow[1]
+ {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
+ \hbox{\check@mathfonts\fontsize\ssf@size\z@
+ \math@fontsfalse\selectfont,}\hidewidth}\egroup}
+\fi
+\makeatother
+
+\publicationmonth{October}
+\publicationyear{2015}
+
+\publicationissue{23}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Enhanced support for \hologo{LuaTeX}}
+
+As noted in \LaTeX\ News 22, the 2015/01/01 release of \LaTeX{}
+introduced built-in support for extended \TeX\ systems.
+
+The range of allocated register numbers (for example, for count
+registers) is now set according to the underlying engine capabilities
+to 256, 32768 or 65536. Additional allocators were also added for the
+facilities added by \hologo{eTeX} (\verb|\newmark|) and \hologo{XeTeX}
+(\verb|\newXeTeXintercharclass|). At that time, however, the work to
+incorporate additional allocators for \hologo{LuaTeX} was not ready for
+distribution.
+
+The main feature of this release is that by default it includes
+allocators for \hologo{LuaTeX}-provided features, such as Lua
+functions, bytecode registers, catcode tables and Lua callbacks.
+Previously these features have been provided by the contributed
+\package{luatex} (Heiko Oberdiek) and \package{luatexbase}
+(\'{E}lie Roux,
+ Manuel P\'{e}gouri\'{e}-Gonnard and Philipp Gesang)
+packages. However, just as
+noted with the \package{etex} package in the previous release, it is
+better if allocation is handled by the format to avoid problems with
+conflicts between different allocation schemes, or definitions made
+before a package-defined allocation scheme is enabled.
+
+The facilities incorporated into the format with this release, and
+described below, are closely modelled on the \package{luatexbase}
+package and we thank the authors, and especially \'{E}lie Roux, for
+help in arranging this transition.
+
+The implementation of these \hologo{LuaTeX} features has been
+redesigned to match the allocation system introduced in the 2015/01/01
+\LaTeX\ release, and there are some other differences from the previous
+\package{luatexbase} package. However, as noted below,
+\package{luatexbase} is being updated in line with this \LaTeX\ release
+to provide the previous interface as a wrapper around the new
+implementation, so we expect the majority of documents using
+\package{luatexbase} to work without change.
+
+\subsection{Names of \hologo{LuaTeX} primitive commands}
+
+The 2015/01/01 \LaTeX\ release for the first time initialised
+\hologo{LuaTeX} in \textsf{latex.ltx} if \hologo{LuaTeX} is being
+used. Following the convention used in the contributed
+\textsf{lualatex.ini} file used to set up the format for earlier
+releases, most \hologo{LuaTeX}-specific primitives were defined with
+names prefixed by \texttt{luatex}. This was designed to minimize name
+clashes but had the disadvantage that names did not match the
+\hologo{LuaTeX} manual, or the names used in other formats, and
+produced some awkward command names such as \verb|\luatexluafunction|.
+From this release the names are enabled without the \texttt{luatex}
+prefix.
+
+In practice this change should not affect many documents; relatively
+few packages access the primitive commands, and many of those are
+already set up to work with prefixed or unprefixed names, so that they
+work with multiple formats.
+
+For package writers, if you want to ensure that your code works with
+this and earlier releases, use unprefixed names in the package and
+ensure that they are defined by using code such as:
+\begin{verbatim}
+\directlua{tex.enableprimitives("",
+ tex.extraprimitives(
+ "omega", "aleph", "luatex"))}
+\end{verbatim}
+Conversely if your document uses a package relying on prefixed names
+then you can add:
+\begin{verbatim}
+\directlua{tex.enableprimitives("luatex",
+ tex.extraprimitives(
+ "omega", "aleph", "luatex"))}
+\end{verbatim}
+to your document.
+
+Note the compatibility layer offered by the \package{luatexbase} package
+described below makes several commands available under both names.
+
+As always, this change can be reverted using:\\
+\verb|\RequirePackage[2015/01/01]{latexrelease}|\\
+at the start of the document.
+
+
+
+\subsection{\TeX\ commands for allocation in \hologo{LuaTeX}}
+For detailed descriptions of the new allocation commands see the
+documented sources in \textsf{ltluatex.dtx} or chapter N of
+\textsf{source2e}; however, the following new allocation commands are
+defined by default in \hologo{LuaTeX}:
+\verb|\newattribute|,
+\verb|\newcatcodetable|,
+\verb|\newluafunction| and
+\verb|\newwhatsit|.
+In addition, the commands \verb|\setattribute| and
+\verb|\unsetattribute| are defined to set and unset Lua attributes
+(integer values similar to counters, but attached to nodes). Finally
+several catcode tables are predefined:
+\verb|\catcodetable@initex|,
+\verb|\catcodetable@string|,
+\verb|\catcodetable@latex|,
+\verb|\catcodetable@atletter|.
+
+\subsection{Predefined Lua functions}
+If used with \hologo{LuaTeX}, \LaTeX\ will initialise a Lua table,
+\textsf{luatexbase}, with functions supporting allocation and also
+the registering of Lua callback functions.
+
+\subsection{Support for older releases and plain \TeX}
+The \hologo{LuaTeX} allocation functionality made available in this
+release is also available in plain \TeX\ and older \LaTeX\ releases
+in the files \textsf{ltluatex.tex} and \textsf{ltluatex.lua} which may be
+used simply by including the \TeX\ file: \verb|\input{ltluatex}|.
+An alternative for old \LaTeX\ releases is to use:\\
+\verb|\RequirePackage[2015/10/01]{latexrelease}|\\
+which will update the kernel to the current release, including
+\hologo{LuaTeX} support.
+
+\subsection{Additional \hologo{LuaTeX} support packages}
+In addition to the base \LaTeX\ release two packages have been
+contributed to the \textsf{contrib} area on CTAN. The
+\package{ctablestack} package offers some commands to help package
+writers control the \hologo{LuaTeX} \textsf{catcodetable}
+functionality, and the \package{luatexbase} package replaces the
+previously available package of the same name, providing a compatible
+interface but implemented over the \package{ltluatex} code.
+
+\section{More Floats and Inserts}
+If \hologo{eTeX} is available, the number of registers allocated in
+the format to hold floats such as figures is increased from 18 to 52.
+
+The extended allocation system introduced in 2015/01/01 means that in
+most cases it is no longer necessary to load the \package{etex}
+package. Many classes and packages that previously loaded this package
+no longer do so. Unfortunately in some circumstances where a package
+or class previously used the \package{etex} \verb|\reserveinserts|
+command, it is possible for a document that previously worked to
+generate an error ``no room for a new insert''. In practice this error
+can always be avoided by declaring inserts earlier, before the
+registers below 256 are all allocated. However, it is better not
+to require packages to be re-ordered and in some cases the re-ordering
+is complicated due to delayed allocations in \verb|\AtBeginDocument|.
+
+In this release, a new implementation of
+\verb|\newinsert| is used which allocates inserts from the previously
+allocated float lists once the classical register allocation has run
+out. This allows an extra 52 (or in \hologo{LuaTeX}, 64~thousand)
+insert allocations which is more than enough for practical documents
+(by default, \LaTeX\ only uses two insert allocations).
+
+\section{Updated Unicode data}
+
+
+The file \textsf{unicode-letters.def} recording catcodes, upper and
+lower case mappings and other properties for Unicode characters has
+been regenerated using the data files from Unicode~8.0.0.
+
+\section{Support for Comma Accent}
+The command \verb|\textcommabelow| has been added to the format.
+This is mainly used for the Romanian letters
+\textcommabelow{S}\textcommabelow{s}\textcommabelow{T}\textcommabelow{t}.
+This was requested in latex/4414 in the \LaTeX\ bug tracker.
+
+\section{Extended \package{inputenc}}
+The \texttt{utf8} option for \package{inputenc} has been extended to support
+the letters s and t with comma accent,
+U+0218\,--\,U+021b. Similarly circumflex w and y U+0174\,--\,U+0177 are defined.
+Also U+00a0 and U+00ad are declared by default, and defined to be
+\verb|\nobreakspace| and \verb|\-| respectively.
+
+The error message given on undefined UTF-8 input characters
+now displays the Unicode number
+in U+\textit{hex} format in addition
+to showing the character.
+
+\section{Pre-release Releases}
+The patch level mechanism has been used previously to identify \LaTeX\
+releases that have small patches applied to the main release, without
+changing the main format date.
+
+The mechanism has now been extended to allow identification of
+pre-release versions of the software (which may or may not be released
+via CTAN) but can be identified with a banner such as\\
+{\catcode`\<=13 \def<{\string<} \catcode`\>=13 \def>{\string>}%
+\verb|LaTeX2e <2015/10/01> pre-release-1|}\\
+Internally this is identified as a patch release with a negative patch
+level.
+
+\section{Updates in tools}
+
+The \package{multicol} package has been updated to fix the interaction
+with ``here'' floats that land on the same page as the start or end of
+a \textsf{multicols} environment.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews24.pdf b/macros/latex-dev/base/ltnews24.pdf
new file mode 100644
index 0000000000..d428dfd11c
--- /dev/null
+++ b/macros/latex-dev/base/ltnews24.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews24.tex b/macros/latex-dev/base/ltnews24.tex
new file mode 100644
index 0000000000..6cba173b60
--- /dev/null
+++ b/macros/latex-dev/base/ltnews24.tex
@@ -0,0 +1,263 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2015-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews24.tex
+%
+% This is issue 24 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\makeatletter % -- provide command introduced in new release
+ % so this typesets with an old format
+
+% Check we are not in the preamble of a composite document
+\def\@tempa{\@latex@error{Can be used only in preamble}\@eha}
+\ifx\DeclareTextCommandDefault\@tempa
+\else
+ \DeclareTextCommandDefault\textcommabelow[1]
+ {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
+ \hbox{\check@mathfonts\fontsize\ssf@size\z@
+ \math@fontsfalse\selectfont,}\hidewidth}\egroup}
+ \DeclareTextCommandDefault\textcommaabove[1]{%
+ \hmode@bgroup
+ \ooalign{%
+ \hidewidth
+ \raise.7ex\hbox{%
+ \check@mathfonts\fontsize\ssf@size\z@\math@fontsfalse\selectfont`%
+ }%
+ \hidewidth\crcr
+ \null#1\crcr
+ }%
+ \egroup
+ }
+\fi
+
+\makeatother
+
+\publicationmonth{February}
+\publicationyear{2016}
+
+\publicationissue{24}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{\hologo{LuaTeX} support}
+
+This release refines the \hologo{LuaTeX} support introduced in the
+2015/10/01 release. A number of patches have been added to improve the
+behavior of \package{ltluatex} (thanks largely to code review by Philipp Gesang).
+The kernel code has been adjusted to
+allow for changes in \hologo{LuaTeX} v0.85--v0.88. Most notably, newer
+\hologo{LuaTeX} releases allow more than $16$ write streams and these are now
+enabled for use by \verb|\newwrite|, but also the experimental
+\texttt{newtoken} Lua library has been renamed back to \texttt{token}
+which required small adjustments in the \hologo{LuaTeX} setup.
+
+The biggest change in \hologo{LuaTeX} v0.85--v0.87 compared to previous
+versions is that all the primitives (originally defined in
+\hologo{pdfTeX}) dealing with the PDF ``back end''
+are no longer defined, being replaced by a much smaller set of new primitives.
+This does not directly affect the core \LaTeX{}
+files in this release but has required major changes to the
+\texttt{.ini} files used by \TeX{} Live and similar distributions to
+set up the format files. These changes in the \hologo{LuaTeX} engine
+will affect any packages using these back end commands (packages such
+as \package{graphics}, \package{color}, \package{hyperref}, etc.).
+Until all contributed packages are updated to the new syntax users may
+need to add aliases for the old \hologo{pdfTeX} commands. A new
+\package{luapdftexalias} package has been contributed to CTAN (not part of the
+core \LaTeX\ release) that may be used for this purpose.
+
+See also the sections below for related changes in the
+\textsf{tools} and \textsf{graphics} bundles.
+
+
+\section{Unicode data}
+
+As noted in \LaTeX{} News~22, the 2015/01/01 release of \LaTeX{} introduced
+built-in support for extended \TeX{} systems. In particular, the kernel now
+loads appropriate data from the Unicode Consortium to set \verb|\lccode|,
+\verb|\uccode|, \verb|\catcode| and \verb|\sfcode| values in an automated
+fashion for the entire Unicode range.
+
+The initial approach taken by the team was to incorporate the existing model
+used by (plain) \hologo{XeTeX} and to pre-process the ``raw'' Unicode data into
+a ready-to-use form as \verb|unicode-letters.def|. However, the relationship
+between the Unicode Consortium files and \TeX{} data structures is non-trivial and still
+being explored. As such, it is preferable to directly parse the original
+(\verb|.txt|) files at point of use. The team has therefore ``spun-out'' both
+the data and the loading to a new generic package, \package{unicode-data}. This
+package makes the original Unicode Consortium data files available in the
+\verb|texmf| tree (in \verb|tex/generic/unicode-data|) and provides generic
+loaders suitable for reading this data into the plain, \LaTeXe{}, and other,
+formats.
+
+At present, the following data files are included in this new package:
+\begin{itemize}\parskip=0pt
+ \item \verb|CaseFolding.txt|
+ \item \verb|EastAsianWidth.txt|
+ \item \verb|LineBreak.txt|
+ \item \verb|MathClass.txt|
+ \item \verb|SpecialCasing.txt|
+ \item \verb|UnicodeData.txt|
+\end{itemize}
+These files are used either by \LaTeXe{} or by \package{expl3}
+(i.e.~they represent the set currently required by the team). The
+Unicode Consortium provides various other data files and we would be happy to add
+these to the generic package, as it is intended to provide a single place
+to collect this material in the \verb|texmf| tree. Such requests can be
+mailed to the team as~usual or logged at the package home page:
+\url{https://github.com/latex3/unicode-data}.
+
+The new approach extends use of Unicode data in setting \TeX{} information in
+two ways. First, the \verb|\sfcode| of all end-of-quotation/closing punctuation
+is now set to $0$ (transparent to \TeX{}). Second, \verb|\Umathcode| values are
+now set using \verb|MathClass.txt| rather than setting up only letters (which
+was done using an arbitrary plane~$0$/plane~$1$ separation). There are also
+minor refinements to the existing code setting, particularly splitting the
+concepts of case and letter/non-letter category codes.
+
+For \hologo{XeTeX}, users should note that \verb|\xtxHanGlue| and
+\verb|\xtxHanSpace| are \emph{no longer defined}, that no assignments are made
+to \verb|\XeTeXinterchartoks| and that no \verb|\XeTeXintercharclass| data is
+loaded into the format. The values which were previously inherited from
+the plain \hologo{XeTeX} setup files are \emph{not} suitable for properly
+typesetting East Asian text. There are third-party packages addressing this
+area well, notably those in the \package{CTeX} bundle. Third-party packages
+may need adjustment to load the data themselves; see the \textsf{unicode-data}
+package for one possible loader.
+
+\section{More support for east European accents}
+
+As noted in \LaTeX{} News~23, comma accent support was added for \texttt{s} and
+\texttt{t} in the 2015/10/01 release. In this release a matching
+\verb|\textcommaabove| accent has been added for U+0123 (\verb|\c{g}|,
+\textcommaabove{g}) which is the lower case of U+0122 (\verb|\c{G}|,
+\textcommabelow{G}). In the OT1 and T1 encodings the combinations are
+declared as composites with the \verb|\c| command, which matches the
+Unicode names ``\textsf{latin (capital|small) letter g with cedilla}'' and
+also allows \verb|\MakeUppercase{\c{g}}| to produce \verb|\c{G}|, as
+required. In T1 encoding, the composite of \verb|\c| with \texttt{k}, \texttt{l},
+\texttt{n} and \texttt{r} are also
+declared to use the comma below accent rather than cedilla to match the
+conventional use of these letters.
+
+The UTF-8 \texttt{inputenc} option \texttt{utf8} has been extended to
+support all latin combinations that can be reasonably constructed with a
+(single) accent command an a base character for the T1 encoding so
+\textcommaabove{g}, \k{u} and similar characters may be directly input
+using UTF-8 encoding.
+
+\section{Changes in Graphics}
+
+The changes in \hologo{LuaTeX}~v0.87 mean that the \package{color} and
+\package{graphics} packages no longer share the \texttt{pdftex.def} file
+between \hologo{LuaTeX} and \hologo{pdfTeX}. A separate file
+\texttt{luatex.def} (distributed separately) has been produced, and
+distributions are encouraged to modify \texttt{graphics.cfg} and
+\texttt{color.cfg} configuration files to default to the \texttt{luatex}
+option if \hologo{LuaTeX}~v0.87 or later is being used. The team has
+contributed suitable \texttt{.cfg} files to CTAN to be used
+as models.
+
+Normally it is best to let the local \texttt{graphics.cfg}
+automatically supply the right option depending on the \TeX\ engine
+being used; however the \package{color} and \package{graphics} (and so
+\package{graphicx}) packages have been extended to have an explicit
+\texttt{luatex} option comparable to the existing \texttt{pdftex} and
+\texttt{xetex} options.
+
+The \package{trig} package has been updated so that pre-computed values
+such as $\sin(90)$ now expand to digits (\texttt{1} rather than the
+internal token \verb|\@one| in this case). This allows them to be used
+directly in PDF literal strings.
+
+\section{Changes in Tools}
+
+\hologo{LuaTeX} from version v0.87 no longer supports the
+\verb|\write18| syntax to access system commands. A new package
+\package{shellesc} has been added to \textsf{tools} that defines a new
+command \verb|\ShellEscape| that may be used in all \TeX\ variants to
+provide a consistent access to system commands. The package also
+defines \verb|\write18| in \hologo{LuaTeX} so that it continues to access
+system commands as before; see the package documentation for details.
+
+\section{Improving support for Unicode engines}
+
+\looseness=-1
+Stability concerns are always paramount when considering any change to
+the \LaTeXe{} kernel. At the same time, it is important that the format
+remains usable and gives reliable results for users. For the Unicode
+\TeX{} engines \hologo{XeTeX} and \hologo{LuaTeX} there are important
+differences in behavior from classical ($8$-bit) \TeX{} engines which
+mean that identical default behaviors are not appropriate. Over the
+past 18 months the team has addressed the most pressing of these
+considerations (as detailed above and in \LaTeX{} News~22 and 23),
+primarily by integrating existing patches into the kernel. There are,
+though, important areas which still need consideration, and which
+\emph{may} result in refinements to kernel support in this area in
+future releases.
+
+The default font setup in \LaTeXe{} at present is to use the \texttt{OT1}
+encoding. This assumes that hyphenation patterns have been read using
+appropriate codes: the \texttt{T1} encoding is assumed. The commonly-used
+hyphenation patterns today, \package{hyph-utf8}, are set up in this
+way for $8$-bit engines (\hologo{pdfTeX}) but for Unicode engines use
+Unicode code points. This means that hyphenation will be incorrect
+with Unicode engines unless a Unicode font is loaded. This requires
+a concept of a Unicode font encoding, which is currently provided by
+the \package{fontspec} package in two versions, \texttt{EU1} and
+\texttt{EU2}. The team is working to fully understand what is meant
+by a ``Unicode font encoding'', as unlike a classical \TeX{} encoding
+it is essentially impossible to know what glyphs will be provided
+(though each slot is always defined with the same meaning). There
+is also an overlap between this area and ideas of language and writing
+system, most obviously in documents featuring mixed scripts (for example
+Latin and Cyrillic).
+
+As well as these font considerations, the team is also exploring
+to what extent it is possible to allow existing ($8$-bit)
+documents to compile directly with Unicode engines without requiring
+changes in the sources. Whether this is truly possible remains an open
+question.
+
+It is important to stress that changes will only be made in this area where
+they do \emph{not} affect documents processed with
+\hologo{eTeX}/\hologo{pdfTeX} (i.e.~documents which are written for
+``classical'' $8$-bit \TeX{} engines). Changes will also be made only where
+they clearly address deficiencies in the current setup for Unicode engines
+(i.e.~where current behaviors are wrong).
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews25.pdf b/macros/latex-dev/base/ltnews25.pdf
new file mode 100644
index 0000000000..31169caec3
--- /dev/null
+++ b/macros/latex-dev/base/ltnews25.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews25.tex b/macros/latex-dev/base/ltnews25.tex
new file mode 100644
index 0000000000..9d675015c3
--- /dev/null
+++ b/macros/latex-dev/base/ltnews25.tex
@@ -0,0 +1,137 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2016-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews25.tex
+%
+% This is issue 25 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+
+\publicationmonth{March}
+\publicationyear{2016}
+
+\publicationissue{25}
+
+\begin{document}
+
+\maketitle
+
+\section{Lua\TeX}
+This \LaTeX\ release sees several internal changes designed to ensure
+that the system is still usable with Lua\TeX\ versions greater than
+0.80, which have introduced many changes into the engine, most notably
+the removal or renaming of most of the primitive commands introduced by
+pdf\TeX. Also the lists of Lua callbacks handled by the callback
+allocation mechanism has been updated to match the callbacks defined
+in Lua\TeX\ version 0.90.
+
+These changes have also required updates in \textsf{tools}
+and \textsf{amsmath} as described below.
+
+This is the first release of \LaTeX\ for which the test suite reports
+no failures when used with Lua\TeX.
+
+\section{Documentation checksums}
+The \package{doc} package has always provided two mechanisms that were
+mainly intended to guard against file truncation or corruption when
+files were commonly distributed by email through unreliable mail
+gateways: a Character Table of the ASCII character set could be
+inserted (and checked) and a ``checksum'' (count of the number of
+backslashes in the code sections) could be checked. These features
+are not really needed with modern distribution mechanisms and can be a
+distraction when reading the source code and so have been removed. The
+\package{doc} package has been updated so that if you use a
+\verb|\CheckSum| command then, as before, the number is checked;
+however, if you omit the command then no error or warning is given.
+
+
+\section{Updates to \package{inputenc}}
+
+The UTF-8 support in \package{inputenc} has been further extended with
+support for non-breaking hyphens and more dashes.
+
+\section{Updates in Tools}
+
+The \package{varioref} package has been updated with improved
+documentation of multi\-lingual support, and avoiding unnecessary warnings in
+some cases with \verb|\reftextfaraway|.
+
+The \package{tabularx} package's handling of \verb|\endtabularx| in
+environment definitions has been fixed to again match its documentation.
+
+The \package{bm} package has been updated as required by the changes
+to \verb|\mathchardef| in Lua\TeX.
+
+
+\section{amsmath}
+
+Since the launch of \LaTeXe\ in 1993, the \textsf{amsmath} bundle has
+been part of the \emph{required} packages in the core \LaTeX\
+distribution, with bug reports handled by the \LaTeX\ bug database at
+\url{https://latex-project.org/bugs-upload.html}.
+
+The \textsf{amsmath} packages and the \textsf{amscls} classes have
+been maintained by the American Mathematical Society.
+
+With this release a new arrangement has been agreed between the
+American Mathematical Society and the \LaTeX3 project. The \LaTeX3
+project will take over maintenance of the \textsf{amsmath} bundle,
+with the American Mathematical Society retaining maintenance of
+\textsf{amscls}.
+
+The recommended installation of these files in the \TeX\ directory
+structure remains unchanged as \path|tex/latex/amsmath| and
+\path|tex/latex/amscls| respectively.
+
+This release of \package{amsmath} includes several updates so that
+\package{amsmath} does not generate errors when math is used with
+Lua\TeX\ v0.87+, which has changes to \verb|\mathchardef| that are
+incompatible with the previous version of \package{amsmath}. It also
+improves \verb|\dots| handling so that \verb|\long| macros are
+correctly handled (for example, \verb|\dots \Rightarrow| now
+uses centered dots), as well as commands expanding to character tokens
+(for example, \verb|\times \dots \times| will use centered dots with
+\verb|\times| defined as in the \package{unicode-math} package).
+
+\section{Related updates}
+In addition to the updates in the core \LaTeX\ release, some files in
+the CTAN ``contrib'' area have also been updated. Notably there have
+been further updates to the \textsf{unicode-data} files; also, the
+files required to build plain and \LaTeX\ formats have now been
+submitted to CTAN as \textsf{tex-ini-files}. The
+addition of a new \texttt{luatex} option for \textsf{graphics}-related
+packages (\textsf{luatex-def} on CTAN) has required updates to the
+configuration files to select a
+default option and these have similarly been uploaded to CTAN as
+\textsf{graphics-cfg}. (Previously these files were maintained
+directly in the \TeX\ Live repository, and were not available on CTAN.)
+\end{document}
diff --git a/macros/latex-dev/base/ltnews26.pdf b/macros/latex-dev/base/ltnews26.pdf
new file mode 100644
index 0000000000..167fab38b8
--- /dev/null
+++ b/macros/latex-dev/base/ltnews26.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews26.tex b/macros/latex-dev/base/ltnews26.tex
new file mode 100644
index 0000000000..a1362b3475
--- /dev/null
+++ b/macros/latex-dev/base/ltnews26.tex
@@ -0,0 +1,239 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2017-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews26.tex
+%
+% This is issue 26 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\publicationmonth{January}
+\publicationyear{2017}
+
+\publicationissue{26}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+\setlength\rightskip{0pt plus 3em}
+\section{\eTeX{}}
+
+In \LaTeX{} News~16 (December 2003) the team announced
+\begin{quotation}
+We expect that within the next two years, releases of \LaTeX{} will
+change modestly in order to run best under an extended \TeX{} engine
+that contains the \eTeX{} primitives, e.g., \eTeX{} or pdf\TeX{}.
+\end{quotation}
+and also said
+\begin{quotation}
+Although the current release does not \emph{require} \eTeX{} features, we
+certainly recommend using an extended \TeX{}, especially if you need to debug
+macros.
+\end{quotation}
+
+For many years the team have worked on the basis that users will have \eTeX{}
+available but had not revisited the above statements formally. As of the
+January 2017 release of \LaTeXe{}, \eTeX{} is \emph{required} to build the
+format, and attempting to build a format without the extensions will fail.
+
+Practically, modern \TeX{} distributions provide the extensions in all engines
+other than the ``pure'' Knuth \texttt{tex}, and indeed parts of the
+format-building process already require \eTeX{}, most notably some of the UTF-8
+hyphenation patterns. As such, there should be no noticeable effect on users of
+this change.
+
+The team expect to make wider use of \eTeX{} within the kernel in future;
+details will be announced where they impact on end users in a visible way.
+
+\section{Default encodings in \hologo{XeLaTeX} and \hologo{LuaLaTeX}}
+The default encoding in \LaTeX\ has always been the original
+128-character encoding \texttt{OT1}. For Unicode based \TeX\ engines, this
+is not really suitable, and is especially problematic with
+\hologo{XeLaTeX} as in the major distributions this is built with
+Unicode based hyphenation patterns in the format. In practice this has
+not been a major problem as documents use the contributed
+\textsf{fontspec} package in order to switch to a
+Unicode encoded font.
+
+In this release we are adding \texttt{TU} as a new supported
+encoding in addition to the previously supported encodings such as \texttt{OT1}
+and \texttt{T1}. This denotes a Unicode based font encoding. It is essentially
+the same as the \texttt{TU} encoding that has been on trial with the
+experimental \texttt{tuenc} option to \textsf{fontspec} for the past
+year.
+
+The \hologo{XeLaTeX} and \hologo{LuaLaTeX} formats will now default
+to \texttt{TU} encoding and \texttt{lmr} (Latin Modern) family. In the
+case of \hologo{LuaLaTeX} the contributed \textsf{luaotfload} Lua
+module will be loaded at the start of each run to enable the loading
+of OpenType fonts.
+
+The \textsf{fontspec} package is being adjusted in a companion release
+to recognise the new encoding default arrangements.
+
+Note that in practice no font supports the full Unicode range, and so
+\texttt{TU} encoded fonts, unlike fonts specified for \texttt{T1}, may be
+expected to be incomplete in various ways. In the current release the file
+\texttt{tuenc.def} that implements the \texttt{TU} encoding-specific commands
+has made some basic assumptions for (for example) default handling of
+accent commands, and the set of command names is derived from the
+command names used for the UTF-8 support in the \textsf{inputenc} package,
+restricted roughly to the character ranges classically provided by
+the \texttt{T1} and \texttt{TS1} encodings, but is part of a longer term plan
+seen over recent releases to increase support for Unicode based \TeX\ engines
+into the core \LaTeX\ support.
+
+
+
+If for any reason you need to process a document with the previous
+default \texttt{OT1} encoding, you may switch encoding in the usual ways, for
+example
+\begin{verbatim}
+\usepackage[OT1]{fontenc}
+\end{verbatim}
+or you may roll back all the changes for this release by starting the
+document with
+\begin{verbatim}
+\RequirePackage[2016/12/31]{latexrelease}
+\end{verbatim}
+
+\section{\cs{showhyphens} in \hologo{XeLaTeX}}
+Due to the way \hologo{XeLaTeX} interfaces to font libraries, the
+standard definition of \cs{showhyphens} does not work. A variant
+definition has been available in the contributed \textsf{xltxtra}
+package, however a (slightly different) definition for \cs{showhyphens}
+is now included in \hologo{XeLaTeX} by default. As usual
+this change will be undone if an earlier
+release is specified using the \textsf{latexrelease} package.
+
+\section{The \textsf{fixltx2e} package}
+As described in \LaTeX{} News~22, the \textsf{fixltx2e} package has become
+obsolete with the new update policy. Since 2015 it has just made a
+warning and exited. In this release we have re-introduced all
+the code from the original fixes in the 2014 \LaTeX\ but guarded by
+\verb|\IncludeInRelease{2015/01/01}|.
+So for current releases \textsf{fixltx2e} still just displays a warning
+but for old releases, whether that is an old format, or a format with
+the version date reset via the \textsf{latexrelease} package, the
+fixes in the original \textsf{fixltx2e} will be applied.
+
+This improves the ability to run old documents in a way that is compatible
+with contemporary formats. If you have a 2014 document that used
+\verb|\usepackage{fixltx2e}| and you add
+\verb|\RequirePackage[2014/01/01]{latexrelease}| and process it with the
+current format then \textsf{latexrelease} will undo most changes made
+since 2014, but now when the document includes \textsf{fixltx2e} it
+will act like a 2014 version of the package and apply the code fixes,
+not just give a warning that the package is obsolete.
+
+\section{The \textsf{latexbug} package}
+
+As explained in more detail
+at the \LaTeX\ Project
+ website\footnote{\url{https://www.latex-project.org/bugs/}}
+a new package, \textsf{latexbug}, has been produced to help produce
+test files to accompany bug reports on the core \LaTeX\ distribution.
+This is being published separately to CTAN at the same time as this
+release. By using the \textsf{latexbug} package you can easily check
+that the packages involved in the test are all part of the core
+release. The \LaTeX\ project cannot handle bug reports on contributed
+packages, which should be directed to the package maintainer as given
+in the package documentation.
+
+\section{Updates to \textsf{amsmath}}
+The \textsf{amsmath} package has two updates at this release.
+\begin{itemize}
+\item The spacing to the left of the \texttt{aligned} and
+ \texttt{gathered} environments has been fixed: the spurious thin
+ space is no longer added by default. Package options control this
+ to revert to the original behaviour where required; see the
+ \textsf{amsldoc} guide for further details.
+\item The large delimiters around generalised fractions (for example
+ in the \cs{binom} construct) did not work in previous releases if
+ using \hologo{LuaTeX} or \hologo{XeTeX} with OpenType math fonts. This is
+ related to the lack of specific metrics for this use in the OpenType Math
+ table. In principle \hologo{LuaTeX} has two additional named metrics
+ to control the delimiters but these are not initialised by default,
+ and in \hologo{XeTeX} it does not seem possible to make them work at all.
+ So for Unicode \TeX\ systems, a new implementation of
+ \cs{genfrac} is used at this release that uses \verb|\left\right|
+ internally but parameterised to give spacing as close to the
+ original as possible. The implementation in (pdf)\TeX\ is
+ unaffected.
+\end{itemize}
+
+\section{Updates to \textsf{tools}}
+The \textsf{array} package has been updated to fix a longstanding but
+previously unreported issue with unwanted interactions between tables
+in the page head or foot and the body of the page, as reported in
+\href{http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=tools/4488}{PR
+ tools/4488}.
+There is also an update to the \hologo{LuaTeX} support in \textsf{bm}.
+
+\section{An addendum to the release changes in 2015: page breaks and vertical spacing}
+
+In 2015 we announced the introduction of the roll-back\slash
+roll-forward concept to manage bug fixes and additions to core
+\LaTeX{} in a manageable way. We also announced at that time
+that we now incorporate all fixes from \textsf{fixltx2e} into the
+kernel (as the old mechanism produced problems instead of improving
+the situation). Refer to
+\href{https://www.latex-project.org/news/latex2e-news/ltnews22.pdf}{\texttt{ltnews22.pdf}}
+for details.
+
+One of the fixes from \textsf{fixltx2e} was for a glaring bug in
+\cs{addvspace} that was originally detected in the mid-nineties and
+back then added to the \textsf{fixltx2e} support package. In certain
+situations \cs{addvspace} would result in a page/column break below
+the baseline of the last line. As a result documents using
+\cs{flushbottom} would show a clear misalignment (even more prominent
+when typesetting in two-column mode).
+
+Starting with release 2015/01/01 this is now finally corrected already
+in the kernel and not only in \textsf{fixltx2e}. In nearly all
+circumstances this will either make no difference to existing
+documents, or it will locally improve the visual appearance of that
+document without changing anything on other pages. However, by the
+nature of the change it is also possible that there are further
+non-local changes to the page breaks due to the different break
+positions introduced by the fix.
+
+Thus, for documents that have been written before 2015 and that should
+be preserved unchanged at all costs you may have to add
+\begin{verbatim}
+\RequirePackage[2014/01/01]{latexrelease}
+\end{verbatim}
+at the top of the document, to roll back the format to a date before
+the policy change.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews27.pdf b/macros/latex-dev/base/ltnews27.pdf
new file mode 100644
index 0000000000..c4a999423c
--- /dev/null
+++ b/macros/latex-dev/base/ltnews27.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews27.tex b/macros/latex-dev/base/ltnews27.tex
new file mode 100644
index 0000000000..37b2fcf89e
--- /dev/null
+++ b/macros/latex-dev/base/ltnews27.tex
@@ -0,0 +1,135 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2017-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews27.tex
+%
+% This is issue 27 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\publicationmonth{April}
+\publicationyear{2017}
+
+\publicationissue{27}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+\setlength\rightskip{0pt plus 3em}
+
+\section{ISO 8601 Date format}
+Since before the first releases of \LaTeXe, \LaTeX\ has used a date
+format in the form \textsc{yyyy/mm/dd}. This has many advantages over more
+conventional formats, as it is easy to sort and avoids the unfortunate
+ambiguity between different communities as to whether 01/02/2017 is the
+1st of February or 2nd of January.
+
+However there is another date format, formalised by the
+International Standard ISO~8601. The basic format defined by this
+standard is functionally equivalent to the \LaTeX\ format, but using
+\texttt{-} rather than \texttt{/}. This date format is now supported
+in many Operating Systems and applications
+(for example the \verb|date --iso-8601| command in Linux and similar systems).
+
+From this release, \LaTeX\ will accept ISO format date strings in the
+date argument of \verb|\ProvidesPackage|, \verb|\usepackage|, etc.
+Currently we recommend that you do not use this format in any packages
+that need to work with older \LaTeX\ releases;
+the \textsf{latexrelease} package may be used with older releases to
+ add this functionality. This change is handled in a special way by
+ \textsf{latexrelease}: The package always adds support for ISO dates
+whatever format date is requested; this is required so that the
+necessary date comparisons may be made.
+
+The new functionality can be seen in the startup banner which
+advertises \texttt{LaTeX2e <2017-04-15>}.
+
+\section{Further TU encoding improvements}
+The 2017/01/01 release saw the introduction of the new TU encoding for
+specifying Unicode fonts with \hologo{LuaTeX} and
+\hologo{XeTeX}. There were a number of small corrections and additions
+in the patch releases updating 2017/01/01, and a further addition in
+this release, notably extended support for the dot-under accent,
+\verb|\d|.
+
+
+\section{Disabling hyphenation}
+The existing \LaTeX\ code for \verb|\verb| and \verb|verbatim| had some
+issues when used with fonts that were not loaded with hyphenation
+disabled via setting \verb|\hyphenchar| to $-1$. In this release these
+verbatim environments use a \verb|\language| setting,
+\verb|\l@nohyphenation|, that has no hyphenation patterns associated.
+
+The format ensures that a language has been allocated with this name.
+For most users this will in fact be no change as the standard
+\textsf{babel} language has for a long time allocated a language with
+this name.
+
+In order that page breaks in \texttt{verbatim} do not influence the
+language used in the page head and foot, the format now normalises the
+language used in the output routine to a default language as described
+below.
+
+\section{Discretionary hyphenation}
+The \LaTeX\ definition of \verb|\-| has been adjusted so that it will
+insert the current font's \verb|\hyphenchar|, as would the
+\TeX\ primitive. A comment in \textsf{source2e} has given
+this new definition since the first releases of \LaTeXe, and in this
+release we finally acted upon this comment. Previously \verb|\-|
+always inserted a \texttt{-} at a break point even if a different
+character would be used for automatic hyphenation with the current font.
+
+\section{Default document language}
+
+A new integer parameter \verb|\document@default@language| is
+introduced; this is initialised to $-1$ but is set at
+\verb|\begin{document}| to the language in force at that time if it
+ has not been set by preamble code. This is very similar to the
+ handling of the default color, and is used in a similar way to
+ normalise the settings for page head and foot as described above.
+Users should not normally need to set this explicitly but it is expected that
+language packages such as \textsf{babel} may set this if the default
+behaviour is not suitable.
+
+\section{Line spacing in parboxes}
+Inside a \verb|\parbox|
+\LaTeX\ normalises the baseline spacing. However it has not
+previously reset \verb|\lineskiplimit|. This meant that
+lines of a paragraph that have ascenders or descenders could be set
+with \emph{closer} line spacing than lines without. This can easily
+happen if you use a \verb|\parbox| in an AMS alignment, as they use a
+relatively large value of \verb|\lineskiplimit|.
+As usual, the \textsf{latexrelease} package may be used to
+force the older behavior.
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews28.pdf b/macros/latex-dev/base/ltnews28.pdf
new file mode 100644
index 0000000000..3193052a17
--- /dev/null
+++ b/macros/latex-dev/base/ltnews28.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews28.tex b/macros/latex-dev/base/ltnews28.tex
new file mode 100644
index 0000000000..c8af784081
--- /dev/null
+++ b/macros/latex-dev/base/ltnews28.tex
@@ -0,0 +1,365 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2017-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews28.tex
+%
+% This is issue 28 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\providecommand\acro[1]{\textsc{#1}}
+\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$}
+
+
+\publicationmonth{April}
+\publicationyear{2018}
+
+\publicationissue{28}
+
+\begin{document}
+
+\maketitle
+\tableofcontents
+
+\setlength\rightskip{0pt plus 3em}
+
+\section{A new home for \LaTeXe{} sources}
+
+In the past the development version of the \LaTeXe{} source files has
+been managed in a Subversion source control system with read access
+for the public. This way it was possible to download in an emergency
+the latest version even before it was released to CTAN and made its
+way into the various distributions.
+
+We have recently changed this setup and now manage the sources using
+Git and placed the master sources on GitHub at
+\begin{quote}
+\url{https://github.com/latex3/latex2e}
+\end{quote}
+where we already store the sources
+for \pkg{expl3} and other work. As before, direct write access is restricted
+to \LaTeX{} Project Team members, but everything is publicly accessible
+including the ability to download, clone (using Git) or checkout
+(using SVN). More details are given in~\cite{Mittelbach:TB39-1}.
+
+\section{Bug reports for core \LaTeXe{}}
+
+For more than two decades we used GNATS, an open source bug tracking
+system developed by the FSF. While that has served us well in the past
+it started to show its age more and more. So as part of this move we
+also decided to finally retire the old \LaTeX{} bug database and replace
+it with the standard ``Issue Tracker'' available at Github.
+
+The requirements and the workflow for reporting a bug in the core
+\LaTeX{} software is documented at
+\begin{quote}
+\url{https://www.latex-project.org/bugs/}
+\end{quote}
+and with further details also discussed in~\cite{Mittelbach:TB39-1}.
+
+
+\section{UTF-8: the new default input encoding}
+
+The first \TeX{} implementations only supported reading 7-bit
+\acro{ascii} files---any accented or otherwise ``special'' character
+had to be entered using commands, if it could be represented at
+all. For example to obtain an ``\"a'' one would enter \verb=\"a=, and to
+typeset a ``\ss'' the command \verb=\ss=. Furthermore fonts at that
+time had 128 glyphs inside, holding the \acro{ascii} characters, some
+accents to build composite glyphs from a letter and an accent, and a
+few special symbols such as parentheses, etc.
+
+With 8-bit \TeX{} engines such as \hologo{pdfTeX} this situation changed
+somewhat: it was now possible to process 8-bit files, i.e., files that
+could encode 256 different characters. However, 256 is still a fairly
+small number and with this limitation it is only possible to encode a
+few languages and for other languages one would need to change the
+encoding (i.e., interpret the character positions 0--255 in a
+different way). The first code points 0--127 were essentially normed
+(corresponding to \acro{ascii}) while the second half 128--255 would
+vary by holding different accented characters to support a certain set
+of languages.
+
+Each computer used one of these encodings when storing or interpreting
+files and as long as two computers used the same encoding it was
+(easily) possible to exchange files between them and have them
+interpreted and processed correctly.
+
+But different computers may have used different encodings and given
+that a computer file is simply a sequence of bytes with no indication for
+which encoding is intended, chaos could easily happen and has
+happened. For example, the German word ``Gr\"o\ss e'' (height) entered on a
+German keyboard could show up as ``Gr\v T\`ae'' on a different
+computer using a different encoding by default.
+
+So in summmary the situation wasn't at all good and it was clear in
+the early nineties that \LaTeXe{} (that was being developed to provide
+a \LaTeX{} version usable across the world) had to provide a solution
+to this issue.
+
+The \LaTeXe{} answer was the introduction of the \package{inputenc}
+package~\cite{Mittelbach:Brno95} through which it is possible to
+provide support for multiple encodings. It also allows to correctly
+process a file written in one encoding on a computer using a different
+encoding and even supports documents where the encoding changes
+midway.
+
+Since the first release of \LaTeXe{} in 1994, \LaTeX{} documents that
+used any characters outside \acro{ascii} in the source (i.e. any
+characters in the range of 128--255) were supposed to load
+\package{inputenc} and specify in which file encoding they were
+written and stored.
+%
+If the \package{inputenc} package was not loaded then \LaTeX{} used a
+``raw'' encoding which essentially took each byte from the input file
+and typeset the glyph that happened to be in that position in the
+current font---something that sometimes produces the right result but
+often enough will not.
+
+In 1992 Ken Thompson and Rob Pike developed the UTF-8 encoding scheme
+which enables the encoding of all Unicode characters within 8-bit sequences.
+Over time this encoding has gradually taken over the world,
+replacing the legacy 8-bit encodings used before. These days all major
+computer operating systems use UTF-8 to store their files and it
+requires some effort to explicitly store files in one of the legacy
+encodings.
+
+As a result, whenever \LaTeX{} users want to use any accented
+characters from their keyboard (instead of resorting to \verb=\"a= and
+the like) they always have to use
+\begin{verbatim}
+ \usepackage[utf8]{inputenc}
+\end{verbatim}
+in the preamble of their documents as otherwise \LaTeX{} will produce
+gibberish.
+
+\subsection{The new default}
+
+With this release, the default encoding for \LaTeX\ files has been
+changed from the ``fall through raw'' encoding to UTF-8 if used with
+classic \TeX\ or \hologo{pdfTeX}. The implementation is essentially
+the same as the existing UTF-8 support from
+\verb|\usepackage[utf8]{inputenc}|.
+
+The \hologo{LuaTeX} and \hologo{XeTeX} engines always supported the
+UTF-8 encoding as their native (and only) input encoding, so with
+these engines \package{inputenc} was always a no-op.
+
+This means that with new documents one can assume UTF-8 input and it
+is no longer required to always specify
+\verb|\usepackage[utf8]{inputenc}|. But if this line is present it
+will not hurt either.
+
+
+\subsection{Compatibility}
+
+For most existing documents this change will be transparent:
+\begin{itemize}
+\item documents using only \acro{ascii} in the input file and
+ accessing accented characters via commands;
+\item documents that specified the encoding of their file via an
+ option to the \package{inputenc} package and then used 8-bit
+ characters in that encoding;
+\item documents that already had been stored in UTF-8 (whether or not
+ specifying this via \package{inputenc}).
+\end{itemize}
+Only documents that have been stored in a legacy encoding and used
+accented letters from the keyboard \emph{without} loading
+\package{inputenc} (relying on the similarities between the input used
+and the T1 font encoding) are affected.
+
+These documents will now generate an error that they contain invalid
+UTF-8 sequences. However, such documents may be easily processed by
+adding the new command \verb|\UseRawInputEncoding| as the first line
+of the file. This will re-instate the previous ``raw'' encoding
+default.
+
+\verb|\UseRawInputEncoding| may also be used on the command line to
+process existing files without requiring the file to be edited
+\begin{verbatim}
+ pdflatex '\UseRawInputEncoding \input' file
+\end{verbatim}
+will process the file using the previous default encoding.
+
+Possible alternatives are reencoding the file to UTF-8 using a tool
+(such as recode or iconv or an editor) or adding the line
+\begin{flushleft}
+\verb= \usepackage[=\meta{encoding}\verb=]{inputenc}=
+\end{flushleft}
+to the preamble specifying the \meta{encoding} that fits the file
+encoding. In many cases this will be \texttt{latin1} or
+\texttt{cp1252}. For other encoding names and their meaning see the
+\package{inputenc} documentation.
+
+As usual, this change may also be reverted via the more general
+\package{latexrelease} package mechanism, by speciying a release date
+earlier than this release.
+
+
+\subsection{BOM: byte order mark handling}
+
+When using Unicode the first bytes of a file may be a, so called, BOM
+character (byte order mark) to indicate the byte oder used in the
+file. While this is not required with UTF-8 encoded files (where the
+byte order is known) it is nevertheless allowed by the standard and
+some editors add that byte sequence to the beginning of a file. In the
+past such files would have generated a ``Missing begin document''
+error or displayed strange characters when loaded at a later stage.
+
+With the addition of UTF-8 support to the kernel it is now possible to
+identify and ignore such BOMs characters even before
+\verb=\documentclass= so that these issues will no longer be showing
+up.
+
+
+
+\section[A general rollback concept]
+ {A general rollback concept for packages and classes}
+
+ In 2015 a rollback concept for the \LaTeX{} kernel was introduced.
+ Providing this feature allowed us to make corrections to the
+ software (which more or less didn't happen for nearly two decades)
+ while continuing to maintain backward compatibility to the highest
+ degree.
+
+ In this release we have now extended this concept to
+ the world of packages and classes which was not covered
+ initially. As the classes and the extension packages have different
+ requirements compared to the kernel, the approach is different (and
+ simplified). This should make it easy for package developers to
+ apply it to their packages and authors to use when necessary.
+
+ The documentation of this new feature is given in an article
+ submitted to TUGboat and also available from our
+ website~\cite{Mittelbach:TB39-2}.
+
+
+\section[Integration of \pkg{remreset} and \pkg{chngcntr} packages]
+ {Integration of \pkg{remreset} and \pkg{chngcntr} packages
+ into the kernel}
+
+With the optional argument to \cs{newcounter} \LaTeX{} offers to
+automatically reset counters when some counter is stepped, e.g.,
+stepping a \texttt{chapter} counter resets the \texttt{section}
+counter (and recursively all other heading counters). However, what
+was until now missing was a way to undo such a link between counters
+or to link two counters after they have been defined.
+
+This can be now be done with \cs{counterwithin} and \cs{counterwithout},
+respectively. In the past one had to load the \pkg{chngcntr} package
+for this. For the programming level we also added
+\cs{@removefromreset} as the counterpart of the already existing
+\cs{@addtoreset} command. Up to now this was offered by the
+\pkg{remreset} package.
+
+\section{Testing for undefined commands}
+\LaTeX\ packages often use a test \verb|\@ifundefined| to test if a command
+is defined. Unfortunately this had the side effect of \emph{defining}
+the command to \verb|\relax| in the case that it had no definition.
+ The new release uses a modified definition
+(using extra testing possibilities available in \hologo{eTeX}. The new definition
+is more natural, however code that was relying on the side effect of the
+command being tested being defined if it was previously undefined may have to add
+\verb|\let\|\meta{command}\verb|\relax|.
+
+
+\section{Changes to packages in the tools category}
+
+\subsection{\LaTeX{} table columns with fixed widths}
+
+Frank published a short paper in
+TUGboat~\cite{Mittelbach:TB38-2-213} on producing tables that have
+columns with fixed widths. The outlined approach using column
+specifiers ``\texttt{w}'' and ``\texttt{W}'' has now been integrated
+into the \pkg{array} package.
+
+\subsection{Obscure overprinting with \pkg{multicol} fixed}
+
+A rather peculiar bug was reported on StackExchange for
+\pkg{multicol}. If the column/page breaking was fully controlled by
+the user (through \cs{columnbreak}) instead of letting the environment
+do its job and if then more \cs{columnbreak} commands showed up on the
+last page then the balancing algorithm was thrown off track.
+As a result some parts of the columns did overprint each other.
+
+The fix required a redesign of the output routines used by
+\pkg{multicol} and while it ``should'' be transparent in other cases
+(and all tests in the regession test suite came out fine) there is the
+off-chance that code that hooked into internals of \pkg{multicol}
+needs adjustment.
+
+
+\section{Changes to packages in the amsmath category}
+
+With this release of \LaTeX{} a few minor issues with \pkg{amsmath}
+have been corrected.
+
+\subsection{Updated user's guide}
+
+Furthermore, \texttt{amsldoc.pdf}, the AMS user's
+guide for the \pkg{amsmath} package~\cite{amsldoc}, has been updated
+from version~2.0 to~2.1 to incorporate changes and corrections made
+between 2016 and 2018.
+
+
+\begin{thebibliography}{9}
+
+\bibitem{Mittelbach:TB39-1} Frank Mittelbach:
+ \emph{New rules for reporting bugs in the \LaTeX{} core software}.
+ In: TUGboat, 39\#1, 2018.
+ \url{https://www.latex-project.org/publications/}
+
+\bibitem{Mittelbach:Brno95} Frank Mittelbach:
+ \emph{\LaTeXe{} Encoding Interface --- Purpose, concepts, and
+ Open Problems}.
+ Talk given in Brno June 1995.
+ \url{https://www.latex-project.org/publications/}
+
+\bibitem{Mittelbach:TB39-2} Frank Mittelbach:
+ \emph{A rollback concept for packages and classes}.
+ Submitted to TUGboat.
+ \url{https://www.latex-project.org/publications/}
+
+\bibitem{Mittelbach:TB38-2-213} Frank Mittelbach:
+ \emph{\LaTeX{} table columns with fixed widths}.
+ In: TUGboat, 38\#2, 2017.
+ \url{https://www.latex-project.org/publications/}
+
+\bibitem{amsldoc} American Mathematical Society and The \LaTeX3 Project:
+ \emph{User's Guide for the \texttt{amsmath} package} (Version 2.1).
+ April 2018.
+ Available from
+ \url{https://www.ctan.org}
+ and distributed as part of every \LaTeX{} distribution.
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltnews29.pdf b/macros/latex-dev/base/ltnews29.pdf
new file mode 100644
index 0000000000..6cb0ac77d0
--- /dev/null
+++ b/macros/latex-dev/base/ltnews29.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews29.tex b/macros/latex-dev/base/ltnews29.tex
new file mode 100644
index 0000000000..78a1b2e60f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews29.tex
@@ -0,0 +1,526 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2018-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews29.tex
+%
+% This is issue 29 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\usepackage{csquotes}
+
+\providecommand\acro[1]{\textsc{#1}}
+\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$}
+
+
+\providecommand\XeTeX{\hologo{XeTeX}}
+\providecommand\LuaTeX{\hologo{LuaTeX}}
+\providecommand\pdfTeX{\hologo{pdfTeX}}
+
+\newcommand\githubissue[2][]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}%
+ {github issue#1 #2}%
+ )}%
+ \par}
+
+% simple solution right now (just link to the first issue if there are more)
+\def\getfirstgithubissue#1 #2\relax{#1}
+
+\newcommand\sxissue[1]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par}
+
+\let\cls\pkg
+\newcommand\env[1]{\texttt{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\iffalse % only for TUB production
+\usepackage{graphicx}
+\makeatletter
+% Xe\TeX{} requires reflecting the first E, hence we complain if the
+% graphics package is not present. (For plain documents, this can be
+% loaded via Eplain.) Also, at Barbara's suggestion, if the current
+% font is slanted, we rotate by 180 instead of reflecting so there is at
+% least a chance to look ok. (The magic values here seem more or less
+% ok for \texttt{cmsl} and \texttt{cmti}.)
+%
+% \begin{macrocode}
+\def\tubreflect#1{%
+ \@ifundefined{reflectbox}{%
+ \TBerror{A graphics package must be loaded for \string\XeTeX}%
+ }{%
+ \ifdim \fontdimen1\font>0pt
+ \raise 1.6ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
+ \else
+ \reflectbox{#1}%
+ \fi
+ }%
+}
+\def\tubhideheight#1{\setbox0=\hbox{#1}\ht0=0pt \dp0=0pt \box0 }
+\def\XekernbeforeE{-.125em}
+\def\XekernafterE{-.1667em}
+\DeclareRobustCommand{\Xe}{\leavevmode
+ \tubhideheight{\hbox{X%
+ \setbox0=\hbox{\TeX}\setbox1=\hbox{E}%
+ \ifdim \fontdimen1\font>0pt \def\XekernbeforeE{0em}\fi
+ \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}%
+ \kern\XekernafterE}}}
+\def\XeTeX{\Xe\TeX}
+\def\XeLaTeX{\Xe{\kern.11em \LaTeX}}
+\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{December}
+\publicationyear{2018}
+
+\publicationissue{29}
+
+\begin{document}
+
+%\addtolength\textheight{4.2pc} % only for TUB
+
+\maketitle
+\tableofcontents
+
+\setlength\rightskip{0pt plus 3em}
+
+\bigskip
+
+\section{Introduction}
+
+The December 2018 release of \LaTeX{} is a maintenance release in
+which we have fixed a few bugs in the software: some are old, some
+newer, and they are mostly rather obscure.
+
+\section[Bug reports for core \LaTeXe{} and packages]
+ {Bug reports for core \LaTeXe{} and packages maintained by the Project Team}
+
+In Spring 2018 we established a new issue tracking system
+(Github issues at \url{https://github.com/latex3/latex2e/issues}) for both
+the \LaTeX{} core and the packages maintained by the
+\LaTeX{} Project Team, with an updated procedure for how to report a
+bug or problem.
+
+Initial experience with this system is good, with people who report
+problems following the guidelines and including helpful working
+examples to show the problem---thanks for doing this.
+
+The detailed requirements and the workflow for reporting a bug in the
+core \LaTeX{} software is documented at
+\begin{quote}
+\url{https://www.latex-project.org/bugs/}
+\end{quote}
+with further details and discussion in~\cite{29:Mittelbach:TB39-1}.
+
+
+\section{Changes to the \LaTeX{} kernel}
+
+\subsection{UTF-8:\ updates to the default input encoding}
+
+In the April 2018 release of \LaTeX{} we changed the default encoding
+from 7-bit \acro{ascii} to \acro{utf}-8 when using classic \TeX\ or
+\hologo{pdfTeX}; see \textit{\LaTeX{} News~28}~\cite{29:ltnews28} for
+details.
+
+Now, after half a year of experience with
+this new default,
+we have
+made a small number of adjustments to further improve the user experience.
+These include:
+\begin{itemize}
+\item
+ Some improvements when displaying error messages about \acro{utf}-8
+ characters that have not been set up for use with \LaTeX{},
+ or are invalid for some other reason;
+%
+\githubissue[s]{60, 62 and 63}
+%
+\item
+ The addition of a number of previously missing declarations for
+ characters that are in fact available with the default fonts, e.g.,
+ \cs{j} \enquote{\j} (0237), \cs{SS} \enquote{\SS} (1E9E),
+ \verb=\k{}= \enquote{\k{ }} (02DB) and \verb=\.{}= \enquote{\.{ }}
+ (02D9);
+\item
+ Correcting the names for \cs{guillemetleft}
+ \enquote{\guillemotleft} and \cs{guillemetright}
+ \enquote{\guillemotright} in all encoding files. These correct
+ names are in addition to the old (but wrong) Adobe names: Adobe
+ mistakenly called them Guillemot, which is a sea bird.
+%
+ \githubissue{65}
+%
+\item
+ Added \cs{Hwithstroke} (\enquote{\Hwithstroke}) and \cs{hwithstroke}
+ (\enquote{\hwithstroke}) necessary for typesetting Maltese.
+%
+ \sxissue{q/460110}
+\end{itemize}
+
+
+
+\subsection{Fixed \cs{verb*} and friends in \texorpdfstring{\XeTeX}{XeTeX} and \LuaTeX{}}
+
+
+The original \cs{verb*} and \texttt{verbatim*} in \LaTeX{} were coded
+under the assumption that the position of the space character (i.e.,
+\acro{ascii} 32) in a typewriter font contains a visible space glyph
+``\verb*= =''. This is correct for \pdfTeX{} with the most used font
+encodings \texttt{OT1} and \texttt{T1}. However, this unfortunately
+does not work for Unicode engines using the \texttt{TU} encoding since
+the space character slot (\acro{ascii} 32) then usually contains a real
+(normal) space, which has the effect that \cs{verb*} produces the same
+results as \cs{verb}.
+
+The \cs{verb*} code now always uses the newly introduced command
+\cs{verbvisiblespace} to produce the visible space character and this
+command will get appropriate definitions for use with the different
+engines. With \pdfTeX{} it will simply use \cs{asciispace}, which is
+a posh name for ``select character 32 in the current font'', but with
+Unicode engines the default definition is
+\begin{verbatim}
+ \DeclareRobustCommand\verbvisiblespace
+ {\leavevmode
+ {\usefont{OT1}{cmtt}{m}{n}\asciispace}}
+\end{verbatim}
+which uses the visible space from the font Computer Modern Typewriter,
+regardless of the currently chosen typewriter font. Internally the
+code ensures that the character used has exactly the same width as the
+other characters in the current (monospaced) font; thus, for example,
+code displays line up properly.
+
+It is possible to redefine this command to select your own character,
+for example
+\begin{verbatim}
+ \DeclareRobustCommand\verbvisiblespace
+ {\textvisiblespace}
+\end{verbatim}
+will select the the ``official'' visible space character of the
+current font. This may look like the natural default, but it wasn't
+chosen as our default because many fonts just don't have that Unicode
+character, or they have one with a strange shape.
+%
+\githubissue[s]{69 and 70}
+
+
+\subsection{Error message corrected}
+Trying to redefine an undefined command could in a few cases generate
+an error message with a missing space, e.g.,
+\verb=\renewcommand\1{...}= gave
+\begin{verbatim}
+ LaTeX Error: \1undefined.
+\end{verbatim}
+This is now fixed.
+%
+\githubissue{41}
+
+
+\subsection{Fixed fatal link error with \pkg{hyperref}}
+
+If an \cs{href} link text gets broken across pages, \pdfTeX{} and
+\LuaTeX{} will generate a fatal error unless both parts of the link
+are internally at the same boxing level. In two-column mode that was
+not the case if one of the pages had spanning top floats. This has now
+been changed so that the error is avoided.
+%
+\githubissue{94}
+
+
+\subsection{Avoid page breaks caused by invisible commands}
+
+Commands like \cs{label} or \cs{index} could generate a potential page
+break in places where a page break was otherwise prohibited, e.g.,
+when used between two consecutive headings. This has now been
+corrected. If for some reason you really want a break and you relied
+on this faulty behavior, you can always add one using \cs{pagebreak},
+with or without an optional argument.
+%
+\githubissue{81}
+
+
+
+\subsection{Prevent spurious spaces when reading table of contents data}
+
+When table of contents data is read in from a \texttt{.toc} file, the
+new-line character at the end of each line is converted by \TeX{} to a
+space. In normal processing this is harmless (as \TeX{} is doing this
+input reading whilst in vertical mode and each line in the file
+represents a single line (paragraph) in the table of contents. If,
+however, this is done in horizontal mode, which is sometimes the case,
+then these spaces will appear in the output. If you then omit some of
+the input lines (e.g., because you do not display \acro{toc} data below a
+certain level), then these spaces accumulate in the typeset output and
+you get surprising, and unwanted, gaps inside the text.
+
+The new code now adds a \texttt{\%} sign at the end of problematic
+lines in the \texttt{.toc} file so that \TeX{} will not generate such
+spaces that may survive to spoil the printed result. As some third
+party packages have augmented or changed the core \LaTeX{}
+functionality in that area (for example, by adding additional
+arguments to the commands in \acro{toc} files) the code uses a conservative
+approach and the \texttt{\%} signs are added only when certain
+conditions are met. Therefore some packages might require updates if
+they want to benefit from this correction, especially if they
+unconditionally overwrite \LaTeX{}'s \cs{addcontentsline} definition.
+%
+\githubissue{73}
+
+
+\subsection{Prevent protrusion in table of contents lines}
+
+In \TeX{}'s internal processing model,
+paragraph data is one of the
+major data structures. As a result,
+many things are internally modeled
+as paragraphs even if they are not conceptually
+``text paragraphs'' in
+the traditional sense.
+In a few cases this has some surprising effects
+that are not always
+for the better. One example is
+standard \acro{toc} entries,
+where you have
+heading data followed by some dot leaders and a page
+number at the right, produced, for example, from this:
+\begin{quote}
+ \contentsline {subsection}{Error message corrected}{2}{section*.7}
+\end{quote}
+The space reserved for the page number is of a fixed width, so that
+the dots always end in the same place. Well, they did end in the same
+place until the advent of protrusion support in the \TeX{} engines.
+Now, with the \pkg{microtype} package loaded, it is possible that the
+page number will protrude slightly into the margin (even though it’s
+typeset inside a box) and as a result this page number box gets
+shifted. With enough bad luck this can get you another dot in the
+line, sticking out like the proverbial sore thumb, as exhibited in the
+question on StackExchange that triggered the correction.
+
+\LaTeX{} now takes care that there will be no protrusion happening on
+such lines, even if it is generally enabled for the whole document.
+%
+\sxissue{q/172785}
+
+
+
+\subsection{Start L-R mode for \cs{thinspace} and friends}
+
+In \LaTeX{}, commands that are intended only for paragraph (L-R) mode
+are generally careful to start paragraph mode if necessary; thus they
+can be used at the start of a paragraph without surprising and
+unwanted consequences. This important requirement had been overlooked
+for a few horizontal spacing commands, such as \cs{thinspace}
+(a.k.a.\ ``\cs{,}''), and for some other support commands such as
+\cs{smash} or \cs{phantom}. Thus they ended up adding vertical space
+when used at the beginning of a paragraph or, in the case of
+\cs{smash}, creating a paragraph of their own. This has now been
+corrected, and a corresponding update has been made to the
+\pkg{amsmath} package, in which these commands are also defined.
+%
+\githubissue[s]{49 and 50}
+
+
+
+\subsection{Guarding \cs{pfill} in \pkg{doc}}
+
+For presenting index entries pointing to
+code fragments and the like,
+the \pkg{doc} package has a \cs{pfill} command that
+generates within the index a line of dots leading from
+the command name to the page or code line numbers.
+If necessary it would automatically split the entry
+over two lines. That worked well enough for a quarter century, but we
+discovered recently that it is broken inside
+the \cls{ltugboat} class,
+where it sometimes produces
+bad spacing within continuation lines.
+
+The reason turned out to be a redefinition of the \LaTeX{} command
+\cs{nobreakspace} (\verb=~=) inside the class \cls{ltugboat}, which
+removed any preceding space (and thus unfortunately also removed the
+dots on the continuation line). While one can argue that this is a
+questionable redefinition (if only done by a single class and not generally),
+it has been in the class so long that changing it would
+certainly break older documents. So instead we now guard against that
+removal of space.
+%
+\githubissue[s]{25 and 75}
+
+
+
+
+
+\section{Changes to packages in the \pkg{tools} category}
+
+\subsection{Sometimes the \pkg{trace} package turned off too much}
+
+The \pkg{trace} package is a useful little tool for tracing macro
+execution: it hides certain lengthy and typically uninteresting
+expansions resulting from font changes and similar activities.
+However, it had the problem that it also reset other tracing settings
+such as \cs{showoutput} in such situations, so that you couldn't use
+\cs{showoutput} in the preamble to get symbolic output of all the
+pages in the document. This has now been corrected.
+
+
+
+
+\subsection{Update to \pkg{xr}}
+
+The \pkg{xr} package has been updated so that the code that reads the
+\texttt{.aux} file has been made more robust. It now correctly
+ignores conditionals (added by \pkg{hyperref} and other packages)
+rather than generating low level parsing errors.
+\sxissue{a/452321}
+
+
+\subsection{Column data for \env{multicols*} sometimes vanished}
+
+In certain situations involving \env{multicols*}, when there are more
+explicit \cs{columnbreak} requests than there are columns on the
+current page, data could vanish due to the removal of an internal
+penalty marking the end of the environment. This has been corrected by
+explicitly reinserting that penalty if necessary.
+%
+\githubissue{53}
+
+\subsection{Extension to \cs{docolaction} in \pkg{multicol}}
+
+The \cs{docolaction} command can be used to carry out actions
+depending on the column you are currently in, i.e., first, any inner
+one (if more than two) or last. However, if the action generates text
+then there is the question: is this text part of the current column or
+the one after? That is, on the next run, do we test before or after it,
+to determine in which column we are?
+
+This is now resolved as follows: if you use \cs{docolaction*} any
+generated text by the chosen action is considered to be after the test
+point. But if you use the command without the star then all the material
+it generates will be placed before the test point to determine the
+current column, i.e., the text will become part of the current column
+and may affect the test result on the next run.
+
+
+
+\subsection{Prevent color leak in \pkg{array}}
+
+In some cases the color used inside a \env{tabular} cell could ``leak
+out'' into the surrounding text. This has been corrected.
+%
+\githubissue{72}
+
+\subsection{Support fragile commands in \texttt{array} or \texttt{tabular} column templates}
+
+The preamble specifiers \texttt{p}, \texttt{m} and \texttt{b} each receives
+a user supplied argument: the width of the paragraph column. Normally
+that is something harmless, like a length or a simple length
+expression. But in more complicated settings involving the \pkg{calc}
+package it could break with a low-level error message. This has now
+been corrected.
+%
+\sxissue{q/459285}
+
+
+
+\section{Changes to packages in the amsmath category}
+
+The changes in the kernel made for \cs{thinspace}, \cs{smash},
+etc.\ (see above) have been reflected in the \pkg{amsmath} package
+code, so that loading this package doesn't revert them.
+%
+\githubissue[s]{49 and 50}
+
+
+
+
+
+\section{Website updates}
+
+\subsection{Publications area reorganized and extended}
+
+To help readers to find relevant information in more convenient and
+easy ways, the area of the website covering publications by the
+\LaTeX{} Project Team was reorganized and extended (many more
+abstracts added). We now provide the articles, talks and supplementary
+data structured both by year and also by major
+topics~\cite{29:site-pub}. Feel free to take a look.
+
+\subsection{Japanese translations of the user's guide}
+
+Yukitoshi Fujimura has kindly translated
+into Japanese two documents that are
+distributed with standard \LaTeX{}.
+These are:
+\begin{itemize}
+\item
+ \LaTeXe{} for authors;
+\item
+ User's Guide for the \pkg{amsmath}~Package~\cite{29:amsldoc}.
+\end{itemize}
+They can be found on the website documentation page~\cite{29:site-doc}.
+You will now also find there a typeset version of the full \LaTeXe{}
+source code (with index etc.\@) and a number of other goodies.
+
+
+
+
+\begin{thebibliography}{9}
+
+\bibitem{29:Mittelbach:TB39-1} Frank Mittelbach:
+ \emph{New rules for reporting bugs in the \LaTeX{} core software}.
+ In: TUGboat, 39\#1, 2018.
+ \url{https://latex-project.org/publications/}
+
+\bibitem{29:ltnews28}
+ \emph{\LaTeX{} News, Issue 28}.
+ In: TUGboat, 39\#1, 2018.\\
+ \rlap{\url{https://latex-project.org/news/latex2e-news/}}
+
+\bibitem{29:site-doc}
+ \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\
+ \url{https://latex-project.org/documentation/}
+
+\bibitem{29:site-pub}
+ \emph{\LaTeX{} Project publications on the \LaTeX{} Project Website}.\\
+ \url{https://latex-project.org/publications/}
+
+\bibitem{29:amsldoc} American Mathematical Society and The \LaTeX3 Project:
+ \emph{User's Guide for the \texttt{amsmath} Package} (Version 2.1).
+ April 2018.
+ Available from
+ \url{https://www.ctan.org}
+ and distributed as part of every \LaTeX{} distribution.
+
+\end{thebibliography}
+
+\end{document}
+
diff --git a/macros/latex-dev/base/ltnews30.pdf b/macros/latex-dev/base/ltnews30.pdf
new file mode 100644
index 0000000000..d06d25c61f
--- /dev/null
+++ b/macros/latex-dev/base/ltnews30.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltnews30.tex b/macros/latex-dev/base/ltnews30.tex
new file mode 100644
index 0000000000..48d5959c6a
--- /dev/null
+++ b/macros/latex-dev/base/ltnews30.tex
@@ -0,0 +1,665 @@
+% \iffalse meta-comment
+%
+% Copyright 2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: ltnews30.tex
+%
+% This is issue 30 of LaTeX News.
+
+\documentclass{ltnews}
+\usepackage[T1]{fontenc}
+
+\usepackage{lmodern,url,hologo}
+
+\usepackage{csquotes}
+
+\providecommand\acro[1]{\textsc{#1}}
+\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$}
+\providecommand\option[1]{\texttt{#1}}
+\providecommand\env[1]{\texttt{#1}}
+
+
+\providecommand\XeTeX{\hologo{XeTeX}}
+\providecommand\LuaTeX{\hologo{LuaTeX}}
+\providecommand\pdfTeX{\hologo{pdfTeX}}
+\providecommand\MiKTeX{\hologo{MiKTeX}}
+\providecommand\CTAN{\textsc{ctan}}
+\providecommand\TL{\TeX{}Live}
+
+\providecommand\githubissue[2][]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}%
+ {github issue#1 #2}%
+ )}%
+ \par}
+
+% simple solution right now (just link to the first issue if there are more)
+\def\getfirstgithubissue#1 #2\relax{#1}
+
+\providecommand\sxissue[1]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par}
+
+\providecommand\gnatsissue[2]{\ifhmode\unskip\fi
+ \quad\penalty500\strut\nobreak\hfill
+ \mbox{\small\slshape(%
+ \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F#2}%
+ {gnats issue #1/#2}%
+ )}%
+ \par}
+
+\let\cls\pkg
+\providecommand\env[1]{\texttt{#1}}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\iffalse % only for TUB production
+\usepackage{graphicx}
+\makeatletter
+% Xe\TeX{} requires reflecting the first E, hence we complain if the
+% graphics package is not present. (For plain documents, this can be
+% loaded via Eplain.) Also, at Barbara's suggestion, if the current
+% font is slanted, we rotate by 180 instead of reflecting so there is at
+% least a chance to look ok. (The magic values here seem more or less
+% ok for \texttt{cmsl} and \texttt{cmti}.)
+%
+% \begin{macrocode}
+\def\tubreflect#1{%
+ \@ifundefined{reflectbox}{%
+ \TBerror{A graphics package must be loaded for \string\XeTeX}%
+ }{%
+ \ifdim \fontdimen1\font>0pt
+ \raise 1.6ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
+ \else
+ \reflectbox{#1}%
+ \fi
+ }%
+}
+\def\tubhideheight#1{\setbox0=\hbox{#1}\ht0=0pt \dp0=0pt \box0 }
+\def\XekernbeforeE{-.125em}
+\def\XekernafterE{-.1667em}
+\DeclareRobustCommand{\Xe}{\leavevmode
+ \tubhideheight{\hbox{X%
+ \setbox0=\hbox{\TeX}\setbox1=\hbox{E}%
+ \ifdim \fontdimen1\font>0pt \def\XekernbeforeE{0em}\fi
+ \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}%
+ \kern\XekernafterE}}}
+\def\XeTeX{\Xe\TeX}
+\def\XeLaTeX{\Xe{\kern.11em \LaTeX}}
+\fi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\publicationmonth{October}
+\publicationyear{2019}
+
+\publicationissue{30}
+
+\begin{document}
+
+%\addtolength\textheight{4.2pc} % only for TUB
+
+\maketitle
+\tableofcontents
+
+\setlength\rightskip{0pt plus 3em}
+
+%\newpage
+
+\medskip
+
+
+%%CCC Does it need an intro?
+%% \section{Introduction}
+
+%% This document is under construction \ldots
+
+
+\section{\LaTeX\texttt{-dev} formats now available}
+
+
+We know that many of you, especially developers and maintainers of
+important packages, have a strong interest in a stable \LaTeX{}
+environment.
+
+In order to keep \LaTeX{} very stable for users whilst allowing for
+further development to continue, we now have a development branch of
+\LaTeX{} on GitHub containing development code for the upcoming
+release. When this code is ready for wider consumption and testing, we
+generate a pre-release of \LaTeX{} from this development branch and make
+it available on \CTAN.
+
+For users of the \TL{} and \MiKTeX{} distributions it is therefore now
+straightforward to test their documents and code against the upcoming
+\LaTeX{} release with ease, simply by selecting a different program name
+(when using the command line) or by selecting a menu entry (after
+setting it up, see below).
+
+If you do this then the latest version of the \LaTeX{} development format
+will be used to process your document, allowing you to test the
+upcoming release with your own documents and packages. For example, if
+you run
+\begin{verbatim}
+ pdflatex-dev myfile
+\end{verbatim}
+then you will be greeted on the screen with something like \texttt{LaTeX2e
+ <2019-10-01> pre-release-2} (identifying the pre-release format)
+instead of the normal \texttt{LaTeX2e <2018-12-01>}. In this
+pre-release you will find the latest new features that we have
+developed.
+
+\subsection{Our hopes}
+
+We don’t expect everybody to start using the development formats to
+participate in testing, but we hope that people with a strong interest
+in a stable \LaTeX{} environment (especially developers and maintainers
+of important packages) will use the new facilities and help us to
+ensure that future public releases of \LaTeX{} do not (as has happened in
+the past) require some immediate patches because of issues that were
+not identified by our internal regression test suite or by other
+testing
+we do.
+
+Any issue identified when using the development format should
+preferably be logged as an issue on GitHub, following the procedure
+outlined on our website at \url{https://www.latex-project.org/bugs/}
+including the use of the \pkg{latexbug} package as described.
+
+Our bug reporting process normally states that issues involving
+third-party software are out of scope as we can’t correct external
+packages, see~\cite{30:Mittelbach:TB39-1}. However, in the particular
+case of the development format showing an incompatibility with a
+third-party package, it is fine to open an issue with us (in addition,
+please, to informing the maintainer of that package) so that we know
+about the problem and can jointly work on resolving it.
+
+\subsection{Details please \ldots}
+
+More details and some background information about the concepts and
+the process is available in an upcoming TUGboat article: \enquote{The
+ \LaTeX{} release workflow and the \LaTeX{} dev
+ formats}~\cite{devformat}.
+
+\subsection{Setting up menu items}
+
+While the command line call works out of the box if you have a recent
+\TL{} or \MiKTeX{} installation, the use within an integrated
+editing environment doesn’t at this point in time (maybe the
+developers of these editors will include it in the future). However,
+it is normally fairly simple to enable it as most (or even all?) of
+them provide simple ways to call your own setup. How this works in
+detail depends very much on the environment you use, so we can’t give
+much help here.
+
+But as an example: to provide an additional menu entry for
+\texttt{XeLaTeX-dev} on a MacBook all that was necessary was to copy
+the file \texttt{XeLaTeX.engine} to XeLaTeX-dev.engine and change the
+call from \texttt{xelatex} to \texttt{xelatex-dev} inside.
+
+
+
+
+\section{Improving Unicode handling in \pdfTeX{}}
+
+Perhaps the most important improvement in this release is
+even
+better support for UTF-8 characters when using \pdfTeX{}.\footnote{The
+ Japanese engines e-p\TeX{} and e-up\TeX{} can't use these features
+ yet as they don't support the primitive \cs{ifincsname}. Work is
+ under way to resolve this in the engines.}
+
+When using a \enquote{Unicode engine},
+any Unicode character (that is not acting as a command,
+i.e., is not \enquote{active})
+can be used as part of the
+\cs{label}/\cs{ref} mechanism or can be displayed in a message or
+written to a file. In 8-bit engines, however, this was severely
+restricted:
+essentially you had to limit yourself to using
+\acro{ascii} letters, digits and a few punctuation symbols. With the
+new release most of these restrictions have been removed and you now
+can write labels such as
+\begin{verbatim}
+ \label{eq:größer}
+\end{verbatim}
+or use accented characters, etc.\ as part of a \cs{typeout} message.
+The only requirement remaining is that only those UTF-8 characters
+that are also available for typesetting can be used, i.e., only those
+characters for
+which adequate font support is loaded. Otherwise you will get an
+error message stating that
+the
+particular Unicode character is not set
+up for use with \LaTeX{}.
+
+Note, however, that the restrictions on what characters can be
+used in the names of commands have not changed.
+
+What is not possible when using
+an 8-bit engine such as \pdfTeX{} is to use
+characters other than \acro{ascii} letters as part of a command
+name. This is due to the fact that all other characters in such
+engines are not single character tokens, but in fact consist of a
+sequence of bytes and this is not supported in command names.
+
+\section{Improving file name handling in \pdfTeX{}}
+
+A related change is that file names used as part of \cs{input},
+\cs{includegraphics}, etc.\ commands
+can now contain any
+Unicode characters allowed by the File System in use,
+including spaces.
+In this case,
+ even characters that can't be typeset
+(due to lack of font support) can be used.
+
+
+\section{Improving the \env{filecontents} environment}
+
+The \env{filecontents} environment now supports an optional argument
+in which you can specify that it is allowed to \option{overwrite} an
+already existing file;
+ by default nothing is written if a file with the given name
+exists anywhere in the search tree. An alternative name for this
+option is \texttt{force}.
+Even then the environment will refuse to write
+to \cs{jobname}\texttt{.tex} to avoid clobbering its own input
+file. However, if you use a different extension on your input file you
+could still overwrite it (there is no way to test for that).
+
+There is also an
+option
+\option{nosearch},
+which specifies that only the current directory is
+examined for an existing file, not the whole \TeX{} inputs tree.
+This is useful if you want to write a
+local copy of a standard system file.
+Finally, \option{noheader} prevents writing a preamble to the file
+(this
+is the same as using the star form of the environment).
+
+Another change is that this
+environment is
+now allowed anywhere in the document,
+which means
+it provides everything (and more) of what the now obsolete
+\pkg{filecontents} package provided.
+
+
+
+\section{Making more user commands robust}
+
+In the early days of \LaTeX{} many commands were fragile, i.e., they
+needed \cs{protect} in front of them when used in places such as
+section headings and other \enquote{moving arguments}, etc.
+In \LaTeXe{} many of these commands were made robust,
+but still a fairly huge number remained unnecessarily fragile.
+
+In this release of \LaTeX{} we have now
+made a lot more commands robust.
+There is a very small collection of commands that must stay fragile
+because their expansion (maybe partially) at just the right time is critical.
+Yet others are unlikely to ever be needed in an \enquote{moving argument}.
+
+Doing this for \cs{begin} and \cs{end} was rather tricky as the
+standard mechanism with \cs{DeclareRobustCommand} doesn't work here,
+at least not for \cs{end} as that needs to expand during typesetting
+without generating a \cs{relax} (from the \cs{protect}. Such a token
+would start a new row in table environments, such as \texttt{tabular}
+etc. Furthermore some packages try to look into the definition of
+\cs{end} by expanding it several times. Thus expansion with
+\cs{expandafter} had to produce exactly the same result as before. But
+in the end we overcame that hurdle too, so now environments are
+automatically robust if used in places like headings or
+\verb=\typeout= and so forth.
+
+%%CCC do we need to say something about possible problems if other packages
+%% or documents have redefined commands whose robustness has changed?
+
+What hasn't been tackled yet is the redefinitions in \pkg{amsmath}:
+this package
+redefines a number of basic math constructs
+that are now robust, so that
+they become fragile again
+once the package is loaded.
+This area will be addressed in a follow up release.
+
+\githubissue{123}
+
+
+
+\section{Other changes to the \LaTeX{} kernel}
+
+\subsection{Guard against \cs{unskip} in tabular cells}
+
+If a \env{tabular} or \env{array} cell started with a
+command that started with an
+\cs{unskip}
+then centering the column broke
+ because the stretching glue
+ on the left got removed. The fix for this was to add
+ a minuscule, and hence unnoticeable, additional space after the stretching space:
+removing this extra space causes no problems.
+
+This change was also applied in the \pkg{array} package.
+
+\githubissue{102}
+
+
+\subsection{Fix Unicode table data}
+
+\texttt{U+012F} which is \enquote{i with ogonek} produced a
+\enquote{dotless i with ogonek} by mistake. This has been corrected.
+
+\githubissue{122}
+
+The Unicode slots \texttt{27E8} and \texttt{27E9} have been mapped to
+\cs{textlangle} and \cs{textrangle} which is the recommended mapping.
+In the past they raised a \LaTeX{} error.
+
+\githubissue{110}
+
+When doing cut-and-paste from other documents or websites f-ligatures and others ligatures
+might end up as
+single Unicode characters in your file. In the past those got rejected by \LaTeX{}.
+ We
+ now define those Unicode slots and map them back to the sequence of
+ individual characters constituting the ligature.
+If supported by the current font
+(which is normally the case) they
+are then reconstructed as ligatures and thus get typeset
+as desired.
+Otherwise they will come out as individual characters which
+is still better than an error message.
+
+\githubissue{154}
+
+
+\subsection{Improve \cs{InputIfFileExists}'s handling of file names}
+
+In rare circumstances it was possible that \cs{InputIfFileExists}
+would work incorrectly, e.g., a construction such as
+\begin{verbatim}
+\InputIfFileExists{foo}{\input{bar}}{}
+\end{verbatim}
+Would not load the files \texttt{foo.tex} and \texttt{bar.tex} but
+would load \texttt{bar.tex} twice. This has been corrected.
+
+\githubissue{109}
+
+
+\subsection{Improve interface for cross-references}
+
+%%CCC should be 'provide' as they still exist. FMi - no they no longer do that
+The packages \pkg{fcnylab} and \pkg{varioref} provided
+a slightly
+improved definition of \cs{refstepcounter} which allowed
+the internal
+\cs{p@..} commands to receive the counter value as an argument,
+instead of
+acting as a simple prefix. This supports
+more complex
+formatting of the value in the reference.
+
+
+These packages also provided
+the command \cs{labelformat} to help in the specification of
+such formatting in an easy way. For
+example, \verb=\labelformat{equation}{eq.~(#1}}= specifies that
+references to equations
+automatically come out as
+\enquote{eq.~(5)} or similar. As this means a \cs{ref} command can no
+longer be used at the start of a sentence, the packages also
+provided \cs{Ref} for such scenarios.
+
+Both of these commands, cs{labelformat} and \cs{Ref},
+are now removed from the packages and instead made available in
+the kernel so there is no
+need to load additional packages.
+
+
+
+
+\subsection{Improve wording of a warning message}
+
+The kernel now says \enquote{Trying to load \ldots}
+instead of \enquote{Try loading \ldots} in one of its informal
+messages to match style of similar messages.
+
+\githubissue{107}
+
+
+\subsection{Avoid bad side-effects of cs{DeclareErrorFont}}
+
+As a side effect of setting up the error font for NFSS, this
+declaration also changed the current font-size back to 10pt.
+In most
+circumstances that doesn't matter, because that declaration was meant
+to be used only during the format generation and not during
+a \LaTeX{} run.
+However, it has turned out to
+used by some developers in other places
+(incorrectly in fact:
+e.g., inside some \texttt{.fd} files) where
+resetting the size causes
+havoc
+seemingly at random.
+The command has now changed to not produce such side effects.
+
+\gnatsissue{latex}{4399}
+
+
+
+\subsection{\pkg{nfssfont}: Generate a font table as the default action}
+
+With the small file \texttt{nfssfont.tex} it is possible to produce
+font tables and other font tests
+in the style set up by Don Knuth.
+In nearly all cases
+a font table is wanted,
+so this action has been made the default.
+Now one can simply hit enter
+instead of having to write \verb=\table\bye=.
+
+
+\subsection{\pkg{trace} package support in the kernel}
+
+The \pkg{trace} package implements the commands \cs{traceon}
+and \cs{traceoff} that work like
+\cs{tracingall} but skip
+certain code blocks that produce a lot of tracing output.
+%%CCC being of no interest to anyone!! -- FMi I love your encouragement
+This is useful when debugging, to suppress uninteresting tracing
+from, for example, loading a font.
+Code blocks that should not be traced
+need to be surrounded by the commands
+\cs{conditionally@traceoff} and \cs{conditionally@traceon}.
+
+The \LaTeX{} kernel now provides dummy definitions for these two
+commands so that package writers can use them in their packages
+regardless of \pkg{trace} being loaded or not.
+
+
+
+
+\section{Changes to packages in the \pkg{tools} category}
+
+\subsection{\pkg{array}: Warn if primitive column specifiers are overwritten}
+
+With \cs{newcolumntype} it is possible to define your own column
+specifiers for a \texttt{tabular} preamble, it is also possible to
+change existing ones. However, doing that for a primitive column
+specifier, such a \texttt{c}, is seldom a good idea, since then its
+functionality becomes unavailable.
+The package was therefore supposed
+to warn the user in this case, but due to a missing \cs{expandafter}
+in the code it never did---now it does.
+
+\githubissue{148}
+
+
+\subsection{\pkg{multicol}: Introduce \texttt{minrows} counter for balancing}
+
+When there are only a few lines of text on a page at the end of a
+\env{multicols} environment,
+balancing the columns often looks rather odd: such as
+three columns each containing a single line. The balancing behavior
+can now be controlled through the counter \texttt{minrows}
+(default is~1) which specifies that,
+after balancing, there must be at least that many lines in the first column.
+Thus, if you set \texttt{minrows}
+to \texttt{2} then you
+would get a
+distribution of \texttt{2+1+0} lines and if set
+to three, the result
+would be
+\texttt{3+0+0} instead of the default \texttt{1+1+1}.
+
+What is most appropriate really depends on the circumstances, but this
+now gives you the tools to make local or global adjustments.
+
+
+\subsection{\pkg{varioref}: better support for \pkg{cleveref}}
+
+The \pkg{varioref} package has been internally updated to provide
+better interfaces for packages such as \pkg{hyperref} and
+\pkg{cleveref}.
+
+It also
+has a new package option \option{nospace} that stops
+\pkg{varioref} from meddling with space in front of
+its commands. The
+original behavior was always somewhat problematical and it is
+suggested that
+all new documents
+use this option (which
+should really have been the default).
+
+Support was also added for the Arabic language through the option
+\option{arabic}.
+
+
+
+
+\subsection{\pkg{xr}: Support citations to bibliographies in external documents}
+
+The \pkg{xr} package can be used to cross-reference an external \LaTeX{}
+document.
+This means that even when a work is split over different documents (that
+need to be processed separately) \cs{ref} or \cs{pageref} can use labels from
+any document, creating links between them. This facility has now been extended
+so that \cs{cite} commands and
+their cousins can now also reference bibliographies in external
+documents; this feature was first provided in the package
+\pkg{xcite} by Enrico Gregorio.
+
+Note that for technical reasons \pkg{xr} doesn't work with
+\pkg{hyperref}. Use \pkg{xr-hyper} instead if you need the latter
+package.
+
+
+\section{Changes to packages in the \pkg{amsmath} category}
+
+\subsection{\pkg{amsmath}: Introduce \texttt{overunderset} command}
+
+The \pkg{amsmath} package has always offered
+the commands \cs{overset} and
+\cs{underset} to produce binary operators with something set above or
+below. But sometimes one needs to put something above and something below:
+The newly added \cs{overunderset} makes this
+easily possible.
+
+
+
+\section{Documentation updates}
+
+There are a number of
+%small
+documentation updates in files
+on the documentation page of the project website~\cite{30:site-doc}.
+
+\subsection{Highlighting the standard NFSS codes for series}
+
+The \emph{Font Selection Guide}~\cite{fntguide} has been
+updated to strongly recommend that the standard codes should be used
+when providing font support. The reason for this recommendation is explained here.
+
+
+The font selection scheme uses a number of standard codes for
+\cs{fontseries} and \cs{fontshape} to ensure that different fonts are
+comparable, e.g., that you get a \enquote{light} weight if you specify
+\texttt{l} and \enquote{extra bold} when you write \texttt{eb},
+etc. Over the years people came up with a number of other creative
+short codes like \texttt{k}, \texttt{j}, \texttt{t} and others with
+the result that changing a font family required different codes and
+thus prevented user from easily mixing and matching different
+families.
+Some work has been undertaken to get back to a coherent scheme and
+all the font families supported through the program \texttt{autoinst}
+are now producing the standard codes again.
+
+
+\subsection{\LaTeX{} \texttt{base} and \texttt{doc} distribution reunited}
+
+For a long time the \LaTeX{} distribution available from \CTAN{} was
+split into several parts to allow them to be uploaded or downloaded
+separately. As this is these days more confusing than helpful we have
+recombined the base part with the documentation part (as both are
+anyway always updated jointly. Thus the package \texttt{latex-doc}
+is no longer separately available from \CTAN{} but contained in the
+\texttt{latex-base} distribution.
+
+
+\begin{thebibliography}{9}
+
+%\fontsize{9.3}{11.3}\selectfont
+
+\bibitem{30:Mittelbach:TB39-1} Frank Mittelbach:
+ \emph{New rules for reporting bugs in the \LaTeX{} core software}.
+ In: TUGboat, 39\#1, 2018.
+ \url{https://latex-project.org/publications/}
+
+\bibitem{devformat} Frank Mittelbach:
+ \emph{The
+ \LaTeX{} release workflow and the \LaTeX{} dev formats}.
+ In: TUGboat, 40\#2, 2019.
+ \url{https://latex-project.org/publications/}
+
+\bibitem{fntguide} \LaTeX{} Project Team:
+ \emph{\LaTeXe{} font selection}.\\
+ \url{https://latex-project.org/documentation/}
+
+\bibitem{30:site-doc}
+ \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\
+ \url{https://latex-project.org/documentation/}
+
+%\bibitem{30:site-pub}
+% \emph{\LaTeX{} Project publications on the \LaTeX{} Project Website}.\\
+% \url{https://latex-project.org/publications/}
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/ltoutenc.dtx b/macros/latex-dev/base/ltoutenc.dtx
index 86135e96c8..b16af5c8c6 100644
--- a/macros/latex-dev/base/ltoutenc.dtx
+++ b/macros/latex-dev/base/ltoutenc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -1030,12 +1030,25 @@
% \begin{macrocode}
\@onlypreamble\DeclareTextComposite
% \end{macrocode}
+%
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
+%
+%
+%
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\UseTextAccent}{Make commands robust}%
+% \end{macrocode}
+%
% \begin{macro}{\UseTextAccent}
% \begin{macro}{\UseTextSymbol}
% \changes{v1.7p}{1995/11/17}{Support \cs{@wrong@font@char} latex/1676}
@@ -1054,7 +1067,7 @@
% \task{?}{Improve this and document its problems, see pr/3160}
% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)}
% \begin{macrocode}
-\def\UseTextAccent#1#2#3{%
+\DeclareRobustCommand\UseTextAccent[3]{%
\hmode@start@before@group
{%
% \end{macrocode}
@@ -1070,7 +1083,7 @@
%
% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)}
% \begin{macrocode}
-\def\UseTextSymbol#1#2{%
+\DeclareRobustCommand\UseTextSymbol[2]{%
\hmode@start@before@group
{%
\def\@wrong@font@char{\MessageBreak
@@ -1082,6 +1095,20 @@
% \end{macrocode}
%
% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\UseTextAccent}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\UseTextAccent
+%<latexrelease>\kernel@make@fragile\UseTextSymbol
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
\def\@use@text@encoding#1{%
\edef\f@encoding{#1}%
\xdef\font@name{%
diff --git a/macros/latex-dev/base/ltoutenc.ins b/macros/latex-dev/base/ltoutenc.ins
index 62e35e7707..e3f436fbc1 100644
--- a/macros/latex-dev/base/ltoutenc.ins
+++ b/macros/latex-dev/base/ltoutenc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/ltoutput.dtx b/macros/latex-dev/base/ltoutput.dtx
index d1fe26b90a..138bc85ba3 100644
--- a/macros/latex-dev/base/ltoutput.dtx
+++ b/macros/latex-dev/base/ltoutput.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -37,7 +37,7 @@
%<*driver>
% \fi
\ProvidesFile{ltoutput.dtx}
- [2018/11/28 v1.4d LaTeX Kernel (Output Routine)]
+ [2019/08/27 v1.4e LaTeX Kernel (Output Routine)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltoutput.dtx}
@@ -783,6 +783,7 @@
% {Added macro}
% \changes{v1.1f}{1994/11/14}{Use normal box register: why a box?}
% \changes{v1.1l}{1995/04/24}{Add \cs{vbox} latex/1392}
+% \changes{v1.4e}{2019/08/27}{Make \cs{AtBeginDvi} robust}
%
% We use a box register in which to put
% stuff that must appear before anything else in the
@@ -792,7 +793,7 @@
% page when it is unboxed.
% \begin{macrocode}
\newbox\@begindvibox
-\def \AtBeginDvi #1{%
+\DeclareRobustCommand \AtBeginDvi [1]{%
\global \setbox \@begindvibox
\vbox{\unvbox \@begindvibox #1}%
}
diff --git a/macros/latex-dev/base/ltpage.dtx b/macros/latex-dev/base/ltpage.dtx
index 4d5601556d..c5ce52b1c6 100644
--- a/macros/latex-dev/base/ltpage.dtx
+++ b/macros/latex-dev/base/ltpage.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpage.dtx}
- [2000/06/02 v1.0k LaTeX Kernel (page style setup)]
+ [2019/08/27 v1.0l LaTeX Kernel (page style setup)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpage.dtx}
@@ -63,6 +63,7 @@
% \changes{v1.0a}{1994/03/07}{Initial version, split from ltherest.dtx}
% \changes{v1.0b}{1994/04/19}{Improve documentation}
% \changes{v1.0i}{1996/04/18}{Improve documentation}
+% \changes{v1.0l}{2019/08/27}{Make various commands robust}
%
%
% \subsection{Page Style Commands}
@@ -175,6 +176,14 @@
% \end{macro}
% \end{macro}
%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\markboth}{Make commands robust}%
+% \end{macrocode}
+%
% \begin{macro}{\markboth}
% \begin{macro}{\markright}
% \changes{v1.0d}{1994/05/20}{Changed setting for \cs{protect}.}
@@ -193,7 +202,7 @@
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
% error (pr/3203).}
% \begin{macrocode}
-\def\markboth#1#2{%
+\DeclareRobustCommand\markboth[2]{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
\unrestored@protected@xdef\@themark {{#1}{#2}}%
@@ -201,7 +210,10 @@
\mark{\the\@temptokena}%
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi}
-\def\markright#1{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand\markright[1]{%
\begingroup
\let\label\relax \let\index\relax \let\glossary\relax
% \end{macrocode}
@@ -216,6 +228,21 @@
% \end{macro}
% \end{macro}
%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\markboth}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\markboth
+%<latexrelease>\kernel@make@fragile\markright
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
%
% \begin{macro}{\@markright}
% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion
@@ -269,7 +296,7 @@
% interfering with the 1fil space of |\newpage|.)
%
% \begin{macrocode}
-\def\raggedbottom{%
+\DeclareRobustCommand\raggedbottom{%
\def\@textbottom{\vskip \z@ \@plus.0001fil}\let\@texttop\relax}
% \end{macrocode}
% \end{macro}
@@ -278,7 +305,7 @@
% |\flushbottom|:
% Inverse of |\raggedbottom| --- makes all pages the same height.
% \begin{macrocode}
-\def\flushbottom{%
+\DeclareRobustCommand\flushbottom{%
\let\@textbottom\relax \let\@texttop\relax}
% \end{macrocode}
% \end{macro}
@@ -290,7 +317,7 @@
% \changes{LaTeX2e}{1993/12/18}{Added \cs{emergencystretch}}
% \changes{v1.0h}{1994/07/20}{Save a few tokens}
% \begin{macrocode}
-\def\sloppy{%
+\DeclareRobustCommand\sloppy{%
\tolerance 9999%
\emergencystretch 3em%
\hfuzz .5\p@
@@ -310,7 +337,7 @@
% \changes{v1.0f}{1995/04/24}{reset \cs{emergencystretch} latex/1344}
% Resets \TeX's parameters to their normal finicky values.
% \begin{macrocode}
-\def\fussy{%
+\DeclareRobustCommand\fussy{%
\emergencystretch\z@
\tolerance 200%
\hfuzz .1\p@
diff --git a/macros/latex-dev/base/ltpageno.dtx b/macros/latex-dev/base/ltpageno.dtx
index da1d574b15..f6b10985b8 100644
--- a/macros/latex-dev/base/ltpageno.dtx
+++ b/macros/latex-dev/base/ltpageno.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltpar.dtx b/macros/latex-dev/base/ltpar.dtx
index 3b72b43a9c..75b4894eb1 100644
--- a/macros/latex-dev/base/ltpar.dtx
+++ b/macros/latex-dev/base/ltpar.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltpictur.dtx b/macros/latex-dev/base/ltpictur.dtx
index 6b84231ab5..ad82cd477f 100644
--- a/macros/latex-dev/base/ltpictur.dtx
+++ b/macros/latex-dev/base/ltpictur.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltpictur.dtx}
- [2016/03/29 v1.1l LaTeX Kernel (Picture Mode)]
+ [2019/08/27 v1.1m LaTeX Kernel (Picture Mode)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltpictur.dtx}
@@ -95,6 +95,8 @@
% \changes{v0.1e}{1994/05/22}{Use new warning cmds}
% \changes{v1.0f}{1994/11/17}
% {\cs{@tempa} to \cs{reserved@a}}
+% \changes{v1.1m}{2019/08/27}{Remove several unnecessary \cs{gdef} definitions}
+% \changes{v1.1m}{2019/08/27}{Make various commands robust}
%
% \begin{oldcomments}
%
@@ -196,8 +198,8 @@
% \changes{v1.0h}{1995/05/12}{Macro added for latex/1355}
% |#1| should be a |(| (eating any white space before the bracket),
% \begin{macrocode}
-\long\gdef\picture#1{\pictur@#1}
-\gdef\pictur@(#1){%
+\long\def\picture#1{\pictur@#1}
+\def\pictur@(#1){%
\@ifnextchar({\@picture(#1)}{\@picture(#1)(0,0)}}
% \end{macrocode}
% \end{macro}
@@ -205,7 +207,7 @@
%
% \begin{macro}{\@picture}
% \begin{macrocode}
-\gdef\@picture(#1,#2)(#3,#4){%
+\def\@picture(#1,#2)(#3,#4){%
\@picht#2\unitlength
\setbox\@picbox\hb@xt@#1\unitlength\bgroup
\hskip -#3\unitlength
@@ -221,7 +223,7 @@
% (proposed by John Hobby)}
%
% \begin{macrocode}
-\gdef\endpicture{%
+\def\endpicture{%
\egroup\hss\egroup
\ht\@picbox\@picht\dp\@picbox\z@
\mbox{\box\@picbox}}
@@ -233,7 +235,7 @@
% changed 20 Jul 87).
%
% \begin{macrocode}
-\long\gdef\put(#1,#2)#3{%
+\long\def\put(#1,#2)#3{%
\@killglue\raise#2\unitlength
\hb@xt@\z@{\kern#1\unitlength #3\hss}%
\ignorespaces}
@@ -244,7 +246,7 @@
% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(}
% |#3| had better be a |(|.
% \begin{macrocode}
-\gdef\multiput(#1,#2)#3{%
+\def\multiput(#1,#2)#3{%
\@xdim #1\unitlength
\@ydim #2\unitlength
\@multiput(}
@@ -254,7 +256,7 @@
% \begin{macro}{\multiput}
% \changes{v0.1c}{1994/04/28}{(DPC) Macro added}
% \begin{macrocode}
-\long\gdef\@multiput(#1,#2)#3#4{%
+\long\def\@multiput(#1,#2)#3#4{%
\@killglue\@multicnt #3\relax
\@whilenum \@multicnt >\z@\do
{\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}%
@@ -266,16 +268,16 @@
%
% \begin{macro}{\@killglue}
% \begin{macrocode}
-\gdef\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}
+\def\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\thinlines}
% \begin{macro}{\thicklines}
% \begin{macrocode}
-\gdef\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
+\DeclareRobustCommand\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc
\@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth}
-\gdef\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw
+\DeclareRobustCommand\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw
\@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth}
% \end{macrocode}
% \end{macro}
@@ -283,19 +285,20 @@
%
% \begin{macro}{\linethickness}
% \begin{macrocode}
-\gdef\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth}
+\DeclareRobustCommand\linethickness[1]
+ {\@wholewidth #1\relax \@halfwidth .5\@wholewidth}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ishortstack}
% \begin{macrocode}
-\gdef\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}}
+\def\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ishortstack}
% \begin{macrocode}
-\gdef\@shortstack[#1]{%
+\def\@shortstack[#1]{%
\leavevmode
\vbox\bgroup
\baselineskip-\p@\lineskip 3\p@
@@ -315,22 +318,22 @@
%
% \begin{macro}{\@ishortstack}
% \begin{macrocode}
-\gdef\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}
+\def\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@stackcr}
% \begin{macro}{\@ixstackcr}
% \begin{macrocode}
-\gdef\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
-\gdef\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}}
+\def\@stackcr{\@ifstar\@ixstackcr\@ixstackcr}
+\def\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\@istackcr}
% \begin{macrocode}
-\gdef\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
+\def\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces}
% \end{macrocode}
% \end{macro}
%
@@ -507,7 +510,7 @@
%
% \begin{macro}{\line}
% \begin{macrocode}
-\gdef\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
+\def\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
\@linelen #3\unitlength
\ifdim\@linelen<\z@\@badlinearg\else
\ifnum\@xarg =\z@ \@vline
@@ -519,7 +522,7 @@
%
% \begin{macro}{\@sline}
% \begin{macrocode}
-\gdef\@sline{%
+\def\@sline{%
\ifnum\@xarg<\z@ \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg
\else \@negargfalse \@yyarg \@yarg \fi
\ifnum \@yyarg >\z@ \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi
@@ -580,7 +583,7 @@
%
% \begin{macro}{\@hline}
% \begin{macrocode}
-\gdef\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi
+\def\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi
\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen
\ifnum \@xarg <\z@ \hskip -\@linelen \fi}
% \end{macrocode}
@@ -588,7 +591,7 @@
%
% \begin{macro}{\@getlinechar}
% \begin{macrocode}
-\gdef\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8%
+\def\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8%
\advance\@tempcnta -9\ifnum #2>\z@ \advance\@tempcnta #2\relax\else
\advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi
\char\@tempcnta}
@@ -597,7 +600,7 @@
%
% \begin{macro}{\vector}
% \begin{macrocode}
-\gdef\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
+\def\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax
\@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi
\ifnum\@tempcnta<5\relax
\@linelen #3\unitlength
@@ -612,7 +615,7 @@
%
% \begin{macro}{\@hvector}
% \begin{macrocode}
-\gdef\@hvector{\@hline\hb@xt@\z@{\@linefnt
+\def\@hvector{\@hline\hb@xt@\z@{\@linefnt
\ifnum \@xarg <\z@ \@getlarrow(1,0)\hss\else
\hss\@getrarrow(1,0)\fi}}
% \end{macrocode}
@@ -620,13 +623,13 @@
%
% \begin{macro}{\@vvector}
% \begin{macrocode}
-\gdef\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi}
+\def\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@svector}
% \begin{macrocode}
-\gdef\@svector{\@sline
+\def\@svector{\@sline
\@tempcnta\@yarg \ifnum\@tempcnta <\z@ \@tempcnta -\@tempcnta\fi
\ifnum\@tempcnta <5%
\hskip -\wd\@linechar
@@ -639,7 +642,7 @@
% \begin{macro}{\@getlarrow}
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \begin{macrocode}
-\gdef\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta 27 % '33
+\def\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta 27 % '33
\else
\@tempcnta #1\relax\multiply\@tempcnta \sixt@@n
\advance\@tempcnta -9 \@tempcntb #2\relax\multiply\@tempcntb \tw@
@@ -652,7 +655,7 @@
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \begin{macro}{\@getrarrow}
% \begin{macrocode}
-\gdef\@getrarrow(#1,#2){\@tempcntb #2\relax
+\def\@getrarrow(#1,#2){\@tempcntb #2\relax
\ifnum\@tempcntb <\z@ \@tempcntb -\@tempcntb\relax\fi
\ifcase \@tempcntb\relax \@tempcnta 45 % '55
\or
@@ -671,13 +674,13 @@
%
% \begin{macro}{\@vline}
% \begin{macrocode}
-\gdef\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi}
+\def\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@upline}
% \begin{macrocode}
-\gdef\@upline{%
+\def\@upline{%
\hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
\@height \@linelen \@depth \z@\hss}}
% \end{macrocode}
@@ -685,7 +688,7 @@
%
% \begin{macro}{\@downline}
% \begin{macrocode}
-\gdef\@downline{%
+\def\@downline{%
\hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth
\@height \z@ \@depth \@linelen \hss}}
% \end{macrocode}
@@ -695,7 +698,7 @@
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \changes{v1.1i}{2000/01/15}{Removed space at end-of-line, CAR}
% \begin{macrocode}
-\gdef\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char 54}% '66
+\def\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char 54}% '66
\raise \@linelen \hb@xt@\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}}
% \end{macrocode}
% \end{macro}
@@ -703,7 +706,7 @@
% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR}
% \begin{macro}{\@downvector}
% \begin{macrocode}
-\gdef\@downvector{\@downline\lower \@linelen
+\def\@downvector{\@downline\lower \@linelen
\hb@xt@\z@{\@linefnt\char 63 % '77
\hss}}
% \end{macrocode}
@@ -800,7 +803,7 @@
%
% \begin{macro}{\dashbox}
% \begin{macrocode}
-\gdef\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip
+\def\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip
\lineskip \z@skip
\@dashdim #2\unitlength
\@dashcnt \@dashdim \advance\@dashcnt 200
@@ -1081,7 +1084,7 @@
% \begin{macro}{\@getcirc}
% \changes{v1.1j}{2003/12/30}{issue warning if circle size can't be met pr/3473}
% \begin{macrocode}
-\gdef\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@
+\def\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@
\@tempcnta\@tempdima
\@tempdima 4\p@ \divide\@tempcnta\@tempdima
\ifnum \@tempcnta >10\relax
@@ -1114,13 +1117,13 @@
%
% \begin{macro}{\@put}
% \begin{macrocode}
-\gdef\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}}
+\def\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\oval}
% \begin{macrocode}
-\gdef\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}
+\def\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}}
% \end{macrocode}
% \end{macro}
%
@@ -1146,7 +1149,7 @@
%
% \begin{macro}{\@oval}
% \begin{macrocode}
-\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
+\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
\@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
% \end{macrocode}
% \changes{v1.1l}{2016/03/29}{initialise tests}
@@ -1189,7 +1192,7 @@
%
% \begin{macro}{\@ovvert}
% \begin{macrocode}
-\gdef\@ovvert#1#2{\vbox to\@ovyy{%
+\def\@ovvert#1#2{\vbox to\@ovyy{%
\if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
\kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
\else \kern \@ovri \kern \@ovdy \fi
@@ -1209,7 +1212,7 @@
%
% \begin{macro}{\@ovhorz}
% \begin{macrocode}
-\gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
+\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
\if@ovr \else \kern \@ovdx \fi
% \end{macrocode}
% \changes{v1.1l}{2016/03/29}
@@ -1232,7 +1235,7 @@
%<latexrelease> {Avoid almost zero length leaders}%
%<latexrelease>\let\if@ovvline\@undefined
%<latexrelease>\let\if@ovhline\@undefined
-%<latexrelease>\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
+%<latexrelease>\def\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen
%<latexrelease> \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue
%<latexrelease> \@tfor\reserved@a :=#3\do
%<latexrelease> {\csname @ov\reserved@a false\endcsname}%
@@ -1254,7 +1257,7 @@
%<latexrelease> \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@
%<latexrelease> \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}%
%<latexrelease> \endgroup}
-%<latexrelease>\gdef\@ovvert#1#2{\vbox to\@ovyy{%
+%<latexrelease>\def\@ovvert#1#2{\vbox to\@ovyy{%
%<latexrelease> \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax
%<latexrelease> \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip
%<latexrelease> \else \kern \@ovri \kern \@ovdy \fi
@@ -1262,7 +1265,7 @@
%<latexrelease> \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax
%<latexrelease> \hbox{\char \@tempcntb}%
%<latexrelease> \else \kern \@ovdy \kern \@ovro \fi}}
-%<latexrelease>\gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
+%<latexrelease>\def\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro
%<latexrelease> \if@ovr \else \kern \@ovdx \fi
%<latexrelease> \leaders \hrule \@height \@wholewidth \hfil
%<latexrelease> \if@ovl \else \kern \@ovdx \fi
@@ -1275,13 +1278,13 @@
% \changes{LaTeX2.09}{1993/08/05}
% {(RMS) Added error message if \cs{circle} is used in math mode.}
% \begin{macrocode}
-\gdef\circle{\@inmatherr\circle\@ifstar\@dot\@circle}
+\def\circle{\@inmatherr\circle\@ifstar\@dot\@circle}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@circle}
% \begin{macrocode}
-\gdef\@circle#1{%
+\def\@circle#1{%
\begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength
\ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb
\@ovro\ht\@tempboxa
@@ -1299,13 +1302,13 @@
% \begin{macro}{\@dot}
% Internal form of |\circle*|.
% \begin{macrocode}
-\gdef\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
+\def\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@circ}
% \begin{macrocode}
-\gdef\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@
+\def\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@
\@tempcnta\@tempdima \@tempdima \p@
\divide\@tempcnta\@tempdima
\ifnum\@tempcnta >15\relax \@tempcnta 15\relax \fi
@@ -1442,7 +1445,7 @@
% \begin{macro}{\qbeziermax}
% The maximum number of points to plot.
% \begin{macrocode}
-\gdef\qbeziermax{500}
+\def\qbeziermax{500}
% \end{macrocode}
% \end{macro}
%
@@ -1474,12 +1477,12 @@
% ignore spaces between its arguments.
% |#2| should be white space, and |#4| should be |(|.
% \begin{macrocode}
-\gdef\bezier#1)#2(#3)#4({\@bezier#1)(#3)(}
+\def\bezier#1)#2(#3)#4({\@bezier#1)(#3)(}
% \end{macrocode}
%
% \begin{macro}{\@bezier}
% \begin{macrocode}
-\gdef\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
+\def\@bezier#1(#2,#3)(#4,#5)(#6,#7){%
\ifnum #1=\z@
\@ovxx #4\unitlength
\advance\@ovxx -#2\unitlength
@@ -1533,10 +1536,55 @@
\hb@xt@\z@{\kern\@xdim
\unhcopy\@tempboxa\hss}%
\advance\count@\@ne}}}
-%</2ekernel>
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% As the commands above all use ``picture'' interface we couldn't define them with
+% |\DeclareRobustCommand| so we do that now.
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\bezier}{Make commands robust}%
+\MakeRobust\bezier
+\MakeRobust\circle
+\MakeRobust\dashbox
+\MakeRobust\line
+\MakeRobust\linethickness
+\MakeRobust\multiput
+\MakeRobust\oval
+\MakeRobust\put
+\MakeRobust\qbezier
+\MakeRobust\shortstack
+\MakeRobust\thinlines
+\MakeRobust\vector
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\bezier}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\bezier
+%<latexrelease>\kernel@make@fragile\circle
+%<latexrelease>\kernel@make@fragile\dashbox
+%<latexrelease>\kernel@make@fragile\line
+%<latexrelease>\kernel@make@fragile\linethickness
+%<latexrelease>\kernel@make@fragile\multiput
+%<latexrelease>\kernel@make@fragile\oval
+%<latexrelease>\kernel@make@fragile\put
+%<latexrelease>\kernel@make@fragile\qbezier
+%<latexrelease>\kernel@make@fragile\shortstack
+%<latexrelease>\kernel@make@fragile\thinlines
+%<latexrelease>\kernel@make@fragile\vector
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
+%
% \Finale
%
diff --git a/macros/latex-dev/base/ltplain.dtx b/macros/latex-dev/base/ltplain.dtx
index 5c4050b734..2337133f2f 100644
--- a/macros/latex-dev/base/ltplain.dtx
+++ b/macros/latex-dev/base/ltplain.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2017
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -314,8 +314,10 @@
% \begin{macro}{\newskip}
% \begin{macro}{\newmuskip}
% \begin{macro}{\newbox}
+% \begin{macro}{\newtoks}
% \begin{macro}{\newread}
% \begin{macro}{\newwrite}
+% \begin{macro}{\newfam}
% \begin{macro}{\newlanguage}
% \changes{v1.0c}{1994/03/28}
% {Remove some \cs{outer} declarations.}
@@ -429,6 +431,8 @@
% \end{macro}
% \end{macro}
% \end{macro}
+% \end{macro}
+% \end{macro}
%
%\begin{macro}{\e@alloc@chardef}
% \changes{v2.0a}{2014/12/30}{macro added}
diff --git a/macros/latex-dev/base/ltsect.dtx b/macros/latex-dev/base/ltsect.dtx
index cb1c6d2c30..239d4c547f 100644
--- a/macros/latex-dev/base/ltsect.dtx
+++ b/macros/latex-dev/base/ltsect.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -31,7 +31,7 @@
%%% From File: ltsect.dtx
%<*driver>
% \fi
-\ProvidesFile{ltsect.dtx}[2018/09/26 v1.1c LaTeX Kernel (Sectioning)]
+\ProvidesFile{ltsect.dtx}[2019/08/27 v1.1d LaTeX Kernel (Sectioning)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltsect.dtx}
@@ -85,6 +85,7 @@
% {\cs{@tempa} to \cs{reserved@a}}
% \changes{v1.0m}{1995/05/03}{TO: Promoted documentation to doc.sty
% standard}
+% \changes{v1.1d}{2019/08/27}{Make various commands robust}
%
% \begin{macrocode}
%<*2ekernel>
@@ -114,65 +115,104 @@
% And finally, the |\maketitle| command produces the actual title,
% using the information previously saved with the other commands.
%
+%
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\title}{Make commands robust}%
+% \end{macrocode}
+%
+%
% \begin{macro}{\title}
-% \begin{macro}{\@title}
% \changes{LaTeX2e}{1993/12/11}{Added default}
% |\title| for use in |\maketitle|. If not given |\maketitle| will
% produce an error message.
% \begin{macrocode}
-\def\title#1{\gdef\@title{#1}}
-\def\@title{\@latex@error{No \noexpand\title given}\@ehc}
+\DeclareRobustCommand\title[1]{\gdef\@title{#1}}
% \end{macrocode}
% \end{macro}
-% \end{macro}
+%
%
% \begin{macro}{\author}
-% \begin{macro}{\@author}
% \changes{LaTeX2e}{1993/12/11}{Added default}
%
% |\author| for use in |\maketitle|. If not given |\maketitle| will
% produce a warning message.
%
% \begin{macrocode}
-\def\author#1{\gdef\@author{#1}}
-\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
+\DeclareRobustCommand\author[1]{\gdef\@author{#1}}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \begin{macro}{\date}
-% \begin{macro}{\@date}
% |\date| for use in |\maketitle|. If not given |\maketitle| will
% produce |\today| as the default.
% \begin{macrocode}
-\def\date#1{\gdef\@date{#1}}
-\gdef\@date{\today}
+\DeclareRobustCommand\date[1]{\gdef\@date{#1}}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
% \changes{1.0h}{1994/11/04}{(ASAJ) Added \cs{protected@xdef} to
% \cs{thanks}.}
% \begin{macro}{\thanks}
% \begin{macrocode}
-\def\thanks#1{\footnotemark
+\DeclareRobustCommand\thanks[1]{\footnotemark
\protected@xdef\@thanks{\@thanks
\protect\footnotetext[\the\c@footnote]{#1}}%
}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\@thanks}
-% \begin{macrocode}
-\let\@thanks\@empty
-% \end{macrocode}
-% \end{macro}
% \begin{macro}{\and}
% \begin{macrocode}
-\def\and{% % \begin{tabular}
+\DeclareRobustCommand\and{% % \begin{tabular}
\end{tabular}%
\hskip 1em \@plus.17fil%
- \begin{tabular}[t]{c}}% % \end{tabular}
+ \begin{tabular}[t]{c}}% % \end{tabular}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\title}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\title
+%<latexrelease>\kernel@make@fragile\author
+%<latexrelease>\kernel@make@fragile\date
+%<latexrelease>\kernel@make@fragile\thanks
+%<latexrelease>\kernel@make@fragile\and
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{\@title}
+% \begin{macrocode}
+\def\@title{\@latex@error{No \noexpand\title given}\@ehc}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@author}
+% \begin{macrocode}
+\def\@author{\@latex@warning@no@line{No \noexpand\author given}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@date}
+% \begin{macrocode}
+\gdef\@date{\today}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@thanks}
+% \begin{macrocode}
+\let\@thanks\@empty
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltspace.dtx b/macros/latex-dev/base/ltspace.dtx
index 6f212bba15..d840b13bbb 100644
--- a/macros/latex-dev/base/ltspace.dtx
+++ b/macros/latex-dev/base/ltspace.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -32,7 +32,7 @@
%<*driver>
% \fi
\ProvidesFile{ltspace.dtx}
- [2018/10/10 v1.3i LaTeX Kernel (spacing)]
+ [2019/08/27 v1.3j LaTeX Kernel (spacing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltspace.dtx}
@@ -62,6 +62,7 @@
% \changes{v1.2q}{1996/07/27}{Further documentation of problems}
% \changes{v1.2r}{1996/07/27}{Correct documentation of problems}
% \changes{v1.2w}{1998/08/17}{Documentation fixes.}
+% \changes{v1.3j}{2019/08/27}{Make various commands robust}
%
%
% \section{Spacing}
@@ -274,18 +275,66 @@
%<*2ekernel>
\message{spacing,}
% \end{macrocode}
+%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\pagebreak}{Make commands robust}%
+% \end{macrocode}
%
% \begin{macro}{\pagebreak}
% \begin{macro}{\nopagebreak}
% \changes{v1.2h}{1995/07/05}{Reimplemented both using \cs{@no@pgbk}}
% \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911}
% \begin{macrocode}
-\def\pagebreak{\@testopt{\@no@pgbk-}4}
-\def\nopagebreak{\@testopt\@no@pgbk4}
+\DeclareRobustCommand\pagebreak{\@testopt{\@no@pgbk-}4}
+\DeclareRobustCommand\nopagebreak{\@testopt\@no@pgbk4}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\linebreak}
+% \begin{macro}{\nolinebreak}
+% \changes{v1.2u}{1996/10/29}{Reimplemented both using \cs{@no@lnbk}}
+% \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911}
+% \begin{macrocode}
+\DeclareRobustCommand\linebreak{\@testopt{\@no@lnbk-}4}
+\DeclareRobustCommand\nolinebreak{\@testopt\@no@lnbk4}
% \end{macrocode}
% \end{macro}
% \end{macro}
%
+% \begin{macro}{\samepage}
+% \begin{macrocode}
+\DeclareRobustCommand\samepage{\interlinepenalty\@M
+ \postdisplaypenalty\@M
+ \interdisplaylinepenalty\@M
+ \@beginparpenalty\@M
+ \@endparpenalty\@M
+ \@itempenalty\@M
+ \@secpenalty\@M
+ \interfootnotelinepenalty\@M}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\pagebreak}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\pagebreak
+%<latexrelease>\kernel@make@fragile\nopagebreak
+%<latexrelease>\kernel@make@fragile\linebreak
+%<latexrelease>\kernel@make@fragile\nolinebreak
+%<latexrelease>\kernel@make@fragile\samepage
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
%
% \begin{macro}{\@no@pgbk}
% \changes{v1.2h}{1995/07/05}{Macro replaces \cs{@pgbk}
@@ -302,16 +351,7 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\linebreak}
-% \begin{macro}{\nolinebreak}
-% \changes{v1.2u}{1996/10/29}{Reimplemented both using \cs{@no@lnbk}}
-% \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911}
-% \begin{macrocode}
-\def\linebreak{\@testopt{\@no@lnbk-}4}
-\def\nolinebreak{\@testopt\@no@lnbk4}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
+%
% \begin{macro}{\@no@lnbk}
% \changes{v1.2u}{1996/10/29}{Macro replaces \cs{@lnbk}
% and \cs{@nolnbk}}
@@ -331,19 +371,6 @@
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\samepage}
-% \begin{macrocode}
-\def\samepage{\interlinepenalty\@M
- \postdisplaypenalty\@M
- \interdisplaylinepenalty\@M
- \@beginparpenalty\@M
- \@endparpenalty\@M
- \@itempenalty\@M
- \@secpenalty\@M
- \interfootnotelinepenalty\@M}
-% \end{macrocode}
-% \end{macro}
-%
%
% \begin{macro}{\\}
% \changes{v1.2a}{1994/11/11}{(DPC) Make robust}
@@ -1140,9 +1167,9 @@
% \begin{macro}{\enspace}
% \changes{v1.3h}{2018/09/24}{Start LR-mode if necessary (git/49)}
% \begin{macrocode}
-\def\thinspace{\leavevmode@ifvmode\kern .16667em }
-\def\negthinspace{\leavevmode@ifvmode\kern-.16667em }
-\def\enspace{\leavevmode@ifvmode\kern.5em }
+\DeclareRobustCommand\thinspace{\leavevmode@ifvmode\kern .16667em }
+\DeclareRobustCommand\negthinspace{\leavevmode@ifvmode\kern-.16667em }
+\DeclareRobustCommand\enspace{\leavevmode@ifvmode\kern.5em }
% \end{macrocode}
% \end{macro}
% \end{macro}
diff --git a/macros/latex-dev/base/lttab.dtx b/macros/latex-dev/base/lttab.dtx
index 54bffa5974..646015daf3 100644
--- a/macros/latex-dev/base/lttab.dtx
+++ b/macros/latex-dev/base/lttab.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -31,7 +31,7 @@
%%% From File: lttab.dtx
%<*driver>
% \fi
-\ProvidesFile{lttab.dtx}[2018/12/30 v1.1p LaTeX Kernel (Columns)]
+\ProvidesFile{lttab.dtx}[2019/08/27 v1.1p LaTeX Kernel (Columns)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{lttab.dtx}
@@ -84,8 +84,9 @@
% \changes{v1.0c}{1994/05/07}{Removed surplus braces from
% \cs{@ifnextchar} constructs}
% \changes{v1.0f}{1994/05/21}{Use new error commands}
-% \changes{v1.0j}{1994/11/17}
-% {\cs{@tempa} to \cs{reserved@a}}
+% \changes{v1.0j}{1994/11/17}{\cs{@tempa} to \cs{reserved@a}}
+% \changes{v1.1q}{2019/08/27}{Remove several unnecessary \cs{gdef} definitions}
+% \changes{v1.1q}{2019/08/27}{Make various commands robust}
%
% \subsection{tabbing}
%
@@ -386,7 +387,7 @@
% a local variable). That this is allowed is a fundamental design
% flaw which is not going to be corrected now.
% \begin{macrocode}
-\gdef\@startline{%
+\def\@startline{%
\ifnum \@nxttabmar >\@hightab
\@badtab
\global\@nxttabmar \@hightab
@@ -401,7 +402,7 @@
%
% \begin{macro}{\@stopline}
% \begin{macrocode}
-\gdef\@stopline{%
+\def\@stopline{%
\unskip
\@stopfield
\if@rjfield
@@ -424,7 +425,7 @@
% \changes{v1.0d}{1994/05/13}
% {Colour support}
% \begin{macrocode}
-\gdef\@startfield{%
+\def\@startfield{%
\global\setbox\@curfield\hbox\bgroup\color@begingroup}
% \end{macrocode}
% \end{macro}
@@ -433,7 +434,7 @@
% \changes{v1.0d}{1994/05/13}
% {Colour support}
% \begin{macrocode}
-\gdef\@stopfield{%
+\def\@stopfield{%
\color@endgroup\egroup}
% \end{macrocode}
% \end{macro}
@@ -442,7 +443,7 @@
% \changes{v1.0d}{1994/05/13}
% {Colour support}
% \begin{macrocode}
-\gdef\@contfield{%
+\def\@contfield{%
\global\setbox\@curfield\hbox\bgroup\color@begingroup
\unhbox\@curfield}
% \end{macrocode}
@@ -450,38 +451,34 @@
%
% \begin{macro}{\@addfield}
% \begin{macrocode}
-\gdef\@addfield{\global\setbox\@curline\hbox{\unhbox
+\def\@addfield{\global\setbox\@curline\hbox{\unhbox
\@curline\unhbox\@curfield}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@ifatmargin}
% \begin{macrocode}
-\gdef\@ifatmargin{\ifdim \wd\@curline =\z@}
+\def\@ifatmargin{\ifdim \wd\@curline =\z@}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@tabcr}
% \begin{macrocode}
-\gdef\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}\@xtabcr}
+\def\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}\@xtabcr}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@xtabcr}
% \begin{macrocode}
-\gdef\@xtabcr{\@ifnextchar[\@itabcr{\@startline\ignorespaces}}
+\def\@xtabcr{\@ifnextchar[\@itabcr{\@startline\ignorespaces}}
% \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@itabcr}
% \begin{macrocode}
-\gdef\@itabcr[#1]{\vskip #1\@startline\ignorespaces}
+\def\@itabcr[#1]{\vskip #1\@startline\ignorespaces}
% \end{macrocode}
%
-% \begin{macrocode}
-\gdef\kill{\@stopfield\@startline\ignorespaces}
-% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\tabbing}
% \changes{v1.1f}{1995/10/23}{(CAR)Make \cs{@hightab} consistently a
@@ -489,7 +486,7 @@
% \changes{latex2e}{1993/12/13}{Removed optional argument of \cs{item}}
% We use |\relax| to prevent |\item| from scanning too far.
% \begin{macrocode}
-\gdef\tabbing{\lineskip \z@skip\let\>\@rtab\let\<\@ltab\let\=\@settab
+\def\tabbing{\lineskip \z@skip\let\>\@rtab\let\<\@ltab\let\=\@settab
\let\+\@tabplus\let\-\@tabminus\let\`\@tabrj\let\'\@tablab
\let\\=\@tabcr
\@hightab\@firsttab
@@ -512,7 +509,7 @@
%
% \begin{macro}{\endtabbing}
% \begin{macrocode}
-\gdef\endtabbing{%
+\def\endtabbing{%
\@stopline\ifnum\@tabpush >\z@ \@badpoptabs \fi\endtrivlist}
% \end{macrocode}
% \end{macro}
@@ -520,7 +517,7 @@
% \begin{macro}{\@rtab}
% Omitted |\global| added to |\@rtab| 17 Jun 86
% \begin{macrocode}
-\gdef\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab
+\def\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab
\global\advance\@curtab \@ne \else\@badtab\fi
\@tempdima\dimen\@curtab
\advance\@tempdima -\dimen\@curtabmar
@@ -534,7 +531,7 @@
% \changes{v1.1f}{1995/10/23}{(CAR)Ensure that \cs{@hightab} increases
% by at most one}
% \begin{macrocode}
-\gdef\@settab{\@stopfield\@addfield
+\def\@settab{\@stopfield\@addfield
\ifnum \@curtab <\@maxtab
\ifnum\@curtab =\@hightab
\advance\@hightab \@ne
@@ -552,7 +549,7 @@
%
% \begin{macro}{\@ltab}
% \begin{macrocode}
-\gdef\@ltab{\@ifatmargin\ifnum\@curtabmar >\@firsttab
+\def\@ltab{\@ifatmargin\ifnum\@curtabmar >\@firsttab
\global\advance\@curtab \m@ne \global\advance\@curtabmar\m@ne\else
\@badtab\fi\else
\@latex@error{\string\<\space in mid line}\@ehd\fi\ignorespaces}
@@ -561,7 +558,7 @@
%
% \begin{macro}{\@tabplus}
% \begin{macrocode}
-\gdef\@tabplus{%
+\def\@tabplus{%
\ifnum\@nxttabmar<\@hightab
\global\advance\@nxttabmar\@ne
\else
@@ -573,7 +570,7 @@
%
% \begin{macro}{\@tabminus}
% \begin{macrocode}
-\gdef\@tabminus{%
+\def\@tabminus{%
\ifnum\@nxttabmar>\@firsttab
\global\advance\@nxttabmar\m@ne
\else
@@ -585,7 +582,7 @@
%
% \begin{macro}{\@tabrj}
% \begin{macrocode}
-\gdef\@tabrj{%
+\def\@tabrj{%
\@stopfield\@addfield\global\@rjfieldtrue\@startfield\ignorespaces}
% \end{macrocode}
% \end{macro}
@@ -593,7 +590,7 @@
% \begin{macro}{\@tablab}
% |\setbox\@curline| made |\global| in |\@tablab|. 17 Jun 86
% \begin{macrocode}
-\gdef\@tablab{%
+\def\@tablab{%
\@stopfield
\global\setbox\@curline\hbox{%
\box\@curline
@@ -605,9 +602,16 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\pushtabs}{Make commands robust}%
+% \end{macrocode}
+%
% \begin{macro}{\pushtabs}
% \begin{macrocode}
-\gdef\pushtabs{%
+\DeclareRobustCommand\pushtabs{%
\@stopfield\@addfield\global\advance\@tabpush \@ne \begingroup
\@contfield}
% \end{macrocode}
@@ -621,7 +625,7 @@
% a local variable). That this is allowed is a fundamental design
% flaw which is not going to be corrected now.
% \begin{macrocode}
-\gdef\poptabs{\@stopfield\@addfield
+\DeclareRobustCommand\poptabs{\@stopfield\@addfield
\ifnum \@tabpush >\z@
\endgroup
\global\advance\@tabpush \m@ne
@@ -636,7 +640,25 @@
% \end{macrocode}
% \end{macro}
%
+% \begin{macrocode}
+\DeclareRobustCommand\kill{\@stopfield\@startline\ignorespaces}
+% \end{macrocode}
+% \end{macro}
%
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\pushtabs}{Make commands robust}%
+%<latexrelease>
+%<latexrelease>\kernel@make@fragile\pushtabs
+%<latexrelease>\kernel@make@fragile\poptabs
+%<latexrelease>\kernel@make@fragile\kill
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
% \begin{macro}{\tabbingsep}
% \begin{macrocode}
\newdimen\tabbingsep
@@ -785,7 +807,7 @@
%
% \begin{macro}{\extracolsep}
% \begin{macrocode}
-\def\extracolsep#1{\tabskip #1\relax}
+\DeclareRobustCommand\extracolsep[1]{\tabskip #1\relax}
% \end{macrocode}
% \end{macro}
%
diff --git a/macros/latex-dev/base/ltthm.dtx b/macros/latex-dev/base/ltthm.dtx
index 78e8a2e586..ee1b51ac5d 100644
--- a/macros/latex-dev/base/ltthm.dtx
+++ b/macros/latex-dev/base/ltthm.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltvers.dtx b/macros/latex-dev/base/ltvers.dtx
index f8da6086ac..4a5cc5283b 100644
--- a/macros/latex-dev/base/ltvers.dtx
+++ b/macros/latex-dev/base/ltvers.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -115,8 +115,19 @@
{2019-10-01}
%</2ekernel|latexrelease>
%<*2ekernel>
-\def\patch@level{-2}
+\def\patch@level{-3}
% \end{macrocode}
+%
+% \begin{macro}{\development@branch@name}
+% For more fine grain control there is the possibility to name the
+% current development branch. This is only used when the
+% \cs{patch@level} is negative (i.e., a pre-release format) and is
+% intended to help help us internally when we locally install a
+% format out of some development branch.
+% \begin{macrocode}
+\edef\development@branch@name{development \the\year-\the\month-\the\day}
+% \end{macrocode}
+% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
@@ -179,9 +190,21 @@
\write16{\fmtname \space<\fmtversion> patch level \patch@level}
\else
\everyjob\expandafter{\the\everyjob
- \typeout{\fmtname \space<\fmtversion> pre-release\patch@level}}
+ \typeout{\fmtname \space<\fmtversion> pre-release\patch@level
+ \ifx\development@branch@name\@undefined \else
+ \ifx\development@branch@name\@empty \else
+ \space (\development@branch@name\space branch)%
+ \fi
+ \fi
+ }}
\immediate
- \write16{\fmtname \space<\fmtversion> pre-release\patch@level}
+ \write16{\fmtname \space<\fmtversion> pre-release\patch@level
+ \ifx\development@branch@name\@undefined \else
+ \ifx\development@branch@name\@empty \else
+ \space (\development@branch@name\space branch)%
+ \fi
+ \fi
+ }
\fi
\fi
%</2ekernel>
@@ -207,7 +230,8 @@
% \begin{macrocode}
\def\IncludeInRelease#1{%
\if@includeinrelease
- \PackageError{latexrelease}{mis-matched IncludeInRelease}{}%
+ \PackageError{latexrelease}{mis-matched IncludeInRelease}%
+ {There is an \string\EndIncludeRelease\space missing}%
\@includeinreleasefalse
\fi
\kernel@ifnextchar[%
@@ -260,7 +284,7 @@
\long\def\@check@IncludeInRelease#1\IncludeInRelease
#2#3\@end@check@IncludeInRelease{%
\ifx\@check@IncludeInRelease#2\else
- \PackageError{latexrelease}{skipped IncludeInRelease}{}%
+ \PackageError{latexrelease}{skipped IncludeInRelease for tag \string#2}{}%
\fi}
% \end{macrocode}
%
diff --git a/macros/latex-dev/base/ltx3info.pdf b/macros/latex-dev/base/ltx3info.pdf
new file mode 100644
index 0000000000..f8c240b27d
--- /dev/null
+++ b/macros/latex-dev/base/ltx3info.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltx3info.tex b/macros/latex-dev/base/ltx3info.tex
new file mode 100644
index 0000000000..d3a7542cfd
--- /dev/null
+++ b/macros/latex-dev/base/ltx3info.tex
@@ -0,0 +1,474 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+\documentclass[a4paper]{article}
+
+% Commands and environments:
+
+\newcommand{\eg}{e.g.~}
+\newcommand{\ie}{i.e.~}
+
+
+\newenvironment{citations}{%
+ \list{}{%
+ \renewcommand{\makelabel}[1]{\normalfont\itshape ##1}%
+ }%
+}{%
+ \endlist
+}
+
+% Some logos:
+
+\newcommand{\NFSS}{NFSS}
+
+\newcommand{\LaTeXNews}{\LaTeX~News}
+
+\newcommand{\AW}{Addison Wesley}
+
+\newcommand{\SGML}{{\sc SGML}}
+\newcommand{\DSSSL}{{\sc DSSSL}}
+\newcommand{\HTML}{{\sc HTML}}
+\newcommand{\XML}{{\sc XML}}
+\newcommand{\PDF}{{\sc PDF}}
+
+\newcommand{\PS}{{\sc Post\-Script}}
+
+\newcommand{\AmSTeX}{$\mathcal A$\lower.4ex\hbox{$\!\mathcal
+ M\!$}$\mathcal S$-\TeX}
+\newcommand{\AmSLaTeX}{$\mathcal A$\lower.4ex\hbox{$\!\mathcal
+ M\!$}$\mathcal S$-\LaTeX}
+\newcommand{\MF}{{\sc Meta\-font}}
+
+% sections
+
+\setcounter{secnumdepth}{-2}
+
+% Front matter:
+
+\title{\Large The \LaTeX3 Project}
+
+\author{\copyright 1995--1999 \
+Frank Mittelbach and
+Chris Rowley}
+
+\date{12 January 1999}
+
+\begin{document}
+
+\thispagestyle{empty}
+
+\maketitle
+
+\begin{abstract}
+ This article describes the motivation, achievements and future of
+ the \LaTeX3 Project, which was established to produce a new version
+ of \LaTeX{}, the widely-used and highly-acclaimed document
+ preparation system. It also describes how you can help us to
+ achieve our aims.\\[2pt]
+ \textbf{For Archive maintainers, Authors, Publishers and
+ Distributors:}\\
+ The project team request that, whenever possible, you include this
+ article in any of the following:
+ \begin{itemize}
+ \item Books about \TeX{} and \LaTeX{}.
+ \item Instructions for authors on using \LaTeX{}.
+ \item The printed documentation of CD-ROM collections that contain
+ \LaTeX.
+ \item On-line collections that include a significant proportion of
+ documents encoded in \LaTeX.
+\end{itemize}
+\end{abstract}
+
+\section{Outline}
+
+The purposes of the \LaTeX3 system can be summarized thus: it will
+greatly increase the range of documents which can be processed; and it
+will provide a flexible interface for typographic designers to easily
+specify the formatting of a class of documents.
+
+The \LaTeX3 Project Team is a small group of volunteers whose aim is
+to produce this major new document processing system based on the
+principles pioneered by Leslie Lamport in the current \LaTeX.
+
+The major visible work of the team before 1997 was the development of
+the current \emph{standard} version of \LaTeX{}. This was first
+released in 1994 and has since then been actively maintained and
+enhanced by extensions to that core system. They will continue to
+develop and maintain this system, releasing updated versions every six
+months and recording these activities in the \LaTeX{} bugs database
+(see below).
+
+Although \LaTeX{} may be distributed freely, the production and
+maintenance of the system does require expenditure of reasonably large
+sums of money. The \LaTeX3 Project Fund has therefore been set up to
+channel money into this work. We know that some users are
+aware of this fund as they have already contributed to it---many
+thanks to all of them! If you want to know more about how you can
+help the project, see Page \pageref{fund}---and thanks in advance for
+your generosity in the future.
+
+
+\section{Background}
+
+With \TeX{}, Knuth designed a formatting system that is able to
+produce a large range of documents typeset to extremely high quality
+standards. For various reasons (\eg quality, portability, stability
+and availability) \TeX{} spread very rapidly and can nowadays be best
+described as a world-wide de facto standard for high quality
+typesetting. Its use is particularly common in specialized areas, such
+as technical documents of various kinds, and for multi-lingual
+requirements.
+
+The \TeX{} system is fully programmable. This allows the development
+of high-level user interfaces whose input is processed by \TeX{}'s
+interpreter to produce low-level typesetting instructions; these are
+input to \TeX{}'s typesetting engine which outputs the format of each
+page in a device-independent page-description language. The \LaTeX{}
+system is such an interface; it was designed to support the needs of
+long documents such as textbooks and manuals. It separates content and
+form as much as possible by providing the user with a generic (\ie
+logical rather than visual) mark-up interface; this is combined with
+style sheets which specify the formatting.
+
+Recent years have shown that the concepts and approach of \LaTeX{} are
+now widely accepted. Indeed, \LaTeX{} has become the standard method
+of communicating and publishing documents in many academic
+disciplines. This has led to many publishers accepting \LaTeX{}
+source for articles and books; and the American Mathematical Society
+now provides a \LaTeX{} package making the features of \AmSTeX{}
+available to all users of \LaTeX{}. Its use has also spread into many
+other commercial and industrial environments, where the technical
+qualities of \TeX{} together with the concepts of \LaTeX{} are
+considered a powerful combination of great importance to such areas as
+corporate documentation and publishing. This has also extended to
+on-line publishing using, for example, \PDF{} output incorporating
+hypertext and other active areas.
+
+With the spreading use of \SGML{}-compliant systems (\eg Web-based
+publishing using \HTML{} or \XML{}) \TeX{} again is a common choice as
+the formatting engine for high quality typeset output: a widely used
+such system is {\em The Publisher\/} from ArborText, whilst a more
+recent development is the object-oriented document editor Grif. The
+latter is used for document processing in a wide range of industrial
+applications; it has also been adopted by the Euromath consortium as
+the basis of their mathematician's workbench, one of the most advanced
+of the emerging project-oriented user environments. Typeset output
+from \SGML{}-coded documents in these systems is obtained by
+translation into \LaTeX{}, which will therefore soon also be a natural
+choice for the output of \DSSSL-compliant systems.
+
+Because a typical \SGML{} Document Type Definition (DTD) uses concepts
+similar to those of \LaTeX{}, the formatting is often implemented by
+simply mapping document elements to \LaTeX{} constructs rather than
+directly to `raw \TeX'.
+This enables the
+sophisticated analytical techniques built into the \LaTeX{}
+software to be exploited; and it avoids the need to program in \TeX{}.
+
+\section{Motivation}
+
+This increase in the range of applications of \LaTeX{} has highlighted
+certain limitations of the current system, both for authors of
+documents and for designers of formatting styles.
+
+In addition to the need to extend the variety of classes of document
+which can be processed by \LaTeX{}, substantial enhancements are
+necessary in, at least, the following areas:
+ \begin{itemize}
+ \item
+ the command syntax (attributes, short references, etc);
+ \item
+ the layout specification interface (style design);
+ \item
+ the level of robustness (error recovery, omitted tags);
+ \item
+ the extendibility (package interface);
+ \item
+ the layout specification of tabular material;
+ \item
+ the specification and inclusion of graphical material;
+ \item
+ the positioning of floating material, and other aspects of page
+ layout;
+ \item
+ the requirements of hypertext systems.
+ \end{itemize}
+
+ Further analysis of these deficiencies has shown that some of the
+ problems are to be found in \LaTeX{}'s internal concepts and design.
+ This project to produce a new version therefore involves thorough
+ research into the challenges posed by new applications and by the use
+ of \LaTeX{} as a formatter for a wide range of documents, \eg \SGML{}
+ documents; on-line \PDF{} documents with hypertext links.
+
+ This will result in a major re-implementation of large parts of the
+ system. Some of the results of such rethinking of the fundamentals
+ are already available in Standard \LaTeX{}, notably in the following
+ areas:
+
+\begin{itemize}
+\item Font declaration and selection;
+\item Font and glyph handling within mathematical formulas;
+\item Handling multiple font glyph encodings within a document;
+\item Allowing multiple input character encodings within a document;
+\item A uniform interface for graphics inclusion;
+\item Support for coloured text;
+\item Building and interfacing new classes and extension packages.
+\end{itemize}
+
+
+\section{Description}
+
+The strengths of the present version of \LaTeX{} are
+as follows:
+ \begin{itemize}
+ \item excellent standard of typesetting for text, technical
+formulas\\
+and tabular material;
+ \item separation of generic mark-up from visual formatting;
+ \item ease of use for authors;
+ \item portability of documents over a wide range of platforms;
+ \item adaptability to many languages;
+ \item widespread and free availability;
+ \item reliable support and maintenance by the \LaTeX3 project team.
+ \end{itemize}
+ These will be preserved and in many cases greatly enhanced by the new
+ version which is being developed to fulfill the following requirements.
+ \begin{itemize}
+ \item
+ It will provide a syntax that allows highly automated translation
+ from popular \SGML{} DTDs into \LaTeX{} document classes (these
+ will be provided as standard with the new version).
+
+ The syntax of the new \LaTeX{} user-interface will, for example,
+ support the \SGML{} concepts of `entity', `attribute' and `short
+ reference' in such a way that these can be directly linked to the
+ corresponding \SGML{} features.
+
+ \item
+ It will support hypertext links and other features required for
+ on-line structured documents using, for example, \HTML{} and \XML{}.
+
+\item
+ It will provide a straightforward style-designer interface to support
+ both the specification of a wide variety of typographic requirements
+ and the linking of entities in the generic mark-up of a document to
+ the desired formatting. These two parts of the design process will
+ be clearly separated so that it is possible to specify different
+ layouts for the same DTD.
+
+ The language and syntax of this interface will be as natural as
+ possible for a typographic designer. As a result, this language
+ could easily be interfaced to a visually-oriented, menu-driven
+ specification system.
+
+ This interface will also support \DSSSL{} specifications and
+ style-sheet concepts such as those used with \HTML{} and \XML{}.
+
+ \item
+ It will provide an enhanced user-interface that allows expression of
+ the typesetting requirements from a large range of subject areas. Some
+ examples are listed here.
+
+ \begin{itemize}
+ \item The requirements of technical documentation (\eg offset layout,\\
+ change bars, etc).
+ \item The requirements of academic publishing in the humanities\\
+ (critical text editions, etc).
+ \item The requirements of structural formulas in chemistry.
+ \item Advanced use of the mathematical-typesetting features of \TeX{}.
+ \item The integration of graphical features, such as shading,
+ within text.
+ \item the integration of hypertext and other links in on-line
+ documents using systems such as \HTML{}, \XML{} and \PDF{}.
+
+ \end{itemize}
+
+ Special care will be taken to ensure that this interface is
+ extensible: this will be achieved by use of modular designs.
+
+
+ \item
+ It will provide a more robust author-interface. For example,
+ artificial restrictions on the nesting of commands will be removed.
+ Error handling will be improved by adding
+ a more effective, interactive help system.
+
+ \item
+ It will provide access to arbitrary fonts from any family (such as
+ the \PS{} and TrueType fonts) including a wide range of fonts for
+ multi-lingual documents and the specialist glyphs required by
+ documents in various technical and academic areas.
+
+ \item
+ The new interfaces will be documented in detail and the
+ system will provide extensive catalogues of examples, carefully
+ designed to make the learning time for new users (both designers and
+ authors) as short as possible.
+
+ \item
+ The code itself will be thoroughly documented and it will be
+ designed on modular principles. Thus the system will be easy to
+ maintain and to enhance.
+\end{itemize}
+
+The resulting new \LaTeX{} will, like the present version, be usable
+with any standard \TeX{} system (or whatever replaces it) and so will
+be freely available on a wide range of platforms.
+
+
+\section{\LaTeX{} documentation}
+
+\begingroup
+\setlength{\parindent}{0pt}
+
+A complete description of Standard \LaTeX{} can be found in:
+\begin{citations}
+\item[\LaTeX: A Document Preparation System]
+ Leslie Lamport,\\ \AW, 2nd ed, 1994.
+\item[The \LaTeX{} Companion]
+ Mittelbach, Goossens with Braams, Carlisle and Rowley,\\ \AW, 2nd ed, 2004.
+\end{citations}
+
+A recent addition to the publications closely associated with the
+project is:
+\begin{citations}
+\item[The \LaTeX{} Graphics Companion]
+ Goossens, Mittelbach and Rahtz,\\ \AW, 1997.
+\end{citations}
+
+This \LaTeX{} distribution comes with documentation on several aspects
+of of the system. The newer features of the system are described in
+the following documents:
+\begin{citations}
+\item[\LaTeXe{} for authors]
+ describes the new features of \LaTeX{} documents,
+ in the file \texttt{usrguide.tex};
+\item[\LaTeXe{} for class and package writers]
+ describes how to produce \LaTeX{} classes and packages,
+ in the file \texttt{clsguide.tex};
+\item[\LaTeXe{} font selection]
+ describes the new features of \LaTeX{} fonts for
+ class and package writers,
+ in the file \texttt{fntguide.tex}.
+\end{citations}
+
+For further contacts and sources of information on \TeX{} and
+\LaTeX{}, see the addresses on Page~\pageref{contacts}.
+
+\endgroup
+\pagebreak
+
+
+\section{The \LaTeX3 Project Fund}
+\label{fund}
+
+Although \LaTeX{} may be distributed freely, the production and
+maintenance of the system does require expenditure of reasonably large
+sums of money. There are many necessities that need substantial
+financing: examples are new or enhanced computing equipment and travel
+to team meetings (the volunteers come from many different countries,
+so getting together occasionally is a non-trivial exercise).
+
+This is why we are appealing to you for contributions to the fund.
+Any sum will be much appreciated; the amount need not be large as
+small contributions add up to very useful amounts. Contributions of
+suitable equipment and software will also be of great value. This
+appeal is both to you as an individual author and to you as a member
+of a group or as an employee: please encourage your department or your
+employer to contribute towards sustaining our work.
+
+We should like to see funded projects that make considerable use of
+\LaTeX{} (\eg conferences and research teams who use it to publish
+their work, and electronic research archives using it) include
+contributions to this fund in their budgets. %% e-print systems
+
+We are also asking commercial organisations to assess the benefits
+they gain from using, or distributing, a well-supported \LaTeX{} and
+to make appropriate contributions to the fund in order that we can
+continue to maintain and improve the product. If you work for, or do
+business with, such an organisation, please bring to the attention of
+the relevant people the existence and needs of the project.
+
+In particular, we ask that all the large number of organisations and
+businesses that distribute \LaTeX{}, within other software or as part
+of a CD-ROM collection, should consider pricing all products containing
+\LaTeX{} at a level that enables them to make regular donations to the
+fund from the profit on these items. We also ask all authors and
+publishers of books about \LaTeX{} to consider donating part of the
+royalties to the fund.
+
+Contributions should be sent to one of the following addresses:
+\begin{quote}\small\label{addrs}
+ \TeX{} Users Group, P.O. Box 2311, Portland, OR~97208-2311 USA\\
+ Fax:~+1~503~223~3960 \ Email: \texttt{tug@tug.org}
+
+ \noindent
+ UK TUG, 1 Eymore Close, Selly Oak, Birmingham B29~4LB UK\\
+ Fax: +44 121 476 2159 \ Email: \texttt{uktug-enquiries@tex.ac.uk}
+\end{quote}
+
+Cheques should be payable to the user group (TUG or UKTUG) and be
+clearly marked as contributions to the \LaTeX3 fund.
+Many thanks to all of you who have contributed in the past and thanks
+in advance for your generosity in the future.
+
+\section{Contacts and information}
+\label{contacts}
+
+In addition to the sources mentioned above, \LaTeX{} has its home page
+on the World Wide Web at:
+\begin{verbatim}
+ http://www.latex-project.org/
+\end{verbatim}
+This page describes \LaTeX{} and the \LaTeX3 project, and contains
+pointers to other \LaTeX{} resources, such as the user guides, the
+\TeX{} Frequently Asked Questions, and the \LaTeX{} bugs database.
+
+More general information, including contacts for local User Groups,
+can be accessed via:
+\begin{verbatim}
+ http://www.tug.org/
+\end{verbatim}
+
+The electronic home of anything \TeX-related is the Comprehensive
+\TeX{} Archive Network (CTAN). This is a network of cooperating ftp
+sites, with over a gigabyte of \TeX{} material:
+\begin{verbatim}
+ ftp://cam.ctan.org/tex-archive/
+ ftp://dante.ctan.org/tex-archive/
+ ftp://tug.ctan.org/tex-archive/
+\end{verbatim}
+
+For more information, see the \LaTeX{} home page.
+
+
+\end{document}
+
+
+
diff --git a/macros/latex-dev/base/ltxcheck.tex b/macros/latex-dev/base/ltxcheck.tex
index d5426aafa1..7446c06cea 100644
--- a/macros/latex-dev/base/ltxcheck.tex
+++ b/macros/latex-dev/base/ltxcheck.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltxdoc.dtx b/macros/latex-dev/base/ltxdoc.dtx
index 329353d123..21cc2d3dcf 100644
--- a/macros/latex-dev/base/ltxdoc.dtx
+++ b/macros/latex-dev/base/ltxdoc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2018
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltxdoc.pdf b/macros/latex-dev/base/ltxdoc.pdf
index caff39f754..f8367ce7bd 100644
--- a/macros/latex-dev/base/ltxdoc.pdf
+++ b/macros/latex-dev/base/ltxdoc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/ltxguide.cls b/macros/latex-dev/base/ltxguide.cls
index 7b1d05ec20..8ef06b95aa 100644
--- a/macros/latex-dev/base/ltxguide.cls
+++ b/macros/latex-dev/base/ltxguide.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+% Copyright 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/ltxref.dtx b/macros/latex-dev/base/ltxref.dtx
index a5c11bf21b..1d8c41c439 100644
--- a/macros/latex-dev/base/ltxref.dtx
+++ b/macros/latex-dev/base/ltxref.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -33,7 +33,7 @@
%<*driver>
% \fi
\ProvidesFile{ltxref.dtx}
- [2014/09/29 v1.1k LaTeX Kernel (Cross Referencing)]
+ [2019/08/22 v1.1l LaTeX Kernel (Cross Referencing)]
% \iffalse
\documentclass{ltxdoc}
\GetFileInfo{ltxref.dtx}
@@ -126,6 +126,50 @@
%
% \end{oldcomments}
%
+% \DescribeMacro\labelformat
+% A reference via |\ref| produces by default the data associated with
+% the corresponding |\label| command (typically a number); any
+% additional formatting has to be provided by the user. If, for
+% example, references to equations are always to be typeset as
+% ``equation (\textit{number})'', one has to code
+% ``\verb=equation (\ref{=\textit{key}\verb=})=''. With |\labelformat|
+% there is a possibility to generate such
+% frills automatically without resorting to low-level coding.
+% The command takes two arguments: the first is
+% the name of a counter and the second is its representation when
+% referenced. This means that for a successful usage, one has to know
+% the counter name being used for generating the label, though in
+% practice this should not pose a problem. The current counter number
+% is picked up as an argument.
+% Here are two examples:
+%\begin{verbatim}
+% \labelformat{section}{section~#1}
+% \labelformat{equation}{equation~(#1)}}
+%\end{verbatim}
+%
+% \DescribeMacro\Ref
+% A side effect of using |\labelformat| is that, depending on the
+% defined formatting, it becomes impossible to use |\ref| at the
+% beginning of a sentence (if its replacement text starts with a
+% lowercase letter). To overcome this problem we
+% introduce the command |\Ref| that behave like
+% |\ref| except that it uppercases the first token
+% of the generated string.
+%
+
+% To make |\Ref| work properly the very first token in the second
+% argument of |\labelformat| has to be a simple \textsc{ascii} or
+% UTF-8 letter, otherwise the capitalization will fail or worse, you
+% will end up with some error messages. If you actually need something
+% more complicated in this place (e.g., an accented letter not written
+% as a UTF-8 character) you have to explicitly surround it with
+% braces, to identify the part that needs to be capitalized. For
+% example, for figure references in the Hungarian language you might
+% want to write |\labelformat{figure}{{\'a}bra~\thefigure}| or use
+% |\labelformat{figure}{ábra~\thefigure}| which avoids the brace
+% problem.
+%
+%
% \begin{macro}{\G@refundefinedtrue}
% \changes{v1.1i}{1995/12/07}{Renamed (back) from \cs{G@refundefined}}
% \begin{macro}{\@refundefined}
@@ -247,7 +291,6 @@
%
% \begin{macro}{\label}
% \changes{v1.1d}{1994/11/04}{(ASAJ)Added \cs{protected@write}}
-% \begin{macro}{\refstepcounter}
% \changes{v1.1d}{1994/11/04}{(ASAJ)Added \cs{protected@edef}}
% The commands |\label| and |\refstepcounter| have been changed to
% allow |\protect|'ed commands to work properly. For example,
@@ -263,79 +306,111 @@
{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
\@esphack}
% \end{macrocode}
+% \end{macro}
%
% \begin{macrocode}
+%</2ekernel>
+%<*2ekernel|latexrelease>
+%<latexrelease>\IncludeInRelease{2019/10/01}%
+%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
+% \end{macrocode}
+%
+% \begin{macro}{\refstepcounter}
+% Step the counter and allow for labels to point to its current value.
+% \begin{macrocode}
\def\refstepcounter#1{\stepcounter{#1}%
\protected@edef\@currentlabel
- {\csname p@#1\endcsname\csname the#1\endcsname}%
+% \end{macrocode}
+% By generating the second csname first the |\p@...| command can
+% grab it as an argument which can be helpful for more complicated
+% typesetting arrangements.
+%
+% The trick is to ensure that |\csname the#1\endcsname| is turned
+% into a single token before |\p@...| is expanded further. This
+% way, if the |\p@...| command is a macro with one argument it will
+% receive |\the...|. With the original kernel code (i.e., without the
+% |\expandafter|) it will instead pick up |\csname| which would be
+% disastrous.
+%
+% Using |\expandafter| instead of braces delimiting the argument is
+% better because, assuming that the |\p@...| command is not defined
+% as a macro with one argument, the braces will stay and prohibit
+% kerning that might otherwise happen between the glyphs generated
+% by |\the...| and surrounding glyphs.
+%
+% \changes{v1.1l}{2019/08/22}{Allow \cs{p@...} to have an
+% argument}
+% \begin{macrocode}
+ {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
}
% \end{macrocode}
% \end{macro}
-% \end{macro}
-%
-%
-% \begin{macro}{\@currentlabel}
-% For |\label| commands that come before any environment
%
+% \begin{macro}{\labelformat}
+% A shortcut to set the |\p@...| macro for a counter. It will pick
+% up the counter representation as an argument so that it can be
+% specially formatted.
+% \changes{v1.1l}{2019/08/22}{Commanded moved from \texttt{varioref.sty}}
% \begin{macrocode}
-\def\@currentlabel{}
+\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
% \end{macrocode}
% \end{macro}
%
+% \begin{macro}{\Ref}
+% This macro expands the result of |\ref| and then uppercases the
+% first token. Only useful if the label was generated via
+% |\labelformat| and contains some lower case letter at its start. If
+% the label starts with a complicated construct (e.g., an accented
+% letter that is provided via a command, e.g., \verb=\"a= instead
+% of a UTF-8 character like ä) one has to surround everything that
+% needs uppercasing in
+% a brace group in the definition of |\labelformat|.\footnote{There
+% is one problem with this approach: the braces are kept in a
+% normal \texttt{\textbackslash ref} which might spoil kerning.
+% Perhaps one day this needs redoing.}
+% \changes{v1.1l}{2019/08/22}{Commanded moved from \texttt{varioref.sty}}
% \begin{macrocode}
-%</2ekernel>
+\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
+ \expandafter\MakeUppercase\@tempa}
% \end{macrocode}
+% \end{macro}
%
-% \subsection{An extension of counter referencing}
%
%
-% At the moment a reference to a counter |foo| will generate the
-% equivalent of |\p@foo\thefoo| although not quite in this form. For
-% some applications it would be nice of one could have |\thefoo| being
-% an argument to |\p@foo| to be able to put material before and after
-% the number generated by |\thefoo|. This can be easily achieved with
-% a small change to one of the kernel commands as follows:
+% \begin{macrocode}
+%</2ekernel|latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<latexrelease>\IncludeInRelease{0000/00/00}%
+%<latexrelease> {\refstepcounter}{Add \labelformat and \Ref}%
+%<latexrelease>
+%<latexrelease>\def\refstepcounter#1{\stepcounter{#1}%
+%<latexrelease> \protected@edef\@currentlabel
+%<latexrelease> {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
+%<latexrelease>}
+%<latexrelease>\let\labelformat\@undefined
+%<latexrelease>\let\Ref\@undefined
+%<latexrelease>
+%<latexrelease>\EndIncludeInRelease
+%<*2ekernel>
+% \end{macrocode}
+%
+%
+%
+%
+%
%
-%\begin{verbatim}
-%\def\refstepcounter#1{\stepcounter{#1}%
-% \protected@edef\@currentlabel
-% {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
-%}
-%\end{verbatim}
%
-% The trick is to ensure that |\csname the#1\endcsname| is turned into
-% a single token before |\p@...| is expanded further. This way, if the
-% |\p@...| command is a macro with one argument it will receive
-% |\the...|. With the kernel code (i.e., without the |\expandafter|)
-% it will instead pick up |\csname| which would be disastrous.
-%
-% Using |\expandafter| instead of braces delimiting the argument is
-% better because, assuming that the |\p@...| command is not defined as
-% a macro with one argument, the braces will stay and prohibit kerning
-% that might otherwise happen between the glyphs generated by
-% |\the...| and surrounding glyphs.
-%
-% We have refrained from making this change in the kernel code
-% although for existing documents it would be 100\% backward
-% compatible. The reason being that any class or package making use of
-% this functionality would then horribly fail with older \LaTeX{}
-% installations.
-%
-% Instead we suggest that people who are interested in using this
-% functionality in a document class or package add the redefinition to
-% the class file. To ensure that this redefinition is properly applied
-% they might want to test for the original definition first, e.g.
+% \begin{macro}{\@currentlabel}
+% Default for |\label| commands that come before any environment.
+% \begin{macrocode}
+\def\@currentlabel{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</2ekernel>
+% \end{macrocode}
%
-%\begin{verbatim}
-%\CheckCommand*\refstepcounter[1]{\stepcounter{#1}%
-% \protected@edef\@currentlabel
-% {\csname p@#1\endcsname\csname the#1\endcsname}%
-%}
-%\renewcommand*\refstepcounter[1]{\stepcounter{#1}%
-% \protected@edef\@currentlabel
-% {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
-%}
-%\end{verbatim}
%
% \Finale
%
diff --git a/macros/latex-dev/base/makeindx.dtx b/macros/latex-dev/base/makeindx.dtx
index 280416f65b..aa998bf3ca 100644
--- a/macros/latex-dev/base/makeindx.dtx
+++ b/macros/latex-dev/base/makeindx.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/makeindx.ins b/macros/latex-dev/base/makeindx.ins
index d7ad42e2f9..b31b967c41 100644
--- a/macros/latex-dev/base/makeindx.ins
+++ b/macros/latex-dev/base/makeindx.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/makeindx.pdf b/macros/latex-dev/base/makeindx.pdf
index 2b9c8061ec..e014fa354c 100644
--- a/macros/latex-dev/base/makeindx.pdf
+++ b/macros/latex-dev/base/makeindx.pdf
Binary files differ
diff --git a/macros/latex-dev/base/manual.err b/macros/latex-dev/base/manual.err
deleted file mode 100644
index e78b18de9f..0000000000
--- a/macros/latex-dev/base/manual.err
+++ /dev/null
@@ -1,365 +0,0 @@
-\documentclass{article}
-
-\newcommand{\reportedby}[2]{{\small [First reported by #1 on \mbox{#2}.]}}
-\newcommand{\erratum}[1]{\subsubsection*{#1}}
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% MODIFICATION DATE %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-% Defines \moddate to expand to modification date such as %
-% %
-% 5 Aug 1991 %
-% %
-% and \prdate to print it in a large box. Assumes editor %
-% updates modification date in standard SRC Gnu Emacs style. %
-% (should work for any user name). %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\def\ypmd{% %
-% %
-% %
- Last modified on Sat 13 October 2018 at 12:56:41 PST by lamport %
- endypmd} %
-% %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-\newcommand{\moddate}{\expandafter\xpmd\ypmd} %
-\def\xpmd Last modified %
-on #1 #2 #3 #4 at #5:#6:#7 #8 by #9 endypmd{#2 #3 #4} %
-\newcommand{\prdate}{\noindent\fbox{\Large\moddate}} %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\newcommand{\mytt}{\normalfont\ttfamily}
-\newcommand{\cindex}{\index}
-\newcommand\bs{\char '134 } % A backslash character for \tt font
-
-\title{Errata to the Second Edition of the \LaTeX\ Manual}
-\author{Leslie Lamport}
-\date{\moddate}
-
-\begin{document}
-\maketitle
-
-\noindent These are all the errors and omissions to the manual,
-\LaTeX: {\em A Document Preparation System}, second edition, published
-by Addison-Wesley, reported as of \moddate. Positions in the book are
-indicated by page and line number, where the top line of a page is
-number 1 and the bottom line is number $-1$. A running head and a
-page number are not considered to be lines, but all other lines are.
-Please report any additional errors to The \LaTeX\ Project at
-\texttt{www.latex-project.org/bugs/}\,.
-
-
-\subsection*{Errors Corrected in the First Printing}
-
-\erratum{page 25, example of \texttt{verse} environment}
-Replace \verb|{\em all\/}| by \verb|\emph{all}|.
- \reportedby{Rosemary Bailey}{29 Aug 1994}
-
-\erratum{page 28, first paragraph}
-Not an error, but it would be
-helpful to add the following sentence to the end of that paragraph:
- ``(If a declaration has arguments, they become additional
-arguments of the corresponding environment's \verb|\begin| command.)''
-
-
-\erratum{page 33, line 10}
-Add \verb|\]| to the list of fragile commands.
- \reportedby{Rosemary Bailey}{29 Aug 1994}
-
-\erratum{page 43, table 3.5}
-Add an entry for \verb|\notin| ($\notin$).
- \reportedby{Rosemary Bailey}{29 Aug 1994}
-
-\erratum{page 72, two examples}
-Change \verb|{\em ...}| to \verb|\emph{...}|
- \reportedby{Rosemary Bailey}{29 Aug 1994}
-
-\erratum{page 101}
-This is not an error, but some readers will find it helpful if, in the
-descriptions of \verb|\setlength| and \verb|\addtolength|,
-\verb|\gnat| were replaced by \verb|\parskip|.
- \reportedby{Ellen Gilkerson}{9 Aug 1994}
-
-\erratum{page 108, lines 7 and 10}
-This is not an error, but it might be easier to understand
-the example if \verb|\len| were replaced by something like \verb|\saved|.
- \reportedby{Rosemary Bailey}{29 Aug 1994}
-
-\erratum{page 139, lines $-8$ and $-9$}
-
-The funny break between these two lines should be eliminated.
-\reportedby{Malcolm Clark}{9 Aug 1994}
-
-\erratum{page 177, line $-12$}
-
-The \verb|twocolumn| option cannot be used with the \verb|letters|
-class.
-
-\erratum{page 197, lines 7 and 9}
-
-The \verb|figure*| environment is ended by \verb|\end{figure*}|, and
-the \verb|table*| environment is ended by \verb|\end{table*}|.
-\reportedby{Malcolm Clark}{9 Aug 1994}
-
-\erratum{page 228}
-
-Add a note that, before running a LaTeX2.09 file in compatibility mode
-in LaTeX2e, you should delete the old versions of the auxiliary files.
-
-\subsection*{Errors Corrected in the Second Printing}
-
-\erratum{page xv, line 10}
-``Chris Rowley'' should come after ``Sebastian Rahtz''.
-\reportedby{Martin Schr\"{o}der}{24 April 1995}
-
-
-
-\erratum{page 29, line $-10$}
-Change ``error indicator line'' to ``error locator line''.
-\reportedby{Xavier Perramon}{2 Jan 1995}
-
-\erratum{page 37, lines 26--28}
-Change the two sentences ``None of these \ldots formula.'' to:
-\begin{quote}
-These text-producing commands can be used in math mode to put ordinary
-text in a formula. (When the command is used in math mode, its
-argument is processed in LR mode.) The declarations cannot be used in
-math mode. Section 3.3.8 explains how to change the type style of a
-formula's math-mode symbols.
-\end{quote}
-\reportedby{Mike Piff}{7 Mar 1995}
-
-\erratum{page 39, line 6}
-Replace ``any mode'' with ``paragraph and LR mode''. Also,
-after line 8, add:
-\begin{quote}
-The commands \verb|\dag|, \verb|\ddag|, \verb|\S|, and \verb|\P|
-can also be used in math mode.
-\end{quote}
-
-\erratum{page 53, line 24}
-Change ``are needed in the'' to ``are used in the''
-\reportedby{Mike Piff}{21 Oct 1994}
-
-\erratum{page 80, line 1}
-The section heading should not be outdented.
-\reportedby{Martin Schr\"{o}der}{23 Jan 1995}
-
-\erratum{page 83, line $-8$}
-Change ``\verb|\resettime|'' to ``\verb|\settime|''.
-
-\erratum{page 84, after line $11$} Add the following sentence: ``The
-\hbox{\verb|\onlyslides|} and \hbox{\verb|\onlynotes|} commands may
-not work right if a \texttt{slide}, \texttt{overlay}, or \texttt{note}
-environment appears in the argument of any command.''
-\reportedby{Eike Ritter}{May 1996}
-
-\erratum{page 153, line 1}
-Add ``or subentry'' after ``entry''.
-\reportedby{Martin Schr\"{o}der}{22 Feb 1995}
-
-\erratum{page 171}
-Add the following before line $-4$:
-\begin{description}
-\item[\mytt \bs columnwidth]
-Normal width
- \cindex{columnwidth}%
-of a column;
-% \index{column!width}%
- \index{width!of column}%
-equals \verb|\textwidth| except for multiple-column styles.
-Its value should not be changed with the length-setting commands.
-\end{description}
-Also, in line $-4$, change \verb|\textwidth| to \verb|\columnwidth|.
-%\reportedby{Volker Kuhlmav}{20 Jan 1995}
-\reportedby{Rosemary Bailey}{9 Sep 1994}
-
-\erratum{page 180, lines 15--19}
-%
-Replace these five lines (which begin ``These commands are overridden'')
-with:
-\begin{itemize} \item[]
-To override a heading on a right-hand page (any page for one-sided
-printing), put a \verb|\markright| after the sectioning command and in
-its mandatory argument, and add an optional argument without the
-\verb|markright|, as in
-\begin{itemize}
-\item[]
- \verb|\chapter[Gnu Scents]{Gnu Scents\markright{|\textit{right\_head}\verb|}}|\\
- \verb|\markright{|\textit{right\_head}\verb|}|
-\end{itemize}
-To change the heading on a left-hand page, put a \verb|\markboth|
-command immediately after the sectioning command.
-\end{itemize}
-\reportedby{Jerome Breitenbach}{14 Dec 1995}
-
-\erratum{page 182}
-The dimensions
-\verb|\pageheight| and \verb|\pagewidth|
-should be \verb|\paperheight| and \verb|\paperwidth|,
-respectively. (The index entries on page 260 should also be changed.)
-\reportedby{Alan Jeffrey, on behalf of a user}{12 Sep 1995}
-\erratum{page 192, line 19}
-Change ``\emph{cmd}'' to ``\emph{def}''.
-\reportedby{Martin Schr\"{o}der}{9 Mar 1995}
-
-
-\erratum{page 195, line 14}
-Change ``numbered `within' it'' to ``numbered directly `within' it''.
-\reportedby{Martin Schr\"{o}der}{5 Dec 1994}
-
-\erratum{page 197, line 14}
-After ``\verb|\textwidth|'' add ``or \verb|\columnwidth|''
-\reportedby{Volker Kuhlmann}{22 Jan 1995}
-
-\erratum{page 226}
-
-After line 7, add
-\begin{quote}
-These declarations may not be used in math mode.
-\end{quote}
-Replace lines 16-19 (beginning ``None of these commands'') with
-\begin{quote}
-When these commands are used in math mode, the \emph{text}
-argument is processed in LR mode.
-
-These commands and declarations are robust. Words typeset in
-typewriter style are not hyphenated except where permitted by \verb|\-|
-commands.
-\end{quote}
-\reportedby{Marc Lavine}{22 Aug 1995}
-
-\erratum{page 228}
-To the section ``Type Styles and Sizes'', add the following sentence:
-A few mathematical symbols now require the \texttt{latexsym} package---see
-Tables 3.4--3.7.
-
-\subsection*{Errors Corrected in the Sixteenth Printing}
-
-\erratum{page 42, line 14}
-Change ``through a symbol'' by ``through a relation symbol''.
-\reportedby{Frank Mittelbach}{15 Nov 1996}
-
-\erratum{page 42, Table 3.4}
-\verb|\land| should be listed as a synonym for \verb|\wedge|, and
-\verb|\lor| should be listed as a synonym for \verb|\vee|.
-\reportedby{Chris Rowley}{28 Oct 1998}
-
-\erratum{page 43, Table 3.7}
-\verb|\lnot| should be listed as a synonym for \verb|\neg|.
-\reportedby{Chris Rowley}{15 Oct 1998}
-
-\erratum{page 137} This is not an error, but it would be better to
-change lines 23 and 24 to:
-\begin{quote}
-\LaTeX\
- \index{file!not found error}%
- \index{file!nonexistent}%
-is trying to read a file that apparently doesn't exist. If the missing
-file has the extension \texttt{tex}, then \LaTeX\ is trying to
- \index{input)@\verb+\input+!of nonexistent file}%
- \index{include)@\verb+\include+!of nonexistent file}%
-\verb|\input| or \verb|\include| it; if it
-\end{quote}
-
-\erratum{page 171, line 19}
-Change the description of \verb|\indent| to:
-\begin{description}
-\item[\mytt \bs indent]
-Produces a
-% \cindex{indent}%
-% \index{paragraph!indentation}%
-horizontal space whose width equals the width of the
-paragraph indentation. It can be used to add a paragraph indentation
-where one would otherwise be suppressed. (If it doesn't work,
-try typing \verb|\indent\indent|.) Robust.
-\end{description}
-\reportedby{Chris Rowley}{15 Oct 1998}
-
-\erratum{page 179, line 19}
-%
-Change to:
-\begin{quote}
-page style for the \texttt{article} and \texttt{report} document classes.
-\end{quote}
-\reportedby{Stephen J. Alter}{17 Sep 1997}
-
-\erratum{page 195, line 28}
-Replace ``\textit{num}$_1$ and \textit{num}$_1$ are numbers''
-with ``\textit{num}$_1$ and \textit{num}$_2$ are numbers''.
-\reportedby{Magnus Lewis-Smith}{14 Jan 1999}
-
-\erratum{page 196, line $-5$}
-Change \verb|\newboolean{|\emph{name}\verb|}| to
-\verb|\newboolean{|\emph{nam}\verb|}|.
-\reportedby{Christopher von B\"{u}low}{28 Aug 2000}
-
-
-\erratum{page 198, line 14}
-Change ``it will not be printed'' to ``it will usually not be printed''.
-
-\erratum{page 218, line $-14$}
-Change ``\texttt{tabular}'' to ``\texttt{tabbing}''.
-\reportedby{Carlos Pita}{27 Aug 2001}
-
-\erratum{foldout, column 3, line 3}
-Replace \emph{style} with \emph{class}. \reportedby{Christopher von B\"{u}low}{28 Aug 2000}
-
-\subsection*{Errors Corrected in the Seventeenth Printing}
-
-\erratum{page 51, line 8}
-Change ``The \verb|\,| command'' to ``The \verb|\,| and \verb*|\ | commands''.
-\reportedby{Phillip J Shelton}{2 Jul 1999}
-
-\erratum{page 61, second example (middle of page)}
-Remove the \verb|\mbox{}| following the \texttt{tabbing} environment.
-\reportedby{Marcin Wolinski}{17 Sep 2003}
-
-\erratum{page 210, line 20}
-Add a space after ``bibliography''.
-\reportedby{Marcin Wolinski}{17 Sep 2003}
-
-\subsection*{Error Corrected in the Twenty-First Printing}
-\erratum{page 198, line $-11$}
-The sentence beginning ``The last three rules'' is hard to read. Better
-would be:
-\begin{quote}
-\noindent The last three rules are suspended when a
- \verb|\clearpage|,\linebreak
- \verb|\cleardoublepage|, or
- \verb|\end{document}| command occurs,
-at which point all unprocessed figures and tables are allowed a
-\hbox{\mytt p} option and printed.
-\end{quote}
-\reportedby{Paul Stanford}{9 Oct 2004}
-
-\subsection*{Error Corrected in the Twenty-Second Printing}
-
-\erratum{page 253, column 2, lines $-5$ and $-6$}
-
-The two index entries for \verb|\ldots| should be combined.
-
-
-\reportedby{Christopher Dutchyn}{22 July 2005}
-
-
-\subsection*{Uncorrected Errors}
-
-\erratum{page 206, line 17 (\texttt{\string\multicolumn} explanation)}
-
-Insert the following text right after ``\texttt{l}, and \texttt{r}.''
-\begin{quote}
-If the part of the environment's \emph{cols} argument being replaced
-immediately follows an \texttt{@} expression, then the \emph{item}
-will be preceded by a normal intercolumn space unless the
-\verb|\multicolumn| command's \emph{col} argument begins with an
-\texttt{@} expression. In particular, beginning the \emph{col}
-argument with \verb|@{}| will suppress that space.
-\end{quote}
-\reportedby{Ulrike Fischer, Frank Mittelbach}{23 Sep 2018}
-
-\end{document}
-
-%try
-%try
diff --git a/macros/latex-dev/base/manual.pdf b/macros/latex-dev/base/manual.pdf
deleted file mode 100644
index 24a4b96b1a..0000000000
--- a/macros/latex-dev/base/manual.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/base/minimal.cls b/macros/latex-dev/base/minimal.cls
index 48d3cb4cf0..d55576326d 100644
--- a/macros/latex-dev/base/minimal.cls
+++ b/macros/latex-dev/base/minimal.cls
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+% Copyright 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/modguide.pdf b/macros/latex-dev/base/modguide.pdf
new file mode 100644
index 0000000000..01a800efea
--- /dev/null
+++ b/macros/latex-dev/base/modguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/modguide.tex b/macros/latex-dev/base/modguide.tex
new file mode 100644
index 0000000000..ff796c7687
--- /dev/null
+++ b/macros/latex-dev/base/modguide.tex
@@ -0,0 +1,412 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: modguide.tex
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[1995/11/28]
+
+\newcommand{\reasonsection}[1]{\subsubsection*{\it #1}}
+
+\newcommand{\nstex}{\textsf{NS-TeX}}
+
+\setcounter{secnumdepth}{-1}
+
+\title{Modifying \LaTeX}
+
+\author{\copyright~Copyright 1995, \LaTeX3 Project Team.\\
+ All rights reserved.}
+
+\date{12 December 1995}
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\begin{abstract}
+ This document was produced in response to suggestions that the
+ modification and distribution conditions for the files constituting
+ the New Standard \LaTeX{} system should be similar to those implied
+ by Version~2 of the \textsc{GNU} General Public Licence, as
+ published by the Free Software Foundation.
+\end{abstract}
+
+\section{Introduction}
+\label{sec:intro}
+
+This article describes the principles underlying our policy on
+distribution and modification of the files comprising the \LaTeX{}
+system. It has been produced as a result of detailed discussions of
+the issues involved in the support and maintenance of a widely
+distributed document processing system used by diverse people for many
+applications. These discussions have involved users, maintainers of
+installations that support \LaTeX{} and various types of organisations
+that distribute it. The discussions are continuing and we hope that
+the ideas in this article will make a useful contribution to the
+debate.
+
+Our aim is that \LaTeX{} should be a system which can be trusted by
+users of all types to fulfill their needs. Such a system must be
+stable and well-maintained. This implies that it must be reasonably
+easy to maintain (otherwise it will simply not get maintained at
+all). So here is a summary of our basic philosophy:
+\begin{quote}
+ We believe that the freedom to rely on a widely-used standard for
+ document interchange and formatting is as important as the freedom to
+ experiment with the contents of files.
+
+ We are therefore adopting a policy similar to that which Donald
+ Knuth applies to modifications of the underlying \TeX{} system: that
+ certain files, together with their names, are part of the system and
+ therefore the contents of these files should not be changed unless
+ the following conditions are met:
+ \begin{itemize}
+ \item they are clearly marked as being no longer part of the
+ standard system;
+ \item the name of the file is changed.
+ \end{itemize}
+\end{quote}
+
+
+\section{The system}
+\label{sec:sys}
+
+In developing this philosophy, and the consequent limitations on how
+modifications of the system should be carried out, we were heavily
+influenced by the following facts concerning the current widespread
+and wide-ranging uses of the \LaTeX{} system.
+\begin{enumerate}
+\item \LaTeX{} is not just a document processing system;
+ it also defines a language for document exchange.
+
+\item The standard document class files, and some other files, also
+ define a particular formatting of a document.
+
+\item The packages that we maintain define a particular document
+ interface and, in some cases, particular formatting of parts of a
+ document.
+
+\item The interfaces between different parts of the \LaTeX{} system
+ are very complex and it is therefore very difficult to check that a
+ change to one file does not affect the functionality of both that
+ file and also other parts of the system not obviously connected to
+ the file that has been changed.
+\end{enumerate}
+
+This leads us to the general principle that:
+\begin{quote}
+ with certain special exceptions, if you change the contents of a
+ file then the changed version should have a different file name.
+\end{quote}
+
+We certainly do not wish to prevent people from experimenting with the
+code in different ways and adapting it to their purposes. However, we
+are concerned that any distribution of modifications to the code
+should be very clearly identified as not being a part of the standard
+distribution. The exact wording and form of the distribution
+conditions is thus something that is flexible, but only within the
+constraint of keeping \LaTeX{} as a standardised, reliable product for
+the purposes described above: the exchange and formatting of
+documents.
+
+
+\section{Some examples}
+\label{sec:expl}
+
+Here we elaborate the arguments that have led us to the above
+conclusion.
+
+
+\reasonsection{Separate development considered harmful!}
+\label{sec:ja}
+
+In many fields, the use of \LaTeX{} as a language for communication
+is just as important as its capacity for fine typesetting; this is a
+very important consideration for a large population of authors,
+journal editors, archivists, etc.
+
+Related to this issue of portability is the fact that the file names
+are part of the end-user syntax.
+
+As a real example, the \LaTeX{} `tools' collection contains the
+package `array.sty'. A new user-level feature was added to this file
+at the end of 1994 and a document using this feature can contain the
+line:
+\begin{verbatim}
+ \usepackage{array}[1994/10/16]
+\end{verbatim}
+
+By supplying the optional argument, the document author is indicating
+that a version of the file \texttt{array.sty} dated no earlier than
+that date is required to run this document without error.
+
+This feature would be totally worthless if we were to allow an
+alternative version of the array package to be distributed under the
+same name since it would mean that there would be in circulation files
+of a later date, but without the new feature. If the document
+were processed using this `alternative array' then it would certainly
+produce `undefined command' errors and would probably not be
+processable at all.
+
+
+\reasonsection{What's in a file-name?}
+\label{sec:jb}
+
+In a pure markup language, such as SGML, it is reasonably clear that
+control over the final presentation lies with the receiver of a
+document and not with the author.
+
+However, the way that \LaTeX{} is often used in practice means that
+most people (at least when using the standard classes and packages)
+expect the formatting to be preserved when they send the document to
+another site.
+
+For example, suppose, as is still the most common use of \LaTeX{} in
+publishing, you produce a document for `camera-ready-copy' using the
+class `article' and that you carefully tune the formatting by, for
+example, adding some explicit line breaks etc, to ensure that it fits
+the 8 page limit set by the editor a journal or proceedings.
+
+It then gets sent to the editor or a referee who, without anyone
+knowing, has a non-standard version of the class file `article' and so
+it then runs to 9 pages. The consequence of this will, at the least,
+be a lot of wasted time whilst everyone involved works out what has
+gone wrong; it will probably also lead to everyone blaming each other
+for something which was in fact caused by a misguided distribution
+policy.
+
+It should also be noted that, for most people, the version of the
+class file `article' that gets used is decided by a site maintainer
+or the compilers of a CD-ROM distribution. To most users,
+the symbols \texttt{a\,r\,t\,i\,c\,l\,e} in:
+\begin{verbatim}
+ \documentclass{article}
+\end{verbatim}
+are just as much part of \LaTeX{}'s syntax as are the symbols
+\texttt{1\,2\,p\,t} in:
+\begin{verbatim}
+ \hspace{12pt}
+\end{verbatim}
+Thus they should both define a standard formatting rather than
+sometimes producing 1 more page or a 5pt larger space.
+
+Users rely on the fact that the command (or menu item) `LaTeX'
+produces a completely standard \LaTeX, including the fact that
+`article' is the `standard article'. They would not be at all happy
+if the person who installed and maintains \LaTeX{} for them were
+allowed to customise `article' every second day so as (in her or his
+opinion) to improve the layout; or because another user wanted to write
+a document in a different language or typeset one with different fonts.
+
+\reasonsection{\TeX{} itself}
+\label{sec:tex}
+
+We have modelled our policies on those of the \TeX{} system since this
+has for some time now been widely acknowledged as a very stable and
+high quality typesetting system.
+
+The distribution policy set up by Donald Knuth for \TeX{} has the
+following features:
+\begin{itemize}
+\item There is a clearly specified method for changing parts of the
+ software by the use of `change files'.
+\item Although arbitrary changes are allowed, the resulting program
+ can be called \TeX{} only if its functionality is precisely the same
+ as that of \TeX{} (i.e.~neither less nor more) in all important
+ areas.
+\item There are many files in the system that cannot be changed at all
+ (without changing the name): examples are the file
+ \texttt{plain.tex} and the files associated with fonts, including
+ the Metafont source files.
+\end{itemize}
+
+
+\reasonsection{Maintaining complexity}
+\label{sec:compl}
+
+Our experience of maintaining \LaTeX{} has shown us just how complex
+are the interactions between different parts of the system.
+
+We have therefore, with lots of help from the bug reports you send in,
+developed a large suite of test files which we run to check the
+effects of every change we make. A non-negligible percentage of these
+test runs give unexpected results and hence show up some unexpected
+dependency in the system.
+
+
+\section{Some assurances}
+\label{sec:conc}
+
+We are certainly not attempting to stop people reformatting \LaTeX{}
+documents in any way they wish. There are many ways of customising
+incoming documents to your personal style that do not involve changing
+the contents of \LaTeX{}'s standard files; indeed, this freedom is one
+of the system's many advantages.
+The simplest way to achieve this is to replace
+\begin{quote}
+\verb|\documentclass{article}|\quad by\quad
+\verb|\documentclass{myart}|
+\end{quote}
+
+Nor do we wish to discourage the production of new packages improving
+on the functionality or implementation of those we distribute. All we
+ask is that, in the best interests of all \LaTeX{} users, you give
+your superbly improved class or package file some other name.
+
+\section{Configuration possibilities}
+\label{sec:conposs}
+
+The standard \LaTeX{} system format can be configured in several ways
+to suit the needs and resources of an installation. For example, the
+loading of fonts and font tables can be customised to match the font
+shapes, families and encodings normally used in text mode. Also, by
+producing the appropriate font definition files, the font tables
+themselves can be set up to take advantage of the available fonts and
+sizes. The loading of hyphenation patterns can be adjusted to cover
+the languages used; this has to be done as part of making the format
+since this is the only stage at which patterns can be loaded.
+
+A complete list of these configuration possibilities can be found in
+the distributed guide \emph{Configuration options for} \LaTeXe{}
+(\texttt{cfgguide.tex}). However, as it says there, the number of
+configuration possibilities is strictly limited; we hope that having
+read this far you will appreciate the reasons for this decision. One
+consequence of this is that there is no provision for a general
+purpose configuration file, or for adding extra code just before the
+|\dump| of the format file.
+
+This was a deliberate decision and we hope that everyone (yes, that
+includes you!) will support its intent. Otherwise there will be a
+rapid return to the very situation, of several incompatible versions
+of \LaTeX~2.09, that originally prompted us to produce \LaTeXe{}: the
+new, and \emph{only}, `Standard \LaTeX'. This will make \LaTeX{}
+unmaintainable and, hence, unmaintained (by us, at least).
+
+\begin{quote}
+ Therefore you should not misuse the configuration files or other
+ parts of the distribution to produce non-standard versions of
+ \LaTeX{}.
+\end{quote}
+
+Some of the allowed configurations can result in a system that can produce
+documents that are no longer `formatting compatible'; for example, the
+use of different default fonts will most likely produce different line
+and page breaks. If you do produce a system that is configured in
+such a way that it is not `formatting compatible' then you should
+consider carefully the needs of users who need to create portable
+documents. A good way to provide for their needs is to make
+available, in addition, a standard form of \LaTeX{} without any
+`formatting incompatible' customisations.
+
+
+\section{Modification conditions}
+\label{sec:modcon}
+
+It is possible that you need to produce a document processing system
+based on standard \LaTeX{} but with functionality that cannot be
+implemented by using the approved configuration files and complying
+with the restriction on the code that is allowed in them. In other
+words, you may need a system which is sufficiently distinct from
+Standard \LaTeX{} that it is not feasible to do this simply by using
+the configuration options we provide or by producing new classes and
+packages.
+
+If you do produce such a system then, for the reasons described
+above, you should ensure that your system is clearly distinguished
+from Standard \LaTeX{} in every possible way, including the following.
+
+
+\begin{enumerate}
+\item
+ Give your system a distinguished name, such as \nstex, which clearly
+ distinguishes it from \LaTeX{}.
+
+\item
+ Ensure that it contains no file with a name the same as that of
+ a file in the standard distribution but with different contents.
+ (If this is not possible then you must:
+ \begin{itemize}
+ \item
+ ensure that files from the non-\LaTeX{} system cannot be
+ accidentally accessed whilst using a standard \LaTeX{};
+ \item ensure that each file from the non-\LaTeX{} system clearly
+ identifies itself as a non-\LaTeX{} file on the terminal and in the
+ log file.)
+ \end{itemize}
+
+\item
+ Ensure that the method used to run your system is clearly
+\label{mcon:command}
+ distinct from that used to run Standard \LaTeX; e.g.~by using a
+ command name or menu entry that is clearly not \texttt{latex}
+ (or \texttt{LaTeX} etc).
+
+\item
+ Ensure that, when a file is being processed by your system, the
+ use of non-standard \LaTeX{} is clearly proclaimed to the user by
+ whatever means is appropriate.
+
+\item Ensure that what is written at the beginning of the log file
+ clearly shows that your system has been used, and that it is
+ not Standard \LaTeX{}.
+ See the file \texttt{cfgguide.tex} for how to achieve this.
+
+\item
+ Clearly explain to users that bug reports concerning your
+ system should not be sent to the maintainers of Standard
+ \LaTeX{}.
+\end{enumerate}
+
+\subsection*{Note to system administrators}
+
+If you install a non-standard (modified) version of \LaTeX{} on a
+multi-user site then please, in addition, install Standard \LaTeX{}
+and observe the conditions enumerated above, particularly
+\ref{mcon:command}.
+
+
+\section{What do you think?}
+\label{sec:you}
+
+We are interested in your views on the issues raised in this document.
+The best way to let us know what you think, and to discuss your ideas
+with others, is to join the \texttt{LaTeX-L} mailing list and send your
+comments there.
+To subscribe to this list, mail to:
+\begin{verbatim}
+ listserv@urz.uni-heidelberg.de
+\end{verbatim}
+the following one line message:
+\begin{verbatim}
+ subscribe LATEX-L <your-first-name> <your-second-name>
+\end{verbatim}
+
+\end{document}
diff --git a/macros/latex-dev/base/newdc.ins b/macros/latex-dev/base/newdc.ins
index 5bbbe900da..5786282a87 100644
--- a/macros/latex-dev/base/newdc.ins
+++ b/macros/latex-dev/base/newdc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/newlfont.dtx b/macros/latex-dev/base/newlfont.dtx
index f058ddced9..5bba5441dd 100644
--- a/macros/latex-dev/base/newlfont.dtx
+++ b/macros/latex-dev/base/newlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/nfssfont.dtx b/macros/latex-dev/base/nfssfont.dtx
index 00b82a1499..a77dfba7b3 100644
--- a/macros/latex-dev/base/nfssfont.dtx
+++ b/macros/latex-dev/base/nfssfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/nfssfont.ins b/macros/latex-dev/base/nfssfont.ins
index 222551ea30..c1ac663471 100644
--- a/macros/latex-dev/base/nfssfont.ins
+++ b/macros/latex-dev/base/nfssfont.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/nfssfont.pdf b/macros/latex-dev/base/nfssfont.pdf
index f05b4735a2..c7650a0455 100644
--- a/macros/latex-dev/base/nfssfont.pdf
+++ b/macros/latex-dev/base/nfssfont.pdf
Binary files differ
diff --git a/macros/latex-dev/base/olddc.ins b/macros/latex-dev/base/olddc.ins
index 694cc6df6f..b512ab2e3e 100644
--- a/macros/latex-dev/base/olddc.ins
+++ b/macros/latex-dev/base/olddc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/oldlfont.dtx b/macros/latex-dev/base/oldlfont.dtx
index 3c768e1e8f..bf39341488 100644
--- a/macros/latex-dev/base/oldlfont.dtx
+++ b/macros/latex-dev/base/oldlfont.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/preload.dtx b/macros/latex-dev/base/preload.dtx
index 0bc9fb4415..a6d7903299 100644
--- a/macros/latex-dev/base/preload.dtx
+++ b/macros/latex-dev/base/preload.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/proc.dtx b/macros/latex-dev/base/proc.dtx
index 724b939fd2..a74dfa36e4 100644
--- a/macros/latex-dev/base/proc.dtx
+++ b/macros/latex-dev/base/proc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/proc.ins b/macros/latex-dev/base/proc.ins
index 48765bddec..15161a4960 100644
--- a/macros/latex-dev/base/proc.ins
+++ b/macros/latex-dev/base/proc.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/proc.pdf b/macros/latex-dev/base/proc.pdf
index 6c567d7861..a0135a97eb 100644
--- a/macros/latex-dev/base/proc.pdf
+++ b/macros/latex-dev/base/proc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slides.dtx b/macros/latex-dev/base/slides.dtx
index 4ccd6824e6..54cfaa20fd 100644
--- a/macros/latex-dev/base/slides.dtx
+++ b/macros/latex-dev/base/slides.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/slides.ins b/macros/latex-dev/base/slides.ins
index a5bbc579c3..a25c3f8fe2 100644
--- a/macros/latex-dev/base/slides.ins
+++ b/macros/latex-dev/base/slides.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
@@ -96,7 +96,7 @@ extension .ins) which are part of the distribution.
This is a generated file.
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -109,7 +109,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
@@ -138,7 +138,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -151,7 +151,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/slides.pdf b/macros/latex-dev/base/slides.pdf
index 83876c4601..6bacf0d00b 100644
--- a/macros/latex-dev/base/slides.pdf
+++ b/macros/latex-dev/base/slides.pdf
Binary files differ
diff --git a/macros/latex-dev/base/slifonts.fdd b/macros/latex-dev/base/slifonts.fdd
index 5a0a4ee247..abb950d6a1 100644
--- a/macros/latex-dev/base/slifonts.fdd
+++ b/macros/latex-dev/base/slifonts.fdd
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/slifonts.pdf b/macros/latex-dev/base/slifonts.pdf
index 17385d8b1c..d7305f0f92 100644
--- a/macros/latex-dev/base/slifonts.pdf
+++ b/macros/latex-dev/base/slifonts.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.pdf b/macros/latex-dev/base/source2e.pdf
index 97cf72361c..cc356e1813 100644
--- a/macros/latex-dev/base/source2e.pdf
+++ b/macros/latex-dev/base/source2e.pdf
Binary files differ
diff --git a/macros/latex-dev/base/source2e.tex b/macros/latex-dev/base/source2e.tex
index 79b9a7f5db..d34dabfa47 100644
--- a/macros/latex-dev/base/source2e.tex
+++ b/macros/latex-dev/base/source2e.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2016
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/syntonly.dtx b/macros/latex-dev/base/syntonly.dtx
index 98c8e4dfc3..6d4c710d0d 100644
--- a/macros/latex-dev/base/syntonly.dtx
+++ b/macros/latex-dev/base/syntonly.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2017
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/syntonly.ins b/macros/latex-dev/base/syntonly.ins
index c05eb92bf0..2adf6c3d78 100644
--- a/macros/latex-dev/base/syntonly.ins
+++ b/macros/latex-dev/base/syntonly.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 1993-2017
+Copyright (C) 1993-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file has the LPPL maintenance status "maintained".
diff --git a/macros/latex-dev/base/syntonly.pdf b/macros/latex-dev/base/syntonly.pdf
index 7f8dc926e9..f38600a887 100644
--- a/macros/latex-dev/base/syntonly.pdf
+++ b/macros/latex-dev/base/syntonly.pdf
Binary files differ
diff --git a/macros/latex-dev/base/testpage.tex b/macros/latex-dev/base/testpage.tex
index d7f468d241..d2b3919f93 100644
--- a/macros/latex-dev/base/testpage.tex
+++ b/macros/latex-dev/base/testpage.tex
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/texpert.txt b/macros/latex-dev/base/texpert.txt
index 7e2860d09d..9380a677fe 100644
--- a/macros/latex-dev/base/texpert.txt
+++ b/macros/latex-dev/base/texpert.txt
@@ -207,4 +207,4 @@ the distributed files with names <*>guide.tex. You will need
to install the new version before you can typeset these files.
---- Copyright 1995-2016 the LaTeX3 project. All rights reserved ---
+--- Copyright 1995-2019 the LaTeX3 project. All rights reserved ---
diff --git a/macros/latex-dev/base/tlc2.err b/macros/latex-dev/base/tlc2.err
deleted file mode 100644
index 57b3c85715..0000000000
--- a/macros/latex-dev/base/tlc2.err
+++ /dev/null
@@ -1,4630 +0,0 @@
-\newcommand\erratafiledate{2014-09-30}
-
-\def\comando#1{\texttt{\string#1}}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% To produce a printed version of this errata file run this file through
-% LaTeX. It will unpack a small class file (if not already present) and
-% a configuration file with the extension .cfg. You might want to modify
-% the setting in this configuration file to print only a partial errata
-% suitable for your printed revision of this book, see details in the
-% .cfg file.
-%
-% The current version of this file can be found at:
-%
-% https://www.latex-project.org/help/books/
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-\begin{filecontents}{ttcterrata.cls}
-%%
-%% Copyright (C) 1997,2004,2005,2007, 2014 Frank Mittelbach
-%% This class file is licenced under LPPL latest version;
-%% see https://www.latex-project.org/lppl
-%
-%
-% It sets up a few commands used to format the errata entries for books in the
-% Addison-Wesley Series:
-%
-% Tools and Techniques for Computer Typesetting
-%
-% hence the name. However, anybody who likes to use it is free to apply it for
-% errata files of other books.
-%
-% Changes:
-%
-% v1.0a - changed name from errata.cls to ttcterrata.cls
-
-\ProvidesClass{ttcterrata}
- [2007/11/10 v1.0a Mini class for errata files; subject to change (FMi)]
-
-\LoadClass{article}
-
-\setcounter{secnumdepth}{-1}
-\addtolength\textwidth{5cm}
-\addtolength\oddsidemargin{-3cm}
-
-\addtolength\textheight{36pt}
-
-\RequirePackage{shortvrb}
-\MakeShortVerb{\|}
-
-\RequirePackage{array,longtable}
-\RequirePackage{multicol}
-
-
-\newcommand\erratagetnumber{}
-\def\erratagetnumber#1/#2/#3\erratagetnumber{#1#2#3}
-
-
-\newcommand\gobbleerrata{%
- \setbox\@tempboxa\vbox\bgroup
- \let\endgobble\egroup
- \let\hideamp\relax
- \let\\\relax\let\par\@@par}
-
-\newcommand*\hideamp{&}
-
-\let\endgobble\relax
-
-
-\newcommand\erratastartdate{}
-\newcommand\myprinting{1}
-
-
-\newcommand\doweprint[2]{%
- \ifnum \myprinting < \if!#2!1000 \else \ifx s#2 1000\else#2 \fi\fi
- \ifnum \expandafter\erratagetnumber\erratastartdate\erratagetnumber <
- \erratagetnumber#1\erratagetnumber \relax
- \@tempswatrue
- \else
- \@tempswafalse
- \fi
- \else
- \@tempswafalse
- \fi
-}
-
-
-
-\newcommand\includedentries{entries after = \erratastartdate}
-\newcommand\printedentries{between \erratastartdate\space and}
-
-\newcommand\showallerrors{%
- \renewcommand\includedentries{all errata entries}%
- \renewcommand\printedentries{up to}
- \renewcommand\doweprint[2]{\@tempswatrue}}
-
-
-\newcommand\displayrevisionfix[2]{%
- \if!#2!\textbf{#1}\else\textit{#1}\rlap{\textsuperscript{#2}}\fi}
-
-\newcommand\norevisionnumbers{%
- \renewcommand\displayrevisionfix[2]{\textbf{##1}}}
-
-\IfFileExists{\jobname.cfg}
- {
- \input{\jobname.cfg}
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* Configuration file for \jobname.err found }
- \typeout{*}
- \typeout{***************************************************}
- \AtEndDocument{
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* If you wish to generate an errata listing}
- \typeout{* containing only errors found after a certain revision}
- \typeout{* and/or only errors found after a certain date}
- \typeout{* modify the information stored in \jobname.cfg}
- \typeout{*}
- \typeout{* Current settings are:}
- \typeout{*}
- \typeout{* \@spaces printing of your book = \myprinting}
- \typeout{* \@spaces include \includedentries}
- \typeout{*}
- \typeout{***************************************************}
- }}
- {}
-
-%% \erroronpage <page> <line info> <contributor> <date> <fixed in revision>
-
-\newcommand\erroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\seriouserroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\CHAPTER[1]{\endgobble
- &\\[4pt]%
- \multicolumn{4}{l}{\framebox[10cm][l]{\textbf{\normalsize\strut#1}}} \\}
-
-\newenvironment{erratalist}
- {\begin{longtable}{r>{\raggedright}p{2cm}l>{\raggedright}p{10cm}l}}
- {\endgobble\end{longtable}}
-
-\newcommand\erratatitle[2]
- {\begin{center}\LARGE\bfseries
- Errata list for #1\\[5pt](\myprinting.\ printing)\\[10pt]
- \small Includes all entries found \printedentries\space #2\\
- (For other periods/print runs reprocess this document
- with different config settings)
- \end{center}%
- \markright{Errata for #1 (\printedentries\space #2)}%
- \thispagestyle{plain}%
- \vspace{20pt}}
-
-\pagestyle{myheadings}
-
-\AtBeginDocument{\small}
-
-\setlength\parindent{0pt}
-\setlength\parskip{2pt}
-
-\newcommand\contributor[2]{\makebox[1cm][l]{\sffamily#1} #2\par}
-
-% some special shortcuts overwriting existing commands:
-
-\let\u\underline
-\renewcommand\>{$\to$}
-
-%%% some code suggested by Thorsten Hansen to count the number of
-%%% contributions by individuals (will work only if we do not get
-%%% too many :-)
-
-\def\count@contributors#1/#2/#3\@nil{
- \@ifundefined{c@#1}{\newcounter{#1}}{}\stepcounter{#1}%
-%%% also count secondary:
-%%% \@ifundefined{c@#2}{\newcounter{#2}}{}\stepcounter{#2}%
-}
-
-\renewcommand\erroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\seriouserroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\contributor[2]{\makebox[1cm][l]{%
- \sffamily#1} #2\@ifundefined{c@#1}{}{ (\arabic{#1})}\par}
-
-\end{filecontents}
-
-
-\begin{filecontents}{\jobname.cfg}
-%
-%
-% Configuration file for the errata listing of
-%
-% The LaTeX Companion, Second Edition
-%
-%
-% \erratastartdate
-%
-% Specifies the date from which on errata entries should be listed.
-%
-% The format is YYYY/MM/DD.
-%
-% The default below ensures that all entries for a particular
-% printing are typeset.
-%
-
-\renewcommand\erratastartdate{2004/04/22}
-
-
-%
-% \myprinting
-%
-% Specifies which (revised) printing you own. For example, if you
-% have the second printing set this to 2 so that errors already
-% corrected in that printing will not appear in your errata
-% listing.
-%
-% The default below ensures that all entries relevant to the x-th
-% printing are typeset.
-%
-%
-
-\renewcommand\myprinting{1}
-\renewcommand\myprinting{2} % 3rd printing was without corrections
-\renewcommand\myprinting{4} % September 2005
-
-%
-% \norevisionnumbers
-%
-% Specifies that all page numbers in the errata are shown in the same
-% format (bold face) irregardless of whether or not they are fixed
-% in some revision. The default is to print corrected errors in
-% italic and add the revision number as a superscript.
-
-%
-% \showallerrors
-%
-% With this command you tell the program that all errata entries are
-% supposed to be generated. This makes \myprinting and
-% \erratastartdate basically obsolete so this isn't turned on by
-% default.
-%
-%
-\endinput
-\end{filecontents}
-
-
-\documentclass{ttcterrata}[2005/11/10] % we want new class
-
-\usepackage[T1]{fontenc}
-\let\u\underline % shortcut for this file
-\newcommand\meta[1]{$\langle$\textit{#1\/}$\rangle$}
-
-\usepackage{textcomp}
-
-\usepackage{url}
-
-\begin{document}
-
-\erratatitle{The \LaTeX{} Companion, Second Edition}{\erratafiledate}
-
-
-\begin{verbatim}
-@book(A-W:MG04,
- author = {Frank Mittelbach and Michel Goossens},
- title = {The {\LaTeX} Companion},
- edition = 2,
- note = {With Johannes Braams, David Carlisle, and Chris Rowley},
- series = {Tools and Techniques for Computer Typesetting},
- publisher = {Addison-Wesley},
- address = {Boston, Massachusetts},
- year = 2004,
- pagenums = {1120},
- bibliography = {yes},
- index = {yes},
- isbn = {0-201-36299-6},
-)
-\end{verbatim}
-
-
-\begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{3cm}}
-\item[]
-
-This file (\texttt{\jobname.err}) can be found as part of the \LaTeX{}
-distribution and its latest version is maintained on the \LaTeX{}
-project site at \texttt{https://www.latex-project.org/help/books/\jobname.err}
-where you will also find extracts of the book.
-
-The first column in the table shows the page number of the errata
-entry. Superscript numbers in the first column refer to the printed
-revision in which this entry was corrected (\textit{s} indicates a
-correction in the sources only). The second
-column gives the precise location (negative line or paragraph numbers
-are counted from the bottom of the page). The third column shows the
-first finder of the problem.
-
-You can customize this list to only show errata related to the printing
-you own by changing the configuration in the file \texttt{\jobname.cfg}.
-
-\begin{center}
- \Large \bfseries To Err is Human --- Bug Contest
-\end{center}
-
-Any mistake found and reported is a gain for all readers of our book.
-For this reason Addison-Wesley and the authors offer a prize (for 6
-periods) to the eligible person who finds the largest
-number of bugs during that period (in case of a draw a random choice
-will be made between all those with the largest number of findings).
-A person can receive at most one prize, ever; errors found by any of
-the authors do not count.
-
-Each prize is a free choice of any single computing book found on the
-AW Professional web site \texttt{http://www.awprofessional.com} (that
-is, no boxed sets or multiple volume offers).
-
-
-As usual, the authors and publisher reserve the right to make various
-decisions such as whether a reported feature is an error for
-competitive purposes or whether similar features count as a single or
-multiple errors. ---
-Good luck!
-
-\begin{center}
-\begin{tabular}{clr}
-Contest period ends & Winner \\[4pt]
-2004/10 & Hubert G\"a\ss lein & 287 suggestions\\
-2005/04 & Ulrich Dirr & 11 suggestions\\
-2005/10 & Daniel Alonso i Alemany & 13 suggestions\\
-2006/04 & Michael Schutte & 2 suggestions\\
-2008/05 & Brooks Moses & 1 suggestion \\
-\ldots & -- final draw eventually --
-\end{tabular}
-\end{center}
-\end{list}
-
-\newpage
-
-
-%<--------------------------
-
-\newcommand\BibTeX{\textsc{Bib}\TeX}
-
-\begin{erratalist}
-
-\CHAPTER{General }
-
-\seriouserroronpage{general}{}{FMi}{2004/06/12}{}
-
- To help you in assessing this errata document we have placed
- exclamation marks in front of each entry that we consider essential
- for correctly understanding the book contents.
-
-\erroronpage{general}{}{FMi}{2004/05/14}{}
-
- Due to the printing process there may be small alignment problems
- between blue and black text on some pages. These can vary from book
- to book depending on how the paper was handled between print
- runs---such is the analog nature of printing on a press.
-
-
-
-\erroronpage{general}{}{FMi}{2004/07/28}{}
- Slightly updated examples matching the second printing will be made
- available at CTAN: \texttt{info/examples/tlc2}. The book CD will
- have the original examples from the first printing.
-
-
-
-\CHAPTER{Front matter}
-
-\erroronpage{iv}{bottom}{FMi}{2004/04/23}{2}
- Some updates indicating second printing (with corrections)
-
-\erroronpage{v}{l.7}{FMi}{2004/04/23}{}
- For the record: the term ``for ever'' is the British spelling and a
- conscious decision.
-
-\erroronpage{xiii}{\S 8.6.2}{FMi}{2004/06/21}{2}
- Change section heading: ``Operator \u{and function} names''
-
-\erroronpage{xxiii}{11.2}{FMi}{2004/07/26}{2}
- Change table caption: ``Languages supported by \u{\texttt{texindy}}''
-
-\erroronpage{xxvii}{para 1, l.1+6+7}{CAR}{2004/05/20}{2}
- Each time a space is missing between package names in parentheses.
-
-\erroronpage{xxvii}{para 1, l.-2}{THa}{2004/06/21}{2}
- Add: ``Thorsten Hansen (\textsf{bibunits}\u{, \textsf{multibib}})
-
-\erroronpage{xxvii}{para 4, l.2}{NBe}{2004/04/23}{2}
- Replace ``Wai Wing'' with ``Wai Wong'' (very sorry for this typo).
-
-\erroronpage{xxvii}{para 4, l.2}{MHCL/CAR}{2004/06/09}{2}
- Kai Tek airport is correctly named Kai Tak airport but the photo
- was actually taken at Hong Kong International Airport
-
-\erroronpage{xxvii}{after para 4}{FMi}{2004/06/09}{2}
- Add following paragraph:
-``Any mistake found and reported is a gain for all readers of our
-book. We would therefore like to thank those readers who reported
-any of the mistakes which had been overlooked so far.
-The latest version of the errata file can
-be found on the \LaTeX{} project site at
-\texttt{https://www.latex-project.org/help/books/tlc2.err} where you will also
-find an on-line version of the index and other extracts from the book.''
-
-\CHAPTER{Chapter 1}
-
-\erroronpage{2}{para 5, l.1}{MSc}{2004/06/03}{2}
- Replace: LaTeX \> \LaTeX{}
-
-\erroronpage{7}{para 5, l.-2}{HjG}{2004/05/20}{2}
- Missing word and wrong designation of acronym:
- ``\ldots\
- languages such \u{as} the \u{Portable Document} Format (PDF)
- \ldots''
-
-
-\erroronpage{7}{para 5, l.-2}{MSc/CAR}{2004/06/06}{2}
-Replace: ``\ldots produce other device-independent
- output forms in proprietary languages such as the Portable Document
- Format~(PDF) (extension~\texttt{.pdf}).'' \> \\
- ``\ldots produce device-independent
- file formats including the Portable Document Format~(PDF)
- (extension~\texttt{.pdf}), which is the native file format of Adobe
- Acrobat.''
-
-
-\erroronpage{13}{para -2, l.5}{FMi}{2004/04/23}{2}
- Replace ``writes'' with ``write''.
-
-%\erroronpage{13}{last para, l.1}{MSc}{2004/06/08}{}
-% ``blue notes`` vertically misaligned
-
-\erroronpage{14}{para 2, l.2}{FMi}{2004/06/12}{2}
- Bug in \texttt{url.sty} generated extra space.
-
-\erroronpage{14}{para 2, l.6}{FMi}{2004/04/23}{2}
- Printing problem: ``or'' only half visible.
-
-\erroronpage{14}{para 3, l.3}{HjG}{2004/05/20}{2}
- Printing problem: ``d'' in ``document'' only half visible.
-
-\erroronpage{14}{exa 1-3-5, l.6}{DHL}{2004/05/14}{2}
- Printing problem: ``i'' in ``\verb=\section='' not visible.
-
-
-\CHAPTER{Chapter 2}
-
-\erroronpage{16}{para 4,ll.2--4}{HjG}{2005/04/03}{4}
- Nitpicking? Code for class options will not be in a package file!\\
- ``Code for \u{class} options is sometimes stored in files
- (in \u{this case} with the extension \texttt{.clo}) but is normally
- directly specified in the class or package file (\dots).''
- \>\\
- ``Code for options is sometimes stored in files
- (in \u{the case of classes} with the extension \texttt{.clo}) but
- is normally
- directly specified in the class or package file (\dots).''
-
-\erroronpage{16}{para 4, l.-2}{HjG}{2004/10/10}{4}
- Although not wrong, better:
- ``For example,
- the option \texttt{11pt} \u{might be} related to
- \u{\texttt{art11.clo}} when\ldots''
- \>
- ``For example,
- the option \texttt{11pt} \u{is} related to
- \u{\texttt{size11.clo}} when\ldots''
-
-\erroronpage{20}{para 1, l.-2}{BMo}{2004/05/14}{2}
- Words need to be swapped: ``\ldots can achieve \u{this effect} by
- \ldots''
-
-\erroronpage{20}{footnote, l.2}{MSc/FMi}{2004/06/10}{2}
- Replace ``e.g.,'' with ``i.e.,''
-
-\erroronpage{21}{para 1 of 2.1.4, l.-1}{HjG}{2004/05/20}{2}
- Words need to be swapped:
- ``\ldots package \u{created by} Donald Arseneau.''
-
-\erroronpage{21}{para -2, l.2}{MLi}{2013/07/12}{}
- The command is called \verb=\AskOption= (without ``s'')
-
-\erroronpage{24}{para -2,ll.-3\slash -2}{HjG}{2005/04/03}{4}
- \LaTeX{}nically not correct:\\
- ``\u{all} lower-level counter\u{s} (i.e., \u{those} with
- higher-level number\u{s}) \u{are} reset.''\>\\
- ``\u{the next} lower-level counter (i.e., \u{that} with \u{the next}
- higher-level number) \u{is} reset.''
-
-\seriouserroronpage{26}{footnote}{HjG}{2004/05/20}{2}
- Misplaced closing brace (see example 2-2-3):\\
- \verb=\fbox{\csname thesection\endcsname\hspace{0.5em}=%
- \u{\texttt{\textbraceright}}
- \>
- \verb=\fbox{\csname thesection\endcsname=%
- \u{\texttt{\textbraceright}}\verb=\hspace{0.5em}=
-
-\erroronpage{27}{exa 2-2-4}{MBr}{2004/08/01}{2}
- Rewrite example text to avoid overfull hbox.
-
-\erroronpage{27}{para -2, l.4}{HjG}{2004/05/20}{2}
- Missing italic correction:
- \verb=\=\emph{name}\verb=mark=
-
-
-\seriouserroronpage{28}{afterskip item, ll.3--4}{HjG}{2005/04/03}{4}
- \LaTeX{}nically not correct (cf.\ latex/3463):\\
- ``\dots\ whether a display heading (\textit{afterskip}${}\geq0$) or a
- run-in heading (\textit{afterskip}${}<0$) is produced.''\>\\
- ``\dots\ whether a display heading (\textit{afterskip}${}>0$) or a
- run-in heading (\textit{afterskip}${}\leq0$) is produced.''
-
-\seriouserroronpage{32}{para -1,l.4--7}{HjG/FMi}{2004/05/20}{2}
- Replace: ``The modified |\section| command
-also starts a new page, which is typeset with a special page style
-(see Chapter~4) and with
-top floats suppressed.
-The indentation of the first paragraph in a
-section is also suppressed by using the low-level kernel command
- |\@afterheading| and setting
-the Boolean switch \texttt{@afterindent} to \texttt{false}.
-For details on the use of these commands see the |\chapter| implementation in
-the standard classes (file \texttt{classes.dtx}).''
-
-\seriouserroronpage{33}{code}{FMi}{2004/05/20}{2}
- Replace code as follows to make statement on p.32 true:\\
-\hspace{0pt minus\linewidth}\begin{minipage}{1.35\linewidth}
-\begin{verbatim}
-\makeatletter
- \renewcommand\appendix{%
- \renewcommand\section{% % Redefinition of \section...
- \newpage\thispagestyle{plain}% % new page, folio bottom
- \suppressfloats[t]\@afterindentfalse % no top floats, no indent
- \secdef\Appendix\sAppendix}% % call \Appendix or \sAppendix
- \setcounter{section}{0}\renewcommand\thesection{\Alph{section}}}
-
- \newcommand\Appendix[2][?]{% % Complex form:
- \refstepcounter{section}% % step counter/ set label
- \addcontentsline{toc}{appendix}% % generate toc entry
- {\protect\numberline{\appendixname~\thesection}#1}%
- {\raggedleft\large\bfseries \appendixname\ % typeset the title
- \thesection\par \centering#2\par}% % and number
- \@afterheading % prepare indentation handling
- \sectionmark{#1}% % add to running header
- \addvspace{\baselineskip}} % space after heading
-
- \newcommand\sAppendix[1]{% % Simplified (starred) form
- {\raggedleft\large\bfseries\appendixname\par \centering#1\par}%
- \@afterheading\addvspace{\baselineskip}}
-\makeatother
-\end{verbatim}
-\end{minipage}
-
-\erroronpage{30}{para-3, l.-2}{RPa}{2004/09/14}{4}
- ``page 426'' should be ``page 428''
-
-\seriouserroronpage{33}{code}{HjG}{2004/05/20}{2}
- Definitions of \verb=\Appendix= and \verb=\sAppendix= use
- \verb=\flushright= instead of \verb=\raggedleft=!
-
- Editorial note: already addressed in previous major change.
-
-\erroronpage{33}{exa 2-2-11}{MBr}{2004/08/01}{2}
- Text contains two spaces after period (not wrong but unnecessary).
-
-\erroronpage{33}{exa 2-2-11}{FMi}{2004/04/23}{2}
- Comment only needs one \% not two.
-
-% not really a bug but ...
-\erroronpage{35}{para 1}{hajk}{2005/09/29}{}
- Package fncychap also makes unwanted ``Chapter 0'' heading for
- |\chapter{Preface}| in |\frontmatter| of book.
-
- Comment: I don't really consider this a bug (as it is not surprising
- with such designs) but will see if it can be explicitly mentioned.
-
-\seriouserroronpage{45}{para 2, l.13}{DHL}{2004/05/27}{2}
- In the displayed code, the second occurrence of
- ``\verb=\renewcommand\theBhead=\dots'' \>
- ``\verb=\renewcommand\theChead=\dots''
-
-\erroronpage{37}{para 3, l.-2}{FMi}{2004/10/21}{4}
- Replace: ``\ldots title in lowercase'' \>
- ``\ldots title in \u{small capitals}''
-
-\erroronpage{46}{para -2,l.3}{HjG}{2005/04/03}{4}
- Delete: ``need\u{ed}'' \> ``need''
-
-\erroronpage{48}{para 2, l.5}{HjG}{2004/05/20}{2}
- Delete doubled word:
- ``(\ldots\ to the \u{the} table of contents)''
-
-\erroronpage{49}{para 3, l.2}{DHL/CAR}{2004/05/27}{2}
- Replace: ``Thereby, the result of'' \>
- ``The exact effect of''
-
-\erroronpage{50}{para -4, l.3}{HjG}{2004/05/20}{2}
- Add remark:
- ``\ldots, so that the standard document classes have definitions
- for \verb=\l@part= and \verb=\l@chapter=
- \u{(or \texttt{\char`\\l@section} with \textsf{article})}
- that do not use \verb=\@dottedtocline=.''
-
-\erroronpage{50}{para --1}{FMi}{2004/10/22}{4}
- Replace para with:
- The nesting level of the entry.
- With the help of the counter \texttt{tocdepth} the user can
- control how many nesting levels will be displayed.
- Levels greater than the value of this counter
- will not appear in the table of contents.
-
-
-\erroronpage{51}{fig.~2.3}{HjG}{2004/05/20}{2}
- The lines of the ``heading text'' are wrapped at a place different
- from that indicated by the \verb=|<- \@tocrmarg ->|=.
-
-\seriouserroronpage{51}{descr. of
- \texttt{\textbackslash
- @pnumwidth}}{CBa}{2005/04/04}{4}
- Needs changing with |\renewcommand|!
-
-\seriouserroronpage{51}{descr. of
- \texttt{\textbackslash @tocrmarg}}{HjG/FMi}{2004/05/20}{2}
- Add additional sentence:
- ``It can be set to a rubber length, which results in the TOC being set
- unjustified.''
-
-\erroronpage{51}{footnote}{FMi}{2004/09/19}{4}
- Add: ``\ldots See Section 7.10.3 \u{on page 428} for more\ldots''
-
-\seriouserroronpage{52}{para 2, exa}{CBa}{2005/04/04}{4}
- As |\@pnumwidth| is actually a macro the assignment using
- |\settowidth| unfortunately doesn't work at all.
- Instead a value needs to be assigned via |\renewcommand|.
-
-\erroronpage{52}{para 3, l.1}{HjG}{2004/05/20}{2}
- Printing problem: ``w'' in ``down'' only half visible.
-
-\erroronpage{52}{middle}{HjG}{2004/05/21}{2}
- Add after code line:
- ``When adjusting \verb=\@pnumwidth= this way it is likely that the
- value of \verb=\@tocrmarg= needs to be changed as well to keep the
- layout of the table of contents consistent.''
-
-\seriouserroronpage{52}{para 3, l.-1}{JJN}{2004/08/17}{4}
- Replace ``and section'' with ``section, and subsection''.
- (or replace code above to use |\setcounter{tocdepth}{1}| and speak
- of "first" level)
-
-\erroronpage{55}{ll.-8/-7}{HjG}{2004/05/21}{2}
- Missing word: ``\ldots\ is defined by \u{the} second argument.''
-
-\erroronpage{56}{footnote}{CBe}{2004/07/27}{2}
-Remove: ``\ldots are limited to three characters, like MS-DOS \u{or Windows}.''
-
-\seriouserroronpage{57}{tab.~2.3}{HjG}{2004/05/21}{2}
- \verb=\mtcPSfont= \> \verb=\mtcSPfont=\\
- \verb=\nomtcrules= \> \verb=\nomtcrule=\\
- \verb=\mtcrules= \> \verb=\mtcrule=
-
-\seriouserroronpage{57}{para-2, l.-3}{HjG}{2004/05/21}{2}
- \verb=\partoc= \> \verb=\parttoc=
-
- \erroronpage{58}{exa 2-3-8}{CBe}{2004/07/27}{2}
- km2 appears two times in the code and in the printed output;
- it should be \verb=km\textsuperscript={2} in the code
- and km\textsuperscript{2} in the output.
-
-\erroronpage{62}{l.-11}{HjG}{2004/05/21}{2}
- ``recourse'' \> ``recur''
-
-\erroronpage{63}{para 1, l.1}{FMi}{2004/11/11}{4}
- Typo: ``This artific\u{i}al example shows how''
-
-\erroronpage{65}{para 2, l.-1}{CKr}{2004/10/15}{4}
- Correct: ``formated'' \> ``format\u{t}ed''
-
-\erroronpage{66}{marginal note}{FMi}{2004/04/23}{2}
- Restrictions on keys deserve a dangerous bend sign.
-
-\erroronpage{68}{exa 2-4-3}{HjG}{2004/05/21}{2}
- The box in the margin ``\fbox{2-4-3}'' is shifted right
- (with respect to other such boxes).
-
-\erroronpage{72}{para 3, l.-3}{HjG/FMi}{2004/05/21}{2}
- Change/add:
- ``\ldots by comparing \u{the number of the chapter} in which the
-|\label| \u{occurred} with the current\ldots''
-
-\erroronpage{75}{para -1, l.2}{CKr}{2004/10/17}{4}
- Change: ``provided the \textit{keys}'' \>
- ``provided the \textit{key}\u{s}''
-
-\seriouserroronpage{76}{para -2, l.5--8}{DAr/FMi}{2004/07/24}{2}
-Change marginal to ``{\itshape Unnumbered sections get moving
-arguments}''
-
-Change text to: ``As a consequence, \u{the
-arguments of unnumbered sectioning commands} are turned into
-moving arguments, \ldots''
-
-\erroronpage{77}{para -1, l.-4}{DAr}{2004/07/24}{2}
- Add: ``In addition, no \u{unrelated} |\addcontentsline| command is
-allowed to intervene between heading and label.''
-
-\erroronpage{78}{\S 2.4.5, l.1}{HjG}{2004/05/24}{2}
- Add: ``Sebastian
- Rahtz \u{(with contributions by Heiko Oberdiek and
- David Carlisle)} has developed\ldots''
-
-\erroronpage{78}{para 3, l.3}{UFi}{2004/06/01}{2}
- Program name changed: ``Acrobat Reader'' \> ``Adobe Reader''
-
-
-\CHAPTER{Chapter 3}
-
-\erroronpage{84}{}{DAr}{2004/07/23}{2}
-Change: ``For example, if the current size is \u{\ttfamily\textbackslash Large} then
-\verb=\relsize{-2}= would change to \u{\ttfamily\textbackslash normalsize}\,.
-
-\seriouserroronpage{84}{exa 3-1-7}{FMi}{2004/04/23}{2}
- To avoid extra space in the output, second line should read:\\
- \verb*= {\relsize{-2}small words} inside.=
-
-\erroronpage{85}{para -1, l.5}{WaS/FMi}{2004/06/16}{2}
- Change: ``ON 28TH \u{OF} JULY 2003'' \> ``ON 2ND AUGUST 2004''
- (no OF generated)
-
-\seriouserroronpage{87}{para 3, l.1}{DAr}{2004/07/24}{2}
- Replace: |\uuline| \> |\uline|
-
-\erroronpage{87}{exa. 3-1-15}{V-Li}{2004/08/14}{}
- \verb+\-+ should be used on a word that is actually hyphenated.
-
- Well, would be nice but not easy to find one.
-
-\erroronpage{87}{exa. 3-1-16}{DHL}{2004/06/07}{2}
- The solid band produced by |\xout| is actually supposed to come
- out as a series of separated ``/'' symbols. With the
- \texttt{ulem} package used for the first printing that works well
- for most text fonts, but
- with Times Roman (used in the example) you get the result shown.
- The new package version fixes this defect.
-
-\erroronpage{92}{para 3, l.1+4}{UFi}{2004/07/31}{2}
-Change: ``The position and the \u{height} of the line
-produced by the |\ul| command can be customized using either
-|\setul| or |\setuldepth|\,. The command |\setul| takes two
-dimensions as arguments: the position of the line in relation to the
-baseline and the \u{height} of the line.
-
-\erroronpage{92}{para -1}{FMi}{2004/07/31}{2}
-Add: ``\ldots can use colored rules instead and, if desired, modify the
-highlighting color\u{ as demonstrated below}:
-
-\erroronpage{95}{exa 3-1-33}{MHo/FMi}{2004/05/17}{2}
- Replace: ``setup'' by ``set-up'' for consistency.
-
-\erroronpage{102}{para 1, l.-3}{CBC}{2004/05/18}{2}
- Replace: ``in great \u{of} detail'' with ``in great detail''.
-
-\erroronpage{103}{l.8}{HjG}{2004/05/23}{2}
- Replace: ``arbitrary bad lines'' \> ``arbitrar\u{il}y bad lines''
-
-\erroronpage{105}{para -3, l.1}{HjG}{2004/05/23}{2}
- Replace: ``typesetting'' \> ``typing''
-
-
-
-\erroronpage{107}{l.3--7}{CBe}{2004/07/27}{4}
- |\linespread| is the \LaTeXe\ command for
- setting up the value of \comando{\baselinestretch}; it is not necessary
- to use |\renewcommand| and in particular it is not necessary to
- activate the new interline spacing by changing font; it suffices the command
- |\selectfont|; the procedure described in this paragraph,
- although still possible, was the one to use with \LaTeX\,209 and with the
- early versions of \LaTeXe, and it was the only way when the First Edition was
- published. The command |\linespread| is introduced the first
- time on page~204, but section 3.1.13 was the right place to do it.
-
-
-\erroronpage{107}{para 4, l.3}{HjG}{2004/05/25}{2}
- Delete word: ``\ldots\ single\u{ (default)}, \ldots''
-
-\erroronpage{107}{para -1, l.3--5}{DHL/FMi}{2004/06/07}{2}
- Add/change:
- ``\ldots leading is increased twice---once by |\baselineskip| (where
- \LaTeX{} already adds about 20\% space between baselines)\ldots'' \>
-``\ldots leading is \u{effectively} increased twice---once by |\baselineskip| (\u{which
- \LaTeX{} already sets to about 20\% above the font size})\ldots''
-
-
-\erroronpage{116}{Footnote 1, line 1}{CBC}{2004/05/18}{2}
- Replace: ``I managed to confuse'' with ``we managed to confuse''.
-
-\erroronpage{117}{para 2, l.2}{HjG}{2004/05/25}{2}
- Missing letter: ``It take\u{s} two \ldots''
-
-\erroronpage{117}{para 3, l.3}{CBC}{2004/05/18}{2}
- Tense correction: ``\ldots they did not change when the text font
- \u{was} modified''.
-
-\erroronpage{117}{para 3,l.-3}{FMi}{2004/05/31}{2}
- Change: ``your list consist of'' \> ``your list\u{s} consist of''.
-
-\erroronpage{117}{para 3,l.-2}{CBC}{2004/05/18}{2}
- Change: ``lists consist\u{s} of'' \> ``lists consist of''.
-
-\erroronpage{117}{footnote}{HjG}{2004/05/26}{2}
- Missing word: ``See, \ldots, the \textsf{ledmac} package [171]
- \u{for} the kinds of \ldots''
-
-\erroronpage{119}{para 2, l.1}{DHL}{2004/06/07}{2}
- Replace word: ``By default, the footnote text is \u{justified}\ldots''
-
-\erroronpage{121}{para 2, l.4}{HjG}{2004/05/25}{2}
- Missing word: ``the \texttt{symbol*} \u{option}''
-
-\erroronpage{124}{middle para, ll. -3/-2}{HjG}{2004/05/26}{2}
- Missing word: ``It is even possible \u{to} use \ldots''
-
-\iffalse
-%% only do if real error on page
-\erroronpage{125}{para 3 of \S 3.2.7, ll.-2/-1}{HjG}{2004/05/26}{}
- Word position: ``\ldots\ whenever |\endnote| or |\endnotemark|
- \u{is used} without an optional argument.''
-\fi
-
-\erroronpage{127}{para 3, l.last}{PYu}{2004/07/01}{2}
- Replace: ``ragged left'' \> ``ragged right''.
-
-\erroronpage{131}{footnote, l.1}{CBC}{2004/05/19}{2}
- Change: ``is not producing'' \> ``does not produce''.
-
-\seriouserroronpage{141}{syntax box}{HjG}{2004/05/26}{2}
- Replace:
- \emph{body-font} \> \emph{body-style}\\
- \emph{head-font} \> \emph{head-style}\\
- \emph{head-after-format} \> \emph{head-after-space}
-
-\erroronpage{142}{exa 3-3-21/22}{UZi}{2005/03/15}{}
- With the newest version of \texttt{amsthm} the font setting for the headline
- is ignored for the optional description of the theorem (looks like a
- bug in amsthm).
-
-\erroronpage{142}{exa 3-3-21}{FMi}{2005/08/15}{4}
- There is an incompatibility between \texttt{amsthm} and
- \texttt{ragged2e}. If the latter is used then the use of |\newline|
- in a theorem declaration doesn't work.
-
-\erroronpage{142}{para -2, l.1}{DHL}{2004/06/07}{2}
- Missing word: ``make'' \> ``\u{to} make''.
-
-\seriouserroronpage{148}{exa 3-3-26}{HjG}{2004/05/26}{2}
- In the example, |\hfil| is used; the text immediately before says:
- ``By using |\hfill| \ldots''
-
-\erroronpage{150}{exa 3-3-28}{HjG}{2004/05/27}{2}
- Nit-picking :-)\\
- Comment should read: ``|%|\quad\texttt{term <\u{=} labelwidth}''\\
- And in ll.2/3 of the text following the example:
- ``If the label is \u{smaller} than |\labelwidth|, \ldots'' \>
- ``\ldots\ \u{not wider} \ldots''
-
-\erroronpage{150}{Example 3-3-28, line 7}{UF}{2004/06/27}{2}
-In the code of the parbox there should be a |\mbox{}| or something
-similar after the |\\| to prevent an underfull hbox-warning.
-
-\erroronpage{150}{exa 3-3-28}{JBez}{2004/07/20}{}
- The vertical space above "Return values" is too small.
-
-\erroronpage{151}{para 3, l.2}{DHL}{2004/06/07}{2}
- Wrong word: to match the example,
- ``\textsc{Notes}'' should be ``\textsc{Note}''
-
-\erroronpage{152}{l.-1 before exa 3-4-2}{HjG}{2004/05/31}{2}
- Replace: ``(see page 167)'' \> ``(see page 168)''
-
-\erroronpage{155}{para 3, l.2}{HjG}{2004/05/31}{2}
- Replace: ``behaves similarly to''
- \> ``is much like''
-
-\erroronpage{155}{para -2, l.5}{HjG}{2004/05/31}{2}
- Replace: ``behave in similar fashion to''
- \> ``\ldots in \u{a fashion similar} to''
-
-\erroronpage{156}{para -1, l.4}{CBC}{2004/05/20}{2}
- Change: ``There is also the possibility to operate'' \> ``It is also
- possible to operate''.
-
-\erroronpage{157}{para 2, l.-4}{CBC}{2004/05/20}{2}
- Change: ``\ldots discussed below) are potentially'' \> ``\ldots
- discussed below) \u{is} potentially''.
-
-\erroronpage{158}{para3, l.3}{DHL/FMi}{2004/06/07}{2}
- Change word: ``tiny white rules \u{behind} the lines'' \> ``tiny white
- rules \u{between} the lines''.
-
-\erroronpage{166}{syntax box}{CAR}{2004/06/02}{2}
- Remove extra space: ``\ldots\verb*/}=/\u{~}\emph{data}\texttt=''
-
-\erroronpage{167}{para 1, l.2}{DAl}{2005/01/11}{4}
- Missing letter: ``\ldots bold italic face exi\u{s}ts.''
-
-\erroronpage{168}{para 3, l.2}{MLa}{2004/05/10}{2}
- Letter missing: ``While on\u{e} can successfully deploy a
- package\ldots''
-
-\erroronpage{169}{tab.~3.7}{HjG}{2004/05/26}{2}
- Spurious space: ``Pascal (\u{ \strut}Borland, \ldots)''
-
-\erroronpage{169}{tab.~3.7}{THa/FMi}{2004/06/21}{2}
- Move the information about blue entries to a separate table note.
-
-\erroronpage{173}{para 2, l.2}{FMi}{2004/11/11}{4}
- Typo: ``to indicate that the line was artific\u{i}ally broken''
-
-\erroronpage{175}{para 1, l.6}{FMi}{2005/02/22}{4}
- Replace: \textsf{inputenclistings} \> \textsf{inputenc}
-
-\erroronpage{177}{exa 3-5-1}{HjG/FMi}{2004/05/31}{2}
- In the first paragraph, the ``\ldots \verb*=.\para='' yields a
- single (sentence ending) interword space; but in the following
- three, ``\ldots \verb*=. \para='' yields doubled space.
- (Due to the leading space in the definition of |\para|.)
- The same problem is in exa 3-5-2 except that there is does not show
- in the output due to a linebreak.
-
-\seriouserroronpage{177/178}{ll.-2/-1/1}{HjG/FMi}{2004/06/01}{2}
- Missing word and references to wrong paragraphs of exa 3-5-2:\\
- ``The line numbers in the second |\marginpar| continue the
- numbering on the main vertical list (the last line of \u{first}
- paragraph was~5) and the \u{second} paragraph then continues with
- line number~9.''
- \\ \>
- ``\ldots\ (the last line of \u{the} \u{preceding} paragraph was~5) and
- the \u{third} paragraph \ldots''
-
-\erroronpage{179}{exa 3-5-5}{HjG}{2004/05/31}{2}
- In the first paragraph, the two instances of
- ``|\linelabel{|\ldots|}|\verb*= \sample=''
- yield double (sentence ending) interword space.
- (Due to the leading space in the definition of |\sample|.)
-
-\erroronpage{179}{Example 3-5-5, l.-2}{CBC}{2004/05/20}{2}
- Change: ``we see to refer to'' \> ``we see references to''.
-
-\erroronpage{182}{para 2, l.-2}{CBC}{2004/05/20}{2}
- Change: ``of an \verb=\Parallel..Text='' \> ``of \u{a}
- \verb=\Parallel..Text=.
-
-\erroronpage{182}{para 3, l.1}{HjG/FMi}{2004/05/31}{2}
- ``computer \u{lingua}'' \> ``computer \u{jargon}''
-
-\erroronpage{182}{exa 3-5-11}{HjG/FMi}{2004/05/31}{2}
- Small improvement:\\
- |\setlength\parindent{|\u{\texttt{-10pt}}|}| \>
- \ldots \u{\texttt{\char`\{-\char`\\leftskip\char`\}}}
-
-\iffalse only on some books
-\erroronpage{183}{exa 3-5-13}{HjG}{2004/05/31}{}
- Printing problem:
- ``|[|'' in ``|\begin{Parallel}[v]{}{}|'' only half visible.
-\fi
-
-\erroronpage{184}{footnote 1, l.1--2}{BMo}{2004/05/16}{2}
- Rewrite beginning: ``Although the \textsf{multicol} package is
- distributed under LPPL (\LaTeX{} Project Public License)~[111], for
- historical reasons its copyright contains an additional ``moral
- obligation'' clause\ldots''
-
-\erroronpage{189}{para 3, l.2}{MHo}{2004/05/08}{2}
- Spurious extra letter: ``If this is a
- possibility, \texttt{multicols}\u{t} produces a warning.''
-
-\erroronpage{189}{para -2, ll.2/3}{HjG}{2004/05/31}{2}
- Extra word: ``bars in the margin, \u{the} known as \ldots''
-
-\erroronpage{189}{par -1, l.4/5}{HjG}{2004/05/31}{2}
- Add comma: ``However, if \ldots\ another\u{,} the \ldots''
-
-\erroronpage{190}{}{FMi}{2004/06/13}{2}
- Editorial comment: changes for page 189 affect page break position
- so 190 has to be retypeset for second printing.
-
-
-\CHAPTER{Chapter 4}
-
-\erroronpage{196}{table 4.2}{YiL}{2012/05/07}{}
- The values shown in the table aren't any quite correct. These days
- some of them are calculated depending on the chosen paper size option
- and so have slightly different values from what is listed in the table.
- The values listed are those that have been used in 2.09 (i.e., they
- would be fully correct in compatibility mode, that is for documents
- starting with |\documentstyle|).
-
-\erroronpage{199}{code block}{UFi}{2004/07/31}{2}
- Change:
- \texttt{\u{1in}+}|\oddsidemargin+\textwidth+\evensidemargin|\texttt{\u{+1in}}
-
-
-\erroronpage{202}{para 3, l.4}{CBC}{2004/05/21}{2}
- Change: ``list-related parameter'' \> ``list-related parameters''.
-
-\erroronpage{202}{para 3, l.4}{PYu}{2004/07/07}{2}
- Remove surplus word: ``in \u{in} figure 3.3''
-
-\erroronpage{203}{para 3, l.3}{HjG}{2004/05/31}{2}
- ``one or the other criteri\u{a}''
- \> ``\ldots\ criteri\u{on}'' (singular)
-
-\seriouserroronpage{205}{para 2, l.2}{HjG}{2004/05/31}{2}
- Delete backslash: ``an option of the type
- \u{\texttt{\char`\\}}\emph{num}|headlines|''
-
-\erroronpage{205}{para 3, l.1}{CBC}{2004/05/21}{2}
- Swap words: ``header \u{is size} enlarged'' \> ``header \u{size is}
- enlarged''.
-
-\erroronpage{205}{para 4, l.4}{CAR}{2004/06/06}{2}
- Delete word: ``\ldots taken up by the binding\u{ method}. For
- example,\ldots''
-
-\erroronpage{205}{para 5, l.2}{CBC}{2004/05/21}{2}
-Omitted word: ``one can \u{perform} the parameter calculations''.
-
-\seriouserroronpage{205}{para 5}{FMi}{2004/06/06}{2}
-Append: For details see the KOMA-Script documentation.
-
-\seriouserroronpage{205}{Example 4-2-6, 1.3}{CBC}{2004/05/21}{2}
-Add a comment line: ``\verb=% syntax: \typearea[<binding corr.>]{<slices>}=''
-
-\erroronpage{206}{para 2, l.6}{FMi}{2004/06/06}{2}
-
- Replace: ``\ldots shows a layout \u{identical} to the one
- produced\ldots'' \>
- ``\ldots shows a layout \u{very similar} to the one produced\ldots''
-
-\seriouserroronpage{206}{para 2, l.6}{HjG}{2004/05/31}{2}
- Wrong references:\\
- ``Example \u{4-2-4} on page \u{204}'' \>
- ``Example \u{4-2-5} on page \u{205}''
-
-\erroronpage{209}{para 1, l.1--2}{BMo}{2004/05/16}{2}
- Replace:
- ``\ldots and does not leave sufficient space for marginal notes
- that fall outside the page.''
- \>
- ``\ldots but does not adjust the size of the marginal boxes to fit
- in the remaining margin.''
-
-
-\erroronpage{210}{para -1, l.3}{CBC}{2004/05/21}{2}
- Omitted word: ``allow you \u{to} set several values''.
-
-\erroronpage{211}{para 4, l.6}{FMi}{2004/08/30}{4}
- Add: ``\ldots be called multiple times \u{in the preamble},
- each time overwriting the previous settings.''
-
-\erroronpage{212}{para -1, l.2}{CKr}{2004/11/11}{4}
- Remove surplus: ``the \emph{logical} page
- \u{you} you want to produce.''
-
-\seriouserroronpage{213}{para 1, l.2}{BMo}{2004/05/16}{2}
- Option \texttt{executive} is listed twice, replace once with
- \texttt{letter}.
-
-\erroronpage{213}{para 2, l.1}{CKr}{2004/11/11}{4}
- Typo: ``The following example sets up an artific\u{i}ally small logical page''
-
-\erroronpage{213}{para 1, l.1--2}{FMi}{2006/09/09}{4}
- Option \texttt{b3} is listed twice.
-
-\erroronpage{213/214}{exa 4-2-11/13}{FMi}{2004/06/05}{2}
- The picture (|rosette.ps|) is clipped a tiny bit at the left side.
- That's actually an error in the |.ps| file itself and can be seen
- in all other examples where the file is used.
-
-\seriouserroronpage{214}{para 1, l.6}{BMo}{2004/05/16}{2}
- ``\ldots\ \texttt{notext} \ldots'' should be ``\ldots\
- \texttt{nographics} \ldots''.
-
-\erroronpage{217}{para -2, l.1}{HjG}{2005/05/08}{4}
- Replace (since the package's default is different):\\
- Finally the \u{en dash} between the prefix and the page number \dots\ \>\\
- Finally the \u{separator} between the prefix and the page number \dots
-
-\erroronpage{219}{l.4}{HjG}{2004/06/03}{2}
- Missing italic correction:
- \verb=\=\emph{name}\verb=mark=
-
-\erroronpage{219}{para -1,l.2}{HjG}{2005/05/09}{4}
- Reference to wrong section:\\
- ``Table~9.2 on page~547 in Section~\u{9.1.3}'' \>\\
- ``Table~9.2 on page~547 in Section~\u{9.2.1}''
- (or omit section refence completely)
-
-\erroronpage{223}{tab 4.3}{THa}{2004/06/22}{2}
- Spurious space after superscript \textsuperscript{a} in footnote.
-
-\erroronpage{226}{para. 5, l.2}{PYu}{2004/07/05}{2}
- Change to plural: ``The headers and footers are typeset \u{in boxes}
- that, by default, \u{have} the same width as |\textwidth|\,. The
- \u{boxes} can be made wider (or narrower)\ldots''
-
-
-\erroronpage{227}{para 2,l.1}{HjG}{2005/05/09}{4}
- Replace:
- ``running \u{heading}'' \>
- ``running \u{header}''
-
-\erroronpage{227}{para 3,l.1}{HjG}{2005/05/09}{4}
- Replace:
- ``the \u{heading} is extended'' \>
- ``the \u{header} is extended'' \>
-
-\erroronpage{229}{2.-1}{CBC}{2004/05/24}{2}
- Change: ``if the first B-head\ldots would have already been'' \> ``if
- the first B-head\ldots had already been''.
-
-\erroronpage{229}{para -2,l.-2}{HjG}{2005/05/09}{4}
- Replace:
- ``the \u{heading}'' \>
- ``the \u{header}''
-
-\erroronpage{230}{exa 4-4-3}{HjG}{2005/05/09}{4}
- Add |%| character:
- ``|\fancyfoot[R]{\scriptsize\today}|\texttt{\u{\char`\%}}''
-
-% not a bug, but heh ho
-\erroronpage{232}{ll.1/2}{HjG}{2004/06/03}{2}
- Add words: ``With a similar mechanism we prepared \u{the running
- headers of} the index for this book.''
-
-\erroronpage{232}{ll.1/2}{CKr}{2004/11/17}{4}
- Remove surplus: ``With a similar mechanism we prepared \u{the} the running\ldots''
-
-\seriouserroronpage{234}{First boxed command}{CBC}{2004/05/24}{2}
- Change: ``\verb=\enlargethispage*{=size\verb=}='' \>
- ``\verb=\enlargethispage{=size\verb=}=''.
-
-\erroronpage{237}{para 1, l.3}{MKo}{2004/08/06}{2}
- Change: ``\textsf{scrpage}'' \> ``\textsf{scrpage2}''
-
-\erroronpage{237}{para 4, l.3}{DAl}{2005/01/11}{4}
- Change: ``also works as \u{an} replacement'' \> ``also works as
- \u{a} replacement''
-
-\erroronpage{237}{para 5, l.2}{CBe}{2004/07/27}{2}
- Change: ``14pt'' \> ``17pt''
-
-
-\CHAPTER{Chapter 5}
-
-\erroronpage{239}{para -1, l.1}{HjG}{2004/06/03}{2}
- Extra word: ``After \u{a} taking a quick look \ldots''
-
-\erroronpage{241}{Example 5-1-1}{CBC}{2004/05/24}{2}
-
- Change: ``esprit trouble'' \> ``esprit troubl\'e''.
-
-The whole example has been changed to better demonstrate
-the \verb|\kill| command.
-
-\erroronpage{242}{para -2}{DSch/FMi}{2005/09/19}{4}
- Replace para with:
-``The \texttt{tabular*} environment has an additional width argument that
-specifies the required total width of the table.
-It needs stretchable spaces between columns, that have to be added using
-|\extracolsep| (see page~246).''
-
-\iffalse
-%% check, maybe (if other error
-\erroronpage{243}{para 1, l.3/4}{HjG}{2004/06/03}{}
- Change: ``Their scope can be \u{general} or local.''
- \> ``\u{global}''
-\fi
-
-\erroronpage{243}{}{CBe}{2004/07/27}{4}
- The explanation of the command \comando{\arraystretch} is
- wrong; in fact it does not multiply the inter-row space by the specified
- factor, so that a factor of 1.5 would move the rows 50\% farther apart.
- \comando{\arraystretch} scales by the specified factor the height and depth of
- the invisible strut that is in the first cell of every row of tabular and array
- environments. If all the cells of the row are smaller than the strut the effect
- is more or less similar to an enlargement of the inter-row space, while if at
- least one cell in the row is larger than the strut no spreading apart takes
- place other than that required by the largest cell.
-
-
-
-\erroronpage{243/244}{tab.~5.1/5.2}{HjG}{2004/06/03}{2}
- In the left columns of these tables, typewriter font should be used
- for the braces, to better match the appearance in the syntax boxes.
-
-\erroronpage{244}{tab.~5.2}{HjG}{2004/06/03}{2}
- 1. In the |m| row, the braces in |\parbox|\u{\{}\emph{width}\u{\}}
- are not from the typewriter font, as they are in the |b| row.\\
- 2. In the |>| and |<| rows, the |p|, |m|, and |b| options are
- listed once without and once with their |{..}| arguments.
-
-\seriouserroronpage{244}{para -1, l.3--4}{FMi/DCa}{2005/02/05}{4}
- Replace: ``the sum of its value,
- added to the product
- |\baselineskip|${}\times{}$|\arraystretch}|''
- \>
- `` $|\arraystretch| \times (|\extrarowheight| + 0.7 |\baselineskip|)$''
-
-
-\erroronpage{246}{para 3}{FMi}{2005/09/19}{4}
- Add blue marginal note: ``Making \texttt{tabular*} stretch to the
- required width''
-
-\erroronpage{246}{para 3, l.3/4}{HjG}{2004/06/03}{2}
- Change:
- ``The use \ldots\ is subject\u{ed} to two restrictions: \ldots''
- \> ``\ldots~subject \ldots''
-
-\erroronpage{247}{exa 5-2-9}{CBe}{2004/07/27}{2}
- Add hyphenation points for |Possibi\-li\-t\'es|
-
-\erroronpage{248}{para 1}{FMi}{2005/09/19}{4}
- Replace para with: ``A
- common use of |@{}| is to remove the space equal to
-the value of |\tabcolsep| (for \texttt{tabular}) that, by default,
-appears on each side of the table,
-except when the column specification starts or ends in a \verb=|=.''
-
-
-\erroronpage{249}{exa 5-2-11}{FMi}{2004/07/27}{2}
- Add hyphenation points for |Possibi\-li\-t\'es|
-
-\seriouserroronpage{249}{l.-2}{HjG}{2004/06/03}{2}
- Change:
- ``\ldots\ the \textsf{array} package \texttt{m} and \u{\texttt{t}}
- types, \ldots''
- \> ``\ldots\ \u{\texttt{b}} \ldots''
-
-\erroronpage{252}{para 2, l.3}{HjG}{2004/06/03}{2}
- Missing word: ``\ldots\ the last entry in \u{a} row \ldots''\\
- Missing word: ``This specification may \u{be} saved \ldots''
-
-\erroronpage{252}{para 3, l.1}{HjG}{2004/06/03}{2}
- Either add: ``The |X| columns are set using the |p| column
- \u{type}, \ldots''\\
- or change (cf.~l.2: an |m| column): ``\ldots\ using \u{a} |p|
- column \ldots''
-
-\seriouserroronpage{257}{syntax box~2}{HjG}{2004/06/03}{2}
- Typo: ``\texttt{\char`\\botto\u{m}caption}''
-
-\erroronpage{261}{para 3, l.3}{HPB/FMi}{2004/07/16}{2}
-Add: ``\ldots may be typeset using
- \u{the packages \textsf{array} and} \textsf{longtable} \ldots''
-
-\erroronpage{262}{para -1, l.2}{HjG/FMi}{2004/06/04}{2}
- Missing characters:
- ``in standard \LaTeX{}\u{'s} \textsf{article} class''
-
-\erroronpage{270}{exa 5-6-7}{DCa}{2004/07/22}{2}
- Spurious `` d'' after ``Beef'' should be deleted.
-
-\seriouserroronpage{270}{para 3 l.1}{UFi}{2004/07/31}{2}
- Change: |\botrule| \> |\bottomrule|
-
-\seriouserroronpage{271}{para 3}{FMi}{2004/12/17}{4}
- Replace para by: ``By default, the rule extends all the way to the left, but is
- ``trimmed'' from the rightmost column by the length specified in the
- length parameter |\cmidrulekern|. The optional (\emph{trim})
- \u{argument may contain the characters
- \texttt{l} and \texttt{r},
- indicating that the rule}
- \u{is to be trimmed from the left or right, respectively.}
- Each \texttt{l} and \texttt{r} may optionally be followed by a width
- argument \u{specified using \texttt{\{}\emph{widths}\texttt{\}}},
- in which case the rule is trimmed by this amount rather than by the default
- |\cmidrulekern|.
-
-
-\seriouserroronpage{271}{syntax box~1}{HjG}{2004/06/04}{2}
- Argument is optional, not mandatory:
- |\addlinespace|\texttt{\u[}\emph{width}\texttt{\u]}
-
-\erroronpage{273}{para 3, l.3}{HjG}{2004/05/26}{2}
- Missing word: ``not accounted for \u{by} |\multirow|''
-
-\seriouserroronpage{278}{para 2, l.-1}{HjG}{2004/05/26}{2}
- Replace: ``Section 6-3-4'' \> ``Example 6-3-4''
-
-\erroronpage{279}{list, item 1}{CKr}{2004/11/30}{4}
- Correct typo: ``forced line b\u{r}eaks.''
-
-
-
-\CHAPTER{Chapter 6}
-
-\erroronpage{283}{para 2, l.5--8}{FMi}{2005/01/15}{4}
-Replace with: ``We then continue by
- explaining how you can define and use your own floating environments (Section~6.3.1),
- or, conversely, how captioning commands can be used to enter
- information into the list of figures and tables for nonfloating
- material (Section~6.3.2).
- Then methods for rotating the content of a float are described
- (Section~6.3.3).
-
-\erroronpage{284}{}{FMi}{2005/01/15}{4}
- Editorial comment: needs reprinting since one line moved from
- 283 to the current page.
-
-\erroronpage{285}{item 3, l.3}{FMi}{2005/02/13}{4}
- Use typewriter: ``the default is \texttt{12pt}
- \texttt{plus} \texttt{2pt} \u{\texttt{minus}}
- \texttt{2pt} for 10\,pt''
-
-\erroronpage{285}{item 3, l.3}{HjG}{2005/02/06}{4}
- Default for 12pt document size is given wrong:\\
- ``\texttt{\u{14pt} plus 2pt minus 4pt}'' \>
- ``\texttt{\u{12pt} plus 2pt minus 4pt}''
-
-\erroronpage{285}{item 3, l.4}{HjG}{2004/06/05}{2}
- Should be singular: ``for 12pt document size\u{s}).''
-
-\erroronpage{285}{item 7, l.3}{HjG/FMi}{2005/02/06}{4}
- Replace (as it is rubbish):
- ``(the default is like |\textfloatsep| on a text page,
- but is |8pt plus 2fil| on a page that contains only floats)'' \>\\
- ``(the default is like |\textfloatsep|)''
-
-\erroronpage{288}{para -1, l.4--7}{DAr/FMi}{2004/07/23}{2}
- Replace part with:
-``However, by itself this option
-forces all floats to appear \emph{before} the next section material is
-typeset, since the |\FloatBarrier| prevents a float from a current
- section from appearing below
-the start of the new section, even if some material of the current
-section is present on the same page. ''
-
-\erroronpage{292}{para 4, ll.1/2}{HjG}{2004/06/05}{2}
- Replace: ``combination \u{to}'' \> ``combination \u{of}''
-
-\seriouserroronpage{292}{para -1, l-2}{FMi}{2005/01/08}{4}
-Add sentence:
- ``Because the float styles define the placement of the caption,
-floats can contain only a single \verb=\caption= command which is a
-restriction compared to standard \LaTeX's behavior.''
-
-Also add marginal warning: ``Only one \verb=\caption= supported''
-
-
-\erroronpage{293}{para 1, l.3}{J-CCh}{2005/06/01}{4}
-Remove surplus char: ``package documentation in
-\texttt{float\u{s}.dtx}.''
-
-\seriouserroronpage{293}{exa 6-3-1}{HjG/FMi}{2004/06/05}{2}
- Wrong command used (or misplaced opening brace) in preamble code:\\
- |\newcommand\xmlcode[1]{\|\u{\ttfamily ttfamily}|{#1}}|
- \>\\
- |\newcommand\xmlcode[1]{\|\u{\ttfamily texttt}|{#1}}| \\
- only by chance this doesn't do any harm in the example!
-
-\erroronpage{293}{exa 6-3-1}{CBe}{2004/07/27}{4}
-The Euler constant must be typeset in roman type according
-to the ISO rules; $e$ is the charge of the electron.
-
-\erroronpage{294}{exa 6-3-3}{HjG/FMi}{2004/06/05}{2}
- The picture (|rosette.ps|) is clipped a tiny bit at the left side.
- That's actually an error in the |.ps| file itself and can be seen
- in all other examples where the file is used.
-
-\erroronpage{295}{para -2, l.3}{HjG}{2004/06/05}{2}
- Missing word: ``The |[H]| \u{float} is \ldots''
-
-
-\erroronpage{298}{para 1, l.4}{AMa}{2005/01/13}{4}
- The word ``caption'' should be should typeset in sans serif.
-
-\seriouserroronpage{298}{para 3, l.5}{HjG}{2004/06/06}{2}
- Missing argument: ``|\newfloat{XMLexa}|%
- \u{\texttt{\textbraceleft\meta{placement}\textbraceright}}|{lox}|''
-
-\erroronpage{299}{para 2, ll.-2/-1}{HjG}{2004/06/06}{2}
- Missing word: ``so that it \u{is} not worth''
-
-\erroronpage{301}{exa 6-4-2}{HjG}{2004/06/06}{2}
- Misspelled word (both in source and output):\\
- ``\texttt{ex-\u{s}ample}'' \> ``\texttt{ex-ample}''
-
-\seriouserroronpage{302}{para 2, l.4}{HjG}{2004/06/06}{2}
- Missing argument: ``|\newfloat{XML}|%
- \u{\texttt{\textbraceleft\meta{placement}\textbraceright}}|{lox}|''
-
-\erroronpage{304/305}{exa 6-4-4}{HjG}{2004/06/06}{2}
- The |\FIG| command is different from the one from
- exa 6-4-3 (p.303).
- Add a line:\\
- |\newcommand\FIG{\includegraphics[width=10mm]{elephant}}|\\
- in the preamble part of the example's source.\\
- (But that will probably spoil your hand-optimized page breaks. ---
- Actually it will improve them: by getting the example larger on
- line will carry over from 304 to 305 avoiding the widow there
- without changing that page otherwise)
-
-\erroronpage{307}{l.-4}{HjG}{2005/02/12}{4}
- Surplus closing brace:\\
- ``|\makebox[\linewidth][c]{\usebox\@tempboxa}|%
- |\par|\texttt{\u\textbraceright}|% single line|''
-
-\iffalse
-\erroronpage{307}{l.3--4}{CBe}{2004/07/27}{}
-The Runaway error may be explained in a better way: the
- \emph{short-text} cannot exceed one paragraph; the \emph{long-text} may be
- several paragraphs long; if the optional argument \emph{short-text} is missing
- the \emph{long-text} replaces it, therefore the macros that should process the
- single paragraph \emph{short-text} get terribly shaken and produce the Runaway
- argument error. A reference to Appendix~B and the long\slash short definition
- of commands should be helpful.
-\fi
-
-\erroronpage{309}{para 4, l.3}{DAl}{2005/06/29}{4}
- Missing comma: ``\ldots you will get a typical ``standard \LaTeX''
- format\u{,} that is, \ldots''
-
-\erroronpage{312}{\texttt{position} option}{JS/FMi}{2005/09/14}{4}
- State that key \texttt{bottom} is the default.
-
-\erroronpage{312}{para 2, l.2}{DAl}{2005/06/29}{4}
- Word in wrong position: ``for example, ``above'' the caption if
- caption is \u{the} placed at the bottom.''
- \>
- ``for example, ``above'' the caption if \u{the} caption is \ldots''
-
-\erroronpage{317}{para -4, l.1}{HjG}{2004/06/06}{2}
- Extra letter: ``The \textsf{subfig} package\u{s} \ldots''
-
-\erroronpage{319}{para 1, l.5}{C-JCh}{2005/06/10}{4}
- Incorrect right quote: ``numbers like ``11.3\u{''}\ldots''
-
-\erroronpage{319}{para 2, l.3}{C-JCh}{2005/06/10}{4}
- Incorrect right quote: ``such as ``Figure 1(a-c)\u{''}.''
-
-\erroronpage{321}{exa 6-5-13, l.2}{HjG/FMi}{2004/06/06}{2}
- Change value:
- ``|listofindent=4em|'' \> ``|listofindent=5em|''.\\
- Looks better and also makes description on page 320 correct.
-
-\erroronpage{321}{para 3, l.2}{UFi}{2004/07/31}{2}
-Remove: ``approach is to \u{to} specify\ldots''
-
-\erroronpage{326}{para -1, l.4}{DAl}{2005/07/14}{4}
- Missing letter: ``floats appear to\u{o} close to each other\ldots''
-
-
-
-\CHAPTER{Chapter 7}
-
-\erroronpage{332}{para -2,l.2}{THa}{2004/07/21}{2}
- SinCE SEriFS arE noT alwayS horizonTaL: ``Serifs are the tiny
- horizontal strokes\dots'' \> ``Serifs are the tiny strokes\dots''
-
-\erroronpage{338}{para -1, l.3}{HjG}{2004/06/29}{2}
- Missing word: ``command \u{and} declarative forms''
-
-\erroronpage{341}{para -2, l.-2}{HjG}{2004/06/29}{2}
- Missing comma: ``such as |\OE|\u, to lowercase).''
-
-\erroronpage{342}{tab 7.1}{CBe/FMi}{2004/07/27}{2}
- Add footnote: ``\textit{The actual sizes shown above are those specially
- tailored for use in this book}''
-
-\erroronpage{347}{para 2, l.5+6}{JS/FMi}{2006/11/08}{s}
-Replace: ``\u{Computer Modern Typewriter and}
-Computer Modern Sans \u{have} only bold extended variants.''
-\>
- ``\u{In contrast} Computer Modern Sans \u{has} only bold extended variants.''
-
-\erroronpage{349}{Table 7.4}{AFV}{2008/08/08}{}
-The font associated with the command |\mathtt| is a sans typewriter font. This
-differs from nearly all TeX set ups where the math typewriter font is Computer
-Modern Typewriter.
-
-\erroronpage{349}{para -1, l.2}{HjG}{2004/06/29}{2}
- Missing comma:
- ``\ldots\ where commands, such as |\rm|\u, would cause \ldots''
-
-\erroronpage{351}{para -2, l.5}{HjG}{2004/06/29}{2}
- Surplus word:
- ``\ldots\ belongs to the text \u{the} surrounding the formula.''
-
-\erroronpage{353}{para 4, l.2}{HjG}{2004/06/29}{2}
- Replace:
- ``\u{Extended} Computer Modern'' \>
- ``\u{European} Computer Modern''
-
-\erroronpage{354/355}{marginal 3}{FMi}{2004/04/23}{2}
- Should be on top of page 355.
-
-\erroronpage{354}{table caption}{AFV/FMi}{2009/01/5}{}
- Replace: ``Classification of the Computer Modern font families'' \>
- ``Classification of \u{most} Computer Modern font families''
- as not all fonts are listed.
-
-\erroronpage{355}{para 4, l.2}{HjG}{2004/06/29}{2}
- Missing character: ``on\u{e} can simply exchange''
-
-\erroronpage{356}{para 2, l.2}{HjG}{2004/06/30}{2}
- Correct: ``\u{ZE}-fonts'' \> ``\u{EZ}-fonts''
- (Index entry is OK!)
-
-\erroronpage{357}{exa 7-5-5, last line}{RSt}{2004/05/26}{2}
- Reference [174] instead of [175].
-
-\erroronpage{357}{exa 7-5-5}{HjG}{2004/06/30}{2}
- Add page entries for ``Clasen, Matthias'', ``Vieth, Ulrik'', and
- ``Ziegler, Justin'' to ``People'' index (pp.1080+1082)
-
-\erroronpage{357}{l.-2}{HjG}{2004/06/30}{2}
- Add word:
- ``Clearly, no one wants to type \u{text} like this \ldots''
-
-\erroronpage{358}{para -1, l.1}{HjG}{2004/06/30}{2}
- Change word order:\\
- ``The list of \u{currently} \u{supported encodings} by
- \textsf{inputenc} \ldots'' \>\\
- ``The list of \u{encodings} \u{currently supported} by
- \textsf{inputenc} \ldots''
-
-\erroronpage{359}{several places}{MKu/FMi}{2004/06/24}{2}
- Replace: ISO-8859 \> ISO 8859
-
-\erroronpage{360}{item 8}{CKr}{2004/12/30}{4}
- Replace: Next Computer encoding \> Ne\u{XT} Computer encoding
-
-\erroronpage{360}{item 9}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8
-
-\erroronpage{360}{para -1}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8 (several times)
-
-\erroronpage{361}{para 2+3}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8 (several times)
-
-\erroronpage{361}{l.-14}{CBe/FMi}{2004/07/27}{2}
- Replace: ``preamble or the document class'' \>
- ``document class, a package, or in the preamble''
-
-
-\erroronpage{362}{l.1}{HjG}{2004/06/30}{2}
- Swap phrases:\\
- ``\ldots\ the user \u{in the preamble} \u{to load still
- more encodings}.'' \\\>\\
- ``\ldots\ the user \u{to load still more encodings}
- \u{in the preamble}.''
-
-\erroronpage{362}{para 1, l.1}{SCo}{2004/05/17}{2}
- Printing problem in some books: ``still'', second `l' only half visible.
-
-\erroronpage{367}{para 2, l.3}{CKr}{2005/01/03}{4}
- Wrong font: ``old-style numerals by simply switching to the \u{\texttt{TS1}}''
-
-\erroronpage{368}{para -4, l.3}{HjG}{2004/07/01}{2}
- Change:\\
- ``\ldots\ only. \u{Only} real errors will be shown.'' \>\\
- ``\ldots\ only. \u{However,} real errors will be shown
- \u{on the terminal}.''
-
-\erroronpage{370}{para 2, l.-1}{RSt}{2004/05/26}{2}
- Replace: ``ran run'' with ``\u{you ran}''.
-
-\erroronpage{370}{para 4, l.5}{HjG}{2004/07/06}{2}
- Add: ``\ldots\ in one of the three \u{text font} categories.''
-
-\erroronpage{371}{para 1, l.4}{HjG}{2004/07/06}{2}
- Add: ``\ldots, such as via a call to |\usefont|\u{ (see Example
- 7-6-1 below)}.''
-
-\erroronpage{373}{first line of 7.6.1}{UFi}{2004/07/31}{2}
- Remove ``the \u{the} fonts''
-
-\erroronpage{373}{first para, l.-1}{BeB}{2004/06/28}{2}
- ``collection'' is (at least seems to me) singular:\\
- Typo: ``appear'' \> ``appears''
-
-\erroronpage{374}{`Bookman', l.1}{HjG}{2004/07/08}{2}
- Typo: ``Bookman was originally design\u{ed} \ldots''
-
-\seriouserroronpage{380}{para 1, l.4--5}{BMo}{2004/05/16}{2}
- Better show octal numbers: ``\ldots starting positions like
- \texttt{'254}, \texttt{'266}, \texttt{'300}, and \texttt{'312}
- (i.e., in octal notation) in\ldots''
-
-\erroronpage{380}{exa. 7-6-10}{J-CCh}{2005/07/06}{4}
- Replace: AGEWMET\u{P}HTOS \> AGEWMET\u{R}HTOS
-
-\erroronpage{386}{para -1, l.2}{RWa}{2004/05/31}{2}
- Replace ``the X Window\u{s} system'' with ``the X Window \u{S}ystem''.
-
-\erroronpage{387}{para -1, ll.3/4}{HjG}{2004/07/09}{2}
- Missing word: ``\texttt{0.87478} should \u{be} used''\\
-
-\iffalse
-% no idea if we can fit that in:
-\erroronpage{387}{para -1, ll.3/4}{HjG}{2004/07/09}{}
- Value for 12\,pt?
-\fi
-
-\erroronpage{388}{tab. 7.14}{HjG}{2004/07/09}{2}
- Row~1: Thickness of vertical line between first two columns too
- wide (printing problem).
-
-\erroronpage{388}{tab 7.14, l.-2}{RPa}{2004/09/14}{4}
- Missing space between ``m,'' and ``bx'' in the middle column.
-
-\erroronpage{391}{tab. 7.15}{FMi}{2004/07/09}{2}
- Row~1: Thickness of vertical line between first two columns too
- wide (printing problem).
-
-\erroronpage{391}{tab 7.15, l.-2}{RPa}{2004/09/14}{4}
- Missing space between ``m,'' and ``bx'' in the middle column.
-
-\erroronpage{392}{tab 7.16, l.3}{RPa}{2004/09/14}{4}
- ``(bx)'' should be moved to the second column.
-
-\erroronpage{393}{tab 7.17, l.3}{RPa}{2004/09/14}{4}
- Missing space between ``(it),'' and ``sc'' in the third column.
-
-\erroronpage{395}{exa 7-7-20}{HjG}{2004/06/22}{2}
- Commands need to be swapped to match text:\\
- ``|\gothfamily| Swab'' \> ``|\swabfamily| Swab''\\
- ``|\swabfamily| Gothic'' \> ``|\gothfamily| Gothic''
-
-\erroronpage{395}{exa 7-7-21}{TSS}{2004/05/25}{2}
- The ``s'' in word ``dies'' should be the ``short s'' (ligature
- ``s:'') since it occurs in a syllable-final position.
-% others wrong???
-%According to page 765 of "The World's Writing Systems" (edited by P.T.
-%Daniels and W. Bright, ISBN 0-19-507993-0, Oxford University Press,
-%1996), a syllable-final "s" in fraktur text should be the "short s".
-
-\erroronpage{396}{para 3, l.5}{FMi}{2004/04/23}{2}
- Should be: ``\ldots on the \u{third} line.''
-
-\erroronpage{396}{exa 7-7-22}{TSS}{2004/05/25}{2}
- The ``s'' in word ``dies'' should be the ``short s'' (ligature
- ``s:'') since it occurs in a syllable-final position.
-
-\erroronpage{403}{para 1, ll.1/2}{HjG}{2004/07/09}{2}
- Change: ``by using \u{G}lyph \u{C}hart''
- \> ``by using \u{the} \u{g}lyph \u{c}hart''\\
- (cf.\ para 3, l.1)
-
-\erroronpage{405}{para 3, l.4}{HjG}{2004/06/22}{2}
- Missing word:
- ``of \u{the} International Phonetic Alphabet (IPA)''
-
-\erroronpage{405/406}{ll.-1/1/2}{HjG}{2004/06/22}{2}
- Move closing parenthesis:\\
- ``\ldots (based on \ldots\ by Donald Knuth, \ldots \u).'' \> \\
- ``\ldots (based on \ldots\ by Donald Knuth\u), \ldots \,.''
-
-\erroronpage{406}{exa 7-8-11}{HjG}{2004/07/09}{2}
- Add comma (?): ``|k\ae{}t|\texttt{\u,}''
-
-\erroronpage{407}{para -2, l.1}{BMo}{2004/05/16}{2}
- Missing word: ``With popular fonts designed for use with \TeX{},
- the euro symbol \u{is} usually available\ldots''
-
-\erroronpage{413}{para -2, l-1}{CBe}{2004/07/27}{4}
- ``local guide''; I believe this is an obsolete concept, dating back to
- the times when \TeX\ and \LaTeX\ were used on multitasking mainframes;
- commercial distributions might still have a ``local guide'', but I have never
- seen one.
-
-
-\erroronpage{414}{footnote}{hv}{2008/10/30}{}
-Replace: |\pcharpath| \> |\pscharpath|.
-
-These days the package |pst-char| has been integrated into |pst-text|.
-
-\erroronpage{416}{tab. 7.27}{HjG}{2004/07/09}{2}
- Uppercase vs.\ lowercase in entries for \texttt{T3} and
- \texttt{TS3}:\\
- ``\LaTeX{} \u{P}honetic \u{A}lphabet encoding'' $\leftrightarrow$\\
- ``\LaTeX{} \u{p}honetic \u{a}lphabet encoding''
-
-\erroronpage{417}{para 4, l.6}{HjG}{2004/07/10}{2}
- Correct case:
- ``\ldots\ in front of it. \u For example,''
-
-\erroronpage{418}{para 2, l.-2}{HjG}{2004/07/10}{2}
- Add:
- ``a typewriter font \u{in medium series} with italic shape''
-
-\erroronpage{420}{table 7.28}{CKr}{2005/04/08}{4}
- For consistency: ``narrow'' \> ``\u{N}arrow''
-
-\erroronpage{420}{para 1, l.6}{FMi}{2004/06/24}{2}
- Replace: ISO-9660 \> ISO 9660
-
-\erroronpage{426}{para 1, l.-2}{CKr}{2005/01/17}{4}
- Remove surplus: ``\ldots---other declarations that use this \u{the}
- font will benefit automatically.''
-
-\erroronpage{426}{para 1, last sentence}{CAR}{2005/01/22}{4}
- Replace with following sentence:
- ``This may seem like a strange usage but it has the advantage that when
- such additional
- fonts become available you will need to change
- only one font shape group declaration---all declarations that
- refer indirectly to these fonts will then benefit automatically.''
-
-
-\erroronpage{426}{para 5}{HjG}{2004/07/10}{2}
- Surplus word: ``\ldots, this function \u{it} writes \ldots''
-
-\erroronpage{426}{l.-2}{HjG}{2004/07/10}{2}
- Add word: ``The \u{third} argument''
-
-\erroronpage{428}{item 6}{CKr}{2005/01/18}{4}
- Replace: ``Specified the quad width'' \> ``Specifie\u{s} the quad
- width''
-
-\erroronpage{432}{para 4, l.9}{HjG}{2004/07/11}{2}
- Not plural: ``\ldots: the outer text size\u{s} and the three math
- sizes for this text size.''
-
-\erroronpage{433}{l.-10}{HjG}{2004/07/11}{2}
- Not start of a sentence, hence \> lowercase:
- ``\u{a}nd are usually placed in an \texttt{.fd} file.''
-
-\erroronpage{441}{para 5, l.1}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8
-
-\erroronpage{442}{footnote, l.2}{usw}{2005/01/11}{4}
- Sentence begins with lowercase 's'.
-
-\erroronpage{443}{para 1, l.1--2}{FMi}{2005/06/10}{4}
-Replace the parentheses with: ``(for the latter people sometimes use
-the single character \verb="=\,, but this is incorrect as it may
-produce a straight double quote, i.e., ")''
-
-\erroronpage{443}{para 3, l.4}{CKr}{2005/01/21}{4}
- Correct order: ``Instead, these commands have been implemented in
- \u{such a} way that \ldots''
-
-\erroronpage{444}{para 2, l.4}{DAl}{2005/08/01}{4}
- Missing word: ``\ldots associates the number 224 \u{with} the
-command |\alpha|.''
-
-\erroronpage{445}{para 4, ll.3--5}{HjG}{2004/07/12}{2}
- Move closing parenthesis:\\
- ``\ldots, which normally denote certain accents (i.e.,
- are encoding-specific commands, but \ldots\ environment\u).''
- \\ \> \\
- ``\ldots, which normally denote certain accents (i.e.,
- are encoding-specific commands\u), but \ldots\ environment.''
-
-\erroronpage{446}{footnote, l.1}{CKr}{2005/01/21}{4}
- Correct order: \ldots ``\textthreesuperior'' \u{was a}
- math glyph---comprehensible?
-
-\erroronpage{447}{Heading}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8
-
-\erroronpage{451}{para 4, l.2}{HjG}{2004/07/12}{2}
- Wrong number:
- ``\texttt{\u{'240}} octal'' \> ``\texttt{\u{'344}} octal''
-
-\erroronpage{453}{para 2, l.2}{DAl}{2005/08/01}{4}
- Missing word : ``\ldots an \emph{LICR-object} that is \u{to} be
-used whenever\ldots''
-
-\erroronpage{455}{para 3, l.-1}{JCh}{2004/07/17}{2}
- Typo (characters need to be swapped):
- ``L\u{CI}R'' \> ``L\u{IC}R''
-
-\erroronpage{457}{tab. 7.33}{HjG}{2004/07/12}{2}
- Wrong sort order (table rows need to be swapped):\\
- |\OE| $\leftrightarrow$ |\O| -- cf.\ |\o| and |\oe| on p.459
-
-\erroronpage{457}{tab. 7.33}{HjG}{2004/07/12}{2}
- Entry |\`i|: ``(\u{avail})'' \> ``(\u{alias})''
-
-\erroronpage{458}{\texttt{\string\copyright}}{FMi/usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\seriouserroronpage{458}{l. 27--30}{JLV}{2005/05/31}{4}
- Unfortunately |\guillemotleft|, |\guillemotright|, |\guilsinglleft|, and
- |\guilsinglright| have no ``default'' and only function in |OT1| if
- \textsf{babel} is loaded
-
-
-\erroronpage{458}{\texttt{\string\k} entries}{usw}{2005/01/11}{4}
- All |\k| entries should be |<constr.>| in LY1 encoding
-
-\erroronpage{459}{\texttt{\string\r A}}{FMi}{2005/04/09}{4}
- |\r A| is |<constr.>| in OT1 encoding
-
-\erroronpage{459}{\texttt{\string\r} entries}{usw}{2005/01/11}{4}
- All |\r| entries should be |<constr.>| in LY1 encoding
-
-\erroronpage{459}{\texttt{\string\textcelsius}}{usw}{2005/01/11}{4}
- Default from |constr./TS1|.
-
-\erroronpage{460}{\texttt{\string\textcopyright}}{usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\erroronpage{460}{\texttt{\string\textdiv}}{usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\erroronpage{460}{\texttt{\string\texteuro}}{usw}{2005/01/11}{4}
- Defined in the newer versions of the encoding (but not available in
- all fonts!)
-
-\erroronpage{460}{tab. 7.33}{HjG}{2004/07/12}{2}
- Wrong sort order (table rows need to be swapped):\\
- |\textdblhyphenchar| $\leftrightarrow$ |\textdblhyphen|
-
-\erroronpage{461}{\texttt{\string\textlnot}}{usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\erroronpage{461}{\texttt{\string\textpertenthousand}}{DAl}{2005/08/01}{4}
- Constructed in T1 encoding
-
-\erroronpage{461}{\texttt{\string\textperthousand}}{DAl}{2005/08/01}{4}
- Constructed in T1 encoding
-
-\erroronpage{461}{\texttt{\string\textpm}}{usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\erroronpage{461}{table, l. -12}{usw}{2004/05/24}{2}
- ``\verb=\textquotedblleft=" is indented by accident.
-
-\erroronpage{462}{\texttt{\string\texttimes}}{usw}{2005/01/11}{4}
- Natively available in LY1 encoding
-
-\erroronpage{462}{tab. 7.33}{HjG}{2004/07/12}{2}
- Wrong sort order (table rows need to be swapped):\\
- |\textthreequartersemdash| $\leftrightarrow$ |\textthreequarters|
-
-\erroronpage{463}{para 1, ll.1/2}{HjG}{2004/06/28}{2}
- Add: ``prior \u{to} 1990''
-
-\erroronpage{463}{para 1, l.2}{HjG}{2004/06/28}{2}
- Change:
- ``\ldots integrated in \u{1993})'' \>
- ``\ldots integrated in \u{1994})''
-
-
-\CHAPTER{Chapter 8}
-
-\erroronpage{465}{para 4, ll.2+4}{HjG}{2004/06/20}{2}
- Add page entry for ``Swanson, Ellen'' to ``People'' index
- (p.1082). \\
- Add page entry for ``Knuth, Donald'' to ``People'' index
- (p.1081).
-
- Editorial comment: no need for reprinting this page.
-
-
-\erroronpage{466}{para 2, ll.3+6}{HjG}{2004/06/20}{2}
- Add page entry for ``Spivak, Michael'' to ``People'' index
- (p.1082).\\
- Add page entry for ``Jones, David'' to ``People'' index
- (p.1081).
-
-\erroronpage{466}{para 3 l.1}{UFi}{2004/06/04}{2}
- Remove comma: ``Michael\u, would have been\ldots''
-
-\seriouserroronpage{468}{para 3, ll.10+11}{JTa}{2004/08/31}4{}
- Extra closing brace after the second argument of
- \texttt{\textbackslash newenvironment} on both lines.
-
-\erroronpage{471}{para 2, l.4}{VPe}{2004/06/02}{2}
- Extra word: ``\ldots this change \u{can} are discussed\ldots''
-
-\erroronpage{478}{exa 8-2-19}{CBe}{2004/07/27}{2}
-Poor Maxwell's equations! No doubt there are mathematical
- physicists or physical mathematicians that write Maxwell's equations that way.
- This is a good example for showing some capabilities of the
- \textsf{amsmath} package and its possible extensions by means of the
- \comando{\newenvironment} command, but it is an example where all possible ISO
- rules are violated! Physical equations deal with quantities, not with
- mathematical variables; and quantities have dimensions; as such they have to
- comply with the rules established by the Sisth\`{e}me International (SI) and the
- various obsolete ``cgm'' systems are officially deprecated; the partial
- derivative sign $\partial$ has exactly that meaning and it cannot substitute
- the ``nabla'' $\nabla$ sign; finally the $j$ symbol probably indicates the
- current density, but in an equation that does not comply with the ISO rules it
- might indicate the imaginary unit (which, on the opposite, is prescribed to be
- typeset in roman or upright shape as well as $\pi$); treating with vectorial
- quantities these should be well marked either with a vector math accent or
- must be set in bold italic; with variables depending from four quantities the
- apex for indicating the derivative is not univocal for specifying the quantity
- with respect to which the derivative is taken. I repeat: the example is good
- for describing the math extension capabilities but it could induce the casual
- reader to believe that this is the correct form for writing down the Maxwell's
- equations; unfortunately it is not.
-
-\erroronpage{480}{para -2, ll.8/9}{HjG}{2004/06/20}{2}
- ``(there must be no space before the \texttt[)'' --- why?\\
- (Would be ignored by \TeX{} as the end of the cs-name!)
-
- Deleted this text.
-
-\erroronpage{484}{para 3, ll.1/2}{HjG}{2004/06/20}{2}
- Add word: ``\ldots\ the \texttt{equation} \u{environment} is
-\ldots''
-
-\erroronpage{488}{para 1, l.2}{HjG}{2004/06/20}{2}
- Add word: ``\ldots\ as a subscript \u{or} superscript.''
-
-\erroronpage{488}{para 1, l.1}{FMi}{2005/04/23}{4}
- Replace word: ``Note that both \u{environments} \ldots''
- \> ``Note that both \u{structures} \ldots'' (as one is a command)
-
-\erroronpage{489}{para -2, l.3}{HjG}{2004/06/20}{2}
- Missing closing parenthesis: ``(see Section 8.5.3\u)''
-
-\erroronpage{489}{exa. 8-3-9.1}{DAl}{2005/08/21}{4}
- The third array actually only needs \texttt{c} as preamble even
- though \texttt{cc} is not wrong. as empty columns on the right are ignored
-
-\erroronpage{491}{para -2, l.3}{BMo}{2004/05/21}{2}
- Replace: ``aside'' \> ``at the side''
-
-\erroronpage{493--95}{ll.-1/-2}{HjG}{2004/06/21}{2}
- Perhaps a note regarding the defaults should be added:\\
- ``The first two parameters, \emph{ldelim} and \emph{rdelim}, are
- the left and right delimiters, respectively.
- \u{They must be either both empty or both non-empty;}
- \u{to place a single delimiter, use a period ``\texttt.'' on the
- ``empty'' side.}''
-
- Editorial comment: affects pagebreaks for 494/95 as well
-
-\iffalse % more blue align stuff
-\erroronpage{498}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-\erroronpage{499}{\S 8.6.2}{HjG}{2004/06/21}{2}
- Change section heading: ``Operator \u{and function} names''
-
-\iffalse % more blue align stuff
-\erroronpage{500}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-\erroronpage{501}{exa 8-6-4}{HjG}{2004/06/21}{2}
- Surplus word (in source comment):\\
- ``\texttt{\% the old \u{the} definition of \textbackslash csc}''
-
-\erroronpage{507}{footnote}{CKr}{2005/02/16}{4}
- Good try but wrong word: ``Technically this is due to the denominator being
- wider than the \u{numerator} in this case\ldots''
-
-\seriouserroronpage{508}{table 8.6, col.5}{FMi}{2004/04/23}{2}
- The bad alignment (in some books) of the blue color probably makes
- the illustrations in this column useless.
-
-\iffalse % more blue align stuff
-\erroronpage{510}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-\erroronpage{511}{marginal note}{MHe}{2004/05/22}{2}
- Swap words: ``\ldots change \u{the existing} math font
- set-up''
-
-\erroronpage{512}{para 3, l.6}{HjG}{2004/06/22}{2}
- Surplus closing brace:
- ``|\bm{\alpha}|\texttt{\u\textbraceright}''
-
-\seriouserroronpage{513}{Figure 8.1}{LSchu}{2004/05/22}{2}
- Text font is Times, but should be Computer Modern (rather
- embarrassing that).
-
-\erroronpage{513}{para 3, l.1}{HjG}{2004/06/22}{2}
- Change: ``In this section show a sample text'' \>\\
- ``In this section \u{we} show a sample text''
-
-\iffalse % more blue align stuff
-\erroronpage{513}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-\erroronpage{515}{para 1, l.3}{HjG}{2004/06/22}{2}
- Wrong reference: ``Figure~8.3'' \> ``Figure~8.2''
-
-\erroronpage{515}{para -1, l.1}{BMo/CAR}{2004/05/21}{2}
- Replace: ``The Metafont versions of Concrete Roman and Math\ldots''
- \> ``The Metafont versions of Concrete, both Roman and Math,\ldots''
-
-\seriouserroronpage{516}{fig.~8.6}{CKr/FMi}{2005/02/18}{4}
- The txfonts have the symbols |\succapprox| and |\precapprox| in the
- wrong position in the fonts.
- Until the fonts are corrected one can manually fix the problem by
- redeclaring them after loading the \texttt{txfonts} package, i.e.,
-\begin{verbatim}
-\usepackage{txfonts}
-\DeclareMathSymbol{\succapprox}{\mathrel}{AMSb}{119}
-\DeclareMathSymbol{\precapprox}{\mathrel}{AMSb}{118}
-\end{verbatim}
-
-\erroronpage{517}{footnote}{FMi}{2005/06/03}{4}
- Y\&Y has unfortunately folded and their domain was taking over by a
- seller for ``latex'' clothing (interesting isnt it?).
- Some information about Y\&Y can be found at
- \texttt{https://www.tug.org/yandy}.
-
-\seriouserroronpage{518}{fig.~8.9}{CKr/FMi}{2005/02/18}{4}
- The pxfonts have the symbols |\succapprox| and |\precapprox| in the
- wrong position in the fonts.
- Until the fonts are corrected one can manually fix the problem by
- redeclaring them after loading the \texttt{pxfonts} package, i.e.,
-\begin{verbatim}
-\usepackage{pxfonts}
-\DeclareMathSymbol{\succapprox}{\mathrel}{AMSb}{119}
-\DeclareMathSymbol{\precapprox}{\mathrel}{AMSb}{118}
-\end{verbatim}
-
-\erroronpage{521}{para 2, l.3}{HjG}{2004/06/26}{2}
- Missing interword space: ``Section\u~7.6.1''
-
-\erroronpage{521}{footnote}{FMi}{2005/06/03}{4}
- Y\&Y has unfortunately folded and their domain was taking over by a
- seller for ``latex'' clothing (interesting isnt it?).
- Some information about Y\&Y can be found at
- \texttt{https://www.tug.org/yandy}.
-
-\seriouserroronpage{523}{figure 8.16}{MHe}{2004/05/22}{2}
- The symbols to the left and right of ``Q(t)'' in the middle of
- the figure are wrong (this is
- actually a bug in the informal math set-up which has now been
- corrected).
-
-\erroronpage{523}{figure 8.16, caption}{BMo}{2004/05/21}{2}
- Replace: ``Info Math fonts'' with ``Informal Math fonts''.
-
-\erroronpage{523}{para 3, l.2}{HjG}{2004/06/26}{2}
- Change:\\
- ``The HV math fonts \u{are} designed at MicroPress'' \>\\
- ``The HV math fonts \u{have been} designed at MicroPress''
-
-\erroronpage{524}{para 1, ll.4--6}{HjG}{2004/06/27}{2}
- Change:\\
- ``This \u{package} extends the \ldots\ font collections\u{ and}
- should normally be loaded \ldots'' \>\\
- ``This \u{font} extends the \ldots\ font collections\u{; the
- corresponding \textsf{stmaryrd} package} should normally be loaded
- \ldots''
-
-\erroronpage{524}{para 2, l.7}{HjG}{2004/06/27}{2}
- The text states: ``\u{\raisebox{1ex}{\scriptsize(\emph{kernel})}}
- identifies symbols \ldots''. However, later on only
- ``\u{\raisebox{1ex}{\scriptsize(\emph{ker})}}'' is used.
- [E.g., Table~8.10 on page~527 (|\hbar|)
- and Table~8.11 on page~528 (|\angle|).]
-
-\erroronpage{524}{para 2, l.-3}{HjG}{2004/06/27}{2}
- The text speaks of ``Alphabetic symbols'' -- but the referenced
- Table~7.30 on page~435 calls it ``Alphabet character''~!?
-
-\erroronpage{524}{exa 8-9-1}{HjG}{2004/06/27}{2}
- The |fleqn| option is used, but in the output, the two equations
- seem to be right aligned rather than left aligned!\\
- Indeed true: this is because in \textsf{amsmath} the |\mathindent|
- added on the left is
- actually a rubber length (see page 471) that is automatically
- shortend if there is not enough space.
-
-\iffalse % more blue align stuff
-\erroronpage{524}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-
-\erroronpage{525}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-
-\erroronpage{526}{para -1, l.1}{CKr/FMi}{2005/02/20}{4}
-Change: ``The unaccented ASCII Latin letters and Arabic
- numeral digits (see Table~8.8) \u{all} referred to\ldots''
- \> ``\ldots \u{are} referred to\ldots''
-
-\erroronpage{527}{para 2, l.1}{HjG}{2005/05/21}{4}
- Replace:\\
- ``in the first \u{columns} of Table~8.9'' \>
- ``in the first \u{rows} of Table~8.9''
-
-\erroronpage{527}{para 2, l.5}{HjG}{2004/06/27}{2}
- Change:
- ``Similarly, the list of lowercase Greek letters \u{there is}
- no omicron'' \>\\
- ``Similarly, the list of lowercase Greek letters \u{contains}
- no omicron''
-
-\iffalse % more blue align stuff
-\erroronpage{528}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
- \erroronpage{527}{table 8.10}{BMo/CAR}{2004/05/21}{2}
- This table would be
- better if reordered, in particular so that the first row
- contains: \verb=\aleph \beth \gimmel \daleth=. This would
- make the this text correct: ``The first four [entries in
- table 8.10] are Hebrew letters.''
-
-
-\erroronpage{527,528}{table 8-10/11}{FMi}{2006/08/09}{s}
- Added the missing symbol from amssymb: |\circledR|, |\yen|,
- |\checkmark|, and |\maltese|.
-
- The general distribution of symbols between the two tables is a bit
- questionable, but this will stay as it is.
-
-\erroronpage{528}{table 8-11}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{528}{table 8.11}{LHe}{2008/02/08}{}
- |\dag| and |\ddag| are |\mathord|s not |\mathbin| as claimed in table
- 8.13.
-
-
-\seriouserroronpage{529}{table 8.12, l.3}{JGr}{2004/06/10}{2}
- \verb=\mathring{x}= is missing its accent.
-
-\erroronpage{529}{para 1, l.2}{CKr}{2005/04/24}{4}
- Replace: ``looked up |\neq|'' \> ``looked up |\ne|\u{\texttt{g}}''
-
-\erroronpage{530}{table 8-13}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{530}{table 8.13}{LHe}{2008/02/08}{}
- |\dag| and |\ddag| are not |\mathbin|s, hence don't belong in this table
- and they
- aren't (as claimed in legend) synonyms of |\dagger|
- and |\ddagger| respectively.
-
-\erroronpage{531}{table 8.15}{BMo/FMi}{2004/05/21}{2}
- The commands starting with |\var...| are only partially in blue to
- indicate their relationship with those commands missing the ``var'' in their
- names. But this is more confusing than helpful, so they are now made
- fully blue.
-
-\seriouserroronpage{531}{table 8.15}{CAR/FMi}{2004/06/05}{2}
- |\obar| is listed twice while |\obslash| (also from stmaryrd) is missing
-
-\erroronpage{531}{table 8-15}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\seriouserroronpage{532}{tables 8-16, 8-17}{HjG}{2004/07/13}{2}
- Since |\precsim| is not a negated symbol, it should be moved from
- Table~8-17 to Table~8-16, where its sibling |\succsim| already
- lives.
-
-\erroronpage{532}{tables 8-16/17}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{532}{table 8.17}{CKr}{2005/02/22}{4}
- Add: ``\ldots or, \u{if} flagged\ldots''
-
-\iffalse % more blue align stuff
-\erroronpage{533}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned.
-\fi
-
-\erroronpage{533}{tables 8-18/19}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\iffalse % more blue align stuff
-\erroronpage{534}{page}{FMi}{2004/04/23}{}
- Printing problem: blue color not properly aligned (horizontally).
-\fi
-
-\erroronpage{534}{table 8-20}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{534}{tab. 8.20}{HjG}{2004/06/28}{2}
- 1. |\hookleftarrow| is listed twice.\\
- 2. Some ``compound'' symbols have different line widths in their
- ``head'' and ``tail'' parts:
- |\Longleftarrow|, |\Longmapsfrom|, |\Longmapsto|, |\Longrightarrow|.
-
-
-\erroronpage{534}{table 8-21}{MBr}{2004/08/02}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{535}{table 8-22/23}{HjG}{2004/07/13}{2}
- Various deviations from alphabetical sort order of the table
- entries.
-
-\erroronpage{537}{table 8-27}{DIs/FMi}{2006/08/09}{s}
- Added the four missing delimiters from amssymb: |\llcorner|, |\lrcorner|,
- |\ulcorner|, and |\urcorner|. Updated the table note and galley text accordingly.
-
-
-\CHAPTER{Chapter 9}
-
-\erroronpage{540}{para -2, l.6}{MKu/FMi}{2004/06/24}{2}
- Replace: ISO-8859-x \> ISO 8859-x
-
-\erroronpage{540}{para -1, l.4}{FMi}{2004/07/20}{2}
-Plural: ``Clearly, 8 bits \u{are} not sufficient\ldots''
-
-\erroronpage{541}{para 1, l.-2}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8
-
-\seriouserroronpage{543}{table 9.1}{MHe/JBr}{2004/06/10}{}
- The Babel implementation on the CD is missing the australian and
- newzealand
- options. If you need them, download a new version of Babel.
-
-\erroronpage{543}{table 9.1}{JBr/WaS}{2004/07/31}{2}
- Replace: ``\texttt{english}, \texttt{USenglish}
- (\texttt{\itshape american}, \texttt{\itshape canadian}), \texttt{UKenglish}
- (\texttt{\itshape british}), \texttt{australian} (\texttt{\itshape
- newzealand})''
-
- Add footnote: ``\textit{The option \texttt{\upshape english}
- combines American hyphenation patterns
- with a British date format.}''
-
-
-\erroronpage{545}{exa 9-2-1}{JAn}{2005/09/09}{4}
- The quotes surrounding R\'ef\'erences and Chapitre
- should be the french ones: use |\og| and |\fg{}|. And similar those
- around German words should use |"`| and |"'|.
-
-
-\erroronpage{546}{para 3, l.4}{HjG}{2004/06/17}{2}
- Typo: ``pattern\u{s}''
-
-\seriouserroronpage{548}{para 2, l.4}{UFi}{2004/06/03}{2}
- Replace: |\aliasshorthand{"}{/}| should be \verb=\aliasshorthand{"}{|}=
-
-\erroronpage{549}{para 1, l.5}{HjG}{2004/06/17}{2}
- Characters should be in `typewriter font' (as in l.2):\\
- ``\,``;'' and ``?''\,'' \> ``\,``|;|'' and ``|?|''\,''
-
-\erroronpage{550}{para -2, l.1--2}{CKr}{2005/02/28}{4}
- Correct: ``Some are
- meant to ease typing, wher\u{e}as others\ldots''
-
-
-\erroronpage{551}{tab 9.3}{CBe}{2004/07/27}{}
- I am surprised that in Russian there is no word for ``Glossary''.
-
- Frank: It most certainly exits :-), but right now Babel doesn't
- know about it---so there is nothing we can do about it at the
- moment. Actually the same problem exists with Polish, although here
- I got a translation ``s\l{}ownik termin\'ow'' which will eventually
- find its way into Babel.
-
-\erroronpage{552}{exa 9-3-4}{CBe}{2004/07/27}{2}
- The words \texttt{i"lusio} and il$\cdot$lusio in the example are
- incorrect. They should be \texttt{i"lusi\string\'o} and il$\cdot$lusi\'{o}
- respectively %(ref: TB 14-3-252-259)
-
-
-\seriouserroronpage{553}{para 4}{UFi}{2004/06/03}{2}
-
- Replace with: ``Another popular shorthand is |"-|, which indicates a
- hyphenation point (like |\-|), but without supressing
- hyphenation in the remainder of the word:''
-
-\erroronpage{553}{exa 9-3-8}{FMi}{2004/06/03}{2}
- Replace the example body with:
-\begin{verbatim}
-\fbox{\parbox[t]{1cm}{minister"-president}} \quad
-\fbox{\parbox[t]{1cm}{minister\-president}} \quad
-\fbox{\parbox[t]{1cm}{ministerpresident}}
-\end{verbatim}
-to show the differences between |"-|, |\-|, and no hyphen.
-
-\erroronpage{553}{exa 9-3-9}{FMi}{2004/06/03}{2}
- Replace the example body with:
-\begin{verbatim}
-1. \present{Gutenberg-Universit"at}
-2. \present{Gutenberg"-Universit"at}
-3. \present{Gutenberg""Universit"at}
-4. \present{Gutenberg"=Universit"at}
-5. \present{Gutenberg"~Universit"at}
-\end{verbatim}
-
-\erroronpage{554}{para 4, l.2}{HjG}{2004/06/17}{2}
- Replace: ``|~n~|\meta{letter}'' \> ``|~n|''
- and ``|~N~|\meta{letter}'' \> ``|~N|''
-
-\erroronpage{554}{exa 9-3-11}{UFi/MGo}{2004/06/03}{2}
- Replace body with:
- ``|En fran\c{c}ais on doit mettre un \fg petit espace\fg\|
- |devant la ponctuation double: comme cela!|
- \ldots''
-
-\erroronpage{556}{item 2, l.3}{HjG}{2004/06/17}{2}
- Remove:
- ``\ldots\u{, with the addition that also \texttt{'u} and
- \texttt{'U} are made available}.''
-\iffalse
-auf s.556 unten (1. item) steht, dass der ' fuer Catalan mit allen
-vokalen verwendet werden kann; das gilt auch fuer Galician (2. item);
-deswegen macht der u.g. nebensatz wenig sinn, denn U gehoert ja zu den
-vokalen! -- war vielleicht 'N gemeint? (aber auch das wird bei
-Galician schon erwaehnt!)
-\fi
-
-\erroronpage{556}{para 4, l.2}{UFi}{2004/06/03}{2}
- Correct spelling: ``\ldots optional \u{because} the acute accent has\ldots''
-
-\erroronpage{557}{exa 9-3-19}{FMi/JBe}{2005/03/20}{4}
- Replaced the example text with a spanish example showing 3 levels of
- quotations.
-
-\erroronpage{558}{para -1, l.2}{UFi}{2004/06/03}{2}
- Add comma: ``day, month\u, year''
-
-\iffalse % alternative (but needs to change two pages)
- Replace:
- ``\ldots |\hebdate| to translate any Gregorian date, given \u{the three
- arguments \emph{day}, \emph{month},
- and \emph{year},}
- into a Gregorian date in Hebrew.''
-\fi
-
-\erroronpage{561--562}{para 2, l.-1; para 2, l.1}{BMo}{2004/05/16}{2}
- The number 999999 (and 1000, in the second instance) should not
- be written with a period as thousands-separator as this is
- confusing for readers used to a different convention.
-
-\erroronpage{562}{para 2, l.1+2}{FMi/DPa}{2004/07/24}{2}
- Change: ``digits \u{before the decimal point} are expressed'' \>
- ``digits \u{denoting multiples of a thousand} are expressed''
-
-\erroronpage{563}{l -18/-17}{CBe}{2004/07/27}{4}
-The non zero \texttt{lccode} for the apostrophe is not
- a speciality of the Italian language; this non null assignment is made at least
- also for Catalan and for French; it should be done for all languages that use
- the apostrophe for replacing an elided vowel.
-
-\seriouserroronpage{564}{table 9.5}{FMi}{2004/04/23}{2}
- Add a note that the definition of \verb=\th= conflicts with its standard
- definition as the LICR object ``\th{}'' (thorn).
-
-\erroronpage{564}{tab. 9.5}{HjG/FMi}{2004/06/18}{2}
- In the `Serbian' column, ``|\sh| sh'' is listed twice;
- replace the second instance with ``|\arsh| arsh''.
-
-\erroronpage{564}{para -1, l.5}{ERy}{2004/08/06}{2}
- Change: ``helpfull'' \> ``helpful''
-
-\erroronpage{565}{line 1}{JGr}{2004/06/16}{2}
- Missing space in: Anotherlayout
-
-\erroronpage{569}{l.-2}{HjG}{2004/06/18}{2}
- Misspelled name:
- ``Andrew Janishe\u{w}sky'' \> ``Andrew Janishe\u{v}sky''
- (This affects p.1081, too!)
-
-\erroronpage{571}{l.1}{HjG}{2004/06/18}{2}
- Replace: ``UNIX-like'' \> ``UN*X-like''
- (to match spelling elsewhere in the book)
-
-\erroronpage{571}{ll.3+4}{MKu/FMi}{2004/08/03}{2}
- Change: ``ISO-IR-111'' \> ``ISO-IR~111'' \\
- and ``ISO-IR-144'' \> ``ISO-IR~144''
-
-\erroronpage{571}{para 4}{HjG}{2004/06/18}{2}
- Code page ``|mnk|'' listed twice.
-
-%\erroronpage{572}{page}{FMi}{2004/04/23}{}
-% Printing problem: blue color not properly aligned.
-
-\erroronpage{573}{descr. env.}{HjG}{2004/06/18}{2}
- Items \texttt{T2B:} and \texttt{T2C:} ``Crimean~Tatar'' \> ``Crimean-Tatar''
-
-\erroronpage{573}{para 3, l.4}{HjG}{2004/06/18}{2}
- Typo: ``pac\u{ak}ge'' \> ``pac\u{ka}ge''
-
-\erroronpage{574}{para 6, l.1}{HjG}{2004/06/18}{2}
- Replace: ``The |cb| font use\u{s} \ldots''
- \> ``The |cb| font\u{s} use \ldots''
-
-\erroronpage{574}{para 7, l.2}{HjG}{2004/06/18}{2}
- Replace: ``translation'' \> ``transliteration''
-
-\erroronpage{575}{tab 9.7}{CBe}{2004/07/27}{2}
- I do not recognize my \texttt{grmn1000} font table; at least
- it is incomplete compared with the one that has been uploaded on CTAN in 2002,
- well ahead of the publication of this Second Edition.
-
- (Unfortunately an older tfm file was used so that some glyphs do not
- show up in the table)
-
-\erroronpage{576}{tab. 9.9}{HjG}{2004/06/18}{2}
- Replace: ``Diaresis'' \> ``Dia\u{e}resis''
-
-\erroronpage{576}{tab 9.9}{CBe}{2004/07/27}{2}
-|<'otan| does not produce the Greek word on its right,
- which was by mistake obtained with |<'o|\texttt{\'otan}
-
-\erroronpage{576}{tab 9.10}{CBe}{2004/07/27}{2}
- In the first line all the examples with upper case letters
- are wrong in the sence that these glyphs cannot appear in real text,
- hence they are removed.
- The last two lines are wrong with both lower and upper case
- letters. The former error implies a hiatus between an initial capital letter
- and a preceding vowel that by definition of ``initial'' is missing. The latter
- error is related to the fact that spirit and accent are separated, the former
- to the left of the vowel, the latter over the vowel.
-
- Part of the problems are due to a missing |\languageattribute{greek}{polutoniko}|.
-
-\erroronpage{579}{table 9.12, l.7}{HjG}{2005/06/02}{4}
- Remove extra right brace: ``|\fontfamily{fr}|\u{\texttt{\textbraceright}}''
-
-\seriouserroronpage{580}{example file \texttt{language.dat}}{WaS}{2004/06/14}{2}
- \u{\texttt{us}}\texttt{english} \> \texttt{\u{US}english}\\
- \u{\texttt{uk}}\texttt{english} \> \texttt{\u{UK}english}
-
-\seriouserroronpage{580}{\texttt{language.dat} on CD}{WaS}{2004/06/14}{}
-The language name problem, i.e.,
-
- \u{\texttt{us}}\texttt{english} \> \texttt{\u{US}english}\\
- \u{\texttt{uk}}\texttt{english} \> \texttt{\u{UK}english}
-
-is also present in the language.dat file on
-the book CD.
-
-\erroronpage{581}{para 2, l.2}{UFi}{2004/06/04}{2}
- Six "languages" are loaded ...: seven?
-
-\erroronpage{581}{para 1, l.2}{WaS/FMi}{2004/06/14}{2}
- Change: ``\ldots loaded first by INI\TeX{}; English in the example
- above).''
- \> ``\ldots loaded first by INI\TeX{}); for compatibility reasons this language
- should contain US-English hyphenation patterns.''
-
-\erroronpage{581}{para 2, l.2}{WaS}{2004/06/14}{2}
- Language names are to be corrected according to p.580.
-
-\iffalse
-% no space. do what? probably nothing right now
-\erroronpage{581}{para 2, l.3}{HjG}{2004/06/18}{}
- Add a footnote to explain the meaning of the term
- ``hyphenation trie''?
-\fi
-
-\erroronpage{583}{para 1, l.1}{HjG}{2004/06/18}{2}
- Wrong number: ``(line 32)'' \> ``(line 34)''
-
-\erroronpage{583}{para 1, l.3}{HjG}{2004/06/18}{2}
- Replace: ``\texttt{welsh.\u{sty}}'' \> ``\texttt{welsh.\u{ldf}}''
-
-\seriouserroronpage{585}{}{CBe}{2004/07/27}{2}
-The line:\\
- \comando{\adddialect\{austrian\}\{german\}}\\
- and the following one correspond neither to lines 102\textendash 103 of the language
- skeleton, nor to the grammar of the \comando{\adddialect} on page 584; this
- description as well as the skeleton file apparently require that the language
- name be preceded by \comando{\l@}; in facts, for example,
- the \texttt{germanb.ldf} contains the line:\\
- \comando{\adddialect}\comando{\l@austrian}\comando{\l@german}
-
-\seriouserroronpage{586}{code line 2}{TSS}{2004/05/26}{2}
- Extra closing brace after \verb|\def\germanhyphenmins|.
-
-\seriouserroronpage{589}{syntax box}{UFi}{2004/06/04}{2}
- Change: |\addto\csname[code]| \> |\addto\csname{code}| (wrong braces)
-
-\erroronpage{591}{para 1, l.5}{UFi}{2004/06/04}{2}
- Extra character: ``The third argument, \emph{ex\u{c}ec}, contains\ldots''
-
-\erroronpage{592}{para 3, l.2+4}{PPN}{2004/05/25}{2}
- Replace: ``Panday'' \> ``Pand\u{e}y'' (sorry)
-
-\seriouserroronpage{592}{para 3, l.3}{PPN}{2004/05/25}{2}
- Replace ``\textsf{bang}'' with ``\textsf{bengali}''. This
- package is available on CTAN in the \textsf{languages/bengali/pandey}.
-
-\seriouserroronpage{592}{para 3, l.4 }{PPN}{2004/05/25}{2}
- Replace ``\textsf{denag}'' with ``\textsf{devnag}''.
- This package is on CTAN \texttt{languages/devanagari/velthuis}.
-
-\erroronpage{592}{para 5, l.1}{CKr}{2004/10/15}{4}
- Replace: ``E\u{hit}opian'' \> ``E\u{thi}opian''
-
-\erroronpage{592}{general remarks}{PPn}{2004/05/25}{}
-Additional remarks not for inclusion in the book: For \TeX{}, \LaTeX{}
-in languages of India,
-there are several nice packages. An overview can be found in the
-following {\sc TUGboat} Articles;
-
-\begin{enumerate}
-\item Anshuman Pandey, \textsl{An overview of Indic Fonts for \TeX{}},
-{\sc TUGboat} Volume 19, Number 2 / June 1998 115---119
-\item Anshuman Pandey, \textsl {Typesetting Bengali in \TeX{}}, {\sc
-TUGboat} Volume 20, Number 2, June 1999 119---126
-\item C. V. Radhakrishnan, \textsl{A case for \TeX{} in India}, {\sc
-TUGboat} Volume 19, Number 1, March 1998, 6---9.
-\item Karel P\'{\i}\v{s}ka, \textsl{A conversion of public Indic fonts
-from METAFONT into Type I format with} {\sc TeX{}TRACE}, Volume
-23, Number 1, 2002, 70---73
-\item
-Yannis Haralambous and John Plaice, \textsl{Low-level Devan\=agari
-support for Omega-- Adapting {\sf devnag}}, i
-Volume 23, Number 1, 2002, 50---56
-\end{enumerate}
-
-In addition to these articles, TUGIndia has uploaded two
-\LaTeXe{} packages (i) Malayalam for \LaTeXe{}, and (ii) Kannada
-\LaTeX{}, both available from www.sarovar.org.
-
-A remark on {\sf devnag} package:-- Originally developed by Frans
-Velthuis in 1991, it was upgraded for use with \LaTeXe{} (made
-NFSS-complaint), and maintained by a team consisting of Dominik
-Wujastyk, John Smith, Anshuman Pandey, Fran\c{c}ois Patte, and
-Zden\v{e}k Wagner. Very recently, the project has
-been handed over to TUGIndia, for further development,
-and as of May 2004, it has moved from sourceforge.net to
-sarovar.org.
-
-
-
-\CHAPTER{Chapter 10}
-
-\erroronpage{chap.10}{boxed texts}{HjG}{2004/06/08}{2}
- In addition to what has been reported elsewhere, here's an overview
- of some more inconsistencies in (some of) the ``syntax boxes'' of
- this chapter. \\
- With parenthesized arguments, commas are part of the syntax;
- hence they should be set in `typewriter font' (???). \\
- The space after these commas should also be uniform.
- \\ \vspace{.5\baselineskip}
- %
- \begin{tabular}{@{}rrllp{44mm}@{}} \hline
- page(s) & box(es) & comma & space & remark \\ \hline
- 599 & & |\rm| & no & asterisk should be in |\tt| \\
- 602/3 & all & |\rm| & yes & ``...'' vs.\ ``\ldots'' \\
- 606 & 1 & |\rm| & no & ``...'' vs.\ ``\ldots'' \\
- 606 & 2 & |\it| & no & \\
- 607 & & |\rm| & yes & \\
- 608 & all & |\it| & no & \\
- 610 & 1--2 & |\rm| & yes & ``...'' vs.\ ``\ldots'' \\
- 616 & & |\it| & no & \raggedright
- also in text after box! \\
- (ll.1+5 in first para)
- \tabularnewline
- 639 & & |\it| & no & \\
- 641 & 1--2 & $^*$ & no & \raggedright
- $^*$various flaws; \\
- see separate error entry.
- \tabularnewline \hline
- \end{tabular}
-
-
-\erroronpage{596}{para 4, l.2}{HjG}{2004/06/07}{2}
- Replace: ``is the same as \u{those} produced''
- \> ``\ldots \u{that} \ldots''
-
-\erroronpage{597}{para -1, l.-4/-3}{HjG}{2004/06/07}{2}
- Replace: ``\ldots, in case \u{they are} changed''
- \> ``\ldots, in case \u{it is} changed''
-
-\erroronpage{597/598}{para -1, l.-2}{HjG}{2004/06/07}{2}
- Delete word: ``which again \u{that} expects one argument.''
-
-\erroronpage{599}{boxed text}{CAR}{2004/05/26}{2}
- The asterisk after |\fancyput| should be centred and the `(' and `)'
- should be in typewriter.
-
-\seriouserroronpage{599}{boxed text}{HjG}{2004/06/08}{2}
- Replace brackets by braces. (The \emph{horizontal-material}
- argument is not an optional, but a mandatory one.)
-
-\erroronpage{600}{para 2, l.4}{HjG}{2004/06/07}{2}
- Replace: ``\u{don't} work'' \> ``\u{does not} work''
-
-\erroronpage{600}{exa 10-1-12}{GBa}{2004/07/28}{2}
- The optional parameter ``[t]'' in the second example is printed as text
-in line (1).
-
- Remove in code: ``\texttt{[t]}''
-
- Append to previous paragraph: ``An optional position argument is not supported.''
-
-\erroronpage{601}{l.-17}{CBe}{2004/07/27}{2}
-Add word: Calculating the horizontal and vertical \u{distance}
-
-\erroronpage{602--603}{all boxed texts}{CAR}{2004/05/26}{2}
- All the parentheses `(' and `)' (9 pairs in total)
- should be in `typewriter font'.
-
-\erroronpage{604,605,609}{}{HjG}{2004/06/07}{2}
- On p.604 (l. -2) and p.605 (ll. 1, 2) we have ``|join|
- environment(s)''.\\
- On p.605 (ll. -6, -1) these are called ``|..join| environments''.\\
- On p.609 (para 3, l.5) it's ``|join| environments'' again.
-
-\erroronpage{606}{para 2, l.1}{HjG}{2005/05/16}{4}
- ``The \textsf{epic} \ldots'' \>
- either: ``\textsf{epic} \ldots''
- or: ``The \textsf{epic} package \ldots''
-
-\erroronpage{606}{para 3, l.1}{HjG}{2004/06/07}{2}
- Delete comma and move word:\\
- ``This command\u{, which} is a variant \ldots\ command, allows
- \ldots'' \>\\
- ``This command is a variant \ldots\ command, \u{which} allows
- \ldots''
-
-\erroronpage{606}{second boxed text}{CAR}{2004/05/26}{2}
- Brackets should also be in `typerwriter font'.
-
-\erroronpage{606}{para -1}{HjG/FMi}{2005/05/19}{4}
- The arguments ``\textit{$\Delta$width}'' and
- ``\textit{$\Delta$height}'' are mistakenly used in math mode. In
- the book that means a different font and different kerning.
-
-\erroronpage{606--608}{all boxed texts}{CAR}{2004/05/26}{2}
- All the parentheses `(' and `)' (9 pairs in total)
- should be in `typewriter font'.
-
-\erroronpage{609}{}{FMi}{2004/06/07}{2}
- Editorial comment: reprinted see earlier summary entries.
-
-\erroronpage{610}{first two boxed texts}{CAR}{2004/05/26}{2}
- All the parentheses `(' and `)' (6 pairs in total)
- should be in `typewriter font'.
-
-\erroronpage{612}{exa 10-1-25}{PYu/FMi}{2004/07/05}{2}
- The |\protect| in front of |\footnotesize| (twice) is not necessary.
-
-\erroronpage{613}{para 1, ll.2/3}{HjG}{2004/06/21}{2}
- Citations disrupt sentence!\\
- ``\ldots\ bundle [48,49] or [57, Chapter~6] for \ldots'' \> \\
- ``\ldots\ bundle \u{(see }[48,49] or [57, Chapter~6]\u)''\\
- and move the parenthesised citations to the end of the sentence.
-
-\erroronpage{614}{para 1, l.4}{HjG}{2004/06/07}{2}
- Missing closing quotes:
- ``the ``extended\u{\strut''} or ``enhanced'' \ldots''
-
-\erroronpage{615}{Tab.\ 10.1}{FMi}{2006/10/21}{s}
-The important driver ``vtex'' is missing. On the other hand
-some of the listed drivers are only of historical interest.
-
-\erroronpage{616}{boxed texts}{FMi}{2004/05/26}{2}
- Corrections as outlined in summary entry above.
-
-\erroronpage{618}{boxed text}{CAR}{2004/05/26}{2}
- Replace: ``\textit{key val list}'' \> ``\textit{key/val-list}''
- (also in following text).
-
-\erroronpage{619}{viewport}{BMo/FMi}{2007/10/20}{s}
- Explanation of \texttt{viewport} key changed to better explain that it only
- changes the space reserved but doesn't prevent printing the whole graphic
- (unless \texttt{clip} is used additionally)
-
-\erroronpage{620}{editorial change}{FMi}{2007/10/20}{s}
- Text changes on previous page results in different page break.
-
-\erroronpage{620}{para 1, l.1; para 2, l.1}{HjG}{2004/06/07}{2}
- Replace:
- ``the first \u{seven} keys'' \> ``the first \u{eight} keys''\\
- ``The first \u{nine} keys'' \> ``The first \u{ten} keys''
-
-\erroronpage{620}{para 5, l.2}{FMi}{2005/04/27}{4}
- Replace:
- ``\ldots in the \u{optional arguments}.'' \>
- ``\ldots in the \textit{key/val-list}.''
-
-%\erroronpage{621}{page}{FMi}{2004/04/23}{}
-% Printing problem: blue color not properly aligned.
-
-\erroronpage{623}{para 1, l.7}{HjG}{2004/06/07}{2}
- Delete word: ``some \u{of} key combinations''
-
-\erroronpage{623}{boxed text}{CAR}{2004/05/26}{2}
- Replace: ``\textit{key val list}'' \> ``\textit{key/val-list}''
- (also in following text).
-
-\erroronpage{630}{para 3, l.3}{UFi}{2004/06/01}{2}
- Replace: ``the next |\parbox| examples'' \> ``the next
- \u{\texttt{tabular}} examples''
-
-\erroronpage{631}{para.2, l.6}{FMi/HjG}{2006/10/22}{s}
- Ersetze: "`\u{This point} is shown \ldots"' \>
- "`\u{This} is shown \ldots"'
-
-\erroronpage{631}{para -1, l.-1}{JBr}{2004/08/02}{2}
- Replace: ``\textit{key val}'' \> ``\textit{key/val}''
-
-\erroronpage{632}{fig. 10.2}{HjG}{2004/06/07}{2}
- The horizontal extent of the box is called ``|length|'' \>
- probably better: ``|width|''.\\
- Missing standalone horizontal specs:
- ``|[l]|'' $\equiv$ ``|[lc]|'';
- ``|[r]|'' $\equiv$ ``|[rc]|''.
-
-\erroronpage{632}{boxed text}{CAR}{2004/05/26}{2}
- Replace: ``\textit{key val list}'' \> ``\textit{key/val-list}''
-
-\erroronpage{633}{para 1, ll.4/5}{HjG}{2005/05/16}{4}
- Add character: ``A matrix \ldots\ appear\u{s} below.''
-
-\erroronpage{633}{l.-2}{HjG/DPa}{2004/06/07}{2}
- Replace: ``The material in the section can be compared to
- Sebastian\ldots'' \>
- ``The material in this section is similar to that of Sebastian\ldots''
-
-\seriouserroronpage{633}{example}{HjG}{2006/10/21}{s}
- The first column shows incorrect output: instead of x=0mm it uses some
- internal default.
-
-\erroronpage{634}{editorial change}{FMi}{2006/10/21}{s}
- Fix on previous page will change page break.
-
-
-\erroronpage{637}{footnote 2}{FMi}{2004/06/12}{2}
- Bug in \texttt{url.sty} generated extra space.
-
-\erroronpage{639}{boxed text}{HjG}{2004/06/08}{2}
- The parentheses `(' and `)' should be in `typewriter font'.
-
-\erroronpage{640}{para -1, l.-2}{HjG}{2004/06/07}{2}
- ``the second |\vector| is truncated'' \>
- ``the second |\vector| is not rendered correctly''
-
-\erroronpage{641}{first two boxed texts}{HjG}{2004/06/08}{2}
- The parentheses `(' and `)' around ``x1,y1'' (3 pairs in total)
- should be in `typewriter font'.\\
- All coordinates should be in (math) italic with subscripts
- (cf., e.g., pp.607/610): $x_1$, $y_1$, $x_2$, $y_2$.
-
-\seriouserroronpage{641}{para 2 l.1}{UFi}{2004/06/01}{2}
- Replace: ``between points (x1,y2)'' \> ``between points (x1,\u{y1})''
-
-\erroronpage{641}{syntax boxes}{FMi}{2004/06/01}{2}
- The variable parts do not show the right fonts.
-
-\erroronpage{641}{para 3, l.1}{ReSt}{2005/04/17}{4}
- Remove: ``The |\Curve| command\u{s} is similar\ldots''
-
-\erroronpage{641}{para 3, l.2}{HjG}{2004/06/07}{2}
- Second occurrence of mandatory argument should use the same font as
- the first one, i.e., ``\textit{m}'' instead of ``\texttt{m}''.
-
-\seriouserroronpage{641}{para 4, ll.2/3}{HjG}{2004/06/07}{2}
- Change sentence:\\
- ``Like |\linethickness|, it is an absolute value \u{in points}
- (i.e., not affected by |\unitlength|)\u{ with the unit omitted}.''
- \>\\
- ``Like |\linethickness|, it is an absolute value (i.e., not
- affected by |\unitlength|)\u{, given in any of \LaTeX's units}.''
-
-\erroronpage{642}{item 6, l.2}{ReSt}{2005/04/28}{4}
- Remove: ``font information \u{information} to allow\ldots''
-
-\seriouserroronpage{643}{para 4, l.3}{MSc}{2004/06/04}{2}
- delete ``,and .gif''
-
-\erroronpage{643}{para 3, l.1}{FMi}{2005/11/11}{s}
- Unfortunately Th\`anh's name is misspelled. The correct spelling
- is ``H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh''.
-
-\erroronpage{643}{para 4, l.5}{CBe}{2004/07/27}{2}
-Add: ``\ldots can be converted to PDF by
-ImageMagick's \texttt{convert} utility\u{, \texttt{eps2pdf}} (\u{both
-of} which call \texttt{ghostscript}
-internally), \texttt{Acrobat Distiller}, or\ldots''
-
-\erroronpage{646}{l.1}{HjG/FMi}{2004/06/08}{2}
-Add:
- ``(If the \texttt{dvi} file contains more than one
-page several output files are generated.)''
-
-
-\CHAPTER{Chapter 11}
-
-\erroronpage{651}{1st example}{PYu}{2004/07/01}{2}
- ``Page 9 :'' should be typeset ``Page 9:''.
-
-\erroronpage{652}{2nd example}{HjG}{2004/06/10}{2}
- Missing colon: ``Page 22\u{\strut:}''
-
-\erroronpage{652}{l.-3}{HjG}{2004/06/10}{2}
- Surplus words: ``The latter case \u{is for} allows for \ldots''
-
-\seriouserroronpage{654}{para 2 l.7}{UFi}{2004/06/01}{2}
- Missing |}|: ``like
- |\index{\texttt{|\emph{key}|}|\u{\texttt{\textbraceright}} and''
-
-
-
-%That's a nice one: somehow the copy-editor has but the output is one
-%of the few remaining graphics in the book, sigh
-
-\seriouserroronpage{656}{figs. 11.3+4}{HjG}{2004/06/10}{2}
- The text on p.649, l.1 claims:
- ``Figures 11.3 and 11.4 on page 656 show the input and generated
- output of a small \LaTeX{} document, \ldots, together with the
- result of including the \textsf{showidx} package \ldots''
- This does not quite hold: There are some differences in the text
- and the output of \textsf{showidx} contains some index entries not
- present in the source.
-
-\vspace{.5\baselineskip}
- %
-\hspace*{-100pt}\begin{minipage}[b]{\linewidth}
- \begin{tabular}{@{}lll@{}} \hline
- \multicolumn{3}{c}{Differences in the text} \\ \hline
- & source (fig. 11.3) & output (fig. 11.4) \\ \hline
- \S1 & \ldots actually written into that file \u{only} \ldots
- & \ldots actually \u{only} written into that file \ldots \\
- \S2 & \u{To} prepare the index \ldots
- & \u{In order to} prepare the index \ldots\\
- \S2 & \ldots, \u {such as} \ldots
- & \ldots, \u{like} \ldots \\
- \S3 & \ldots by \u{the index processor} \ldots
- & \ldots by \u{\texttt{makeindex}} \ldots \\ \hline
- \multicolumn{3}{c}{Missing index entries} \\ \hline
- & \multicolumn{2}{l}{include index} \\
- & \multicolumn{2}{l}{Final production run} \\
- & \multicolumn{2}{l}{makeindex@\texttt{makeindex} program
- \emph{(2nd instance)}} \\ \hline
- \end{tabular}
-\end{minipage}
-
-\vspace{.5\baselineskip}
-The source has now been edited to match the printed output.
-
-
-\erroronpage{656}{}{CBe}{2004/07/27}{s}
- How horrible the page rotated counterclockwise!
-
-\erroronpage{657}{\texttt{-p} item, l.-1}{HjG}{2004/06/10}{2}
- Add word: ``\ldots the three \u{special} cases \ldots''
-
-\erroronpage{660}{tab 11.1, note}{JMH}{2005/08/06}{4}
- Swap the words ``single'' and ``double''
-
-\iffalse
-% not a bug make it look nicer
-\erroronpage{661}{tab. 11.2, right col.}{HjG}{2004/06/10}{}
- Inter-line spacing in multiple-line entries ???\\(Keywords:
- |headings_flag|, |item_x1|, |delim_0|, |page_precedence|)
-\fi
-
-\erroronpage{661}{tab. 11.2, l.12}{JMH}{2005/08/06}{4}
- The identifier referred is ``\texttt{heading\_flag}'', but the
- description uses the word ``\texttt{flag}''.
-
-
-\erroronpage{662}{l.6}{RPa}{2004/09/14}{4}
- The |-p| option is described on page 657.
-
-
-% in short rnaRA is correct
-\seriouserroronpage{664/665}{para -2/-1}{HjG}{2004/06/10}{2}
- Confusion: default value of |page_precedence|:\\
- In para~\mbox{-2}, l.\mbox{-1}:
- ``\ldots; the default is |rRnaA|, as noted in Table~11.2 on
- page~661.''
- But in that table, ``|"rnaRA"|'' is given!\\
- In para~\mbox{-1}, l.\mbox{-2}:
- ``\ldots\ default |page_precedence| of |rnaRA| \ldots''!\\
- (Also note that the remarks on p.666, para~2, suggest |rRnaA|,
- referring to the same table as above.)
-
-Changed to consistently refer to rnaRA.
-
-page 666 changed to reflect rnaRA:\\
-`` \ldots\ assumes that pages numbered with lowercase Roman
-numerals precede those numbered with Arabic numerals, which in turn
-precede those numbered with the lowercase alphabet, uppercase Roman
-numerals and finally the uppercase alphabet.
-
-
-\seriouserroronpage{661/664-5}{}{FMi}{2005/08/14}{4}
-
- Confusion: the changes made in the second printing were wrong! The
- default for |page_precedence| is |rRnaA| after all. (Or more
- precisely: the program code shows |rnaRA| as the default but that
- value is never used and the program logic implements |rRnaA| -- what
- a mess.)
-
- Most of that section rewriten to better explain the limitations of
- MakeIndex in the area of ``funny'' page numbers.
-
-
-\seriouserroronpage{666}{para 4 l.5 and l.6}{UFi}{2004/06/01}{2}
- Add extra visual space in second index: ``Likewise,
- \verb*=\index{a space}= and
- \verb*=\index{a space}= produce\ldots''
-
-\erroronpage{668}{boxed text}{HjG}{2004/06/10}{2}
- Slight inconsistency (also in subsequent text: para~\mbox{-2}):
- File arguments named ``\emph{idx1 idx2 \ldots}'' -- as opposed to
- pp.~655 and~674, where they're named ``\emph{idx0 idx1 \ldots}''.
-
-\erroronpage{669}{para 3}{JS}{2004/07/24}{2}
- Since xindy ignores all macros, it has no problems at all with
- formatting macros, but more problems with macros producing text.
- Substituted this paragraph with:
-
- ``\texttt{texindy} ignores unknown
- \TeX{} commands by default under the assumption that they do not
- produce text. It also knows about typical text-producing commands
- like \verb=\LaTeX= and \verb=\BibTeX= and handles them correctly.
- If you have your own command definition that produces text, or if you
- use one supplied by a package, then the entry is sorted
- incorrectly. You will either need to specify an explicit sort key
- in your index entry, as in \verb=\index{prog@\Prog}=, or write a
- \texttt{xindy} style file with a merge rule, as explained in
- Section~11.3.4.
-
- Be aware that producing index entries in arguments of commands has
- its own pitfalls, e.g., in
- \verb=\command{Properties of \Prog\index{\Prog}}=.
- Then \LaTeX{} commands might be expanded
- before they are written to the \texttt{idx} file and the placement
- in the index will depend on the expansion of \verb=\Prog=.''
-
-\erroronpage{669}{para -2, l.3}{MKu/FMi}{2004/07/01}{2}% already done by fmi
- Add: ``\ldots \verb|\usepackage[latin1]{inputenc}| to all her
- documents \u{(or on recent Linux distributions the
- option \texttt{utf8})}, while\ldots''
-
-\erroronpage{669}{section 11.3.2, para 2, L.3}{JMH}{2005/08/06}{4}
-"*her* documents": why a female *her*?
-
-\erroronpage{670}{table 11.3}{TMW/JS}{2004/06/07}{2}
- texindy can only work with Latin scripts out of the box. Removed
- all other languages, and checked list of supported languages with
- current xindy ``\LaTeX{} Companion Release''.
-
-\erroronpage{671}{para 2}{JS}{2004/06/07}{2}
-Replace with: ``There are about 50 predefined languages available, 35 of them are
-readily usable with \texttt{texindy}. They are listed in
-Table~11.3 on the facing page; you select one of them with the
-\texttt{texindy} option~\texttt{-L}. The other predefined
-languages have non-Latin scripts, their usage is described in the
-\texttt{xindy} documentation.
-
-
-\erroronpage{672}{table 11.4}{TSS/JS/CAR}{2004/05/26}{2}
- The \verb|word-order| module has two essentially equivalent
- descriptions. The |letter-order| module doesn't mention that
- it's turned on by texindy option \texttt{-l}. Use ``so-called'' as
- an example for |ignore-hyphen|. Add table footnote ``When two
- entries are identical except for ignored characters, those
- characters are not ignored any more.''
-
-\erroronpage{673}{para 5, ll.2/3}{HjG}{2004/06/10}{2}
- Words need to be swapped:
- ``multiple \u{characters may} form a unit''
-
-\erroronpage{674}{para 1 l.1}{UFi}{2004/06/01}{2}
- Extra word: ``those \u{of} available''
-
-\erroronpage{674/675}{boxed text and item list below}{JS}{2004/07/24}{2}
- Add option |[-C codepage]|. Add explanation between option |-L|
- and |-q|: ``Use \textit{codepage} as internal base
- encoding for sorting. This is used for fine-grained control of language
- module selection, needed only for non-Latin scripts.''
-
-\erroronpage{675}{example code}{JS}{2004/07/24}{2}
- Exchange xindy example style file with one that works. (Half of the
- lines were problematic in subtle ways.)
-
-\erroronpage{679}{example 3, para after the source}{JMH}{2005/08/06}{4}
- \texttt{:define-attributes} \> \texttt{define-attributes}
-
-\seriouserroronpage{679}{descr of theindex}{DSch}{2005/05/23}{4}
- Comparing the code in TLC2 with \texttt{book.cls} made me realize
-that the |\columnsep| command must come \emph{before} |\twocolumn| in
-order to have the desired effect.
-
-\seriouserroronpage{680}{descr of theindex}{DSch}{2005/05/23}{4}
- Comparing the code in TLC2 with \texttt{book.cls} made me realize
-that the |\columnsep| command must come \emph{before} |\twocolumn| in
-order to have the desired effect.
-
-\erroronpage{680}{First code block}{AFV}{2006/01/13}{s}
- Correct: |\mark|\texttt{\u k}|both| \>
- |\markboth|
-
-\erroronpage{681}{para 1 of \S 11.4.3, l.2}{HjG}{2004/05/26}{2}
- Extra word: ``augments \u{the} \LaTeX's indexing mechanism''
-
-
-\CHAPTER{Chapter 12}
-
-\erroronpage{general}{several pages}{HVo/FMi}{2004/05/21}{}
- The German word ``Schuldrecht'' is incorrectly hyphenated as
- ``Schul\-drecht'' in several examples due to the fact that English
- hyphenation patterns are used unless the language is
- explicitly marked. This is a deliberate effect, see pages 719 and
- 733--734.
-
-\erroronpage{683}{para 3, l.1}{HjG}{2004/06/12}{2}
- Missing word:
- ``The chapter begins \u{with} a short introduction \ldots''
-
-
-\erroronpage{684/685}{exa 12-1-2, l.-2 of source}{BMo/FMi}{2004/05/16}{2}
- ``But then it might not'' should be ``But then they might not''
- for parallelism with the ``Multiple authors'' to which it is
- referring.
-
- Also changed: ``Multiple authors'' \> ``Entries with multiple
- authors''
- so that it is clear that not the authors are a problem (though
- come to think of it: given the example's authors\ldots)
-
-\erroronpage{685}{exa 12-1-1/2}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-
-\erroronpage{687}{para 1}{FMi}{2004/08/03}{2}
-Add: ``Depending on the layout produced by the class,
-it may result in \u{a normal space,} some extra space\u, or in starting a new line.''
-
-\erroronpage{688}{figure 12.1}{JMH}{2005/07/18}{4}
- Replace in first item: |\cite| \> |\citation|
-
-\erroronpage{690}{entry test97}{HjG/FMi}{2004/06/18}{2}
- Add ``\texttt{and others}'' to the author field. Otherwise the
- example explanations in chapter 13 (pages 793--797) are
- partially wrong.
-
- Editorial comment: This change will affect the output of a
- number of examples in chapter 12 as well.
-
-\erroronpage{691}{syntax box}{HjG}{2004/06/13}{2}
- Set commas in `typewriter font'
-
-\erroronpage{694}{para 3, l.2}{HjG}{2004/06/13}{2}
- Missing comma: `\,``see [2--3,7\u,13]''\,'
-
-\erroronpage{696}{para 1, l.1}{DAl}{2005/08/21}{4}
- Missing word: ``\ldots option \u{is} shown in Example 12-2-9\ldots''
-
-\erroronpage{697}{para 3, l.5}{HjG}{2004/06/13}{2}
- Move period: `\,``Ref\u{''.}\,' \> `\,``Ref\u{.''}\,'
-
-%%\erroronpage{702}{para 2, l.2}{BMo}{2004/05/16}{}
-%% ``Evidently'' does not seem to me to be quite the right word here.
-%
-% not convinced yet /FMi
-
-\erroronpage{705}{exa 12-3-17/18}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\erroronpage{705}{para 3, l.5}{TMi}{2004/08/27}{4}
- Replace ``Geophysics'' with ``Geophysical''.
-
-\erroronpage{707}{exa 12-3-22}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\erroronpage{707}{exa 12-3-22, l.-2 of source}{BMo}{2004/05/16}{2}
- ``But then it might not'' should be ``But then they might not''
- for parallelism with the ``Multiple authors'' to which it is
- referring.
-
- Also changed: ``Multiple authors'' \> ``Entries with multiple
- authors''
-
-
-\erroronpage{708}{para 3, l.6}{UFi}{2004/05/27}{2}
- Replace: ``situati\u{ui}n'' \> ``situation''
-
-\erroronpage{708}{para 4, l.1}{HjG}{2004/06/14}{2}
- Add: ``when using \u{the} \texttt{chicago} \u{\BibTeX\ style}.''
-
-\seriouserroronpage{710}{para 4, l.2}{BMo}{2004/05/16}{2}
- Replace:
- ``locate the printed version.'' \> ``locate the
- article within the journal.''
-
-\erroronpage{713}{para 1, l.3}{HjG}{2004/06/14}{2}
- Replace: ``|\citep|'' \> ``|\citealp|''
-
-\erroronpage{717}{para 1, l.4}{JMH}{2005/07/18}{4}
-Add word: ``If you \u{only} want to specify an \textit{annotator},
-\ldots''
-
-\seriouserroronpage{719}{para 4, l.-2/-1}{UFi}{2004/05/27}{2}
- Extra word: ``the \u{the} journal'' \\
- Correct explanation: ``\ldots the journal name\u{, volume number,}
- and year of publication, which is why we got ``TUGboat \u{10
- [}1989\u]''.''
-
-\seriouserroronpage{719}{syntax box}{HjG/FMi}{2004/06/14}{2}
- Order of optional arguments are like |\cite| (i.e., swapped):\\
- |\citetitle[|\emph{post-note}|]{|\emph{key(s)}|}| or
- |\citetitle[|\emph{annotator}|][|\emph{post-note}|]{|\emph{key(s)}|}|\\
- |\cite*[|\emph{post-note}|]{|\emph{key(s)}|}| or
- |\cite*[|\emph{annotator}|][|\emph{post-note}|]{|\emph{key(s)}|}|
-
-\seriouserroronpage{722}{para 2, ll.2/3}{HjG}{2004/06/14}{2}
- Correct explanation: ``\ldots is always ``author name, journal,
- \u{volume,} and year''.''
-
-\seriouserroronpage{723}{syntax box}{HjG/FMi}{2004/06/14}{2}
- Order of optional arguments are like with |\cite|:\\
- |\fullcite[|\emph{post-note}|]{|\emph{key(s)}|}| or
- |\fullcite[|\emph{annotator}|][|\emph{post-note}|]{|\emph{key(s)}|}|
-
-\erroronpage{726}{para 3, l.2}{HjG}{2004/06/14}{2}
- Delete comma:
- ``\ldots\ when used together\u, with \ldots''
-
-\seriouserroronpage{727}{para 3, l.-3}{JBe}{2004/06/01}{2}
- Replace: \texttt{\textbackslash jbnovarioref} \>
- \texttt{\textbackslash jbignorevarioref}
-
-\erroronpage{727}{examples 12-5-21/22}{FMi}{2004/06/03}{2}
- Not wrong, but it looks funny: due to the chosen example height the
- footnote from the previous page (not shown) is partially carried
- over so we get ``43311-7'' as the first item in the footnote. That
- is the last part of the ISBN number see example 12-5-20.
-
- Previous page enlarged by one line to avoid this.
- \verb|\AtBeginDocument{\enlargethispage*{\baselineskip}}|
- added to (hidden) preamble commands.
-
-\erroronpage{729}{para 1, l.-1}{HjG}{2004/06/14}{2}
- Correct: ``to ``Ibid.\u{, \S\,3}''.''
-
-\seriouserroronpage{730}{example 12-5-28}{UFi}{2004/05/27}{2}
- Citation 7 and 8 are similar, but the description above says
- something else...
-
- To correct this mistake and to better show what happens, the example
- was changed to contain a slightly different set of citations (same
- change was made to example 12-5-27):
-\begin{verbatim}
- Full citations: \cite{aschur} \cite{bschur}
- not shown on the left!
-\newpage
- text \cite[\S\,7]{aschur} text
- \cite[\S\,8]{aschur} \cite[\S\,16]{zpo}
- text \cite[\S\,7]{bschur} \cite{aschur}
- text \cite[\S\,3]{zpo}
-\end{verbatim}
-And the text above the example was changed as follows:
-
- ``If \texttt{name\&title\&auto} was selected (either implicitly or
-explicitly), then the following happens: the first citation of a
-publication automatically displays the full entry (citation~5 in the
-next example). In case of repeated citations to unambiguous works
-only the name of the author(s) are shown (citation~8). For ambiguous citations
-this will be done only for immediately following citations
-(citation~4). However, if there are
-intervening citations, then the name(s) and short titles are shown
-(citations~3, 6, and~7).''
-
-\erroronpage{731}{para 1, l.4}{HjG/FMi}{2004/06/15}{2}
- Correct/change to: ``that \u{two}
- citation\u{s} \ldots\ \u{are} actually wrong:''
-
-\erroronpage{732}{para 3. l.2}{JMH}{2005/07/18}{4}
-Replace: ``in which case \u{the first} cross-reference \ldots''
-\> ``in which case \u{a} cross-reference \ldots''
-
-\erroronpage{734}{para 1, l.2}{CKr}{2005/05/7}{4}
- Correct: |\bibgerman| \> |\bib|\u{\texttt s}|german|
-
-\erroronpage{734}{para 2, l.-1}{CKr}{2005/03/24}{4}
- Remove surplus letters: ``get the correct\u{ion} hyphenation.''
-
-\seriouserroronpage{741}{l.-5}{HjG}{2004/06/15}{2}
- Missing closing brace:
- |\renewcommand\opcit{\textit{supra}|\u{\texttt{\textbraceright}}
-
-\seriouserroronpage{743}{item 3}{UFi}{2004/05/27}{2}
- Equal sign missing: \texttt{sortkey\u{ = }"Bismarck, Otto von"}.
-
-\erroronpage{744}{exa 12-5-48/49}{HjG}{2004/06/15}{}
- There's a spurious space before all occurrences of
- ``\textsc{D. E. Knuth}''! \\ This is (partly, ie in the footnote)
- due to a missing percent in the definition of |\@realcite| and
- |\@printbibliography| in the camel package. Seems that a problem
- with the volume parsing in camel is the reason for the surplus
- spaces showing up in the bibliography output. Reported to the
- author.
-
-\erroronpage{745}{ll.3/4}{HjG}{2004/06/15}{2}
- Missing metaness:\\
- ``\ldots\ \texttt{jobname.tts}'' \>
- ``\ldots\ \meta{jobname}\texttt{.tts}''\\
- ``\ldots\ \texttt{jobname.lts}'' \>
- ``\ldots\ \meta{jobname}\texttt{.lts}''
-
-\erroronpage{746}{tab 12.2}{HjG}{2004/06/15}{2}
- Replace (`bibtopic' column, row 4; `multibib' column, row 7):\\
- ``no'' \> ``No''
-
-\erroronpage{746}{Tab. 12.2}{THa}{2004/06/21}{2}
- Change ``Requires tailored .bib files'' \> ``Works with standard
- .bib files''
- (and change matching row entries)
-
-\erroronpage{746}{Tab. 12.2}{THa}{2004/06/21}{2}
- Change: ``Above typeset together somewhere'' \>
- ``Group bibliographies together''
-
-\erroronpage{749}{para -1, l.1}{THa}{2004/06/22}{2}
- Missing accents: ``Jose Alberto Fernandez'' \> ``Jos\'e Alberto
- Fern\'andez''
-
-\erroronpage{750}{para -3, l.-2}{CKr}{2005/03/31}{4}
- Delete surplus word: ``\ldots as \u{the} the auxiliary files would be
- overwritten.''
-
-\erroronpage{752}{para 1, l.-1}{HjG}{2004/06/15}{2}
- Delete backslash:
- ``\ldots in an \texttt{\u\textbackslash article} class).''
-
-\erroronpage{753}{para 4, l.5}{HjG}{2004/06/15}{2}
- Replace: ``|\bibliography|'' \> ``|\bibliographystyle|''
-
-\seriouserroronpage{755/756}{}{THa}{2004/06/21}{2}
- Wrong limitation of multibib: The whole passage from ``A final
- difference'' up to ``|nocite|.'' should be replaced with something
- like: ``The multibib package (since version 2.3 of 2004/01/24) is
- compatible with most other packages that provide extensions to the
- cite mechanisms, including \textsf{cite}, \textsf{natbib}, and
- {jurabib}. Moreover, the package provides a general interface which
- allows to add arbitrary extensions of cite commands to be recognized
- by \textsf{multibib}.''
-
- Editorial comment: change affects pagebreak position.
-
-\erroronpage{756}{Ex. 12-6-10}{THa/FMi}{2004/06/21}{2}
- Replace source text with:
- |\LaTeX{} offers an interface to include|\\
- |graphics \citelatex{LGC97}. \LaTeX's|\\
- |default citation scheme is| \\
- |number-only \cite{vLeunen:92}.|\\
- i.e., move/remove the sentence periods. This should not affect the
- output as the superscript is moved and double periods are removed.
-
-
-\CHAPTER{Chapter 13}
-
-% perhaps
-\erroronpage{758}{para 3, ll.1/2}{HjG}{2004/06/16}{2}
- Delete word: ``\ldots\ to look for
- \u{management} tools that help in managing such databases.''
-
-\erroronpage{758}{para 4}{HjG/FMi}{2004/06/16}{2}
- Add+change: ``Once everything is under control, we return in
- \u{Section~13.5} to the task of typesetting
-and look at how different \BibTeX{} styles can be used to produce
-different bibliography layouts from the same input. As there may not
-be a suitable style for a particular set of layout requirements
-available, Section~\u{13.5.2} discusses how to
-generate\ldots''
-
-\erroronpage{763}{tab. 13.1}{HjG/FMi}{2004/06/16}{2}
- In the explanation for \texttt{misc}, replace:\\
- ``(i.e., the entire field is empty)'' \>
- ``(i.e., the entire entry is empty or has only ignored fields).''
-
-\erroronpage{764}{para -3, l.-1}{HjG}{2004/06/16}{2}
- Add: ``following a field \u{name (and \texttt= sign)}''
-
-\erroronpage{765}{tab. 13.2}{HjG}{2004/06/16}{2}
- In the explanation for \texttt{type}:\\
- l.2: Add word:
- ``For the \u{entry} type \texttt{phdthesis} \ldots''\\
- l.3: Punctuation is not part of string:
- ``|type = "{Ph.D.} dissertation|\texttt{\u.}|"|'' \>
- ``|type = "{Ph.D.} dissertation"|\u.''\\
- l.5: Punctuation is not part of strings:\\
- ``\texttt{chapter = "1.2\u," type = "Section\u."}'' \> \\
- ``\texttt{chapter = "1.2"}\u{ and} \texttt{type = "Section"}\u.''
-
-\erroronpage{765}{`key's description, l.1}{JMH}{2005/06/29}{4}
-Remove ``cross-referencing'': cross-referencing just uses key appearing in
-|\cite| commands.
-
-\erroronpage{766/767}{several places}{DAl}{2005/09/12}{4}
- Replaced ``Miguel Lopez Fernandez'' by ``Miguel Parra Benavides''
- as the original name would really require accents that are not yet
- discussed at this point.
-
-\erroronpage{766}{para 6, l.1 }{UFi}{2004/05/27}{2}
- Move comma: Fernandez\u{,''} should be Fernandez\u{'',}
-
-\erroronpage{767}{l.7}{SPe}{2007/05/21}{s}
-``Miguel Parra Benavides'' is missing closing quotes.
-
-\erroronpage{767}{l.10}{SPe}{2007/05/21}{s}
-``Parra'' and ``Benavides'' are missing closing quotes.
-
-\erroronpage{768}{para 4, l.4}{UFi}{2004/05/27}{2}
- Replace: ``(see Section 13.2.2)'' \> ``(see below)'' \\
- After all we are in 13.2.2 :-)
-
-\erroronpage{770}{para 1, l.1}{HjG}{2004/06/16}{2}
- Replace: ``text \u{field} of \BibTeX\ \u{entries}'' \>
- ``text \u{part} of \BibTeX\ \u{fields}''
-
-\seriouserroronpage{771}{verb. text}{HjG}{2004/06/16}{2}
- Surplus closing brace:
- ``|"\providecommand\url[1]{\texttt{#1}}|\texttt{\u\textbraceright}|"|''
-
-\erroronpage{771}{l.-3}{HjG}{2004/06/16}{2}
- Change: ``different sorting rules from English'' \>
- ``sorting rules different from those of English''
-
-\erroronpage{772}{l.-5}{HjG}{2004/06/16}{2}
- Shell command line should be underlined (as on pp.~775--778).
-
-\erroronpage{773}{para 3, ll.2/3}{HjG}{2004/06/16}{2}
- Change: ``put \u{from \BibTeX}\ into the \texttt{.bbl} file'' \>
- ``put into the \texttt{.bbl} file \u{by \BibTeX}''
-
-\seriouserroronpage{773}{para 3, ll.-1}{HjG}{2004/06/16}{2}
- Change: ``and \u{an} additional \LaTeX\ run'' \>
- ``and \u{two} additional \LaTeX\ run\u{s}''
-
-\erroronpage{773}{para -2, l.3}{HjG}{2004/06/16}{2}
- Add: ``articles and book\u{s}''
-
-\erroronpage{775}{para -2, l.1}{HjG}{2004/06/16}{2}
- Change font: ``in the \texttt{\u{string}} parameter'' \>
- ``in the \emph{\u{string}} parameter''
-
-\erroronpage{777}{program output}{FMi}{2004/08/03}{2}
-After changing the bib file this line comes out as:
-\begin{verbatim}
-%% "EX/tex.bib", line 92: Unexpected value in ``year = "1980ff"''.
-\end{verbatim}
-
-\erroronpage{777}{para -1, l.-3}{HjG}{2004/06/16}{2}
- Change: ``all \u{entries} are examined'' \>
- ``all \u{fields of an entry} are examined''
-
-\erroronpage{777}{para -1, l.-2}{HjG}{2004/06/16}{2}
- Change: ``value part of the \u{entries}'' \>
- ``value part of the \u{fields}''
-
-\erroronpage{778}{para 4,l.2}{JMH}{2005/07/18}{4}
- Replace: ``\texttt{year=1980ff}'' \> ``|year={1980ff}|''
-
-\erroronpage{779--784}{throughout}{HjG}{2004/06/16}{2}
- Shell command lines should be underlined (as on pp.~775--778).
-
-\erroronpage{779}{para 3, l.2/3}{HjG}{2004/06/16}{2}
- Add: ``one ore more \BibTeX\ databases as its argument\u{(s)}''
-
-\erroronpage{779}{footnote 2}{HjG}{2004/06/16}{2}
- Add second hyphen: ``after the \texttt{-} option.''
- \> ``after the \texttt{-\u-} option.''
-
-\erroronpage{780}{top}{FMi}{2004/08/03}{2}
- Spurious space on top of page.
-
-\erroronpage{784}{para 1, l.-1}{HjG}{2004/06/16}{2}
- Typo (forgotten backslash!?):
- ``Progpybliographer'' \> ``\textsf{pybliographer}''
-
-\erroronpage{787}{l.2}{HjG}{2004/06/16}{2}
- Shell command line should be underlined (as on pp.~775--778).
-
-\erroronpage{787}{para -2, l.1}{CKr}{2005/04/20}{4}
- Remove surplus letter: ``The \textsf{JBibtexManager} program
- develop\u{p}ed by Nizar Batada''
-
-\erroronpage{788}{fig. caption}{FMi}{2004/05/14}{2}
- Add: The \textsf{JBibtexManager} workspace with the \u{(German locale)}
-
-\erroronpage{788}{footnote}{FMi}{2004/04/23}{2}
- Replace: ``Most of these restrictions have been lifted in the
- new version of JBibtexManager.''
-
-\erroronpage{789}{para 2, l.1}{FMi}{2004/04/23}{2}
- Replace: ``\ldots are kept unchanged but they are
- neither visible nor modifiable from within the program.'' \\
- \>
- ``\ldots are neither visible nor modifiable
- except when using the ``raw \BibTeX'' mode in the newest version of
- the program. ''
-
-
-\erroronpage{789}{para 3}{FMi}{2005/06/02}{4}
-Replace whole paragraph with:
-``The program is not available on CTAN. Its current home is
-\texttt{https://www.jabref.org}, where it was merged
-with a similar project called \textsf{BibKeeper}
-under the new name \textsf{JabRef}.''
-
-\erroronpage{789}{para 5, l.3}{FMi}{2004/05/14}{2}
- Small rewrite:
- The only ``foreign'' export formats supported are \texttt{.bbl} files
- \u{and \texttt{.htm} files} (i.e., processing a selection of entries with
- \BibTeX{} or \BibTeX8 from within the program and producing HTML
- from a selection of entries\u{)}.
-
-\erroronpage{791--793}{tab 13.4}{HjG}{2004/06/16}{2}
- \texttt{apa.bst} -- add:
- ``American Psychology Association \u{\BibTeX\ style}'' \\
- \texttt{jmb.bst} -- add:
- ``\emph{Journal of Molecular Biology} \u{\BibTeX}\ style''\\
- Some journal names are written in italic, other's aren't:
- Astronomy; Behavioral and Brain Sciences; Human Biology.
-
-
-\erroronpage{793}{para 1, l.2}{SN}{2004/06/11}{2}
- Remove surplus word: ``using another \u{the} \BibTeX{} style''.
-
-\erroronpage{793}{para 2,l.5}{DAl}{2005/09/03}{4}
- Remove comma: ``\ldots wich will show us\u{,} how different\ldots''
-
-\erroronpage{794}{exa 13-5-1/2}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\erroronpage{795}{exa 13-5-3/4}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\erroronpage{795}{para 2, l.2}{JMH}{2005/07/18}{4}
- Replace: ``author's name'' \> ``authors' names''
-
-\seriouserroronpage{795}{para 2, ll.4/5}{HjG}{2004/06/18}{2}
- The text states: ``Also note the interesting label produced for the
- reference with more than three authors.'' \\
- However, example 13-5-4 cannot show this, as there are only three
- authors (item~[GUD97]).
-
-\erroronpage{796}{exa 13-5-5/6}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\seriouserroronpage{796}{para 1, ll.-2/-1}{HjG}{2004/06/18}{2}
- The text states: ``Note that the entry with more than three authors
- has now been collapsed, showing only the first one.'' \\
- Again, example 13-5-5 does not show this, as there are only three
- authors, and all three are shown (item~[5]).
-
-\seriouserroronpage{797}{para 3, l.3}{HjG}{2004/06/18}{2}
- Replace:
- ``\ldots; as a result, we get an incomplete \u{first} entry.'' \>
- ``\ldots; as a result, we get an incomplete \u{second} entry.'' \\
- (Obviously, the citation of \texttt{LGC97} has been added to
- example 13-5-7 \emph{after} this text was written.)
-
-\erroronpage{797}{exa 13-5-7}{FMi}{2004/06/20}{2}
- Editorial comment: due to the modification of the \BibTeX{} data
- base \texttt{tex.bib} on page 690 the example output will change
- slightly in a reprint.
-
-\erroronpage{798}{tab 13.5, l. 1-2}{MSch}{2006/01/06}{s}
- Replace: ``Erwin'' \>
- '`Ervin''
-
-\erroronpage{798}{para 1, l.3}{CKr}{2005/04/23}{4}
- Remove surplus word: ``\ldots, then it is all that \u{it} is necessary.''
-
-\erroronpage{800}{Citation scheme,l.2}{DAl}{2005/09/03}{4}
- Replace letter: ``\ldots different questions th\u{a}n if you
- choose\ldots''
-
-\erroronpage{802}{para 2, l.4}{HjG}{2004/06/17}{2}
- Replace: ``derivation'' \> ``deviation''
-
-\erroronpage{802}{para -1, l.3}{FMi}{2005/06/02}{4}
- Replace wrong braces:
- ``|\urlprefix\url[|\textit{field-value}|]|'' \>
- ``|\urlprefix\url{|\textit{field-value}|}|''
-
-\erroronpage{803}{para -2, l.2}{HjG}{2004/06/17}{2}
- Replace: ``in the second phase of the \u{formatting}'' \>
- ``in the second phase of the \u{processing}''
-
-
-\erroronpage{806}{list, item 3}{UFi}{2004/06/01}{2}
- Extra character: ``Printed in the order in which the\u{e}
- references\ldots''
-
-\erroronpage{806}{para -3}{FMi}{2005/06/02}{4}
- Move this paragraph to the bottom of the page since it is really an
- explanation about the functions defined for each publication type.
-
-\erroronpage{808}{table 13.8}{JMH}{2005/07/18}{4}
- Replace description for |int.to.chr$| with:
- ``Translates integers into a characters using the ASCII mapping''
-
-\erroronpage{810}{\texttt{fin.entry} example}{HjG}{2004/06/17}{2}
- Replace in ``\emph{After Modification}'' part (2~times):
- ``|\sc|'' \> ``|\scshape|''
-
-\erroronpage{811}{para 2, l.3}{HjG}{2004/06/17}{2}
- Replace: ``at the beginning of this section'' \>
- ``on the facing page''
-
-
-
-\CHAPTER{Chapter 14}
-
-\erroronpage{814}{para 6, l.1}{HjG}{2004/06/08}{2}
- Delete doubled word:
- ``The most important \u{important} commands \ldots''
-
-%% not really a bug but inconsistent
-\erroronpage{814}{para -1, l.-2}{HOb}{2004/05/28}{2}
- Explicitly show spaces: \verb*=% \iffalse= \ldots\ \verb*=% \fi=
-
-\erroronpage{815}{syntax boxes 2+3}{HOb}{2004/05/28}{2}
- For clarification the argument of |\DescribeMacro| and that of
- |\begin{macro}| should both start with a |\|.
-
-\erroronpage{816}{para -3, l.4+}{HOb}{2004/05/28}{2}
- Change sentence:
- Note that \u{such short forms for \texttt{\textbackslash verb},
- just} like \texttt{\textbackslash verb} itself,
- cannot appear in the argument of another command, but
- \u{the characters} may be used
- freely inside \texttt{verbatim} and \texttt{macrocode} environments.
-
-\seriouserroronpage{820}{para 2, last line}{DHL}{2004/05/16}{2}
- Change to: ``lines 1, 2, and \u{4} if \texttt{Bname} is also
-asked for, and lines 1, \u{3}, and 4 otherwise.''
-
-\erroronpage{820}{para 3, l.5}{HOb}{2004/05/29}{2}
- Remove surplus space: ``behind \%\u{~} signs\ldots''
-
-\erroronpage{820}{table 14.1}{HOb}{2004/05/29}{2}
- Entries not sorted correctly: swap |\CheckSum| and |\CheckModules|
-
-\seriouserroronpage{821}{descr.\ of
- \ttfamily\textbackslash DeleteShortVerb}{UFi}{2004/05/23}{2}
- \verb=\MakeshortVerb= should be \verb=\Make=\u{S}\texttt{hortVerb}\\
- \verb=\MakeshortVerb*= should be \verb=\Make=\u{S}\texttt{hortVerb*}
-
-\erroronpage{821}{table 14.1}{HjG}{2004/06/08}{2}
- As suggested by HOb (p.815):
- ``|\DescribeMacro{\|\emph{cmd}|}|'' and
- ``|\begin{macro}{\|\emph{cmd}|}|''.
-
-\erroronpage{822}{table 14.1, entry 2}{HjG}{2004/06/08}{2}
- |\meta{|\emph{arg}|}| ``Print \u{the} argument \ldots''
-
-\erroronpage{822}{table 14.1, entry 3}{HOb}{2004/05/29}{2}
- Replace with: \verb=\SpecialEscapechar{\=\emph{char\/}\verb=}=
-
-\seriouserroronpage{822}{table 14.1, entry -2}{HOb}{2004/05/29}{2}
- Wrong default: ``(default |*|)'' \> ``(default |!|)''
-
-\erroronpage{823}{table 14.1}{HjG}{2004/06/08}{2}
- As suggested by HOb (p.815):
- ``|\SpecialIndex{\|\emph{cmd}|}|'',
- ``|\SpecialMainIndex{\|\emph{cmd}|}|'', and
- ``|\SpecialUsageIndex{\|\emph{cmd}|}|''.
-
-\seriouserroronpage{824}{table 14.1, entry 6}{HOb}{2004/05/29}{2}
- Typo: |\MakePercentCommand| \> |\MakePercentComment|
-
-\erroronpage{825}{para 3, l.1}{THa}{2004/06/25}{2}
- ``\% sign'' \> ``|%| sign''
-
-\erroronpage{825}{para 5, l.1}{THa}{2004/06/25}{2}
- ``target'' \> ``target machine''
-
-% making the syntax box bigger affects next page as well:
-\seriouserroronpage{826/827}{code box}{UFi/FMi}{2004/05/24}{2}
- Closing brace of \verb=\generate{...}= is missing. Also it would be
- better if the box shows that several |\file| commands can be used.
-
-\erroronpage{826/827}{para -1\slash para 2}{HjG}{2005/05/15}{4}
- The descriptions referring to the syntax box do not characterize
- the changed contents of that box (due to a previous error report).
-
- Not only a single \textit{result-file} is possible:\\
- ``Within the argument to |\generate| you specify the
- \textit{result-file} you want to produce by using a |\file|
- declaration.''
-
- The text ``as given above'' does no longer hold:\\
- ``With the syntax specification for |\generate| as given above,
- you can produce one \textit{result-file} from one or more
- \textit{source-files}.''
-
-\erroronpage{826}{l.2}{HjG}{2005/02/26}{4}
- Replace: LaTeX \> \LaTeX{}
-
-\erroronpage{826}{para -2, l.-3}{HjG}{2004/06/08}{2}
- Add: ``only the code piece\u{s}''
-
-\erroronpage{827}{para 2, l.-1}{HjG}{2005/05/15}{4}
- ``source files'' \> ``\emph{source-files}''
-
-\erroronpage{827}{}{FMi}{2004/06/08}{2}
- Editorial comment: reprinted because of pagebreak changes.
-
-\erroronpage{828}{para 3, l.2}{DHL}{2004/05/16}{2}
- Extra word: ``If so, \u{case}'' \> ``If so,''
-
-\seriouserroronpage{829}{syntax box}{HOb}{2004/05/29}{2}
- |\preamble|, |\endpreamble|, |\postamble|, and |\endpostamble| all
- have to be on lines by themselves, so the displayed syntax is a bit
- misleading (to say it nicely).
-
-\erroronpage{829}{para -2, l.-2/-1}{HjG}{2004/06/08}{2}
- Add word: ``in \u{the} \textsc{docstrip} package documentation''
-
-\erroronpage{830}{para 4, ll.5/6}{HjG}{2004/06/08}{2}
- Change:
- ``In addition, the user \u{has configured} the \textsc{docstrip}
- program \ldots'' \>
- ``\ldots\ \u{has to configure} \ldots''
-
-\erroronpage{830}{para 5, l.4}{HjG}{2004/06/08}{2}
- Add: ``in the \textsc{docstrip} \u{script}''
-
-\erroronpage{831}{ll. 4 to 15}{UFi/FMi}{2004/05/27}{2}
- The |\usedir| declarations in the example are not in accordance
- with the TDS set-up. They show what \textsf{jurabib}
- currently implements in its \texttt{.ins} files.
- However, the correct set-up would be:
-\begin{verbatim}
- \usedir{tex/latex/jurabib}
- \file{jurabib.sty}{\from{jurabib.dtx}{package}}
- \file{dejbbib.ldf}{\from{jurabib.dtx}{german}}
- ...
- \usedir{bibtex/bst/jurabib}
- \file{jurabib.bst}{\from{jurabib.dtx}{jurabst}}
- ...
- \usedir{doc/latex/jurabib}
- \file{jbtest.tex}{\from{jurabib.dtx}{test}}
- ...
-\end{verbatim}
- This also requires to change the text following.
-
-\erroronpage{831}{ll.16/17}{HjG}{2004/06/09}{2}
- Double interword space?
- (if so: 2x visible, 1x vanished in line break)\\
- ``in \ |tex/...|'' \qquad yes, bug in \texttt{url}.
-
-\seriouserroronpage{831/832}{general}{HjG}{2004/06/09}{2}
- Replace throughout: |\DeclareDirectory| \> |\DeclareDir|.\\
- Unfortunately, \texttt{docstrip} is not consistent in its command names.
-
-\seriouserroronpage{832}{l. 5}{UFi}{2004/05/27}{2}
- Missing \texttt{*}: |\DeclareDir|\u{\texttt{*}}|{tex/bibtex/...|
-
-\erroronpage{832}{code blocks}{DPa}{2004/08/04}{2}
- Three instances of |tex/bibtex| in |\DeclareDir| should lose the |tex/| to
- conform to TDS and change made on page 831
-
-\erroronpage{832}{2. code block}{MSch}{2006/01/06}{s}
- Replace: |text/latex/base| \> |tex/latex/base|
-
-\erroronpage{832}{para 4, l.-2}{HOb}{2004/05/29}{2}
- Change: ``\ldots a single |\UseTDS| in\ldots'' \>
- ``a |\UseTDS| and a |\BaseDirectory| declaration in\ldots''
-
-\erroronpage{832}{para 5, l. -3}{UFi}{2004/05/23}{2}
- The ``\TeX{} Live CD'' is spelled incorrectly as
- ``\TeX{} live'' or ``\TeX live''
-
-\erroronpage{832}{l.-2}{HjG}{2005/05/15}{4}
- Underline, as it is command line input.
-
-\erroronpage{833}{para -1, l.1}{J-CCh}{2005/07/17}{4}
- Spurious extra blank between ``Another potential''.
-
-
-\erroronpage{834}{para 4, l.2}{HjG}{2004/06/09}{2}
- Change: ``These command\u{s}''
-
-\erroronpage{834}{para 5, l.-1}{HjG}{2004/06/09}{2}
- Closing parenthesis should not be in `typewriter font':\\
- ``(after |\begin{document}|\u)''
-
-\erroronpage{834}{para 5}{FMi}{2007/11/13}{}
- Explain that |\cmd| can't be used with conditionals, e.g., those produced
- with |\newif| .
-
-\erroronpage{835}{para 6, l.2}{DHL}{2004/05/16}{2}
-Missing letter: ``the source files into a
-``user'' documentation and a\u{n} ``implementation'' part.''
-
-\erroronpage{835}{para 6, l.5}{DHL}{2004/05/16}{2}
-Missing word: ``as the \textsf{doc} package \u{is} loaded''
-
-\erroronpage{835}{ll.-6/-4}{HjG}{2004/06/09}{2}
- Replace:
- ``\ldots\ \u{and no} configuration file.'' \>
- ``\ldots\ \u{without a} configuration file.''
-
-\erroronpage{837}{exa 14-4-1}{FMi}{2004/06/12}{}
- Editorial comment: example has to be reprocessed whenever this
- chapter is modified to show correct rcs checkin (otherwise input
- and output will not match).
-
-\erroronpage{837}{para 2,l.3}{DAl}{2005/09/03}{4}
- Replace:
- ``running \u{heading}'' \>
- ``running \u{header}''
-
-\erroronpage{838}{code box}{UFi}{2004/05/27}{2}
- \texttt{\$Id\$}: first |$| uses wrong font (2 times)
-
-\erroronpage{839}{exa 14-4-2}{FMi}{2004/06/12}{}
- Editorial comment: example has to be reprocessed whenever this chapter is modified to
- show correct rcs checkin (otherwise input and output will not match).
-
-\seriouserroronpage{839}{item 1, l.1 and l.3}{AHo}{2004/09/02}{4}
- Replace: \texttt{nottoday} \> \texttt{notoday}
-
-\seriouserroronpage{839}{item 2, l.4}{HjG}{2004/06/09}{2}
- Replace brackets with braces: ``\texttt{%
- \char`\\pagestyle\u\textbraceleft fancy\u\textbraceright}''
-
-
-\CHAPTER{Appendix A}
-
-\erroronpage{842}{para 2, l.5}{PYu/FMi}{2004/07/03}{2}
- Remove: ``\ldots
- \texttt{A}\ldots\texttt{Z})\u{ in case of command names prefixed with a
- backslash}.''
-
-\erroronpage{842}{para 3, marginal}{FMi}{2004/08/01}{2}
- Change: ``Environments and command names'' \> ``Environments''
-
-\erroronpage{842}{para 3}{PYu/FMi}{2004/08/01}{2}
- Remove: ``On
- the other hand, names of environments \u{and counters}
- are different.''
-
-Add: ``In this case the
-\texttt{*} is part of the name \u{and spaces preceding it are not ignored}. Thus, when writing
-\verb*=\begin{figure *}=, the space would become part of the name \u{and
-is not recognized as the start of a \texttt{figure*} environment}.''
-
-
-\erroronpage{843}{para 3, l.2}{YvH}{2004/05/28}{2}
- Missing word: ``and |\z@| contain |@| \u{in} their name''
-
-\erroronpage{843}{para 4, l.3}{PYu}{2004/07/03}{2}
- Change: ``to do: the difficult'' \> ``to do\u; the difficult''
-
-\erroronpage{844}{para 4, l.4}{PYu/FMi}{2004/07/04}{2}
- Replace: ``Thus, the above example could be shortened to'' \>
- ``Thus, the definition in the above example should be
- replaced as follows:''
-
-\erroronpage{846}{para 1, l.2}{ARi}{2004/07/02}{2}
- A period should follow the right parenthesis and ``without''
- should be capitalized.
-
-\iffalse
-% maybe
-\erroronpage{845/846/847}{syntax boxes and text}{FMi}{2004/07/04}{}
- Replace: ``\textit{command definition}'' \>
- ``\textit{command-definition}''
-\fi
-
-\erroronpage{847}{para. 5, ll. 2-3}{PYu}{2004/07/04}{2}
- For consistency replace \meta{cmd}with \textit{cmd}
-and \meta{command definition} with \textit{command definition}.
-
-
-\erroronpage{847}{para -2, l.3}{VVo}{2008/09/02}{}
-Replace: ``An error is raised if the definitions differ, ldots''
-\> ``A warning is shown if the definitions differ, \ldots''
-
-
-\erroronpage{851}{para 5, l.-2}{FMi}{2004/07/20}{2}
- Add + change font: ``It also defines \u{the command}
- |\the|\u{\textit{newctr}} to\ldots''
-
-\erroronpage{852}{code block 1, l.2}{JGr}{2004/06/10}{2}
- Second \verb=\makeatletter= should be \verb=\makeatother=
-
-\erroronpage{852}{para 3, l.-3}{FMi}{2004/06/23}{2}
- ``\u{For that reason} the next example'' \> ``\u{As a result} the next example''
-
-\erroronpage{852}{para -1, l.3}{FMi}{2004/07/24}{2}
-Move word: ``|\setcounter| or |\addtocounter| \u{command} or when\ldots'' \>
- ``\u{command} |\setcounter| or |\addtocounter| or when\ldots''
-
-\erroronpage{852}{para -1, l.-3}{THa/FMi}{2004/06/23}{2}
-Change:
- ``It is \emph{not} suitable to print that number! For that reason a
- set\ldots'' \>
- ``However, the command cannot be used to typeset the value of the
- counter! For that purpose a set\ldots''
-
-
-\erroronpage{853}{l.6}{THa/FMi}{2004/06/23}{2}
- Missing space: ``c,\u{~}\dots, z''
-
-\erroronpage{853}{para 4,ll.2+3}{HjG}{2004/05/25}{2}
- Add word: ``\ldots definitions for sectioning \u{counters}''
-
-\erroronpage{853}{counter code block}{FMi}{2005/06/09}{4}
-The order of declarations of the counters is incorrect; they have to be
-\begin{verbatim}
-\newcounter{part}
-\newcounter{section}
-\newcounter{subsection}[section]
-\newcounter{subsubsection}[subsection]
-\end{verbatim}
-or you will receive a ``counter not defined'' error.
-
-\iffalse
-\erroronpage{853}{general}{THa/FMi}{2004/06/23}{}
- Perhaps ``|\the|\meta{ctr}'' should be written without the meta
- braces to match the form used on p.~852. \\
- Then again, perhaps not.
-\fi
-
-\erroronpage{854}{ll. 1+2}{FMi}{2004/05/25}{2}
- Add word and commata: ``Only the representation\u{, prefix,} and
- label field commands
- are defined \ldots''
-
-\seriouserroronpage{854}{code block 1}{HjG/FMi}{2004/05/25}{2}
-Replace with approx:\\[6pt]
-\hspace*{-140pt}\begin{minipage}[b]{\linewidth}
-\begin{verbatim}
-\renewcommand\theenumi {\arabic{enumi}} \renewcommand\theenumii{\alph{enumii}}
-\renewcommand\theenumiii{\roman{enumiii}} \renewcommand\theenumiv{\Alph{enumiv}}
-\end{verbatim}
-\begin{verbatim}
- \renewcommand\p@enumii{\theenumi}
-\renewcommand\p@enumiii{\theenumi(\theenumii)} \renewcommand\p@enumiv{\p@enumiii\theenumiii}
-\end{verbatim}
-\begin{verbatim}
-\newcommand\labelenumi {\theenumi.} \newcommand\labelenumii{(\theenumii)}
-\newcommand\labelenumiii{\theenumiii.} \newcommand\labelenumiv{\theenumiv.}
-\end{verbatim}
-\end{minipage}
-
-
-\erroronpage{855}{fig A.1, l.4}{JAn}{2005/09/09}{4}
- Change ``Did\^ot'' \> ``Didot'' (no caret); and delete the
-comma after inch
-
-
-\erroronpage{855}{fig A.1}{CBe/FMi}{2004/07/27}{2}
-Add: \texttt{ex} \quad Height of a small ``x'' in the current font \u{(approximately)}
-\\
-Add: \texttt{em} \quad Width
- of capital ``M'' in current font \u{(approximately)}
-
-
-
-\erroronpage{856}{tab A.2, ll.1-3}{YvH}{2004/05/28}{2}
- Correct: ``horizonal'' \> ``horizon\u{t}al'' (three times)
-
-\erroronpage{856}{tab A.2, l.6}{PYu}{2004/07/05}{2}
- Add: ``a \u{solid} horizontal line''
-
-\erroronpage{857}{table A.3}{V-Li}{2004/09/14}{4}
- |\vspace{len}| is missing
-
-\erroronpage{858}{l.-8}{HjG/FMi}{2004/05/26}{2}
- Add: ``\u{missing or} misplaced |\item|''
-
-\erroronpage{858}{syntax box}{PYu}{2004/07/03}{2}
- |\addvspace{|\textit{space}|}| should be typeset in a smaller font.
-
-\erroronpage{859}{para -4, l.1}{HjG}{2004/05/20}{2}
- Typo: ``ar\u{r}ises'' \> ``arises''
-
-\erroronpage{860}{para 1 of \S A.2, l.5}{CAR}{2004/05/26}{2}
- Replace: ``that behaves similarly to a\ldots''
- \> ``that behaves \u{much like} a\ldots''
-
-\erroronpage{861}{l.-2}{HjG}{2004/05/26}{2}
- The \(\Longleftrightarrow\) in the margin seems to sport a tiny
- gap in the middle (seems to be a lucida set-up problem).
-
-\erroronpage{866}{para 2 of \S A.2.3, l.5}{HjG}{2004/05/26}{2}
- Words need to be swapped: ``height of a \u{box framed} with
- |\fbox| or |\framebox|''
-
-\seriouserroronpage{867}{ll.1/2 after exa A-2-17}{HjG}{2004/05/26}{2}
- \(2 \times 5.3\,\mathrm{pt} + 0.4\,\mathrm{pt} = 11\,\mathrm{pt}
- \ne 12\,\mathrm{pt}\) so skip should be $5.8\,\mathrm{pt}$.
-
-\seriouserroronpage{868}{Table A4.}{UFi}{2004/05/22}{2}
- Default value of depth of \verb=\hrule= should be 0.0pt (not 0.4pt).
-
-\seriouserroronpage{871}{para 2, l.2}{UFi}{2004/05/21}{2}
- ``binary operators (, , , )'' should be typeset
- ``binary operators (\texttt{+}, \texttt{-}, \texttt{*}, \texttt{/})''.
-
-
-\erroronpage{875/876}{tab. A.5}{FMi}{2004/07/28}{2}
- Add: ``\TeX{} switches \u{(can only be queried)}'' \\
- Add: ``\LaTeX{} switches \u{(last two can be set)}'' \\ \qquad (these are
- |@afterindent| and |@tempswa|)\\
- Add row:\\
- |@afterindent| \quad \parbox[t]{7cm}{Switch checked by command
- |\@afterheading| (usually used in headings) to
- prevent (if |false|) indentation of next
- paragraph.}
-
- Editorial comment: change moves pagebreak.
-
-\seriouserroronpage{878}{codeline 4 (?)}{UFi}{2004/05/22}{2}
- |\usepackage[german]{varioref}[2001/09/0]:| day number is missing
- (test for version doesn't work then anymore!)
-
-\erroronpage{886}{fig.~A.1}{HjG}{2004/05/21}{2}
- Add: \verb=\ProcessOptions= \u{\texttt{\char`\\relax}}
- (cf. hint on p.~882!)
-
-
-\CHAPTER{Appendix B}
-
-\erroronpage{891}{para 1, l.7}{DHL}{2004/05/16}{2}
-Missing letter: ``\verb=l.167 \par=\u{\texttt{t}}\verb={Text}=''
-
-\seriouserroronpage{892}{para 1, l.-2}{HjG}{2004/05/22}{2}
- ``\verb=\romen= (lines 1 and~2)''
- \>
- ``\verb=\romen= (lines 2 and~3)''
-
-\erroronpage{892}{para -1, ll.2--4}{HOb/FMi}{2004/05/22}{2}
- Add: ``Technically, a moving argument is an argument
- that is internally expanded by \LaTeX{} without typesetting it
- directly\u{ (e.g.}, by using the internal \LaTeX{} construct
- |\protected@edef|\textsuperscript{1}\u).''
-
-\erroronpage{893}{para 2, l.8}{MHo/FMi}{2004/10/05}{4}
- Replace:
- ``On the other hand, |\cong| is fragile\ldots''
- \>
- ``On the other hand, |\[...\]| is fragile\ldots''
-
-
-\erroronpage{894}{l.-7}{FMi}{2004/04/23}{2}
- Add word: \ldots still open) \u{or} will be swallowed\ldots
-
-\erroronpage{896}{item 1}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move one item down.
-
-\erroronpage{896}{item 4}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move four items down.
-
-\erroronpage{896}{item -1}{HOb}{2004/05/29}{2}
- Whether or not the image size can be automatically determined
- depends on the graphics driver. Last sentence rewritten as follows:\\
- ``It usually does this automatically, for example, for
-\texttt{.eps} files by reading the bounding box
-information. However, depending on the graphics driver, it may be
-unable to extract this information from binary
-bitmap images such as \texttt{.jpg}, \texttt{.gif}, and \texttt{.png} files.''
-
-\erroronpage{897}{item 5}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move one item down.
-
-\erroronpage{899}{item 1}{JGr}{2004/06/10}{2}
- The extra \verb=\or= could result from bad use of \verb=\ifthenelse=
-
-\erroronpage{899}{item 5}{UFi}{2004/05/23}{2}
- The ``\TeX{} Live CD'' is spelled incorrectly as
- ``\TeX{} live'' or ``\TeX live''
-
-\erroronpage{901}{item 3}{UFi}{2004/05/23}{2}
- The ``\TeX{} Live CD'' is spelled incorrectly as
- ``\TeX{} live'' or ``\TeX live''
-
-\seriouserroronpage{902}{l.5}{HjG}{2004/05/22}{2}
- Missing letter: ``\texttt{\char`\\dis\u{c}retionary}''
-
-\erroronpage{907}{item 5, l.2}{CKr}{2005/05/30}{4}
- Add missing word: ``\ldots or \texttt{figure}, \u{is} encountered\ldots''
-
-\erroronpage{907--909}{item 2}{UFi/FMi}{2004/07/31}{2}
- \TeX{} error message missing: ``\texttt{No room for a new ...}''
-
- The packages loaded in your document require more internal registers
-(|\count|, |\dimen|, \ldots) than there are available in \TeX. Try
-processing your document with e\TeX{} and additionally load the
-\textsf{etex} package.
-
- Editorial comment: affects pagebreaks for 908/909 as well.
-
-
-
-\erroronpage{909}{middle}{HjG}{2004/05/22}{2}
- In the sample output, the lines ``\texttt{<*> samplefile.tex}'' and
- ``\texttt{? }'' should be indented by the same amount as the first
- four lines.
-
-\erroronpage{909}{l.-2}{HjG}{2004/05/22}{2}
- Missing interword space: ``an\u{ }\verb=\addvspace= command''
-
-%%check (that's me)
-\iffalse
-\erroronpage{911}{item 5}{HjG}{2004/05/22}{}
- ``To the author's knowledge, \ldots''
- \>
- ``To the authors' knowledge, \ldots''
-\fi
-
-\erroronpage{913}{item 1}{MKu/FMi}{2004/06/24}{2}
- Replace: UTF8 \> UTF-8
-
-\erroronpage{913}{item 1}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move four items down.
-
-\erroronpage{913}{item -3, l.-3/-1}{HjG}{2004/05/22}{2}
- Replace word: ``\ldots commands \u{and}, if necessary, masking a line
- break in the source with a \verb=%= sign.''
-
-\erroronpage{914}{l.8}{HjG}{2004/05/22}{2}
- Missing interword space: ``\verb=\spacefactor=\u{ }only''
-
-\erroronpage{917}{footnote}{HOb}{2004/05/29}{2}
- Replace footnote with: ``In modern distributions \LaTeX{} is automatically
- using the e\TeX{} program. On older installations you may have to
- call a different program (e.g., \texttt{elatex} instead of
- \texttt{latex}) when processing a
- document.''
-
-
-\erroronpage{918}{l.-13}{HjG}{2004/05/22}{2}
- Misplaced comma:\\
- ``\ldots\ arguments thereby, using up \ldots''
- \>\\
- ``\ldots\ arguments, thereby using up \ldots''
-
-\erroronpage{920}{item 2}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move one item down.
-
-\erroronpage{921}{item -2}{MBr}{2004/08/03}{2}
- Not in alphabetical order: move item to top.
-
-\erroronpage{923}{item 1}{UFi}{2004/05/23}{2}
- Not in alphabetical order: move one item down.
-
-\erroronpage{924}{item 2, para 2, l.1}{HjG}{2004/05/22}{2}
- Typo: ``th\u{r}ough'' \> ``though''
-
-\erroronpage{925}{l.1}{HjG}{2004/05/22}{2}
- Missing interword space: ``the command\u{ }\verb=\symbol=''
-
-\erroronpage{925}{item -2, l.-2}{HjG}{2004/05/22}{2}
- Extra word: ``are \u{the} those'' \> ``are those''\\
- Surplus space: `` register~\u~0'' \> ``register~0''
-
-\erroronpage{925}{item -2}{MBr}{2004/08/03}{2}
- Not in alphabetical order: move item one up.
-
-\seriouserroronpage{926}{item 4, title}{UFi}{2004/05/23}{2}
- ``\verb=Overfull \hbox (badness= \meta{number}\texttt)'' should be
- ``\verb=Overfull \hbox (=\meta{number}\texttt{pt too wide)}''
-
-\erroronpage{926}{item 5, l.1}{HjG}{2004/05/23}{2}
- Typo: ``built'' \> ``build''
-
-\seriouserroronpage{926}{item 5, title}{UFi}{2004/05/23}{2}
- ``\verb=Overfull \vbox (badness= \meta{number}\texttt)'' should be
- ``\verb=Overfull \vbox (=\meta{number}\texttt{pt too wide)}''
-
-\seriouserroronpage{928}{item 6, title}{UFi}{2004/05/23}{2}
- ``\verb=Tight \hbox='' should be ``\verb=Tight \vbox=''
-
-\erroronpage{930}{item 1, l.1}{HjG}{2004/05/23}{2}
- Omit paragraph indentation!
-
-\erroronpage{930}{item 4, l.2}{UFi}{2004/05/23}{2}
- Typo: ``i\u{t}entify'' \> ``identify''
-
-\erroronpage{931}{item 4, l.-1}{HjG}{2004/05/23}{2}
- Add: ``\ldots\ package \u{or class} in question.''
-
-\erroronpage{931}{item 4}{JGr}{2004/06/10}{2}
- The warning also happens if you give absolute or relative
- pathnames like \verb=\documentclass{base/article}=
-
-\erroronpage{931}{item 6}{MBr/FMi}{2004/08/03}{2}
- Order here is debatable but a ``,'' may not be good for visual
- sorting, so move this item one up (placeholder are always sorted to
- top so it doesn't pass ``package-or-class''.
-
-\erroronpage{932}{para 4, l.1}{UFi}{2004/05/23}{2}
- Typo: ``\u{t}which \> ``which''
-
-\seriouserroronpage{935}{ll.3--5}{HjG}{2004/05/23}{2}
- The text claims:\\
- ``The output is slightly different: the name \u{and the type} of a
- token are not shown by |\meaning|; instead, only its ``meaning'' is
- presented.''\\
- However, as example B-3-1 depicts, the type \emph{is} shown; hence,
- the sentence should be changed to:\\
- ``The output is slightly different: the name
- of the token \u{is} not shown by
- |\meaning|; instead, only \u{its type and} its ``meaning''
- \u{are} presented.''
-
-\erroronpage{936}{para 1, l.3}{UFi}{2004/05/23}{2}
- Closing brace should be after ``19'' and not at end of line.
-
-\erroronpage{938}{para -1, l.3}{UFi/FMi}{2004/05/23}{2}
- Difficult to understand; replace:
- ``\ldots a large \u{increase in} \texttt{t=} between''
-
-\erroronpage{939}{para 3, l.2}{HjG}{2004/05/23}{2}
- Words need to be swapped:
- ``\ldots\ \TeX{} indicates \u{this fact} with \ldots''
-
-\erroronpage{941}{l.19/20}{HjG}{2004/05/24}{2}
- Add: ``so-called demerits \u{(\texttt{d=})}''
-
-\erroronpage{942}{l.22}{HjG}{2004/05/24}{2}
- Change: ``several ways to reach \u{\texttt{@@2}};''
- \> ``several ways to reach \u{\texttt{@@6}};''
-
-\erroronpage{943}{para -1 of \S B.3.3, l.-6}{HjG}{2004/05/24}{2}
- Typo: ``shinkability'' \> ``shrinkability''
-
-
-
-\CHAPTER{Appendix C}
-
-\erroronpage{general}{several pages}{FMi}{2005/07/01}{4}
- Appendix was partially rewritten to reflect changes in the layout
- of the web sites. More importantly: CTAN changed their ftp
- software and stopped supporting the generation of directory
- archives on the fly. Instead they now offer precompiled
- \texttt{zip} files that can be downloaded.
-
-\erroronpage{947}{ll.-2/-1}{HjG}{2004/05/24}{2}
- Missing word: ``it is best \u{to} access''
-
-\erroronpage{947}{para -1, l.5}{FMi}{2004/06/12}{2}
- Bug in \texttt{url.sty} generated extra space.
-
-\erroronpage{948}{para -1, l.5}{UFi}{2004/05/23}{2}
- Show short name: ``\ldots\ \TeX{} Users Group (\u{TUG}, United States)''
-
-\erroronpage{950}{para 1, l.2}{FMi}{2006/09/12}{s}
- Replace: Figure C.\u{2} \> Figure C.\u{1}
-
-\erroronpage{950}{para 3, l.2}{HjG}{2004/05/24}{2}
- Typo: ``a site that i\u{s} not too distant''
-
-\seriouserroronpage{953}{l.11}{HjG}{2004/05/24}{2}
- Replace line: ``\verb=>>>>>>> 1.6='' \>
- ``\texttt{200-index graphicx}''
- (probably due to an incomplete merge with CVS)
-
-\erroronpage{954}{para 3, l.1}{HjG}{2005/05/09}{4}
- ``\TeX live'' \> ``\TeX{} Live''
-
-\erroronpage{955}{para 2, l.4}{HjG}{2005/05/09}{4}
- Remove surplus word:
- ``in \u{the} Thomas Esser's \texttt{tetex} distribution''
-
-\erroronpage{955}{para -2, l.-4}{MHe}{2004/05/22}{2}
- Letters need to be swapped: ``eig\u{ht}eenth''
-
-\erroronpage{956}{cn: entry}{HjG}{2005/05/09}{4}
- Replace:
- ``\u{name}: Hong Feng'' \> ``\u{contact}: Hong Feng''
-
-\erroronpage{957}{col. 2, l.15}{TMW}{2004/06/07}{2}
- This should read ``Lietuvos \TeX'o Vartotoj\k{u} Grup\.{e}''.
-
-\erroronpage{958}{col. 1, l.19}{TMW}{2004/06/07}{2}
- An acute accent should be added: ``Toru\'n''
-
-
-
-\CHAPTER{Bibliography}
-
-\erroronpage{963}{[1]}{CKr}{2005/06/20}{4}
- Url changed: \url{https://partners.adobe.com/public/developer/en/font/T1_SPEC.PDF}
- 2017: url no longer valid; maybe \url{https://www-cdf.fnal.gov/offline/PostScript/T1_SPEC.PDF}
-
-\erroronpage{963}{[2]}{CKr}{2005/06/20}{4}
- Url changed: \url{https://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf}
- 2017: url no longer valid; maybe \url{https://www-cdf.fnal.gov/offline/PostScript/5001.PDF}
-
-\erroronpage{963}{[3]}{CKr}{2005/06/20}{4}
- Url changed:
- \url{https://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf}
- 2017: url no longer valid; maybe \url{https://archive.org/details/5002.EPSFSpec}
-
-\erroronpage{964}{[5]}{CKr}{2005/06/20}{4}
- Url changed:
- \url{https://partners.adobe.com/public/developer/en/pdf/PDFReference.pdf}
- 2017: url no longer valid; maybe \url{http://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf}
-
-
-\erroronpage{965}{[17], l.-1}{HjG}{2004/06/18}{2}
- Delete character: ``in a\u{n} multi-language setting''
-
-\erroronpage{966}{[25]}{HjG}{2004/05/20}{2}
- First line of online resources is not flush right but centered.
-
-\erroronpage{971}{[74]}{FMi}{2006/09/18}{s}
- Add ``Lars Hellstr\"om'' as author. Change date to December 2004.
- Change comment to ``Documentation for
- the fontinst utility package that supports \ldots''
-
-\erroronpage{973}{[88]}{TSS}{2004/05/26}{2}
- The bibliography entry for "The Art of Computer Programming" lacks
- ISBN numbers: 0-201-89683-4, 0-201-03822-6, and 0-201-03803-X.
-
-\erroronpage{973}{[90], l.2}{HjG}{2004/06/07}{2}
- Words need to be swapped:
- ``\ldots do not look as \u{beautiful now} as they did in the past.''
-
-\erroronpage{973}{[91]}{HjG}{2004/05/20}{2}
- First line of online resources is not flush right but centered.
-
-\erroronpage{975}{[107], [109], [110], [111]}{HjG}{2004/06/21}{2}
- Incomplete URLs:\\
- \texttt{https://www.latex-project.org\u{/news/latex2e-news/}}\\
- \texttt{https://www.latex-project.org\u{/help/documentation/fntguide.pdf}}\\
- \texttt{https://www.latex-project.org\u{/help/documentation/cfgguide.pdf}}\\
- \texttt{https://www.latex-project.org\u{/lppl/}}
-
-\erroronpage{976}{[117]}{FMi}{2005/11/07}{s}
- The title is ``E-\TeX: Guidelines for Future \TeX{} Extensions''.
-
-\erroronpage{977}{[124]}{HjG}{2004/05/20}{2}
- First line of online resources is not flush right but centered.
-
-\erroronpage{977}{[124]}{FMi}{2005/07/09}{4}
- Link is missing a period:
- \url{https://www.latex-project.org/publications/tug99}\texttt{\u.pdf}
-
-\erroronpage{978}{[138]}{FMi}{2005/06/25}{4}
- Now has appeared: 24\#1, pp.~105--114, 2004. URL:
- \url{https://www.tug.org/TUGboat/Articles/tb24-1/plaice.pdf}
-
-\erroronpage{979}{[143]}{HjG}{2004/05/20}{2}
- Missing period: Robert M\u. Ritter
-
-\erroronpage{979}{entry 146, l.3}{RWa}{2004/06/01}{2}
- Missing word: ``for \LaTeX\ \u{and} a possible''
-
-\erroronpage{980}{[151]}{THa}{2004/06/25}{2}
- Remove: ``\LaTeX\u{Joachim Schrod}.''
-
-\erroronpage{980}{[153]}{THa}{2004/06/25}{2}
- Swap words: ``often are'' \> ``are often''
-
-\erroronpage{980}{[155]}{THa}{2004/06/25}{2}
- Missing word: ``For \u{the} \textsf{kuvio} system\ldots''
-
-\erroronpage{980}{[157]}{HjG}{2004/05/20}{2}
- First line of online resources is not flush right (stray space?).
-
-\erroronpage{981}{[158]-[162]}{RKo}{2005/11/11}{s}
- Unfortunately Th\`anh's name is misspelled (accents in [161/2]). The correct spelling
- is ``H\`an Th\^e\llap{\raise 0.5ex\hbox{\'{}}} Th\`anh''.
-
- Furthermore, the surename is H\`an so the entries should have been sorted
- under H (something that can't be corrected easily).
-
-\erroronpage{981}{[161]}{CKr}{2005/07/06}{4}
- Remove surplus name in text: ``User\u{Sebastian Rahtz} manual \ldots''
-
-\erroronpage{981}{[162/3], title}{THa}{2004/06/25}{2}
- Change: ``Makeindex'' \> ``makeindex''
-
-\erroronpage{982}{[168]}{HjG}{2004/05/20}{2}
- First line of online resources should be:\\
- \texttt{https://www.tug.org/TUGboat/Articles/\u{tb11-3/tb29vulis.pdf}}
-
-
-\CHAPTER{Index}
-
-\erroronpage{983--1082}{index}{FMi}{2004/06/11}{}
- I do not list changes to the index that are results of other errata
- entries as they are too difficult to track. Instead I will put an
- updated index on the web at
- \url{https://www.latex-project.org/help/books/tlc2-ap4.pdf} once in a while.
-
-\erroronpage{general}{}{FMi}{2004/06/08}{2}
- Editorial comment: the whole index has been reprinted.
-
-\erroronpage{general}{}{FMi}{2005/09/08}{4}
- Editorial comment: the whole index has been reprinted.
-
-\erroronpage{general}{}{FMi}{2004/06/08}{2}
- Add index entries into production notes, e.g., for example setup,
- hanging punctuation, \ldots
-
-\erroronpage{983}{para 1, l.3}{UFi}{2004/05/23}{2}
- Remove surplus word: ``\ldots one of \u{the} the following''
-
-\seriouserroronpage{983}{para -2}{HjG}{2004/05/20}{2}
- The text explains the meaning of bold and blue page numbers,
- but fails to point out the significance of slanted (italic)
- ones---there is none: blue italic indicates normal example blue bold
- indicates example and also important info.
-
-\erroronpage{988,1009}{}{CKr}{2004/10/10}{4}
- Replace: ``alphabetical document headings''
- \> ``alphabetically numbered document headings''
-
-and
-
- ``document headings / alphabetical''
- \>
- ``document headings / alphabetically numbered''
-
-\erroronpage{990}{}{J-CCh}{2005/07/17}{s}
- Correct range: author-date citations / history of (699, 700)
-
-\erroronpage{992}{}{J-CCh}{2005/07/17}{s}
- Correct: ``B\u{\'e}zier''
-
-\erroronpage{993}{}{SEg}{2005/04/26}{4}
- bibliographies/authors/name,formatting shows 798--1092 but should be
- just 798
-
-\erroronpage{1000}{}{J-CCh}{2005/07/17}{s}
- Correct range: Citation systems /
- author-date /
- history of (699, 700)
-
-\erroronpage{1007}{}{HjG}{2004/07/12}{2}
- Add page entry for |\DeclareFontSubstitution|
- back to 431 (para~2).
-
-
-\erroronpage{1014}{secound col., l.8}{MSc}{2004/06/04}{2}
- missing index entry for ``eTeX, TeX extension''
-
-\erroronpage{1017}{}{FHa}{2004/10/05}{4}
- The index entry for "floats / placement control" lists pages 286-983
- for information. I think that is a bit too much. It should probably
- end at page 291.
-
-
-\erroronpage{1019}{}{J-CCh}{2005/07/17}{s}
- Correct range: fonts /
- oblique (333)
-
-\erroronpage{1020}{}{CKr}{2005/01/09}{4}
- Replace ``fonts / URW Antigua'' \> ``fonts / URW Anti\u{q}ua''
-
-\erroronpage{1034}{first col.}{FMi}{2004/05/15}{2}
- Add entry: ``lists / enumerated / user-defined, 151''
-
-\erroronpage{1035}{}{THa}{2004/07/02}{2}
- ``\textsf{makeindex}'' \> ``\textsl{MakeIndex}''
-
-\erroronpage{1041}{}{FMi}{2004/08/02}{2}
- ``\texttt{NACRO} \BibTeX{} command'' \>
- ``\texttt{MACRO} \BibTeX{} command''
-
-\erroronpage{1051}{secound col., l.14}{MSc}{2004/06/04}{2}
- missing index entries for ``pdftex'' on p.7 and p.643
-
-\erroronpage{1069}{}{FMi}{2004/11/07}{4}
- Replace: ``text symbols / setting-up'' \>
- ``\u{math} symbols / setting-up''
-
-
-\erroronpage{1076}{}{CKr}{2005/01/09}{4}
- Replace ``URW Antigua'' \> ``URW Anti\u{q}ua''
-
-
-\CHAPTER{People}
-
-\erroronpage{1080}{page}{FMi}{2004/07/26}{4}
- Editorial comment: Needs manual breaking in index output file for
- second and fourth printing.
-
-\erroronpage{1081}{col 1}{FMi}{2004/06/22}{2}
- Missing accents: ``Fernandez, Jose Alberto '' \> `Fern\'andez, Jos\'e Alberto''
-
-\erroronpage{1081}{col 1}{HjG}{2004/06/22}{2}
- Change page number in entry:
- ``Fukui, Rei, xxvii, 405, \u{969}'' \> ``\ldots, \u{968}''
-
-\erroronpage{1081}{col 1}{LMa}{2004/05/14}{2}
- The name ``M\o ller Neergaard, Peter'' should be sorted as
- ``Neergaard, Peter M\o ller''.
-
-\erroronpage{1081}{col 2}{HjG}{2004/06/16}{2}
- Change page number in entry:
- ``Hufflen, Jean-Michel, 761, \u{971}'' \> ``\ldots, \u{970}''
-
-\erroronpage{1081}{}{HjG}{2004/07/08}{2}
- Add page entries for ``Kettler, Howard'' and ``Frutiger, Adrian''
- to ``People'' index back to 374.
-
-\erroronpage{1082}{}{HjG}{2004/07/08}{2}
- Add page entry for ``Smith, Ralph'' to ``People'' index back to 376.
-
-
-\erroronpage{1082}{col 1, l.19 }{PPn}{2004/05/25}{2}
- Replace ``Panday'' with ``Pandey'' (very sorry for the typo).
-
-\erroronpage{1082}{col 1}{FMi}{2004/04/23}{2}
- Replace ``Wing, Wai'' with ``Wong, Wai'' (very sorry for the typo).
-
-\erroronpage{1082}{col 1}{HjG}{2004/07/13}{2}
- Change page numbers in entry:
- ``Mittelbach, Frank, \ldots, 976--\u{978, 980}, \ldots''
- \> ``\ldots, 976--\u{979}, \ldots''
-
-\erroronpage{1082}{}{HjG}{2004/07/13}{2}
- Add page entry for ``Rahtz, Sebastian''
- back to 981 (bib-item [161]).
-
-
-
-
-
-
-\CHAPTER{Biographies}
-
-\erroronpage{1084}{Goossens image}{THa}{2004/06/23}{2}
- Spurious gray square in upper right corner of framed image of Michel
- Goossens.
-
-\erroronpage{1085}{para 3, l.6}{MSc}{2004/05/19}{2}
- Replace ``TeX'' with ``\TeX''.
-
-
-\CHAPTER{Production Notes}
-
-\erroronpage{1089}{para 4, l.4}{FMi}{2004/07/21}{2}
- Add: ``\ldots this typographical icing \u{(package
- \textsf{pdfcprot})} was\ldots''
-
-\erroronpage{1089}{l.-5}{HjG}{2004/05/20}{2}
- Missing period: \ldots files\u. It \ldots
-
-\erroronpage{1090}{para -3, l.-4}{HjG}{2004/05/23}{2}
- Change/add: ``paragraphs ending \u{with a} single word \u{line}''
-
-\erroronpage{1091}{top}{WAd}{2004/05/08}{2}
- The series title in the box does not use a real caps and small caps
- font but a faked one (compare with the front cover where
- the font \emph{Christiana} designed by Gudrun Zapf-von Hesse is used).
-
-\end{erratalist}
-
-
-\setcounter{collectmore}{3}
-
-\begin{multicols}{3}[Thanks to all who have found errors or
- omissions. Listed are the people who found an errata entry first.]
-\contributor{AFV}{Alfonso Fernandez-Vazquez}
-\contributor{AHo}{Antti Honkela}
-\contributor{AMa}{Arni Magnusson}
-\contributor{ARi}{Alan Ristow}
-\contributor{BMo}{Brooks Moses}
-\contributor{BeB}{Bernd Burghardt}
-\contributor{CAR}{Chris A. Rowley}
-\contributor{CBC}{Charles B. Cameron}
-\contributor{CBa}{Cristian Battaglia}
-\contributor{CBe}{Claudio Beccari}
-\contributor{CKr}{Claudia Krysztofiak}
-\contributor{DAl}{Daniel Alonso i Alemany}
-\contributor{DAr}{Donald Arseneau}
-\contributor{DCa}{David Carlisle}
-\contributor{DHL}{Dan Luecking}
-\contributor{DIs}{Daniel Isaacson}
-\contributor{DSch}{Dirk Schlimm}
-\contributor{ERy}{Elizabeth Ryan}
-\contributor{FHa}{Ferdy Hanssen}
-\contributor{FMi}{Frank Mittelbach}
-\contributor{GBa}{Gerhard Bachmaier}
-\contributor{HOb}{Heiko Oberdiek}
-\contributor{HPB}{Harold P. Boas}
-\contributor{HVo}{Herbert Voss}
-\contributor{HjG}{Hubert G\"a\ss lein}
-\contributor{J-CCh}{Jean-C\^ome Charpentier}
-\contributor{JAn}{Jacques Andr\'e}
-\contributor{JBez}{Javier Bezos}
-\contributor{JBe}{Jens Berger}
-\contributor{JBr}{Johannes Braams}
-\contributor{JCh}{Joel Chan}
-\contributor{JGr}{Jose Grimm}
-\contributor{JJN}{Jarmo Niemel\"a}
-\contributor{JLV}{Juan Luis Varona}
-\contributor{JMH}{Jean-Michel Hufflen}
-\contributor{JS}{Joachim Schrod}
-\contributor{JTa}{Juhani Takkinen}
-\contributor{LHe}{Lars Hellstr\"om}
-\contributor{LMa}{Lars Madsen}
-\contributor{LSchu}{Lothar Schumacher}
-\contributor{MBr}{Marion Braams}
-\contributor{MGo}{Michel Goossens}
-\contributor{MHCL}{Martin Hiu Chung Law}
-\contributor{MHe}{Martin Hensel}
-\contributor{MHo}{Morten H\o gholm}
-\contributor{MKo}{Markus Kohm}
-\contributor{MKu}{Markus Kuhn}
-\contributor{MLa}{Mark Laplante}
-\contributor{MLi}{Martin Liebmann}
-\contributor{MSc}{Martin Schr\"oder}
-\contributor{MSch}{Michael Schutte}
-\contributor{NBe}{Nelson Beebe}
-\contributor{PPN}{P.P. Narayanaswami}
-\contributor{PYu}{Peng Yu}
-\contributor{RKo}{Reinhard Kotucha}
-\contributor{RPa}{Reimo Palm}
-\contributor{RSt}{Ralf Stubner}
-\contributor{RWa}{Richard Walker}
-\contributor{ReSt}{Rebecca Stiels}
-\contributor{SCo}{Steven Douglas Cochran}
-\contributor{SEg}{Stephen Eglen}
-\contributor{SPe}{Sa\v sa Petrovi\' c}
-\contributor{THa}{Thorsten Hansen}
-\contributor{TMW}{Thomas Widmann}
-\contributor{TMi}{Tom Micevski}
-\contributor{TSS}{Tommi Syrj\"anen}
-\contributor{UFi}{Ulrike Fischer}
-\contributor{UZi}{Uwe Ziegenhagen}
-\contributor{V-Li}{Christian Faulhammer}
-\contributor{VPe}{Vivi Petersen}
-\contributor{VVo}{Vladimir Volovich}
-\contributor{WAd}{William Adams}
-\contributor{WaS}{Walter Schmidt}
-\contributor{YiL}{Yiannis Lazarides}
-\contributor{YvH}{Yvon Henel}
-\contributor{hajk}{Henk Koster}
-\contributor{usw}{Ulrich Dirr}
-\end{multicols}
-
-
-Other people have sent us corrections for errors already found.
-Thanks to all of you!
-
-If you find further errors please report them to one of the authors, e.g.,
-\begin{quote}\ttfamily
- frank.mittelbach@latex-project.org
-\end{quote}
-preferably in a form usable directly in this file, i.e.,
-\begin{flushleft}
-|\erroronpage{|\textit{page-number}|}{|\textit{line-identification}|}{|%
- \textit{your-initials}|}{|\textit{date}|}{}| \\
- \hspace*{2em}\textit{description of the the erratum}
-\end{flushleft}
-Here is an example:
-\begin{verbatim}
-\erroronpage{5}{para 3, l.1}{MOs}{1997/06/01}{}
- ``LaTeX'' should be typeset ``\LaTeX''.
-\end{verbatim}
-
-\end{document}
-
-
diff --git a/macros/latex-dev/base/tlc2.pdf b/macros/latex-dev/base/tlc2.pdf
deleted file mode 100644
index c79d0723d3..0000000000
--- a/macros/latex-dev/base/tlc2.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/base/tulm.fdd b/macros/latex-dev/base/tulm.fdd
index a5a212c6e1..dfda332ce4 100644
--- a/macros/latex-dev/base/tulm.fdd
+++ b/macros/latex-dev/base/tulm.fdd
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 2016-2017
+% Copyright 2016-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
@@ -30,7 +30,7 @@
%\iffalse This is a META comment
%
% File `cmfonts.fdd'.
-% Copyright (C) 2016-2017 LaTeX3 Project
+% Copyright (C) 2016-2019 LaTeX3 Project
%
%
%<TUlmr>\ProvidesFile{tulmr.fd}
diff --git a/macros/latex-dev/base/tulm.ins b/macros/latex-dev/base/tulm.ins
index 1a48c866b4..d307956830 100644
--- a/macros/latex-dev/base/tulm.ins
+++ b/macros/latex-dev/base/tulm.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 2016-2017
+%% Copyright (C) 2016-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -11,12 +11,12 @@
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
-%% conditions of the LaTeX Project Public License, either version 1.3b
+%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
-%% and version 1.3b or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
@@ -48,7 +48,7 @@ reports for it can be opened at https://latex-project.org/bugs.html
(but please observe conditions on bug reports sent to that address!)
-Copyright 2016-2017
+Copyright (C) 2016-2019
The LaTeX3 Project and any individual authors listed elsewhere
in this file.
@@ -61,7 +61,7 @@ of this license or (at your option) any later version.
The latest version of this license is in
https://www.latex-project.org/lppl.txt
and version 1.3c or later is part of all distributions of LaTeX
-version 2005/12/01 or later.
+version 2008 or later.
This file may only be distributed together with a copy of the LaTeX
base system. You may however distribute the LaTeX base system without
diff --git a/macros/latex-dev/base/tulm.pdf b/macros/latex-dev/base/tulm.pdf
index 2e0609184b..7b170f6b44 100644
--- a/macros/latex-dev/base/tulm.pdf
+++ b/macros/latex-dev/base/tulm.pdf
Binary files differ
diff --git a/macros/latex-dev/base/unpack.ins b/macros/latex-dev/base/unpack.ins
index 969028edfe..5e6f36ca9d 100644
--- a/macros/latex-dev/base/unpack.ins
+++ b/macros/latex-dev/base/unpack.ins
@@ -3,7 +3,7 @@
%% driver files from the doc files in this package when run through
%% LaTeX or TeX.
%%
-%% Copyright 1993-2017
+%% Copyright (C) 1993-2019
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
@@ -16,7 +16,7 @@
%% The latest version of this license is in
%% https://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
-%% version 2005/12/01 or later.
+%% version 2008 or later.
%%
%% This file has the LPPL maintenance status "maintained".
%%
diff --git a/macros/latex-dev/base/usrguide.pdf b/macros/latex-dev/base/usrguide.pdf
new file mode 100644
index 0000000000..2afcee0f05
--- /dev/null
+++ b/macros/latex-dev/base/usrguide.pdf
Binary files differ
diff --git a/macros/latex-dev/base/usrguide.tex b/macros/latex-dev/base/usrguide.tex
new file mode 100644
index 0000000000..0805416837
--- /dev/null
+++ b/macros/latex-dev/base/usrguide.tex
@@ -0,0 +1,1817 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the LaTeX base system.
+% -------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% This file has the LPPL maintenance status "maintained".
+%
+% The list of all files belonging to the LaTeX base distribution is
+% given in the file `manifest.txt'. See also `legal.txt' for additional
+% information.
+%
+% The list of derived (unpacked) files belonging to the distribution
+% and covered by LPPL is defined by the unpacking scripts (with
+% extension .ins) which are part of the distribution.
+%
+% \fi
+% Filename: usrguide.tex
+
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\documentclass{ltxguide}[2001/05/28]
+
+\title{\LaTeXe~for authors}
+
+\author{\copyright~Copyright 1995--2019, \LaTeX3 Project Team.\\
+ All rights reserved.}
+
+\date{27 January 2019}
+
+
+\begin{document}
+
+\maketitle
+
+\tableofcontents
+
+\section{Introduction}
+
+Welcome to \LaTeXe, the new standard version of the \LaTeX{} Document
+Preparation System.
+
+This document describes how to take advantage of the new features of
+\LaTeX, and how to process your old \LaTeX{} documents with
+\LaTeXe. However, this document is only a brief introduction to the
+new facilities and is intended for authors who are already familiar
+with the old version of \LaTeX{}. It is \emph{not} a reference manual
+for \LaTeXe{} nor is it a complete introduction to \LaTeX.
+
+It is somewhat of an historical document now, since \LaTeXe{} came into
+existence in 1994.
+
+\subsection[\LaTeXe---The new \LaTeX~release]
+ {\LaTeXe---The new \LaTeX~release\\ (well, for more than 10 years now)}
+
+The previous version of \LaTeX{} was known as \LaTeX~2.09. Over the
+years many extensions have been developed for \LaTeX. This is, of
+course, a sure sign of its continuing popularity but it has had one
+unfortunate result: incompatible \LaTeX{} formats came into use at
+different sites. This included `standard \LaTeX~2.09', \LaTeX{} built
+with the \emph{New Font Selection Scheme}~(\NFSS), \SLiTeX, \AmSLaTeX,
+and so on. Thus, to process documents from various places, a site
+maintainer was forced to keep multiple versions of the \LaTeX{}
+program. In addition, when looking at a source file it was not always
+clear for which format the document was written.
+
+To put an end to this unsatisfactory situation, \LaTeXe{} has been
+produced; it brings all such extensions back under a single format and
+thus prevents the proliferation of mutually incompatible dialects of
+\LaTeX~2.09. With \LaTeXe{} the `new font selection scheme' is
+standard and, for example, \textsf{amsmath} (formerly the \AmSLaTeX{}
+format) or \textsf{slides} (formerly the \SLiTeX{} format) are simply
+extensions, which may be loaded by documents using the same base format.
+
+The introduction of a new release also made it possible to add a small
+number of often-requested features and to make the task of writing
+packages and classes simpler.
+
+\subsection{\LaTeX3---The long-term future of \LaTeX}
+\label{Sec:ltx3}
+
+\LaTeXe{} is the consolidation step in a comprehensive
+reimplementation of the \LaTeX{} system. The next major release of
+\LaTeX{} will be \LaTeX3, which will include a radical overhaul of the
+document designers' and package writers' interface to \LaTeX.
+
+\LaTeX3 is a long-term research project but, until it is completed,
+the project team are committed to the active maintenance of \LaTeXe{}.
+Thus the experience gained from the production and maintenance of
+\LaTeXe{} will be a major influence on the design of \LaTeX3.
+A brief description of the project can be found in the document
+|ltx3info.tex|.
+
+If you would like to support the project then you are welcome to send
+donations to the \LaTeX3 Project Fund; this has been set up to help
+the research team by financing various expenses associated with this
+voluntary work of maintaining the current \LaTeX{} and developing
+\LaTeX3.
+
+The fund is administered by The \TeX{} Users Group and by various
+local user groups. Information about making donations and joining
+these groups is available from:
+\begin{quote}\small\label{addrs}
+ \texttt{http://www.tug.org/lugs.html}
+\end{quote}
+
+The \LaTeX3{} project has its home page
+on the World Wide Web at:
+\begin{verbatim}
+ http://www.latex-project.org/
+\end{verbatim}
+This page describes \LaTeX{} and the \LaTeX3 project, and contains
+pointers to other \LaTeX{} resources, such as the user guides, the
+\TeX{} Frequently Asked Questions, and the \LaTeX{} bugs database.
+
+Older articles covering aspects of the \LaTeX3 project are also
+available for anonymous ftp from the Comprehensive \TeX{} Archive, in
+the directory:
+\begin{verbatim}
+ ctan:info/ltx3pub
+\end{verbatim}
+The file |ltx3pub.bib| in that directory contains an abstract of each
+of the files.
+
+\subsection{Overview}
+
+This document contains an overview of the new structure and features
+of \LaTeX. It is \emph{not} a self-contained document, as it contains
+only the features of \LaTeX{} which have changed since version 2.09.
+You should read this document in conjunction with an introduction to
+\LaTeX{}.
+
+\begin{description}
+
+\item[Section~\ref{Sec:class+packages}]
+ contains an overview of the new structure of
+ \LaTeX{} documents. It describes how classes and packages work and
+ how class and package options can be used. It lists the standard
+ packages and classes which come with \LaTeX.
+
+\item[Section~\ref{Sec:commands}] describes the new commands available
+ to authors in \LaTeXe.
+
+\item[Section~\ref{Sec:209}] shows how to process old \LaTeX{}
+ documents with \LaTeXe.
+
+\item[Section~\ref{Sec:problems}] contains advice on dealing with
+ problems you may encounter in running \LaTeXe.
+ It lists some error messages which are new in \LaTeXe{} and
+ it describes some of the more common problems and how to cure them,
+ or where to find further information.
+
+\end{description}
+
+\subsection{Further information}
+
+For a general introduction to \LaTeX, including the new features of
+\LaTeXe, you should read \emph{\LaTeXbook}
+by Leslie Lamport~\cite{A-W:LLa94}.
+
+A more detailed description of the new features of \LaTeX, including an
+overview of more than 200 packages and nearly 1000 ready to run examples, is
+to be found in \emph{\LaTeXcomp second edition} by Frank Mittelbach and
+Michel Goossens~\cite{A-W:MG2004}.
+
+Packages and programs for producing and manipulating graphics are
+discussed at length in \emph{\LaTeXGcomp} by Michel Goossens,
+Sebastian Rahtz and Frank Mittelbach~\cite{A-W:GRM97}.
+
+Solutions for publishing with \LaTeX{} on the World Wide Web are given
+in \emph{\LaTeXWcomp} by Michel Goossens and Sebastian
+Rahtz~\cite{A-W:GR99}.
+
+For more information about the many new \LaTeX{} packages you should
+read the package documentation, which should be available from the
+same source as your copy of \LaTeX.
+
+There are a number of documentation files which accompany every copy
+of \LaTeX. A copy of \emph{\LaTeX{} News} will come out with each
+six-monthly release of \LaTeX; it will be found in the files
+|ltnews*.tex|. The class- and package-writer's guide \emph{\clsguide}
+describes the new \LaTeX{} features for writers of document classes
+and packages; it is in |clsguide.tex|. The guide \emph{\fntguide}
+describes the \LaTeX{} font selection scheme for class- and
+package-writers; it is in |fntguide.tex|. Support for Cyrillic languages
+in \LaTeX{} is described in \emph{\cyrguide}.
+
+The documented source code (from the files used to produce the kernel
+format via |latex.ltx|) is now available as
+\emph{The \LaTeXe\ Sources}. ]
+This very large document also includes an index of
+\LaTeX{} commands. It can be typeset from the \LaTeX{} file
+|source2e.tex| in the |base| directory, using the source files and
+the class file |ltxdoc.cls| from this directory.
+
+For more information about \TeX{} and \LaTeX{}, please contact your
+local \TeX{} Users Group, or the international \TeX{} Users Group (see
+page \pageref{addrs}).
+
+
+\section{Classes and packages}
+\label{Sec:class+packages}
+
+This section describes the new structure of \LaTeX{} documents and the
+new types of file: \emph{classes} and \emph{packages}.
+
+\subsection{What are classes and packages?}
+
+The main difference between \LaTeX~2.09 and \LaTeXe{} is in the
+commands before |\begin{document}|.
+
+In \LaTeX~2.09, documents had \emph{styles},
+such as \textsf{article} or \textsf{book}, and \emph{options},
+such as \textsf{twoside} or \textsf{epsfig}.
+These were indicated by the |\documentstyle| command:
+\begin{quote}
+ |\documentstyle|\oarg{options}\arg{style}
+\end{quote}
+For example, to specify a two-sided article with encapsulated
+PostScript figures, you said:
+\begin{verbatim}
+ \documentstyle[twoside,epsfig]{article}
+\end{verbatim}
+However, there were two different types of document style option:
+\emph{built-in options} such as |twoside|; and \emph{packages} such as
+|epsfig.sty|. These were very different, since any \LaTeX{} document
+style could use the \textsf{epsfig} package but only document styles
+which declared the \textsf{twoside} option could use that option.
+
+To avoid this confusion, \LaTeXe{} differentiates between built-in
+options and packages. These are given by the new |\documentclass| and
+|\usepackage| commands:
+\begin{quote}
+ |\documentclass|\oarg{options}\arg{class} \\
+ |\usepackage|\oarg{options}\arg{packages}
+\end{quote}
+For example, to specify a two-sided article with encapsulated
+PostScript figures, you now write:
+\begin{verbatim}
+ \documentclass[twoside]{article}
+ \usepackage{epsfig}
+\end{verbatim}
+You can load more than one package with a single |\usepackage|
+command; for example, rather than writing:
+\begin{verbatim}
+ \usepackage{epsfig}
+ \usepackage{multicol}
+\end{verbatim}
+you can specify:
+\begin{verbatim}
+ \usepackage{epsfig,multicol}
+\end{verbatim}
+Note that \LaTeXe{} still understands the \LaTeX~2.09 |\documentstyle|
+command. This command causes \LaTeXe{} to enter \emph{\LaTeX~2.09
+compatibility mode}, which is described in Section~\ref{Sec:209}.
+
+You should not, however, use the |\documentstyle| command for new
+documents because this compatibility mode is very slow and the new
+features of \LaTeXe{} are not available in this mode.
+
+To help differentiate between classes and packages, document classes
+now end with |.cls| rather than |.sty|. Packages still end with
+|.sty|, since most \LaTeX~2.09 packages work well with \LaTeXe.
+
+\subsection{Class and package options}
+
+In \LaTeX~2.09, only document styles could have options such as
+|twoside| or |draft|. In \LaTeXe{}, both classes and packages are
+allowed to have options. For example, to specify a two-sided article
+with graphics using the |dvips| driver, you write:
+
+\begin{verbatim}
+ \documentclass[twoside]{article}
+ \usepackage[dvips]{graphics}
+\end{verbatim}
+It is possible for packages to share common options. For example,
+you could, in addition, load the \textsf{color} package by specifying:
+\begin{verbatim}
+ \documentclass[twoside]{article}
+ \usepackage[dvips]{graphics}
+ \usepackage[dvips]{color}
+\end{verbatim}
+But because |\usepackage| allows more than one package to be listed,
+this can be shortened to:
+\begin{verbatim}
+ \documentclass[twoside]{article}
+ \usepackage[dvips]{graphics,color}
+\end{verbatim}
+In addition, packages will also use each option given to
+the |\documentclass| command (if they know what to do with it), so you
+could also write:
+\begin{verbatim}
+ \documentclass[twoside,dvips]{article}
+ \usepackage{graphics,color}
+\end{verbatim}
+Class and package options are covered in more detail in
+\emph{\LaTeXcomp} and in \emph{\clsguide}.
+
+\subsection{Standard classes}
+
+The following classes are distributed with \LaTeX:
+\begin{description}
+
+\item[article] The |article| class described in \emph{\LaTeXbook}.
+\item[book] The |book| class described in \emph{\LaTeXbook}.
+\item[report] The |report| class described in \emph{\LaTeXbook}.
+\item[letter] The |letter| class described in \emph{\LaTeXbook}.
+\item[slides] The |slides| class described in \emph{\LaTeXbook},
+ formerly \SLiTeX.
+\item[proc] A document class for proceedings, based on |article|.
+ Formerly the |proc| package.
+\item[ltxdoc] The document class for documenting the \LaTeX{}
+ program, based on |article|.
+\item[ltxguide] The document class for \emph{\usrguide} and
+ \emph{\clsguide}, based on |article|. The document you are reading
+ now uses the |ltxguide| class. The layout for this class is likely
+ to change in future releases of \LaTeX.
+\item[ltnews] The document class for the \emph{\LaTeX{} News}
+ information sheet, based on |article|. The layout for this class
+ is likely to change in future releases of \LaTeX.
+\item[minimal]
+\NEWfeature{1995/12/01}
+ This class is the bare minimum (3 lines) that is needed in a
+ \LaTeX\ class file. It just sets the text width and height, and
+ defines |\normalsize|. It is principally intended for debugging
+ and testing \LaTeX\ code in situations where you do not need to
+ load a `full' class such as |article|. If, however, you are
+ designing a completely new class that is aimed for documents with
+ structure radically different from the structure supplied by the
+ article class, then it may make sense to use this as a base and add
+ to it code implementing the required structure, rather than
+ starting from |article| and modifying the code there.
+\end{description}
+
+\subsection{Standard packages}
+\label{Sec:st-pack}
+
+The following packages are distributed with \LaTeX:
+\begin{description}
+\item[alltt]
+\NEWfeature{1994/12/01}
+ This package provides the |alltt| environment, which is like
+ the |verbatim| environment except that |\|, |{|, and |}|
+ have their usual meanings. It is described in |alltt.dtx| and
+ \emph{\LaTeXbook}.
+\item[doc] This is the basic package for typesetting the documentation
+ of \LaTeX{} programs. It is described in |doc.dtx| and in
+ \emph{\LaTeXcomp}.
+\item[exscale] This provides scaled versions of the math extension
+ font. It is described in |exscale.dtx| and \emph{\LaTeXcomp}.
+ \item[fontenc] This is used to specify which font encoding \LaTeX{}
+ should use. It is described in |ltoutenc.dtx|.
+\item[graphpap]
+\NEWfeature{1994/12/01}
+ This package defines the |\graphpaper| command; this
+ can be used in a |picture| environment.
+\item[ifthen] Provides commands of the form `if\dots then do\dots
+ otherwise do\dots'.
+ It is described in |ifthen.dtx| and \emph{\LaTeXcomp}.
+\item[inputenc]
+\NEWfeature{1994/12/01}
+ This is used to specify which input encoding \LaTeX{} should use.
+ It is described in |inputenc.dtx|.
+\item[latexsym] \LaTeXe{} no longer loads the \LaTeX{} symbol font by
+ default. To access it, you should use the |latexsym| package. It
+ is described in |latexsym.dtx| and in \emph{\LaTeXcomp}; see also
+ Section~\ref{Sec:problems}.
+ \item[makeidx] This provides commands for producing indexes. It is
+ described in \emph{\LaTeXbook} and in \emph{\LaTeXcomp}.
+ \item[newlfont] This is used to emulate the font commands of
+ \LaTeX~2.09 with the New Font Selection Scheme. It is described in
+ \emph{\LaTeXcomp}.
+ \item[oldlfont] This is used to emulate the font commands of
+ \LaTeX~2.09. It is described in \emph{\LaTeXcomp}.
+ \item[showidx]
+ This causes the argument of each |\index| command to
+ be printed on the page where it occurs.
+ It is described in \emph{\LaTeXbook}.
+ \item[syntonly] This is used to process a document without
+ typesetting it. It is described in |syntonly.dtx| and in
+ \emph{\LaTeXcomp}.
+ \item[tracefnt] This allows you to control how much information about
+ \LaTeX's font loading is displayed. It is described in
+ \emph{\LaTeXcomp}.
+\end{description}
+
+\subsection{Related software}
+
+\NEWdescription{1998/12/01}
+The following software should be available from the same distributor
+as your copy of \LaTeXe. You should obtain at least the
+\textsf{graphics} and \textsf{tools} collections in order to have all
+the files described in \emph{\LaTeXbook}. The |amsmath| package (part
+of \textsf{amslatex} and formerly known as |amstex|)
+and \textsf{babel} are also mentioned in the list
+of `standard packages' in section C.5.2 of that book.
+\begin{description}
+\item[amslatex] Advanced mathematical typesetting from the American
+ Mathematical Society. This includes the |amsmath| package; it
+ provides many commands for typesetting mathematical formulas of
+ higher complexity. It is produced and supported by the American
+ Mathematical Society and it is described in \emph{\LaTeXcomp}.
+\item[babel] This package and related files support typesetting in
+ many languages. It is described in \emph{\LaTeXcomp}.
+\item[cyrillic]
+\NEWfeature{1998/12/01}
+ Everything you need (except the fonts themselves) for
+ typesetting with Cyrillic fonts.
+\item[graphics] This includes the |graphics| package which
+ provides support for the inclusion and transformation of graphics,
+ including files produced by other software. Also included, is the
+ |color| package which provides support for typesetting in colour.
+ Both these packages are described in \emph{\LaTeXbook}.
+\item[psnfss] Everything you need (except the fonts themselves) for
+ typesetting with a large range of Type~1 (PostScript) fonts.
+\item[tools] Miscellaneous packages written by the \LaTeX3
+ project team.
+\end{description}
+These packages come with documentation and each of them is also
+described in at least one of the books \emph{\LaTeXcomp} and
+\emph{\LaTeXbook}.
+
+\subsubsection{Tools}
+
+This collection of packages includes, at least, the following (some
+files may have slightly different names on certain systems):
+
+\begin{description}
+\item[array]
+ Extended versions of the environments |array|, |tabular|
+ and |tabular*|, with many extra features.
+\item[calc]
+\NEWfeature{1996/12/01}
+ Enables the use of certain algebraic notation when specifying
+ values for lengths and counters.
+\item[dcolumn]
+ Alignment on `decimal points' in tabular entries. Requires the
+ |array| package.
+\item[delarray]
+ Adds `large delimiters' around arrays. Requires |array|.
+\item[hhline]
+ Finer control over horizontal rules in tables. Requires |array|.
+\item[longtable]
+ Multi-page tables. (Does not require |array|, but it uses the
+ extended features if both are loaded.)
+\item[tabularx]
+ Defines a |tabularx| environment that is similar to |tabular*|
+ but it modifies the column widths, rather than the inter-column
+ space, to achieve the desired table width.
+\item[afterpage]
+ Place text after the current page.
+\item[bm]
+ Access bold math symbols.
+\item[enumerate]
+ Extended version of the |enumerate| environment.
+\item[fontsmpl]
+ Package and test file for producing `font samples'.
+\item[ftnright]
+ Place all footnotes in the right-hand column in two-column mode.
+\item[indentfirst]
+ Indent the first paragraph of sections, etc.
+\item[layout]
+ Show the page layout defined by the current document class.
+\item[multicol]
+ Typeset text in columns, with the length of the columns
+ `balanced'.
+\item[rawfonts]
+ Preload fonts using the old internal font names of \LaTeX~2.09.
+ See Section~\ref{Sec:oldinternals}.
+\item[somedefs]
+ Selective handling of package options. (Used by the rawfonts
+ package.)
+\item[showkeys]
+ Prints the `keys' used by |\label|, |\ref|, |\cite| etc.; useful
+ whilst drafting.
+\item[theorem]
+ Flexible declaration of `theorem-like' environments.
+\item[varioref]
+ `Smart' handling of page references.
+\item[verbatim]
+ Flexible extension of the verbatim environment.
+\item[xr]
+ Cross reference other `external' documents.
+\item[xspace]
+ `Smart space' command that helps you to avoid the common mistake
+ of missing spaces after command names.
+\end{description}
+
+
+\section{Commands}
+\label{Sec:commands}
+
+This section describes the new commands available in \LaTeXe.
+They are covered in more detail in \emph{\LaTeXbook} and in
+\emph{\LaTeXcomp}.
+
+\subsection{Initial commands}
+
+Initial commands can appear only before the |\documentclass|
+line.
+
+\begin{decl}
+|\begin{filecontents}| \arg{file-name} \\
+ \m{file-contents} \\
+|\end{filecontents}|
+\end{decl}
+
+The |filecontents| environment is intended for bundling within a
+single document file the contents of packages, options, or other
+files. When the document file is run through \LaTeXe{} the body of
+this environment is written verbatim (preceded by a comment line) to a
+file whose name is given as the environment's only argument. However,
+if that file already exists then nothing happens except for an
+information message.
+
+Only normal ASCII text characters (7-bit visible text) should be
+included in a |filecontents| environment. Anything else, such as tab
+characters, form-feeds or 8-bit characters, should not be included in a
+|filecontents| environment.
+
+Tabs and form feeds produce a warning, explaining that they are turned
+into spaces or blank lines, respectively.
+What happens to 8-bit characters depends on the \TeX{} installation and
+is in general unpredictable.
+
+The |filecontents| environment is used for including \LaTeX{} files.
+For other plain text files (such as Encapsulated PostScript files),
+you should use the |filecontents*| environment which does not add a
+comment line.
+
+These environments are allowed only before |\documentclass|. This
+ensures that any packages that have been bundled in the document are
+present when needed.
+
+\subsection{Preamble commands}
+\label{Sec:pre}
+
+The changes to the preamble commands are intentionally designed to make
+\LaTeXe{} documents look clearly different from old documents. The
+commands should be used only before |\begin{document}|.
+
+\begin{decl}
+|\documentclass| \oarg{option-list} \arg{class-name}
+ \oarg{release-date}
+\end{decl}
+
+This command replaces the
+\LaTeX~2.09 command |\documentstyle|.
+
+There must be exactly one |\documentclass| command in a document; and
+it must come after the |filecontents| environments, if any, but before
+any other commands.
+
+The \m{option-list} is a list of options, each of which may modify the
+formatting of elements which are defined in the \m{class-name} file,
+as well as those in all following |\usepackage| commands (see
+below).
+
+The optional argument \m{release-date} can be used to specify the
+earliest desired release date of the class file; it should contain a
+date in the format \textsc{yyyy/mm/dd}. If a version of the class
+older than this date is found, a warning is issued.
+
+For example, to specify a two-column article, using a version of
+|article.cls| released after June 1994, you specify:
+\begin{verbatim}
+ \documentclass[twocolumn]{article}[1994/06/01]
+\end{verbatim}
+
+\begin{decl}
+|\documentstyle| \oarg{option-list} \arg{class-name}
+\end{decl}
+
+This command is still supported for compatibility with old files. It
+is essentially the same as |\documentclass| except that it invokes
+\emph{\LaTeX~2.09 compatibility mode}. It also causes any options in
+the \m{option-list} that are not processed by the class file to be
+loaded as packages after the class has been loaded. See
+Section~\ref{Sec:209} for more details on \LaTeX~2.09 compatibility
+mode.
+
+\begin{decl}
+|\usepackage| \oarg{option-list} \arg{package-name} \oarg{release-date}
+\end{decl}
+
+Any number of |\usepackage| commands is allowed. Each package file
+(as denoted by \m{package-name}) defines new elements (or modifies
+those defined in the class file loaded by the \m{class-name} argument
+of the |\documentclass| command). A package file thus extends the
+range of documents which can be processed.
+
+The \m{option-list} argument can contain a list of options, each of
+which can modify the formatting of elements which are defined in this
+\m{package-name} file.
+
+As above, \m{release-date} can contain the earliest desired release
+date of the package file in the format \textsc{yyyy/mm/dd}; if an
+older version of the package is found, a warning is issued.
+
+For example, to load the |graphics| package for the |dvips| driver,
+using a version of |graphics.sty| released after June 1994, you write:
+\begin{verbatim}
+ \usepackage[dvips]{graphics}[1994/06/01]
+\end{verbatim}
+Each package is loaded only once. If the same package is requested
+more than once, nothing happens in the second or following attempt
+unless the package has been requested with options that were not given
+in the original |\usepackage|. If such extra options are specified
+then an error message is produced. See Section~\ref{Sec:problems} how
+to resolve this problem.
+
+As well as processing the options given in the \m{option-list} of the
+|\usepackage| command, each package processes the
+\m{option-list} of the |\documentclass| command as well. This
+means that any option which should be processed by every package (to
+be precise, by every package that specifies an action for it) can be
+specified just once, in the |\documentclass| command, rather than
+being repeated for each package that needs it.
+
+\begin{decl}
+|\listfiles|
+\end{decl}
+
+If this command is placed in the preamble then a list of the files
+read in (as a result of processing the document) will be displayed
+on the terminal (and in the log file) at the end of the run. Where
+possible, a short description will also be produced.
+
+\NEWdescription{1995/12/01}
+\emph{Warning}: this command will list only files which were read
+using \LaTeX{} commands such as |\input|\arg{file} or
+|\include|\arg{file}. If the file was read using the primitive \TeX{}
+syntax |\input |\emph{file} (without |{ }| braces around the file name)
+then it will not be listed; failure to use the \LaTeX{} form with the
+braces can cause more severe problems, possibly leading to overwriting
+important files, so \textbf{always put in the braces}.
+
+
+\begin{decl}
+|\setcounter{errorcontextlines}| \arg{num}
+\end{decl}
+
+\TeX~3 introduced a new primitive |\errorcontextlines| which controls
+the format of error messages. \LaTeXe\ provides an interface to this
+through the standard |\setcounter| command. As most \LaTeX\ users do
+not want to see the internal definitions of \LaTeX\ commands each time
+they make an error, \LaTeXe{} sets this to $-1$ by default.
+
+\subsection{Document structure}
+
+The |book| document class introduces new commands to indicate
+document structure.
+\begin{decl}
+|\frontmatter| \\ |\mainmatter| \\ |\backmatter|
+\end{decl}
+These commands indicate the beginning of the front matter (title page,
+table of contents and prefaces), main matter (main text) and back
+matter (bibliography, indexes and colophon).
+
+\subsection{Definitions}
+
+In \LaTeX, commands can have both mandatory and optional arguments,
+for example in:
+\begin{verbatim}
+ \documentclass[11pt]{article}
+\end{verbatim}
+the |11pt| argument is optional, whereas the |article| class name is
+mandatory.
+
+In \LaTeX~2.09 users could define commands with arguments, but these
+had to be mandatory arguments. With \LaTeXe, users can now define
+commands and environments which also have one optional argument.
+
+\begin{decl}
+|\newcommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \\
+|\newcommand*| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \\
+|\renewcommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \\
+|\renewcommand*| \arg{cmd} \oarg{num} \oarg{default} \arg{definition}
+\end{decl}
+
+These commands have a new, second, optional argument; this is used for
+defining commands which themselves take one optional argument. This
+new argument is best introduced by means of a simple (and hence not
+very practical) example:
+\begin{verbatim}
+ \newcommand{\example}[2][YYY]{Mandatory arg: #2;
+ Optional arg: #1.}
+\end{verbatim}
+This defines |\example| to be a command with two arguments, referred
+to as |#1| and |#2| in the \arg{definition}---nothing new so far. But
+by adding a second optional argument to this |\newcommand| (the
+|[YYY]|) the first argument (|#1|) of the newly defined command
+|\example| is made optional with its default value being |YYY|.
+
+Thus the usage of |\example| is either:
+\begin{verbatim}
+ \example{BBB}
+\end{verbatim}
+which prints:
+\begin{quote}
+ Mandatory arg: BBB;
+ Optional arg: YYY.
+\end{quote}
+or:
+\begin{verbatim}
+ \example[XXX]{AAA}
+\end{verbatim}
+which prints:
+\begin{quote}
+ Mandatory arg: AAA;
+ Optional arg: XXX.
+\end{quote}
+
+The default value of the optional argument is \texttt{YYY}.
+This value is specified as the \oarg{default} argument of the
+|\newcommand| that created |\example|.
+
+As another more useful example, the definition:
+\begin{verbatim}
+ \newcommand{\seq}[2][n]{\lbrace #2_{0},\ldots,\,#2_{#1} \rbrace}
+\end{verbatim}
+means that the input |$\seq{a}$| produces
+the formula $\lbrace a_{0},\ldots,\,a_{n} \rbrace$,
+whereas the input |$\seq[k]{x}$| produces the formula
+$\lbrace x_{0},\ldots,\,x_{k} \rbrace$.
+
+In summary, the command:
+\begin{quote}
+ |\newcommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition}
+\end{quote}
+defines \m{cmd} to be a command with \m{num} arguments, the first of
+which is optional and has default value \m{default}.
+
+Note that there can only be one optional argument but, as before,
+there can be up to nine arguments in total.
+
+\begin{decl}
+|\newenvironment|
+ \arg{cmd} \oarg{num} \oarg{default} \arg{beg-def} \arg{end-def} \\
+|\newenvironment*|
+ \arg{cmd} \oarg{num} \oarg{default} \arg{beg-def} \arg{end-def} \\
+|\renewenvironment|
+ \arg{cmd} \oarg{num} \oarg{default} \arg{beg-def} \arg{end-def} \\
+|\renewenvironment*|
+ \arg{cmd} \oarg{num} \oarg{default} \arg{beg-def} \arg{end-def}
+\end{decl}
+
+\LaTeXe\ also supports the creation of environments that have one
+optional argument. Thus the syntax of these two commands has
+been extended in the same way as that of |\newcommand|.
+
+\begin{decl}
+|\providecommand| \arg{cmd} \oarg{num} \oarg{default} \arg{definition} \\
+|\providecommand*| \arg{cmd} \oarg{num} \oarg{default} \arg{definition}
+\end{decl}
+
+This takes the same arguments as |\newcommand|. If \m{cmd} is already
+defined then the existing definition is kept; but if it is currently
+undefined then the effect of |\providecommand| is to define \m{cmd}
+just as if |\newcommand| had been used.
+
+\NEWfeature{1994/12/01}
+ All the above five `defining commands' now have \texttt{*}-forms that
+ are usually the better form to use when defining commands with
+ arguments, unless any of these arguments is intended to contain
+ whole paragraphs of text. Moreover, if you ever do find yourself
+ needing to use the non-star form then you should ask whether
+ that argument would not better be treated as the contents of a
+ suitably defined environment.
+
+\NEWfeature{1995/12/01}
+ The commands produced by the above five `defining commands' are
+ now robust.
+
+\subsection{Boxes}
+
+These next three commands for making LR-boxes all existed in
+\LaTeX~2.09. They have been enhanced in two ways.
+
+\begin{decl}
+|\makebox| \oarg{width} \oarg{pos} \arg{text} \\
+|\framebox| \oarg{width} \oarg{pos} \arg{text} \\
+|\savebox| \arg{cmd} \oarg{width} \oarg{pos} \arg{text}
+\end{decl}
+
+One small but far-reaching change for \LaTeXe\ is that, within the
+\m{width} argument only, four special lengths can be used. These are
+all dimensions of the box that would be produced by using simply
+|\mbox|\arg{text}:
+\begin{itemize}
+\item [] |\height|\quad its height above the baseline;
+\item [] |\depth|\quad its depth below the baseline;
+\item [] |\totalheight|\quad the sum of |\height| and |\depth|;
+\item [] |\width|\quad its width.
+\end{itemize}
+Thus, to put `hello' in the centre of a box of twice its natural
+width, you would use:
+\begin{verbatim}
+ \makebox[2\width]{hello}
+\end{verbatim}
+Or you could put \textit{f} into a square box, like
+this:
+ \framebox{\makebox[\totalheight]{\itshape f\/}}
+\begin{verbatim}
+ \framebox{\makebox[\totalheight]{\itshape f\/}}
+\end{verbatim}
+Note that it is the total width of the framed box, including the
+frame, which is set to |\totalheight|.
+
+The other change is a new possibility for \m{pos}: |s| has been added
+to |l| and |r|. If \m{pos} is |s| then the text is stretched the full
+length of the box, making use of any `rubber lengths' (including any
+inter-word spaces) in the contents of the box. If no such `rubber
+length' is present, an `underfull box' will probably be produced.
+
+\begin{decl}
+|\parbox| \oarg{pos} \oarg{height} \oarg{inner-pos} \arg{width}
+ \arg{text} \\
+|\begin{minipage}|
+ \oarg{pos} \oarg{height} \oarg{inner-pos} \arg{width}\\
+\m{text}\\
+|\end{minipage}|
+\end{decl}
+
+As for the box commands above, |\height|, |\width|, etc.~may be used
+in the \oarg{height} argument to denote the natural dimensions of the
+box.
+
+The \m{inner-pos} argument is new in \LaTeXe. It is the vertical
+equivalent to the \m{pos} argument for |\makebox|, etc, determining
+the position of \m{text} within the box. The \m{inner-pos} may be any
+one of |t|, |b|, |c|, or |s|, denoting top, bottom, centered, or
+`stretched' alignment respectively. When the \m{inner-pos} argument
+is not specified, \LaTeX\ gives it same value as \m{pos} (this could be
+the latter's default value).
+
+
+\begin{decl}
+|\begin{lrbox}| \arg{cmd}\\
+\m{text}\\
+|\end{lrbox}|
+\end{decl}
+
+This is an environment which does not directly print anything.
+Its effect is to save the typeset \m{text} in the bin \m{cmd}. Thus
+it is like |\sbox| \arg{cmd} \arg{text}, except that any white space
+before or after the contents \m{text} is ignored.
+
+This is very useful as it enables both the |\verb| command and the
+\texttt{verbatim} environment to be used within \m{text}.
+
+It also makes it possible to define, for example, a `framed box'
+environment. This is done by first using this environment to save
+some text in a bin \m{cmd} and then calling
+|\fbox{\usebox{|\m{cmd}|}}|.
+
+The following example defines an environment, called |fmpage|, that is
+a framed version of |minipage|.
+\begin{verbatim}
+ \newsavebox{\fmbox}
+ \newenvironment{fmpage}[1]
+ {\begin{lrbox}{\fmbox}\begin{minipage}{#1}}
+ {\end{minipage}\end{lrbox}\fbox{\usebox{\fmbox}}}
+\end{verbatim}
+
+
+\subsection{Measuring things}
+
+The first of these next commands was in \LaTeX~2.09. The two new
+commands are the obvious analogues.
+
+\begin{decl}
+|\settowidth| \arg{length-cmd} \arg{lr text} \\
+|\settoheight| \arg{length-cmd} \arg{lr text} \\
+|\settodepth| \arg{length-cmd} \arg{lr text}
+\end{decl}
+
+\subsection{Line endings}
+
+\NEWdescription{1994/12/01}
+The command |\\|, which is used to indicate a line-end in various
+places, is now a robust command when used within arguments such as
+section titles.
+
+Also, because it is often necessary to distinguish which type of line
+is to be ended, we have introduced the following new command; it
+has the same argument syntax as that of |\\|.
+\begin{decl}[1994/12/01]
+|\tabularnewline| \oarg{vertical-space}
+\end{decl}
+One example of its use is when the text in the last
+column of a |tabular| environment is set with |\raggedright|; then
+|\tabularnewline| can be used to indicate the end of a row of the
+|tabular|, whilst |\\| will indicate the end of a line of text in a
+paragraph within the column. This command can be used in the |array|
+environment as well as |tabular|, and also the extended versions of
+these environments offered by the \textsf{array} and \textsf{longtable}
+packages in the tools collection.
+
+\subsection{Controlling page breaks}
+
+Sometimes it is necessary, for a final version of a document, to
+`help' \LaTeX\ break the pages in the best way. \LaTeX~2.09 had a
+variety of commands for this situation: |\clearpage|, |\pagebreak|
+etc. \LaTeXe\ provides, in addition, commands which can produce
+longer pages as well as shorter ones.
+
+
+\begin{decl}
+|\enlargethispage| \arg{size} \\
+|\enlargethispage*| \arg{size}
+\end{decl}
+
+These commands increase the height of a page (from its normal value of
+|\textheight|) by the specified amount \m{size}, a rigid length. This
+change affects \emph{only} the current page.
+
+This can be used, for example, to allow an extra line to be fitted
+onto the page or, with a negative length, to produce a page
+shorter than normal.
+
+The star form also shrinks any vertical white space on the page as
+much as possible, so as to fit the maximum amount of text on the
+page.
+
+\NEWdescription{1995/12/01}
+These commands do not change the position of the footer text; thus, if
+a page is lengthened too far, the main text may overprint the footer.
+
+\subsection{Floats}
+
+There is a new command, |\suppressfloats|, and a new `float
+specifier'. These will enable people to gain better
+control of \LaTeX's float placement algorithm.
+
+\begin{decl}
+|\suppressfloats| \oarg{placement}
+\end{decl}
+
+This command stops any further floating environments from being placed
+on the current page. With an optional argument, which should be either
+|t| or |b| (not both), this restriction applies only to putting
+further floats at the top or at the bottom. Any floats which would
+normally be placed on this page are placed on the next page instead.
+
+\begin{decl}
+The extra float location specifier: \ \texttt{!}
+\end{decl}
+
+This can be used, along with at least one of \texttt{h}, \texttt{t},
+\texttt{b} and \texttt{p}, in the location optional argument of a
+float.
+
+If a \texttt{!} is present then, just for this particular float,
+whenever it is processed by the float mechanism the following are
+ignored:
+\begin{itemize}
+\item all restrictions on the number of floats which can appear;
+\item all explicit restrictions on the amount of space on a text page
+which may be occupied by floats or must be occupied by text.
+\end{itemize}
+The mechanism will, however, still attempt to ensure that pages are
+not overfull and that floats of the same type are printed in the
+correct order.
+
+Note that its presence has no effect on the production of float pages.
+
+A \texttt{!} specifier overrides the effect of any |\suppressfloats|
+command for this particular float.
+
+\subsection{Font changing: text}
+
+The font selection scheme used in \LaTeXe{} differs a lot from that
+used in \LaTeX~2.09. In this section, we give a brief description of
+the new commands. A more detailed description with examples is given
+in \emph{\LaTeXcomp}, and the interface for class- and package-writers
+is described in \emph{\fntguide}.
+
+\begin{decl}
+|\normalfont|\\
+|\rmfamily|\\
+|\sffamily|\\
+|\ttfamily|\\
+|\mdseries|\\
+|\bfseries|\\
+|\upshape|\\
+|\itshape|\\
+|\slshape|\\
+|\scshape|
+\end{decl}
+
+These are font commands whose use is the same as the commands |\rm|,
+|\bf|, etc. The difference is that each command changes just one
+attribute of the font (the attribute changed is part of the name).
+One result of this is that, for example, |\bfseries\itshape| produces
+both a change of series and a change of shape, to give a bold italic
+font.
+
+\begin{decl}
+|\textnormal|\arg{text}\\
+|\textrm|\arg{text}\\
+|\textsf|\arg{text}\\
+|\texttt|\arg{text}\\
+|\textmd|\arg{text}\\
+|\textbf|\arg{text}\\
+|\textup|\arg{text}\\
+|\textit|\arg{text}\\
+|\textsl|\arg{text}\\
+|\textsc|\arg{text}\\
+|\emph|\arg{text}
+\end{decl}
+
+These are one-argument commands; they take as an argument the
+text which is to be typeset in the particular font. They also
+automatically insert italic corrections where appropriate; if you do
+not like the result, you can add an italic correction with |\/| or
+remove it with |\nocorr|. The |\nocorr| should always be the first or
+last thing within the \arg{text} argument.
+
+\subsection{Font changing: math}
+
+Most of the fonts used within math mode do not need to be explicitly
+invoked; but to use letters from a range of fonts, the following
+class of commands is provided.
+
+\begin{decl}
+|\mathrm| \arg{letters}\\
+|\mathnormal| \arg{letters}\\
+|\mathcal| \arg{letters}\\
+|\mathbf| \arg{letters}\\
+|\mathsf| \arg{letters}\\
+|\mathtt| \arg{letters}\\
+|\mathit| \arg{letters}
+\end{decl}
+
+These are also one-argument commands which take as an argument the
+letters which are to be typeset in the particular font. The argument
+is processed in math mode so spaces within it will be ignored. Only
+letters, digits and accents have their font changed, for example
+|$\mathbf{\tilde A \times 1}$| produces $\mathbf{\tilde A \times 1}$.
+
+\subsection{Ensuring math mode}
+
+\begin{decl}
+|\ensuremath| \arg{math commands}
+\end{decl}
+
+In \LaTeX~2.09, if you wanted a command to work both in math mode and
+in text mode, the suggested method was to define something like:
+\begin{verbatim}
+ \newcommand{\Gp}{\mbox{$G_p$}}
+\end{verbatim}
+Unfortunately, the |\mbox| stops |\Gp| changing size correctly in (for
+instance) subscripts or a fraction.
+
+In \LaTeXe{} you can define it thus:
+\begin{verbatim}
+ \newcommand{\Gp}{\ensuremath{G_p}}
+\end{verbatim}
+Now |\Gp| will work correctly in all contexts.
+
+This is because the |\ensuremath| does nothing, producing simply
+|G_p|, when |\Gp| is used within math mode; but it ensures that math
+mode is entered (and exited) as required when |\Gp| is used in text
+mode.
+
+
+\subsection{Setting text superscripts}
+
+\begin{decl}
+|\textsuperscript| \arg{text}
+\end{decl}
+
+\NEWfeature{1995/06/01} In \LaTeX~2.09 textual superscripts such as
+footnote markers were produced by internally entering math mode and
+typesetting the number as a math superscript. This normally looked
+fine since the digits in math fonts are the same as those in text
+fonts when Computer Modern fonts are used. But when a different
+document font (such as Times) is selected, the results look rather
+strange. For this reason the command |\textsuperscript| has been
+introduced which typesets its argument in the current text font, in a
+superscript position and in the correct size.
+
+\subsection{Text commands: all encodings}
+
+\NEWdescription{1994/12/01}
+ One of the main differences between \LaTeXe{} and \LaTeX~2.09 is
+ that \LaTeXe{} can deal with fonts in arbitrary \emph{encodings}.
+ (A font encoding is the sequence of characters in the font---for
+ example a Cyrillic font would have a different encoding from a Greek
+ font.)
+
+ The two major font encodings that are used for Latin languages such
+ as English or German are |OT1| (Donald Knuth's 7-bit encoding, which
+ has been used during most of \TeX's lifetime) and |T1| (the new
+ 8-bit `Cork' encoding).
+
+ \LaTeX~2.09 only supported the |OT1| encoding, whereas \LaTeXe{} has
+ support for both |OT1| and |T1| built-in. The next section will
+ cover the new commands which are available if you have |T1|-encoded
+ fonts. This section describes new commands which are available in
+ all encodings.
+
+ Most of these commands provide characters which were available in
+ \LaTeX~2.09 already. For example |\textemdash| gives an `em dash',
+ which was available in \LaTeX~2.09 by typing |---|. However, some
+ fonts (for example a Greek font) may not have the |---| ligature,
+ but you will still be able to access an em dash by typing
+ |\textemdash|.
+
+\begin{decl}[1994/12/01]
+ |\r{<text>}|
+\end{decl}
+ This command gives a `ring' accent, for example `\r{o}' can be typed
+ |\r{o}|.
+
+\begin{decl}[1994/12/01]
+ |\SS|
+\end{decl}
+ This command produces a German `SS', that is a capital `\ss'. This
+ letter can hyphenate differently from `SS', so is needed for entering
+ all-caps German.
+
+\begin{decl}[1994/12/01]
+ |\textcircled{<text>}|
+\end{decl}
+ This command is used to build `circled characters' such as
+ |\copyright|. For example |\textcircled{a}| produces
+ \textcircled{a}.
+
+\begin{decl}[1994/12/01]
+ |\textcompwordmark|
+\end{decl}
+ This command is used to separate letters which would normally
+ ligature. For example `f\textcompwordmark i' is produced with
+ |f\textcompwordmark i|. Note that the `f' and `i' have not
+ ligatured to produce `fi'. This is rarely useful in English
+ (`shelf\textcompwordmark ful' is a rare example of where it might be
+ used) but is used in languages such as German.
+
+\begin{decl}[1994/12/01]
+ |\textvisiblespace|
+\end{decl}
+ This command produces a `visible space' character
+ `\textvisiblespace'. This is sometimes used in computer listings,
+ for example `type \textsf{hello\textvisiblespace world}'.
+
+\begin{decl}[1994/12/01]
+ |\textemdash|
+ |\textendash|
+ |\textexclamdown|
+ |\textquestiondown| \\
+ |\textquotedblleft|
+ |\textquotedblright|
+ |\textquoteleft|
+ |\textquoteright|
+\end{decl}
+ These commands produce characters which would otherwise be
+ accessed via ligatures:
+ \begin{center}
+ \begin{tabular}{ccl}
+ \emph{ligature} & \emph{character} & \emph{command} \\
+ |---| & --- & |\textemdash| \\
+ |--| & -- & |\textendash| \\
+ |!`| & !` & |\textexclamdown| \\
+ |?`| & ?` & |\textquestiondown| \\
+ |``| & `` & |\textquotedblleft| \\
+ |''| & '' & |\textquotedblright| \\
+ |`| & ` & |\textquoteleft| \\
+ |'| & ' & |\textquoteright|
+ \end{tabular}
+ \end{center}
+ The reason for making these characters directly accessible is so
+ that they will work in encodings which do not have these characters.
+
+\begin{decl}[1994/12/01]
+ |\textbullet|
+ |\textperiodcentered|
+\end{decl}
+ These commands allow access to characters which were previously only
+ available in math mode:
+ \begin{center}
+ \begin{tabular}{lcl}
+ \emph{math command} & \emph{character} & \emph{text command} \\
+ |\bullet| & $\bullet$ & |\textbullet| \\
+ |\cdot| & $\cdot$ & |\textperiodcentered|
+ \end{tabular}
+ \end{center}
+
+\begin{decl}[1995/12/01]
+ |\textbackslash|
+ |\textbar|
+ |\textless|
+ |\textgreater|
+\end{decl}
+ These commands allow access to ASCII characters which were
+ only available in verbatim or math mode:
+ \begin{center}
+ \begin{tabular}{lcl}
+ \emph{math command} & \emph{character} & \emph{text command} \\
+ |\backslash| & $\backslash$ & |\textbackslash| \\
+ |\mid| & $\mid$ & |\textbar| \\
+ |<<| & $<$ & |\textless| \\
+ |>>| & $>$ & |\textgreater|
+ \end{tabular}
+ \end{center}
+
+\begin{decl}[1995/12/01]
+ |\textasciicircum|
+ |\textasciitilde|
+\end{decl}
+ These commands allow access to ASCII characters which were
+ previously only available in verbatim:
+ \begin{center}
+ \begin{tabular}{cl}
+ \emph{verbatim} & \emph{text command} \\
+ |^| & |\textasciicircum| \\
+ |~| & |\textasciitilde|
+ \end{tabular}
+ \end{center}
+
+\begin{decl}[1995/12/01]
+ |\textregistered|
+ |\texttrademark|
+\end{decl}
+ These commands provide the `registered trademark' (R) and
+ `trademark' (TM) symbols.
+
+\subsection{Text commands: the T1 encoding}
+
+\NEWdescription{1994/12/01}
+ The |OT1| font encoding is fine for typesetting in English, but has
+ problems when typesetting other languages. The |T1| encoding solves
+ some of these problems, by providing extra characters (such as `eth'
+ and `thorn'), and it allows words containing accented letters to be
+ hyphenated (as long as you have a package like |babel| which allows
+ for non-American hyphenation).
+
+ This section describes the commands you can use if you have the |T1|
+ fonts. To use them, you need to get the `ec fonts', or the
+ |T1|-encoded PostScript fonts, as used by \textsf{psnfss}.
+ All these fonts are
+ available by anonymous ftp in the Comprehensive \TeX{} Archive, and
+ are also available on the CD-ROMs \emph{4all \TeX} and
+ \emph{\TeX{} Live} (both available from the \TeX{} Users Group).
+
+ You can then select the |T1| fonts by saying:
+\begin{verbatim}
+ \usepackage[T1]{fontenc}
+\end{verbatim}
+ This will allow you to use the commands in this section.
+
+ \emph{Note:} Since this document must be processable on any site
+ running an up-to-date \LaTeX, it does not contain any characters
+ that are present only in |T1|-encoded fonts. This means that this
+ document cannot show you what these glyphs look like! If you want
+ to see them then run \LaTeX{} on the document |fontsmpl| and
+ respond `|cmr|' when it prompts you for a family name.
+
+\begin{decl}[1994/12/01]
+ |\k{<text>}|
+\end{decl}
+ This command produces an `ogonek' accent.
+
+\begin{decl}[1994/12/01]
+ |\DH|
+ |\DJ|
+ |\NG|
+ |\TH|
+ |\dh|
+ |\dj|
+ |\ng|
+ |\th|
+\end{decl}
+ These commands produce characters `eth', `dbar', `eng', and `thorn'.
+
+\begin{decl}[1994/12/01]
+ |\guillemotleft|
+ |\guillemotright|
+ |\guilsinglleft|
+ |\guilsinglright| \\
+ |\quotedblbase|
+ |\quotesinglbase|
+ |\textquotedbl|
+\end{decl}
+ % A local hack (could be improved):
+ \newcommand{\fauxguillemet}[1]{$\vcenter{\hbox{$\scriptscriptstyle#1$}}$}
+ These commands produce various sorts of quotation mark.
+ Rough representations of them are:
+ \fauxguillemet\ll a\fauxguillemet\gg{}
+ \fauxguillemet<a\fauxguillemet>
+ ,\kern -0.1em,\kern 0.05em a\kern -0.05em``
+ ,\kern 0.05em a\kern -0.05em` and |"|a|"|.
+
+\NEWdescription{2001/06/01}
+ There are therefore some extra short-form ligatures available for
+ use in documents that will only be used with |T1|-encoded fonts.
+
+ The guillemets |\guillemotleft| and |\guillemotright|%
+ \footnote{We apologise once again for maintaining Adobe's
+ enormous solipsism~(sic) of confusing a diving bird with
+ punctuation marks!}
+ can be obtained by typing |<<<<| and |>>>>| and |\quotedblbase|
+ by typing |,,|\,.
+
+ Also, unlike the unexpected results with
+ |OT1|-encoded fonts, |<<| and |>>| will produce \textless{} and
+ \textgreater{}.
+
+ Note also that the single character |"| will no longer produce ''
+ but rather |\textquotedbl|.
+
+\subsection{Logos}
+
+\begin{decl}
+|\LaTeX|\\
+|\LaTeXe|
+\end{decl}
+
+|\LaTeX| (producing `\LaTeX') is still the `main' logo command,
+but if you need to refer to the new features, you can write
+|\LaTeXe| (producing `\LaTeXe').
+
+\subsection{Picture commands}
+
+\begin{decl}
+ |\qbezier[<N>](<AX>,<AY>)(<BX>,<BY>)(<CX>,<CY>)| \\
+ | \bezier{<N>}(<AX>,<AY>)(<BX>,<BY>)(<CX>,<CY>)|
+\end{decl}
+The |\qbezier| command can be used in |picture| mode to draw a
+quadratic Bezier curve from position |(<AX>,<AY>)| to |(<CX>,<CY>)| with
+control point |(<BX>,<BY>)|. The optional argument \m{N} gives the
+number of points on the curve.
+
+For example, the diagram:
+\begin{center}
+ \begin{picture}(50,50)
+ \thicklines
+ \qbezier(0,0)(0,50)(50,50)
+ \qbezier[20](0,0)(50,0)(50,50)
+ \thinlines
+ \put(0,0){\line(1,1){50}}
+ \end{picture}
+\end{center}
+is drawn with:
+\begin{verbatim}
+ \begin{picture}(50,50)
+ \thicklines
+ \qbezier(0,0)(0,50)(50,50)
+ \qbezier[20](0,0)(50,0)(50,50)
+ \thinlines
+ \put(0,0){\line(1,1){50}}
+ \end{picture}
+\end{verbatim}
+The |\bezier| command is the same, except that the argument \m{N} is not
+optional. It is provided for compatibility with the \LaTeX~2.09
+|bezier| document style option.
+
+\subsection{Old commands}
+
+\begin{decl}
+|\samepage|
+\end{decl}
+
+The |\samepage| command still exists but is no longer being
+maintained.
+This is because it only ever worked erratically; it does not
+guarantee that there will be no page-breaks within its scope; and
+it can cause footnotes and marginals to be wrongly placed.
+
+We recommend using |\enlargethispage| in conjunction with page-break
+commands such as |\newpage| and |\pagebreak| to help control page
+breaks.
+
+\begin{decl}
+ |\SLiTeX|
+\end{decl}
+Since \SLiTeX{} no longer exists, the logo is no longer defined in the
+\LaTeX{} kernel. A suitable replacement is |\textsc{Sli\TeX}|. The
+\SLiTeX{} logo is defined in \LaTeX~2.09 compatibility mode.
+
+\begin{decl}
+|\mho| |\Join| |\Box| |\Diamond| |\leadsto| \\
+|\sqsubset| |\sqsupset| |\lhd| |\unlhd| |\rhd| |\unrhd|
+\end{decl}
+
+These symbols are contained in the \LaTeX{} symbol font, which was
+automatically loaded by \LaTeX~2.09. However, \TeX{} has room for
+only sixteen math font families; thus many users discovered that they
+ran out. Because of this, \LaTeX{} does not load the \LaTeX{} symbol
+font unless you use the \textsf{latexsym} package.
+
+These symbols are also made available, using different fonts, by the
+\textsf{amsfonts} package, which also defines a large number of other
+symbols. It is supplied by the American Mathematical Society.
+
+The \textsf{latexsym} package is loaded automatically in \LaTeX~2.09
+compatibility mode.
+
+\section{\LaTeX~2.09 documents}
+\label{Sec:209}
+
+\LaTeXe{} can process (almost) any \LaTeX~2.09 document, by entering
+\emph{\LaTeX~2.09 compatibility mode}. Nothing has changed, you run
+\LaTeX{} in the same way you always did, and you will get much the
+same results.
+
+The reason for the `almost' is that some \LaTeX~2.09 packages made use
+of low-level unsupported features of \LaTeX. If you discover such a
+package, you should find out if it has been updated to work with
+\LaTeXe. Most packages will still work with \LaTeXe---the easiest way
+to find out whether a package still works is to try it!
+
+\LaTeX~2.09 compatibility mode is a comprehensive emulation of
+\LaTeX~2.09, but at the cost of time. Documents can run up to 50\%
+slower in compatibility mode than they did under \LaTeX~2.09.
+In addition, many of the new features of \LaTeXe{} are not available in
+\LaTeX~2.09 compatibility mode.
+
+\subsection{Warning}
+
+\NEWdescription{1995/12/01}
+This \emph{\LaTeX~2.09 compatibility mode} is provided solely to allow
+you to process 2.09 documents, i.e.~documents that were written (we
+hope, a long time ago) for a very old system and therefore could be
+processed by using a genuine antique \LaTeX~2.09 system.
+
+This mode is therefore \emph{not} intended to provide access to the
+enhanced features of \LaTeXe{}. Thus it must not be used to process
+new documents which masquerade as 2.09 documents (i.e.~they begin with
+|\documentstyle|) but which could not be processed using that genuine
+antique \LaTeX~2.09 system because they contain some new,
+\LaTeXe{}-only, commands or environments.
+
+To prevent such misuse of the system, and the consequent trouble it
+causes when such misleadingly encoded documents are distributed, the
+\emph{\LaTeX~2.09 compatibility mode} turns off most of these new
+features and commands. Any attempt to use them will give you an error
+message and, moreover, many of them simply will not work, whilst
+others will produce unpredictable results.
+So don't bother sending us any bug reports about such occurrences since
+they are intentional.
+
+
+\subsection{Font selection problems}
+\label{Sec:fsprob}
+
+When using compatibility mode, it is possible that you will find
+problems with font-changing commands in some old documents. These
+problems are of two types:
+
+\begin{itemize}
+\item producing error messages;
+\item not producing the font changes you expected.
+\end{itemize}
+
+In case of error messages it is possible that the document (or an old
+style file used therein) contains references to old internal commands
+which are no longer defined, see Section~\ref{Sec:oldinternals} for
+more information if this is the case.
+
+\NEWdescription{1995/12/01}
+One example of the unexpected is if you use one of the new style of
+math-mode font changing command as follows:
+\begin{verbatim}
+$ \mathbf{xy} A $
+\end{verbatim}
+You may well find that this behaves as if you had put:
+\begin{verbatim}
+$ \bf {xy} A $
+\end{verbatim}
+everything including the $A$ coming out bold.
+
+\LaTeX~2.09 allowed sites to customize their \LaTeX{} installation,
+which resulted in documents producing different results on different
+\LaTeX{} installations. \LaTeXe{} no longer allows so much
+customization but, for compatibility with old documents, the local
+configuration file |latex209.cfg| is loaded every time \LaTeXe{}
+enters \LaTeX~2.09 compatibility mode.
+
+For example, if your site was customized to use the New Font
+Selection Scheme (\NFSS) with the |oldlfont| option, then you can
+make \LaTeXe{} emulate this by creating a |latex209.cfg| file
+containing the commands:
+\begin{verbatim}
+\ExecuteOptions{oldlfont}\RequirePackage{oldlfont}
+\end{verbatim}
+Similarly, to emulate \NFSS{} with the |newlfont| option, you can
+create a |latex209.cfg| file containing:
+\begin{verbatim}
+\ExecuteOptions{newlfont}\RequirePackage{newlfont}
+\end{verbatim}
+
+
+\subsection{Native mode}
+\label{Sec:native}
+
+To run an old document faster, and use the new features of
+\LaTeXe, you should try using \emph{\LaTeXe{} native mode}.
+This is done by replacing the command:
+\begin{quote}
+ |\documentstyle[|\m{options}|,|\m{packages}|]|\arg{class}
+\end{quote}
+with:
+\begin{quote}
+ |\documentclass|\oarg{options}\arg{class} \\
+ |\usepackage{latexsym,|\m{packages}|}|
+\end{quote}
+However, some documents which can be processed in \LaTeX~2.09
+compatibility mode may not work in native mode. Some \LaTeX~2.09
+packages will only work with \LaTeXe{} in 2.09 compatibility mode.
+Some documents will cause errors because of \LaTeXe's improved error
+detection abilities.
+
+But most \LaTeX~2.09 documents can be processed by \LaTeXe{}'s native
+mode with the above change. Again, the easiest way to find out
+whether your documents can be processed in native mode is to try it!
+
+
+\section{Local modifications}
+\label{sec:loc}
+
+\NEWdescription{1995/12/01}
+There are two common types of local modifications that can be done
+very simply. Do not forget that documents produced using such
+modifications will not be usable at other places (such documents are
+called `non-portable').
+
+One type of modification is the use of personal commands for commonly
+used symbols or constructions. These should be put into a package
+file (for example, one called \texttt{mymacros.sty}) and loaded by
+putting |\usepackage{mymacros}| in the document preamble.
+
+Another type is a local document class that is very similar to one of
+the standard classes but contains some straightforward modifications
+such as extra environments, different values for some parameters, etc.
+These should be put into a class file; here we shall describe a simple
+method of constructing such a file using, as an example, a class
+called \textsf{larticle} that is very similar to the \textsf{article}
+class.
+
+\NEWfeature{1995/12/01}
+The class file called \texttt{larticle.cls} should (after the
+preliminary identification commands) start as follows:
+\begin{verbatim}
+ \LoadClassWithOptions{article}
+\end{verbatim}
+This command should be followed by whatever additions and changes you
+wish to make to the results of reading in the file
+\texttt{article.sty}.
+
+The effect of using the above |\LoadClassWithOptions| command is to
+load the standard class file \textsf{article} with whatever options
+are asked for by the document. Thus a document using your
+\textsf{larticle} class can specify any option that could be specified
+when using the standard \textsf{article} class; for example:
+\begin{verbatim}
+ \documentclass[a4paper,twocolumn,dvips]{larticle}
+\end{verbatim}
+
+
+\section{Problems}
+\label{Sec:problems}
+
+This section describes some of the things which may go wrong when
+using \LaTeXe, and what you can do about it.
+
+\subsection{New error messages}
+
+\LaTeXe{} has a number of new error messages.
+Please also note that many error messages now produce further helpful
+information if you press |h| in response to the error prompt.
+
+\begin{decl}
+|Option clash for package |\m{package}|.|
+\end{decl}
+The named package has been loaded twice with different options. If
+you enter |h| you will be told what the options were, for example, if
+your document contained:
+\begin{verbatim}
+ \usepackage[foo]{fred}
+ \usepackage[baz]{fred}
+\end{verbatim}
+then you will get the error message:
+\begin{verbatim}
+ Option clash for package fred.
+\end{verbatim}
+and typing |h| at the |?| prompt will give you:
+\begin{verbatim}
+ The package fred has already been loaded with options:
+ [foo]
+ There has now been an attempt to load it with options:
+ [baz]
+ Adding the line:
+ \usepackage[foo,baz]{fred}
+ to your document may fix this.
+ Try typing <<return>> to proceed.
+\end{verbatim}
+The cure is, as suggested, to load the package with both sets of
+options. Note that since \LaTeX{} packages can call other packages,
+it is possible to get a package option clash without explicitly
+requesting the same package twice.
+
+\begin{decl}
+ |Command |\m{command}| not provided in base NFSS.|
+\end{decl}
+The \m{command} is not provided by default in \LaTeXe. This error is
+generated by using one of the commands:
+\begin{verbatim}
+ \mho \Join \Box \Diamond \leadsto
+ \sqsubset \sqsupset \lhd \unlhd \rhd \unrhd
+\end{verbatim}
+which are now part of the \textsf{latexsym} package.
+The cure is to add:
+\begin{verbatim}
+ \usepackage{latexsym}
+\end{verbatim}
+in the preamble of your document.
+
+\begin{decl}
+ |LaTeX2e command <command> in LaTeX 2.09 document.|
+\end{decl}
+The \m{command} is a \LaTeXe{} command but this is a \LaTeX~2.09
+document. The cure is to replace the command by a \LaTeX~2.09
+command, or to run document in native mode, as described in
+Section~\ref{Sec:native}.
+
+\begin{decl}
+ |NFSS release 1 command \newmathalphabet found.|
+\end{decl}
+The command |\newmathalphabet| was used by the New Font Selection
+Scheme Release 1 but it has now been replaced by
+|\DeclareMathAlphabet|, the use of which is described in
+\emph{\fntguide}.
+
+The best cure is to update the package which contained the
+|\newmathalphabet| command. Find out if there is a new release of
+the package, or (if you wrote the package yourself) consult
+\emph{\fntguide} for the new syntax of font commands.
+
+If there is no updated version of the package then you can cure this
+error by using the \textsf{newlfont} or \textsf{oldlfont} package,
+which tells \LaTeX{} which version of |\newmathalphabet| should be
+emulated.
+
+You should use \textsf{oldlfont} if the document selects math fonts with
+syntax such as this:
+\begin{quote}
+ |{\cal A}|, etc.
+\end{quote}
+Use \textsf{newlfont} if the document's syntax is like this:
+\begin{quote}
+ |\cal{A}|, etc.
+\end{quote}
+
+
+\begin{decl}
+ |Text for \verb command ended by end of line.|
+\end{decl}
+The |\verb| command has been begun but not ended on that line. This
+usually means that you have forgotten to put in the end-character of
+the |\verb| command.
+
+\begin{decl}
+ |Illegal use of \verb command.|
+\end{decl}
+The |\verb| command has been used inside the argument of another
+command. This has never been allowed in \LaTeX{}---often producing
+incorrect output without any warning---and so \LaTeXe{} produces
+an error message.
+
+\subsection{Old internal commands}
+\label{Sec:oldinternals}
+
+A number of \LaTeX~2.09 internal commands have been removed, since
+their functionality is now provided in a different way. See
+\emph{\clsguide} for more details of the new, supported interface for
+class and package writers.
+
+\begin{decl}
+ |\tenrm| |\elvrm| |\twlrm| \dots\\
+ |\tenbf| |\elvbf| |\twlbf| \dots\\
+ |\tensf| |\elvsf| |\twlsf| \dots\\
+ $\vdots$
+\end{decl}
+These commands provided access to the seventy fonts preloaded by
+\LaTeX~2.09. In contrast, \LaTeXe{} normally preloads at most
+fourteen fonts, which saves a lot of font memory; but a consequence is
+that any \LaTeX{} file which used the above commands to directly
+access fonts will no longer work.
+
+Their use will usually produce an error message such as:
+\begin{verbatim}
+ ! Undefined control sequence.
+ l.5 \tenrm
+\end{verbatim}
+The cure for this is to update the document to use the new
+font-changing commands provided by \LaTeXe; these are described in
+\emph{\fntguide}.
+
+If this is not possible then, as a last resort, you can
+use the \textsf{rawfonts} package, which loads the
+seventy \LaTeX~2.09 fonts and provides direct access to them using the
+old commands. This takes both time and memory. If you do not
+wish to load all seventy fonts, you can select some of them by using the
+|only| option to \textsf{rawfonts}. For example, to load only |tenrm|
+and |tenbf| you write:
+\begin{verbatim}
+ \usepackage[only,tenrm,tenbf]{rawfonts}
+\end{verbatim}
+
+The \textsf{rawfonts} package is distributed as part of the \LaTeX{}
+tools software, see Section~\ref{Sec:st-pack}.
+
+\subsection{Old files}
+
+One of the more common mistakes in running \LaTeX{} is to read in old
+versions of packages instead of the new versions. If you get an
+incomprehensible error message from a standard package, make sure you
+are loading the most recent version of the package. You can find out
+which version of the package has been loaded by looking in the log
+file for a line like:
+\begin{verbatim}
+ Package: fred 1994/06/01 v0.01 Fred's package.
+\end{verbatim}
+You can use the \m{release-date} options to |\documentclass| and
+|\usepackage| to make sure that you are getting a suitably recent copy
+of the document class or package. This is useful when sending a
+document to another site, which may have out-of-date software.
+
+\subsection{Where to go for more help}
+
+If you can't find the answer for your problem here, try looking in
+\emph{\LaTeXbook} or \emph{\LaTeXcomp}. If you have a problem with
+installing \LaTeX, look in the installation guide files which come with
+the distribution.
+
+If this doesn't help, contact your local \LaTeX{} guru or local
+\LaTeX{} mailing list.
+
+If you think you've discovered a bug then please report it! First,
+you should find out if the problem is with a third-party package or
+class. If the problem is caused by a package or class other than
+those listed in Section~\ref{Sec:class+packages} then please report
+the problem to the author of the package or class, not to the \LaTeX3
+project team.
+
+If the bug really is with core \LaTeX{} then you should create a
+\emph{short}, \emph{self-contained} document which exhibits the
+problem. You should run a \emph{recent} (less than a year old)
+version of \LaTeX{} on the file and then run \LaTeX{} on
+|latexbug.tex|. This will create an error report which you should
+send, together with the sample document and log file, to the
+\LaTeX{} bugs address which can be found in the file
+|latexbug.tex| or |bugs.txt|.
+
+
+\section{Enjoy!}
+\label{Sec:enjoy}
+
+We certainly hope you will enjoy using the new standard \LaTeX{} but,
+if this is not possible, we hope that you will enjoy success and
+fulfillment as a result of the documents which it will help you to
+create.
+
+If you find that the contribution of \LaTeX{} to your life is such
+that you would like to support the work of the project team, then
+please read Section~\ref{Sec:ltx3} and discover practical ways to do
+this.
+
+\begin{thebibliography}{1}
+
+\bibitem{A-W:GRM97}
+Michel Goossens, Sebastian Rahtz and Frank Mittelbach.
+\newblock {\em The {\LaTeX} Graphics Companion}.
+\newblock Addison-Wesley, Reading, Massachusetts, 1997.
+
+
+\bibitem{A-W:GR99}
+Michel Goossens and Sebastian Rahtz.
+\newblock {\em The {\LaTeX} Web Companion}.
+\newblock Addison-Wesley, Reading, Massachusetts, 1999.
+
+
+\bibitem{A-W:DEK91}
+Donald~E. Knuth.
+\newblock {\em The \TeX book}.
+\newblock Addison-Wesley, Reading, Massachusetts, 1986.
+\newblock Revised to cover \TeX3, 1991.
+
+
+\bibitem{A-W:LLa94}
+Leslie Lamport.
+\newblock {\em {\LaTeX:} A Document Preparation System}.
+\newblock Addison-Wesley, Reading, Massachusetts, second edition, 1994.
+
+\bibitem{A-W:MG2004}
+Frank Mittelbach and Michel Goossens.
+\newblock {\em The {\LaTeX} Companion second edition}.
+\newblock With Johannes Braams, David Carlisle, and Chris Rowley.
+\newblock Addison-Wesley, Reading, Massachusetts, 2004.
+
+
+\end{thebibliography}
+
+\end{document}
diff --git a/macros/latex-dev/base/utf8ienc.dtx b/macros/latex-dev/base/utf8ienc.dtx
index d6c8f82f40..ea377297a5 100644
--- a/macros/latex-dev/base/utf8ienc.dtx
+++ b/macros/latex-dev/base/utf8ienc.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright 1993-2019
+% Copyright (C) 1993-2019
% The LaTeX3 Project and any individual authors listed elsewhere
% in this file.
%
@@ -13,7 +13,7 @@
% The latest version of this license is in
% https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
-% version 2005/12/01 or later.
+% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
diff --git a/macros/latex-dev/base/utf8ienc.pdf b/macros/latex-dev/base/utf8ienc.pdf
index 62c50c5f0a..5b390be9a6 100644
--- a/macros/latex-dev/base/utf8ienc.pdf
+++ b/macros/latex-dev/base/utf8ienc.pdf
Binary files differ
diff --git a/macros/latex-dev/base/webcomp.err b/macros/latex-dev/base/webcomp.err
deleted file mode 100644
index f604d8ef35..0000000000
--- a/macros/latex-dev/base/webcomp.err
+++ /dev/null
@@ -1,381 +0,0 @@
-\newcommand\erratafiledate{1999/06/05}
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% To produce a printed version of this errata file run this file through
-% LaTeX. It will unpack a small class file (if not already present) and
-% a configuration file with the extension .cfg. You might want to modify
-% the setting in this configuration file to print only a partial errata
-% suitable for your printed revision of this book, see details in the
-% .cfg file.
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-
-\begin{filecontents}{ttcterrata.cls}
-%%
-%% Copyright (C) 1997,2004,2005,2007 Frank Mittelbach
-%% This class file is licenced under LPPL latest version;
-%% see https://www.latex-project.org/lppl
-%
-%
-% It sets up a few commands used to format the errata entries for books in the
-% Addison-Wesley Series:
-%
-% Tools and Techniques for Computer Typesetting
-%
-% hence the name. However, anybody who likes to use it is free to apply it for
-% errata files of other books.
-%
-% Changes:
-%
-% v1.0a - changed name from errata.cls to ttcterrata.cls
-
-\ProvidesClass{ttcterrata}
- [2007/11/10 v1.0a Mini class for errata files; subject to change (FMi)]
-
-\LoadClass{article}
-
-\setcounter{secnumdepth}{-1}
-\addtolength\textwidth{5cm}
-\addtolength\oddsidemargin{-3cm}
-
-\addtolength\textheight{36pt}
-
-\RequirePackage{shortvrb}
-\MakeShortVerb{\|}
-
-\RequirePackage{array,longtable}
-\RequirePackage{multicol}
-
-
-\newcommand\erratagetnumber{}
-\def\erratagetnumber#1/#2/#3\erratagetnumber{#1#2#3}
-
-
-\newcommand\gobbleerrata{%
- \setbox\@tempboxa\vbox\bgroup
- \let\endgobble\egroup
- \let\hideamp\relax
- \let\\\relax\let\par\@@par}
-
-\newcommand*\hideamp{&}
-
-\let\endgobble\relax
-
-
-\newcommand\erratastartdate{}
-\newcommand\myprinting{1}
-
-
-\newcommand\doweprint[2]{%
- \ifnum \myprinting < \if!#2!1000 \else \ifx s#2 1000\else#2 \fi\fi
- \ifnum \expandafter\erratagetnumber\erratastartdate\erratagetnumber <
- \erratagetnumber#1\erratagetnumber \relax
- \@tempswatrue
- \else
- \@tempswafalse
- \fi
- \else
- \@tempswafalse
- \fi
-}
-
-
-
-\newcommand\includedentries{entries after = \erratastartdate}
-\newcommand\printedentries{between \erratastartdate\space and}
-
-\newcommand\showallerrors{%
- \renewcommand\includedentries{all errata entries}%
- \renewcommand\printedentries{up to}
- \renewcommand\doweprint[2]{\@tempswatrue}}
-
-
-\newcommand\displayrevisionfix[2]{%
- \if!#2!\textbf{#1}\else\textit{#1}\rlap{\textsuperscript{#2}}\fi}
-
-\newcommand\norevisionnumbers{%
- \renewcommand\displayrevisionfix[2]{\textbf{##1}}}
-
-\IfFileExists{\jobname.cfg}
- {
- \input{\jobname.cfg}
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* Configuration file for \jobname.err found }
- \typeout{*}
- \typeout{***************************************************}
- \AtEndDocument{
- \typeout{***************************************************}
- \typeout{*}
- \typeout{* If you wish to generate an errata listing}
- \typeout{* containing only errors found after a certain revision}
- \typeout{* and/or only errors found after a certain date}
- \typeout{* modify the information stored in \jobname.cfg}
- \typeout{*}
- \typeout{* Current settings are:}
- \typeout{*}
- \typeout{* \@spaces printing of your book = \myprinting}
- \typeout{* \@spaces include \includedentries}
- \typeout{*}
- \typeout{***************************************************}
- }}
- {}
-
-%% \erroronpage <page> <line info> <contributor> <date> <fixed in revision>
-
-\newcommand\erroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\seriouserroronpage[5]{%
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\newcommand\CHAPTER[1]{\endgobble
- &\\[4pt]%
- \multicolumn{4}{l}{\framebox[10cm][l]{\textbf{\normalsize\strut#1}}} \\}
-
-\newenvironment{erratalist}
- {\begin{longtable}{r>{\raggedright}p{2cm}l>{\raggedright}p{10cm}l}}
- {\endgobble\end{longtable}}
-
-\newcommand\erratatitle[2]
- {\begin{center}\LARGE\bfseries
- Errata list for #1\\[5pt](\myprinting.\ printing)\\[10pt]
- \small Includes all entries found \printedentries\space #2\\
- (For other periods/print runs reprocess this document
- with different config settings)
- \end{center}%
- \markright{Errata for #1 (\printedentries\space #2)}%
- \thispagestyle{plain}%
- \vspace{20pt}}
-
-\pagestyle{myheadings}
-
-\AtBeginDocument{\small}
-
-\setlength\parindent{0pt}
-\setlength\parskip{2pt}
-
-\newcommand\contributor[2]{\makebox[1cm][l]{\sffamily#1} #2\par}
-
-% some special shortcuts overwriting existing commands:
-
-\let\u\underline
-\renewcommand\>{$\to$}
-
-%%% some code suggested by Thorsten Hansen to count the number of
-%%% contributions by individuals (will work only if we do not get
-%%% too many :-)
-
-\def\count@contributors#1/#2/#3\@nil{
- \@ifundefined{c@#1}{\newcounter{#1}}{}\stepcounter{#1}%
-%%% also count secondary:
-%%% \@ifundefined{c@#2}{\newcounter{#2}}{}\stepcounter{#2}%
-}
-
-\renewcommand\erroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\seriouserroronpage[5]{%
- \count@contributors#3/secondary/\@nil
- \endgobble
- \doweprint{#4}{#5}%
- \if@tempswa
- \typeout{Typesetting entry #1 #2 #3 #4}%
- \else
- \typeout{Ignoring entry #1 #2 #3 #4}%
- \expandafter\gobbleerrata
- \fi
- \hideamp \\%
- \fbox{\bfseries !!}\hfill
- \displayrevisionfix{#1}{#5}
- \hideamp #2 \hideamp (\textsf{#3}) \hideamp
-}
-
-\renewcommand\contributor[2]{\makebox[1cm][l]{%
- \sffamily#1} #2\@ifundefined{c@#1}{}{ (\arabic{#1})}\par}
-
-\end{filecontents}
-
-
-\begin{filecontents}{\jobname.cfg}
-%
-%
-% Configuration file for the errata listing of
-%
-% The LaTeX Web Companion
-%
-%
-% \erratastartdate
-%
-% Specifies the date from which on
-% errata entries should be listed.
-%
-% The format is YYYY/MM/DD.
-%
-% The default below ensures that all
-% entries are typeset.
-%
-\renewcommand\erratastartdate{1999/05/01}
-
-%
-% \myprinting
-%
-% Specifies which (revised) printing you
-% own. For example, if you have the second
-% printing set this to 2 so that errors
-% already corrected in that printing will not
-% appear in your errata listing.
-%
-% The default below ensures that all
-% entries are typeset.
-%
-\renewcommand\myprinting{1}
-%
-%
-% \norevisionnumbers
-%
-% Specifies that all page numbers in the errata are shown in the same
-% format (bold face) irregardless of whether or not they are fixed
-% in some revision. The default is to print corrected errors in
-% italic and add the revision number as a superscript.
-%
-%
-% \showallerrors
-%
-% With this command you tell the program that all errata entries are
-% supposed to be generated. This makes \myprinting and
-% \erratastartdate basically obsolete so this isn't turned on by
-% default.
-%
-%
-\endinput
-\end{filecontents}
-
-
-
-\documentclass{ttcterrata}
-
-
-\begin{document}
-
-\erratatitle{The \LaTeX{} Web Companion}{\erratafiledate}
-
-
-\begin{verbatim}
-@book(A-W:GR99,
- author = {Michel Goossens and Sebastian Rahtz},
- title = {The {\LaTeX} Web Companion},
- substitle = {Integrating {\TeX}, HTML, and XML},
- series = "Tools and Techniques for Computer Typesetting",
- publisher = {Addison-Wesley},
- address = {Reading, Massachusetts},
- year = 1999,
- ISBN = "0-201-43311-7",
- LCCN = "QA76.76.H94G66 1999",
- pagenums = {xxii + 522},
- source-infos = {yes},
- bibliography = {yes},
- index = {yes},
- price = "US\$39.95",
- note = "With Eitan M. Gurari and Ross Moore and Robert S.
- Sutor.",
-)
-\end{verbatim}
-
-\begin{list}{}{\setlength\leftmargin{0cm}\setlength\rightmargin{5cm}}
-\item[]
-The latest version of this file (\texttt{\jobname.err}) can be found
-as part of the \LaTeX{} distribution.
-
-The first column in the table shows the page number of the errata
-entry. Superscript numbers in the first column refer to the printed
-revision in which this entry was corrected. The second column gives
-the precise location, negative line numbers are counted from the
-bottom of the page. The third column shows the first finder of the
-problem.
-
-\end{list}
-
-
-\begin{erratalist}
-
-%=======================================================================
-\CHAPTER{Chapter 6}
-
-\erroronpage{247}{3 para l.5}{MGo}{1999/06/05}{}
- GenCod \> GenCode
-
-\CHAPTER{Appendix B}
-
-\erroronpage{418}{3 para}{MGo}{1999/06/05}{}
- The \texttt{book} element types (lines 10--\u{15})
-
-\end{erratalist}
-
-
-
-%==========================================================================
-
-\bigskip
-
-
-\begin{multicols}{3}[Thanks to all who have found errors or
- omissions. Listed are the people who found an errata entry first.]
-\contributor{MGo}{Michel Goossens}
-\end{multicols}
-
-
-If you find further errors please report them to one of the authors
-\begin{quote}\ttfamily
- sebastian.rahtz@oucs.ox.ac.uk\\
- goossens@cern.ch
-\end{quote}
-preferable in a form usable for this file, i.e.,
-\begin{flushleft}
-|\erroronpage{|\textit{page-number}|}{|\textit{line-identification}|}{|%
- \textit{your-initials}|}{|\textit{date}|}{}| \\
- \hspace*{2em}\textit{description of the the errata}
-\end{flushleft}
-Here is an example:
-\begin{verbatim}
-\erroronpage{4}{l.-7}{PMcJ}{1998/06/11}{}
- surprisingly \> surprising
-\end{verbatim}
-
-
-\end{document}
diff --git a/macros/latex-dev/base/webcomp.pdf b/macros/latex-dev/base/webcomp.pdf
deleted file mode 100644
index 063e429db7..0000000000
--- a/macros/latex-dev/base/webcomp.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/README.md b/macros/latex-dev/required/amsmath/README.md
new file mode 100644
index 0000000000..66a27edf03
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/README.md
@@ -0,0 +1,81 @@
+The amsmath bundle for LaTeX
+============================
+
+Release 2019-10-01 pre-release 3
+
+Overview
+--------
+
+The `amsmath` package is an extension package for LaTeX that provides
+additional features to facilitate mathematical typesetting. It has been
+developed by the American Mathematical Society (AMS) and released for general
+use as a service to the mathematical community. A number of smaller
+auxiliary packages are also distributed with the `amsmath` package.
+
+Effective in 2016, maintenance of `amsmath was transferred from AMS to
+the LaTeX Project; as `amsmath` is considered a "required" package, this
+centralizes control over the core LaTeX components.
+
+Installation
+------------
+
+We no longer distribute installation instructions for the various TeX
+implementations. All modern TeX systems include `amsmath` as-standard, and end
+users should in general use the release versions supplied in this way.
+
+Release distribution is carried out only through the CTAN archives.
+
+Documentation
+-------------
+
+The primary documentation for `amsmath` is in provided as `amsldoc.pdf`.
+
+Additional documentation files include:
+
+ - `diffs-m.txt`
+ - `subeqn.pdf`
+ - `technote.pdf`
+ - `testmath.pdf`
+
+which are included in the collection. All of these can be accessed
+easily with most distributions by entering `texdoc` *filename* at the
+command line, or via [TeXdoc Online](http://texdoc.net).
+
+Change logs
+-----------
+
+The file `changes.txt` lists recent changes in reverse chronological order.
+
+The file `diffs-m.txt` contains information on development and changes
+prior to 2000.
+
+Reporting Bugs
+--------------
+
+If you wish to report a problem or bug in the `amsmath` bundle
+please use the [Issue Tracker for LaTeX2e on
+GitHub](https://github.com/latex3/latex2e/issues)
+and follow the guidelines that pop up if you press the "New issue" button.
+
+In particular, to check that you are really seeing a bug, please write
+a short, self-contained document that shows the problem. This should
+include the `latexbug` package, which will warn if your test file is
+not suitable for one or the other reason. See the [CONTRIBUTING
+guide](https://github.com/latex3/latex2e/blob/master/CONTRIBUTING.md)
+for further details, or if you need to obtain the `latexbug` package.
+
+If the bug turns out to be with third-party software then please
+contact the developer, and not us!
+
+License
+-------
+
+The contents of this bundle are distributed under the [LaTeX Project
+Public License](https://www.latex-project.org/lppl/lppl-1-3c/),
+version 1.3c or later.
+
+-----
+
+<p>Copyright (C) 2001-2004, 2007, 2008, 2010, 2011, 2013 American Mathematical Society. <br />
+<p>Copyright (C) 2016-2019 The LaTeX Project and American Mathematical Society. <br />
+
diff --git a/macros/latex-dev/required/amsmath/ams-external.txt b/macros/latex-dev/required/amsmath/ams-external.txt
new file mode 100644
index 0000000000..fa2dbea556
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/ams-external.txt
@@ -0,0 +1,547 @@
+%%% list of external commands used by amsmath (not totally correct)
+
+\!
+\"
+\(
+\*
+\,
+\-
+\.
+\/
+\:
+\;
+\=
+\Acute
+\AmS
+\AmSfont
+\And
+\AtBeginDocument
+\Bar
+\Big
+\Bigg
+\Biggr
+\Bigr
+\Breve
+\Check
+\DOTS
+\DOTSB
+\DOTSI
+\DOTSX
+\Ddot
+\DeclareFontEncoding
+\DeclareFontShape
+\DeclareMathAccent
+\DeclareMathDelimiter
+\DeclareMathOperator
+\DeclareMathSymbol
+\DeclareOption
+\DeclareRobustCommand
+\Dot
+\ExecuteOptions
+\GenericError
+\GenericInfo
+\GenericWarning
+\Grave
+\Hat
+\Leftarrow
+\Longleftarrow
+\Longleftrightarrow
+\Longrightarrow
+\MessageBreak
+\MultiIntegral
+\PackageError
+\PackageWarning
+\PackageWarningNoLine
+\PassOptionsToPackage
+\Pr
+\ProcessOptions
+\Relbar
+\RequirePackage
+\Rightarrow
+\Tilde
+\Umathaccent
+\Umathcar
+\Umathchar
+\Umathcharnumdef
+\Umathcode
+\Umathcodenum
+\Umathfractiondelsize
+\Vec
+\Vert
+\XeTeXcharclass
+\[
+\]
+\above
+\abovedisplayskip
+\abovewithdelims
+\accentedsymbol
+\acute
+\addtocounter
+\advance
+\aftergroup
+\allowbreak
+\allowdisplaybreaks
+\alph
+\arabic
+\arccos
+\arcsin
+\arctan
+\arg
+\array
+\arraycolsep
+\arraystretch
+\atop
+\atopwithdelims
+\badness<
+\bar
+\baselineskip
+\baselineskip6
+\begin
+\begingroup
+\belowdisplayskip
+\bgroup
+\big
+\bigcap
+\bigcup
+\bigg
+\biggr
+\bigodot
+\bigoplus
+\bigotimes
+\bigr
+\bigsqcup
+\biguplus
+\bigvee
+\bigwedge
+\binom
+\bmod
+\boldsymbol
+\box
+\boxed
+\breve
+\cases
+\cdotp
+\cdots
+\cfrac
+\char
+\chardef
+\check
+\cleaders
+\colon
+\columnwidth
+\coprod
+\copy
+\cos
+\cosh
+\cot
+\coth
+\cr
+\crcr
+\csc
+\csname
+\csnamen
+\csnamethe
+\dbinom
+\ddddot
+\dddot
+\ddot
+\def
+\deg
+\delimiter
+\delimiterfactor
+\delimitershortfall
+\det
+\dfrac
+\dim
+\displaybreak
+\displayindent
+\displaylimits
+\displaystyle
+\displaywidth
+\divide
+\do
+\dot
+\doteq
+\dots
+\dotsb
+\dotsc
+\dotsi
+\dotsm
+\dotso
+\dp
+\edef
+\egroup
+\else
+\end
+\endalign
+\endaligned
+\endarray
+\endcsname
+\endgather
+\endgroup
+\endmathdisplay
+\endmatrix
+\endmultline
+\endsplit
+\endsubarray
+\eqno
+\eqref
+\everycr
+\everydisplay
+\everymath
+\exp
+\expandafter
+\fbox
+\fi
+\fontchardp
+\fontcharht
+\fontdimen
+\fontencoding
+\fontfamily
+\frac
+\fracwithdelims
+\futurelet
+\gcd
+\gdef
+\genfrac
+\global
+\grave
+\halign
+\halignto
+\hat
+\hbox
+\hdots
+\hdotsfor
+\hfil
+\hfill
+\hfilneg
+\hfuzz
+\hom
+\hookleftarrow
+\hookrightarrow
+\hrule
+\hskip
+\ht
+\ialign
+\idotsint
+\if
+\ifDOTS
+\ifcase
+\ifdim
+\iff
+\iffalse
+\iffalse%initialvalue
+\ifhbox
+\ifinner
+\ifm
+\ifmacrostarts
+\ifmmode
+\ifnum
+\ifnum`
+\ifodd
+\iftrue
+\ifvmode
+\ifx
+\ignorespaces
+\ignorespacesafterend
+\iiiint
+\iiint
+\iint
+\impliedby
+\implies
+\inf
+\injlim
+\int
+\interdisplaylinepenalty
+\intertext
+\intop
+\joinrel
+\jot
+\ker
+\kern
+\l%
+\lVert
+\label
+\lastbox
+\lastkern
+\lastskip
+\lbrace
+\ldots
+\leavevmode
+\left
+\leftarrow
+\leftmargini
+\leftmarginiminus
+\leftroot
+\leqno
+\let
+\lg
+\lhook
+\lim
+\liminf
+\limits
+\lineskip
+\lineskiplimit
+\linewidth
+\llap
+\ln
+\log
+\long
+\longleftarrow
+\longleftrightarrow
+\longmapsto
+\longrightarrow
+\loop
+\lq
+\lvert
+\mapsto
+\mapstochar
+\mathaccent
+\mathaccentV
+\mathalpha
+\mathbin
+\mathchar
+\mathchardef
+\mathchoice
+\mathclose
+\mathcode
+\mathdisplay
+\mathellipsis
+\mathgroup
+\mathhexbox
+\mathinner
+\mathop
+\mathopen
+\mathord
+\mathpalette
+\mathpunct
+\mathrel
+\mathring
+\mathsurround
+\mathxxx
+\mathxxxtest
+\mathxxxx
+\matrix
+\max
+\maxdimen
+\mbox
+\meaning
+\medmuskip
+\medspace
+\min
+\minalignsep
+\mintagsep
+\mkern
+\mod
+\moveleft
+\mskip
+\mspace
+\multicolumn
+\multiply
+\multlinegap
+\multlinegap10pt
+\multlinetaggap
+\multlinetaggap10pt
+\negmedspace
+\negthickspace
+\negthinspace
+\newbox
+\newcommand
+\newcount
+\newcounter
+\newdimen
+\newenvironment
+\newhelp
+\newif
+\newmuskip
+\newskip
+\newtoks
+\noalign
+\nobreak
+\nobreakdash
+\nobreakspace
+\noexpand
+\noindent
+\nointerlineskip
+\nolimits
+\nonscript
+\nonumber
+\normalbaselines
+\normalcolor
+\normalfont
+\normallineskiplimit
+\not
+\notag
+\nottest
+\null
+\nulldelimiterspace
+\number
+\numberwithin
+\of
+\oint
+\ointop
+\omit
+\openup
+\operatorfont
+\operatorname
+\operatornamewithlimits
+\or
+\over
+\overleftarrow
+\overleftrightarrow
+\overline
+\overrightarrow
+\overset
+\overwithdelims
+\par
+\parshape
+\penalty
+\pmatrix
+\pmod
+\pod
+\postdisplaypenalty
+\predisplaypenalty
+\prevdepth
+\primfrac
+\prod
+\projlim
+\protect
+\providecommand
+\qopname
+\quad
+\rVert
+\raise
+\raisetag
+\rangle
+\rbrace
+\rbrack
+\rceil
+\ref
+\refstepcounter
+\relax
+\relaxo
+\relbar
+\renewcommand
+\renewenvironment
+\repeat
+\rfloor
+\rgroup
+\rhook
+\right
+\rightarrow
+\rlap
+\rmoustache
+\romannumeral
+\root
+\rootbox
+\rq
+\rvert
+\scriptfont
+\scriptscriptfont
+\scriptscriptstyle
+\scriptstyle
+\sec
+\selectfont
+\setbox
+\setcounter
+\shoveleft
+\shoveright
+\sideset
+\sim
+\sin
+\sinh
+\skewchar
+\smash
+\space
+\spaceor
+\span
+\spbreve
+\spcheck
+\spdddot
+\spddot
+\spdot
+\sphat
+\split
+\sptilde
+\sqrtsign
+\stepcounter
+\string
+\strut
+\strutbox
+\subarray
+\substack
+\sum
+\sup
+\symoperators
+\tabskip
+\tag
+\taghere
+\tan
+\tanh
+\tbinom
+\text
+\textellipsis
+\textfont
+\textstyle
+\textup
+\tfrac
+\the
+\theequation
+\theparentequation
+\thetag
+\thickmuskip
+\thickmuskip0mu
+\thickspace
+\thinmuskip
+\thinspace
+\tilde
+\tmspace
+\toks
+\typeout
+\u
+\underleftarrow
+\underleftrightarrow
+\underrightarrow
+\underset
+\unhbox
+\unhcopy
+\unpenalty
+\unskip
+\unvbox
+\unvcopy
+\uppercase
+\uproot
+\usefont
+\value
+\varDelta
+\varGamma
+\varLambda
+\varOmega
+\varPhi
+\varPi
+\varPsi
+\varSigma
+\varTheta
+\varUpsilon
+\varXi
+\varinjlim
+\varliminf
+\varlimsup
+\varprojlim
+\vbox
+\vcenter
+\vec
+\vee
+\veqno
+\vert
+\vrule
+\vskip
+\vss
+\vtop
+\wd
+\widehat
+\widetilde
+\xdef
+\xleaders
+\xleftarrow
+\xrightarrow
diff --git a/macros/latex-dev/required/amsmath/ams-internal.txt b/macros/latex-dev/required/amsmath/ams-internal.txt
new file mode 100644
index 0000000000..06a0c97f09
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/ams-internal.txt
@@ -0,0 +1,482 @@
+%%%% list of internal commands used by amsmath (not totally correct)
+
+\@@above
+\@@abovewithdelims
+\@@atop
+\@@atopwithdelims
+\@@eqno
+\@@italiccorr
+\@@leqno
+\@@over
+\@@overline
+\@@overwithdelims
+\@@sqrt
+\@@undefined
+\@@underline
+\@M
+\@addtoreset
+\@amsmath@err
+\@arrayboxrestore
+\@arrayparboxrestore
+\@backslashchar
+\@badmath
+\@car
+\@cdots
+\@centering
+\@checkend
+\@currentlabel
+\@currenvir
+\@declmathop
+\@depth
+\@display@init
+\@displaytrue
+\@eha
+\@ehc
+\@ehd
+\@elt
+\@empty
+\@emptytoks
+\@envbody
+\@eqnnum
+\@eqnswfalse
+\@eqnswtrue
+\@eqpen
+\@fleqntrue
+\@for
+\@genfrac
+\@getpen
+\@gobble
+\@gobblefour
+\@gobblethree
+\@gobbletwo
+\@gtempa
+\@height
+\@iden
+\@ifdefinable
+\@ifnextchar
+\@ifnotempty
+\@ifpackageloaded
+\@ifpackagewith
+\@ifstar
+\@ifundefined
+\@ignoretrue
+\@ldots
+\@let@token
+\@lign
+\@m
+\@mathmargin
+\@mathmeasure
+\@mathstyle
+\@namedef
+\@ne
+\@nil
+\@nocnterr
+\@nocounterr
+\@nx
+\@onlypreamble
+\@saveprimitive
+\@sptoken
+\@stpelt
+\@tempa
+\@tempb
+\@tempc
+\@tempcnta
+\@tempcntb
+\@tempd
+\@tempdima
+\@tempdimb
+\@tempdimc
+\@temptokena
+\@testopt
+\@totalleftmargin
+\@undefined
+\@width
+\@xp
+\@xp#1
+\DN@
+\DOTS@
+\DOTSCASE@
+\FN@
+\Invalid@@
+\Leftarrowfill@
+\Leftrightarrowfill@
+\Let@
+\Mathstrut@
+\Mathstrutbox@
+\RIfM@
+\Rightarrowfill@
+\SK@@label
+\SK@equationtrue
+\SK@tagform@
+\Umathch@
+\acc@check
+\acc@error
+\accentclass@
+\add@amp
+\add@amps
+\addto@envbody
+\addto@hook
+\align@
+\align@preamble
+\align@recover
+\aligned@a
+\alignedat@a
+\alignedspace@left
+\alignsafe@testopt
+\alignsep@
+\alignsep@-
+\alignsep@<
+\alt@tag
+\ams@DeclareRobustCommand
+\ams@def
+\ams@newcommand
+\ams@renewcommand
+\andhelp@
+\arrowfill@
+\bBigg@
+\begin@stack
+\big@size
+\bigcap@
+\bigcup@
+\bigodot@
+\bigoplus@
+\bigotimes@
+\bigsqcup@
+\biguplus@
+\bigvee@
+\bigwedge@
+\binrel@
+\binrel@@
+\black@
+\bold@false
+\bold@true
+\boldsymboldots@
+\boxz@
+\c@MaxMatrixCols
+\c@MaxMatrixColsc
+\calc@shift@align
+\calc@shift@gather
+\check@mathfonts
+\checkat@false
+\checkat@true
+\cl@@ckpt
+\classnum@
+\cmex@opt
+\collect@@body
+\collect@body
+\column@
+\column@plus
+\coprod@
+\count@
+\csname@@
+\csnamec@
+\csnamecl@
+\csnameemdf@
+\csnamem@gobble
+\csnamemb@
+\ctagsplit@false
+\ctagsplit@true
+\default@tag
+\delayed@
+\df@label
+\df@tag
+\dft@tag
+\dimen@
+\displ@y
+\displ@y@
+\displaywidth@
+\dotsb@
+\dotso@
+\dotsspace@
+\dspbrk@
+\dspbrk@context
+\dspbrk@lvl
+\dt@pfalse
+\dt@ptrue
+\emdf@L
+\emdf@La
+\emdf@R
+\emdf@Ra
+\emdf@U
+\emdf@Ua
+\endmathdisplay@a
+\endmathdisplay@fleqn
+\endmultline@math
+\env@cases
+\env@matrix
+\eqnshift@
+\every@math@size
+\ex@
+\ext@arrow
+\extra@
+\extrap@
+\f@series
+\f@size
+\field@lengths
+\fieldlengths@
+\finsm@sh
+\firstchoice@false
+\firstchoice@true
+\fracwithdelims@
+\frozen@everymath
+\gather@
+\gather@split
+\gdisplaywidth@
+\genfrac@choice
+\genfrac@rule
+\getdsp@pen
+\getmathch@
+\getmathcode@
+\gmeasure@
+\gobble@tag
+\gtest@false
+\gtest@true
+\hdots@for
+\hexnumber@
+\if@display
+\if@eqnsw
+\if@fleqn
+\ifbold@
+\ifcheckat@
+\ifctagsplit@
+\ifdt@p
+\iffirstchoice@
+\ifgtest@
+\ifinalign@
+\ifingather@
+\ifmeasuring@
+\ifshifttag@
+\ifst@rred
+\iftag@
+\iftagsleft@
+\iftagsleft@L
+\ifxxat@
+\ilimits@
+\inalign@false
+\inalign@true
+\incr@eqnum
+\inf@bad
+\ingather@false
+\ingather@true
+\insplit@
+\intdots@
+\intertext@
+\intkern@
+\ints@a
+\ints@b
+\ints@c
+\invalid@tag
+\keybin@
+\keybin@test
+\label@in@display
+\leavevmode@ifvmode
+\leftarrowfill@
+\leftrightarrowfill@
+\leftroot@
+\leftroot@mu
+\lendmultline@
+\lendsplit@
+\lineht@
+\ltx@label
+\m@gobble
+\m@ne
+\m@th
+\m@th$
+\macc@a
+\macc@adjust
+\macc@code
+\macc@depth
+\macc@group
+\macc@kerna
+\macc@kernb
+\macc@nested
+\macc@nested@a
+\macc@nucleus
+\macc@palette
+\macc@set@skewchar
+\macc@skewchar
+\macc@style
+\macc@test
+\macc@tmp
+\macro@
+\macro@@
+\make@df@tag
+\make@df@tag@@
+\make@df@tag@@@
+\make@display@tag
+\makesm@sh
+\maketag@@
+\maketag@@@
+\math@
+\math@bgroup
+\math@cr
+\math@cr@
+\math@cr@@
+\math@cr@@@
+\math@cr@@@align
+\math@cr@@@align@measure
+\math@cr@@@aligned
+\math@cr@@@alignedat
+\math@cr@@@gather
+\math@cr@@[
+\math@egroup
+\mathbin@
+\mathch@
+\mathdisplay@@pop
+\mathdisplay@@push
+\mathdisplay@pop
+\mathdisplay@push
+\mathdisplay@stack
+\mathrel@
+\mathsm@sh
+\matrix@check
+\matrix@error
+\maxcol@width
+\maxcolumn@widths
+\maxfields@
+\mb@b
+\mb@t
+\mb@tb
+\mdots@
+\mdots@@
+\meaning@
+\meaning@@
+\measure@
+\measuring@false
+\measuring@true
+\mmeasure@
+\multline@
+\multline@indent
+\new@ifnextchar
+\newmcodes@
+\newmcodes@m
+\newmcodes@o
+\next@
+\nextii@
+\nextiii@
+\nextiv@
+\nextix@
+\nextv@
+\nextvi@
+\nextvii@
+\nextviii@
+\nfss@text
+\nmlimits@
+\noaccents@
+\nogood@displaybreak
+\nolimits@
+\nomath@env
+\nonmatherr@
+\not@
+\operator@font
+\operator@fontlim$
+\operator@fontmod
+\overarrow@
+\p@
+\p@equation
+\place@tag
+\place@tag@gather
+\plainroot@
+\print@eqnum
+\process@envbody
+\prod@
+\protected@edef
+\push@begins
+\r@@t
+\raise@tag
+\relaxnext@
+\rendmultline@
+\rendsplit@
+\reset@equation
+\reset@strutbox@
+\resetMathstrut@
+\restore@hfuzz
+\restore@math@cr
+\restorealignstate@
+\restorecolumn@
+\restorecounters@
+\rightarrowfill@
+\rightdelim@
+\row@
+\savealignstate@
+\savecolumn@
+\savecounters@
+\savefieldlength@
+\saveshift@
+\savetaglength@
+\select@group
+\set@field
+\set@gather@field
+\set@mathaccent
+\setboxz@h
+\sf@size
+\shdots@for
+\shift@tag
+\shifttag@false
+\shifttag@true
+\sixt@@n
+\skip@
+\slimits@
+\split@
+\split@al@a
+\split@al@tagcheck
+\split@aligned
+\split@err
+\split@tag
+\split@warning
+\spread@equation
+\ssf@size
+\st@rredfalse
+\st@rredtrue
+\start@align
+\start@aligned
+\start@gather
+\start@multline
+\std@equal
+\std@minus
+\striplong@
+\strut@
+\strut@$
+\strutbox@
+\sum@
+\tag@false
+\tag@help
+\tag@in@align
+\tag@in@display
+\tag@in@display@a
+\tag@lengths
+\tag@shifts
+\tag@true
+\tag@width
+\tagform@
+\tagshift@
+\tagsleft@false
+\tagsleft@true
+\tagwidth@
+\tdots@
+\text@
+\textdef@
+\thecharacter@
+\thedots@
+\thr@@
+\toks@
+\too@wide
+\totwidth@
+\try@load@fontshape
+\tw@
+\underarrow@
+\uproot@
+\use@mathgroup
+\varlim@
+\varliminf@
+\varlimsup@
+\wdz@
+\x@calc@shift@lc
+\x@calc@shift@lf
+\x@calc@shift@rc
+\x@calc@shift@rf
+\x@lcalc@width
+\x@rcalc@width
+\xatlevel@
+\xxat@true
+\z@
diff --git a/macros/latex-dev/required/amsmath/amsbsy.dtx b/macros/latex-dev/required/amsmath/amsbsy.dtx
new file mode 100644
index 0000000000..890fbd0d82
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsbsy.dtx
@@ -0,0 +1,238 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\usepackage{amsbsy}
+\GetFileInfo{amsbsy.sty}
+\begin{document}
+\title{The \pkg{amsbsy} package}
+\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes}
+\date{Version \fileversion, \filedate}
+\DocInput{amsbsy.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+%
+% The package \texttt{amsbsy}, first written in 1989, implements a
+% few commands for producing \textbf{bold} characters in the `normal'
+% \emph{math version}.
+% \begin{quote}\em
+% Note: It is recommended nowadays to use the \pkg{bm} package, which
+% became available in 1997.
+% \end{quote}
+%
+% If we have bold fonts which contain the character in question then
+% we will use these fonts to produce the wanted character. But
+% sometimes math fonts are only available in a certain weight
+% (e.g.\ the AMS symbol fonts).
+% \DescribeMacro\pmb
+% For these cases we provide a command which is called \verb+\pmb+ (an
+% acronym for \textbf{p}oor \textbf{m}an's \textbf{b}old) with one argument.
+% The bolder weight is achieved by copying the argument three times in
+% slightly different positions which is better than nothing but no
+% match for a real bold font.
+%
+% \DescribeMacro\boldsymbol
+% There also exists the \verb+\boldsymbol+ command which is better in
+% all cases where bold fonts exists. This command will internally
+% switch to the corresponding `bold' \emph{math version} typeset its
+% argument in this version.
+%
+% Both commands will preserve the nature of their arguments, i.e.\ if
+% they get a relational atom their result will again be a relation as
+% far as \tex/'s mathspacing is concerned.
+%
+% Since it is good policy to make at least a small test we try to
+% typeset the infinity sign ($\infty$) first with \verb+\pmb+ and then
+% with \verb+\boldsymbol+.
+% \[
+% \pmb{\infty} = \boldsymbol{\infty} \quad ?
+% \]
+% \StopEventually{}
+%
+% Standard package info.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\ProvidesPackage{amsbsy}[1999/11/29 v1.2d Bold Symbols]
+% \end{macrocode}
+%
+% \section{The implementation}
+%
+% We need some functions from the \pkg{amsgen} package.
+% \begin{macrocode}
+\RequirePackage{amsgen}
+% \end{macrocode}
+%
+%\begin{macro}{\boldsymbol}
+% In implementing boldsymbol, we must take into account \tex/'s
+% limitation of only 16 mathgroups (math families, in Knuth's
+% terminology). If we wanted to maintain mathgroups for both the bold
+% and non-bold version of each math font, it would not take long to
+% run out of mathgroups. Therefore what we do instead for a bold
+% symbol is embed it in an \verb|\hbox|; inside that \verb|\hbox|,
+% when we start another math formula, we can change all the
+% mathgroups to their bold equivalents.
+%
+% However, to get the correct math style inside the hbox (display,
+% text, script or scriptscript) we have to use \verb|\mathchoice|.
+% Since \verb|\mathversion{bold}| has a lot of overhead, and
+% \verb|\mathchoice| typesets the argument text four times, we would
+% rather not put the \verb|\mathversion| command inside each
+% \verb|\hbox| in the \verb|\mathchoice|; on the other hand,
+% \verb|\mathversion| gives an error message if it's used in math
+% mode. Therefore if we want to execute \verb|\mathversion{bold}|
+% before starting the \verb|\mathchoice| we have to temporarily
+% disable the \verb|\@nomath| error. (The error message is intended
+% to keep people from accidentally emboldening a preceding part of a
+% math formula, since only the mathgroups defined at the end of a
+% math formula will determine the fonts used in that formula; but we
+% are going to typeset our bold symbol not in the current formula but
+% in an embedded formula, so that this danger doesn't apply here.)
+% \begin{macrocode}
+\DeclareRobustCommand{\boldsymbol}[1]{%
+% \end{macrocode}
+% Start a group to localize the change of \verb|\@nomath|:
+% \begin{macrocode}
+ \begingroup
+% \end{macrocode}
+% Disable \verb|\@nomath| so that we don't have to leave math
+% mode before executing \verb|\mathversion|:
+% \begin{macrocode}
+ \let\@nomath\@gobble \mathversion{bold}%
+% \end{macrocode}
+% \cs{math@atom} is a test macro which looks at its argument and
+% produces a math atom of the proper class.
+% \begin{macrocode}
+ \math@atom{#1}{%
+% \end{macrocode}
+% Although it is tempting to use \verb|\text| here, to save some
+% main memory, that caused a bug in the past due to some internal
+% interactions with \verb|\mathversion|.
+% \begin{macrocode}
+ \mathchoice%
+ {\hbox{$\m@th\displaystyle#1$}}%
+ {\hbox{$\m@th\textstyle#1$}}%
+ {\hbox{$\m@th\scriptstyle#1$}}%
+ {\hbox{$\m@th\scriptscriptstyle#1$}}}%
+% \end{macrocode}
+% End the group we started earlier.
+% \begin{macrocode}
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@atom}
+% The macro \verb+\math@atom+ looks at its argument and produce a
+% correct math atom, i.e.\ a primitive like \verb+\mathopen+.
+% Until the day we have a real implementation for all cases we use
+% the \verb+\binrel@+ command from \amstex/ which can distinguish
+% between binary, relation and ord atoms.
+% \begin{macrocode}
+\def\math@atom#1#2{%
+ \binrel@{#1}\binrel@@{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pmb}
+% Poor man's bold command, works by typesetting multiple copies of
+% the given argument with small offsets.
+% \begin{macrocode}
+\DeclareRobustCommand{\pmb}{%
+ \ifmmode\else \expandafter\pmb@@\fi\mathpalette\pmb@}
+% \end{macrocode}
+%
+% \cs{pmb@@} is called by \cn{pmb} in the non-math-mode case.
+% Discard the first two arguments which are for the math-mode case.
+% \begin{macrocode}
+\def\pmb@@#1#2#3{\leavevmode\setboxz@h{#3}%
+ \dimen@-\wdz@
+ \kern-.5\ex@\copy\z@
+ \kern\dimen@\kern.25\ex@\raise.4\ex@\copy\z@
+ \kern\dimen@\kern.25\ex@\box\z@
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newdimen\pmbraise@
+% \end{macrocode}
+% Note: because of the use of \cs{mathpalette}, if \cs{pmb@} is applied to a
+% single math italic character (or a single character from some other
+% slanted math font), the italic correction will be added. This will
+% cause subscripts to fall too far away from the character in some
+% cases, e.g., $\pmb{T}_1$ or $\pmb{\mathcal{T}}_1$.
+% \begin{macrocode}
+\def\pmb@#1#2{\setbox8\hbox{$\m@th#1{#2}$}%
+ \setboxz@h{$\m@th#1\mkern.5mu$}\pmbraise@\wdz@
+ \binrel@{#2}%
+ \dimen@-\wd8 %
+ \binrel@@{%
+ \mkern-.8mu\copy8 %
+ \kern\dimen@\mkern.4mu\raise\pmbraise@\copy8 %
+ \kern\dimen@\mkern.4mu\box8 }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\binrel@#1{\begingroup
+ \setboxz@h{\thinmuskip0mu
+ \medmuskip\m@ne mu\thickmuskip\@ne mu
+ \setbox\tw@\hbox{$#1\m@th$}\kern-\wd\tw@
+ ${}#1{}\m@th$}%
+% \end{macrocode}
+% The \cn{noexpand} here should be unnecessary, but just in case
+% \ldots
+% \begin{macrocode}
+ \edef\@tempa{\endgroup\let\noexpand\binrel@@
+ \ifdim\wdz@<\z@ \mathbin
+ \else\ifdim\wdz@>\z@ \mathrel
+ \else \relax\fi\fi}%
+ \@tempa
+}
+% \end{macrocode}
+% For completeness, assign a default value for \cs{binrel@@}.
+% \begin{macrocode}
+\let\binrel@@\relax
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \CheckSum{131}
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amsbsy.ins b/macros/latex-dev/required/amsmath/amsbsy.ins
new file mode 100644
index 0000000000..fe1cd5413d
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsbsy.ins
@@ -0,0 +1,50 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amsbsy.sty}{\from{amsbsy.dtx}{}}
+}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/amsmath/amsbsy.pdf b/macros/latex-dev/required/amsmath/amsbsy.pdf
new file mode 100644
index 0000000000..9a2dabfc88
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsbsy.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amscd.dtx b/macros/latex-dev/required/amsmath/amscd.dtx
new file mode 100644
index 0000000000..2d0a35d685
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amscd.dtx
@@ -0,0 +1,322 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\usepackage{amscd}
+\GetFileInfo{amscd.sty}
+% Dummy citation to avoid error in an example.
+\bibcite{fre:cichon}{C}
+\begin{document}
+\title{The \pkg{amscd} package}
+\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes}
+\date{Version \fileversion, \filedate}
+\DocInput{amscd.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+% \newcommand{\operatorname}[1]{\mathop{\mathrm{#1}}}
+% \newcommand{\per}{\operatorname{per}}
+% \newcommand{\cov}{\operatorname{cov}}
+% \newcommand{\non}{\operatorname{non}}
+% \newcommand{\cf}{\operatorname{cf}}
+% \newcommand{\add}{\operatorname{add}}
+% \newcommand{\End}{\operatorname{End}}
+%
+% \section{Introduction}
+%
+% The \pkg{amscd} package provides a \env{CD} environment that
+% emulates the commutative diagram capabilities of \amstex/ version
+% 2.x. This means that only simple rectangular diagrams are
+% supported, with no diagonal arrows or more exotic features. Many
+% users will be better served by one of the more powerful diagram
+% packages such as \pkg{diagram}, \pkg{xypic}, or \pkg{kuvio}.
+%
+% Example:
+% \begin{equation}\begin{CD}
+% S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\
+% @VVV @VV{\End P}V\\
+% (S\otimes T)/I @= (Z\otimes T)/J
+% \end{CD}\end{equation}
+% \begin{verbatim}
+% \begin{equation}\begin{CD}
+% S^{{\mathcal{W}}_\Lambda}\otimes T @>j>> T\\
+% @VVV @VV{\End P}V\\
+% (S\otimes T)/I @= (Z\otimes T)/J
+% \end{CD}\end{equation}
+% \end{verbatim}
+% (assuming \cn{End} is defined as an `operator name'.
+%
+% Another example:
+%
+% We will make liberal use of Cichon's Diagram \cite{fre:cichon}:
+% \begin{equation}
+% \begin{CD}
+% \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>>
+% \cf(\mathcal{L})\\
+% @VVV @AAA @AAA @VVV\\
+% \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>>
+% \non(\mathcal{L})
+% \end{CD}\end{equation}
+% \begin{verbatim}
+% \begin{equation}\begin{CD}
+% \cov(\mathcal{L}) @>>> \non(\mathcal{K}) @>>> \cf(\mathcal{K}) @>>>
+% \cf(\mathcal{L})\\
+% @VVV @AAA @AAA @VVV\\
+% \add(\mathcal{L}) @>>> \add(\mathcal{K}) @>>> \cov(\mathcal{K}) @>>>
+% \non(\mathcal{L})
+% \end{CD}\end{equation}
+% \end{verbatim}
+%
+% \StopEventually{}
+%
+% Standard package info.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\ProvidesPackage{amscd}[2017/04/14 v2.1 AMS Commutative Diagrams]
+% \end{macrocode}
+% \begin{macrocode}
+\RequirePackage{amsgen}
+% \end{macrocode}
+% Better not to redefine \verb|\math@cr| if it is already defined,
+% because for CD use only we want to omit the part of the code
+% related to \verb|\dspbrk@lvl| (see \fn{amsmath.sty}).
+%
+% [mjd,1999/11/04] These definitions have gone somewhat obsolete; but
+% we had probably better leave them as they are for backward
+% compatibility.
+% \begin{macrocode}
+\@ifundefined{math@cr}{%
+ \def\math@cr{{\ifnum0=`}\fi
+ \@ifstar{\global\@eqpen\@M\math@cr@}%
+ {\global\@eqpen\interdisplaylinepenalty \math@cr@}}
+% \end{macrocode}
+% The following section merely duplicates some code from the
+% \pkg{amsmath} package, in case the \pkg{amscd} package is used by
+% itself. For documentation of the code refer to \fn{amsmath.dtx}.
+% \begin{macrocode}
+ \def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}}
+ \def\math@cr@@[#1]{\ifnum0=`{\fi}\math@cr@@@
+ \noalign{\vskip#1\relax}}
+ \def\restore@math@cr{\def\math@cr@@@{\cr}}
+}{}
+\restore@math@cr
+% \end{macrocode}
+% [mjd,1999/11/04] These definitions too are somewhat obsolete;
+% but we had probably better leave them as they are for backward
+% compatibility.
+% \begin{macrocode}
+\@ifundefined{rightarrowfill@}{
+ \def\rightarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@
+ $#1\copy\z@\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+ \def\leftarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@
+ $#1\mathord\leftarrow\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill
+ \mkern-6mu\box\z@$}
+ \def\leftrightarrowfill@#1{\m@th\setboxz@h{$#1-$}\ht\z@\z@
+ $#1\mathord\leftarrow\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+}{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\atdef@#1{\expandafter\def\csname\space @\string#1\endcsname}
+\@ifundefined{Iat}{%
+ \DeclareRobustCommand{\Iat}{\FN@\at@}
+}{}
+\begingroup \catcode`\@=\active
+% \end{macrocode}
+% Define math \qc{\@} to replicate its mathcode-dictated behavior.
+% This is in case \qc{\@} occurs outside of \env{CD}.
+% \begin{macrocode}
+\csname if\string @compatibility\endcsname
+\else \fam=\mathcode`\@
+ \xdef @{\mathchar\number\fam\space }
+\fi
+\gdef\CDat{\let @=\Iat}
+\endgroup
+\mathcode`\@="8000 % make @ pseudo-active in math
+\def\at@{\let\next@\at@@
+ \ifcat\noexpand\next a\else
+ \ifcat\noexpand\next0\else
+ \ifcat\noexpand\next\relax\else
+ \let\next@\at@@@\fi\fi\fi\next@}
+\def\at@@#1{\expandafter
+ \ifx\csname\space @\string#1\endcsname\relax
+ \DN@{\at@@@#1}%
+ \else
+ \DN@{\csname\space @\string#1\endcsname}%
+ \fi\next@}%
+% \end{macrocode}
+% The following items should be defined only if they are not
+% already defined, either to leave the package name untouched (in
+% the case of \cs{PackageError}) or to avoid redundant allocation
+% of token or dimen registers.
+% \begin{macrocode}
+\@ifundefined{default@tag}{%
+ \def\default@tag{%
+ \def\tag{\PackageError{amscd}{\protect\tag\space not allowed
+ here}\@eha}}%
+}{}%
+\@ifundefined{at@@@}{%
+ \def\at@@@{\PackageError{amscd}{\Invalid@@ @}{\the\athelp@}\char64\relax}
+}{}
+\@ifundefined{athelp@}{\csname newhelp\endcsname\athelp@
+{Only certain combinations beginning with @ make sense to me.^^J%
+I'll assume you wanted @@ for a printed @.}}{}
+\@ifundefined{minaw@}{\newdimen\minaw@}{}
+\@ifundefined{bigaw@}{\newdimen\bigaw@}{}
+% \end{macrocode}
+%
+% Assignment of a couple of dimensions, and initialization of
+% \verb=\ampersand@=. We check to see if we need to define
+% \verb=\minaw@= and \verb=\bigaw@=.
+% \begin{macrocode}
+\minaw@11.111pt
+\newdimen\minCDarrowwidth
+\minCDarrowwidth2.5pc
+\newif\ifCD@
+\let\ampersand@\relax
+% \end{macrocode}
+%
+% Added \verb|\restore@math@cr\default@tag| to fix line numbering
+% problems, 7-JUN-1991. Suggested by I.~Zakharevich.
+% \begin{macrocode}
+\newenvironment{CD}{%
+ \CDat
+ \bgroup\relax\iffalse{\fi\let\ampersand@&\iffalse}\fi
+ \CD@true\vcenter\bgroup\let\\\math@cr\restore@math@cr\default@tag
+ \tabskip\z@skip\baselineskip20\ex@
+ \lineskip3\ex@\lineskiplimit3\ex@\halign\bgroup
+ &\hfill$\m@th##$\hfill\crcr
+}{%
+ \crcr\egroup\egroup\egroup
+}
+% \end{macrocode}
+%
+% \begin{macro}{\CD@check}
+% This check is used by all macros that must not appear outside the
+% \env{CD} environment. The first argument is the symbol to be used
+% after \verb+@+, the second one the action to be performed.
+%
+% Once again we use the trick of defining a temporary control
+% sequence \verb+\next@+ and calling it after the final \verb+\fi+.
+% This is not absolutely necessary, but it ensures that the
+% conditional text is processed in one and the same column
+% of the enclosing alignment.
+% \begin{macrocode}
+\def\CD@check#1#2{\ifCD@\DN@{#2}\else
+ \DN@{\PackageError{amscd}{@\protect#1 not
+ allowed outside of the CD environment}\@eha}%
+ \fi\next@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\atdef@>#1>#2>{\ampersand@
+ \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi
+ \setboxz@h{$\m@th\scriptstyle\;{#1}\;\;$}%
+ \ifdim\wdz@>\bigaw@\global\bigaw@\wdz@\fi
+% \end{macrocode}
+% If \verb|#2| is empty we can save some work.
+% \begin{macrocode}
+ \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;{#2}\;\;$}%
+ \ifdim\wd\@ne>\bigaw@\global\bigaw@\wd\@ne\fi}%
+ \ifCD@\enskip\fi
+ \mathrel{\mathop{\hbox to\bigaw@{\rightarrowfill@\displaystyle}}%
+ \limits^{#1}\@ifnotempty{#2}{_{#2}}}%
+ \ifCD@\enskip\fi \ampersand@}
+%
+\atdef@<#1<#2<{\ampersand@
+ \ifCD@ \global\bigaw@\minCDarrowwidth \else \global\bigaw@\minaw@ \fi
+ \setboxz@h{$\m@th\scriptstyle\;\;{#1}\;$}%
+ \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi
+ \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;\;{#2}\;$}%
+ \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}%
+ \ifCD@\enskip\fi
+ \mathrel{\mathop{\hbox to\bigaw@{\leftarrowfill@\displaystyle}}%
+ \limits^{#1}\@ifnotempty{#2}{_{#2}}}%
+ \ifCD@\enskip\fi \ampersand@}
+% \end{macrocode}
+%
+% Variants of the above two arrows, using \verb|(| and \verb|)|
+% characters instead of \verb|<| and \verb|>| characters, are
+% provided for those whose keyboards don't have the latter.
+% \begin{macrocode}
+\begingroup \catcode`\~=\active \lccode`\~=`\@
+\lowercase{%
+ \global\atdef@)#1)#2){~>#1>#2>}
+ \global\atdef@(#1(#2({~<#1<#2<}
+}% end lowercase
+\endgroup
+% \end{macrocode}
+%
+% \begin{macrocode}
+\atdef@ A#1A#2A{\CD@check{A..A..A}{\llap{$\m@th\vcenter{\hbox
+ {$\scriptstyle#1$}}$}\Big\uparrow
+ \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}}
+%
+\atdef@ V#1V#2V{\CD@check{V..V..V}{\llap{$\m@th\vcenter{\hbox
+ {$\scriptstyle#1$}}$}\Big\downarrow
+ \rlap{$\m@th\vcenter{\hbox{$\scriptstyle#2$}}$}&&}}
+%
+\atdef@={\CD@check={&\enskip\mathrel
+ {\vbox{\hrule\@width\minCDarrowwidth\vskip2\ex@\hrule\@width
+ \minCDarrowwidth}}\enskip&}}
+%
+\atdef@|{\CD@check|{\Big\Vert&&}}
+%
+\atdef@\vert{\CD@check\vert{\Big\Vert&&}}
+%
+\atdef@.{\CD@check.{&&}}
+% \end{macrocode}
+%
+% The \cn{pretend} command has weird syntax that doesn't fit well
+% with standard \latex/ syntax so we leave it undone, at least for
+% now. [mjd,1994/10/27]
+% \begin{macrocode}
+%\def\pretend#1\haswidth#2{\setboxz@h{$\m@th\scriptstyle{#2}$}\hbox
+% to\wdz@{\hfill$\m@th\scriptstyle{#1}$\hfill}}
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \CheckSum{459}
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amscd.ins b/macros/latex-dev/required/amsmath/amscd.ins
new file mode 100644
index 0000000000..148c4cb32e
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amscd.ins
@@ -0,0 +1,50 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amscd.sty}{\from{amscd.dtx}{}}
+}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/amsmath/amscd.pdf b/macros/latex-dev/required/amsmath/amscd.pdf
new file mode 100644
index 0000000000..860352c44a
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amscd.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsgen.dtx b/macros/latex-dev/required/amsmath/amsgen.dtx
new file mode 100644
index 0000000000..5edc26b9cc
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsgen.dtx
@@ -0,0 +1,386 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\usepackage{amsgen}
+\GetFileInfo{amsgen.sty}
+\begin{document}
+\title{The \pkg{amsgen} package}
+\author{American Mathematical Society\\Michael Downes}
+\date{Version \fileversion, \filedate}
+\DocInput{amsgen.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+% This is an internal package for storing common functions
+% that are shared by more than one package in the \amslatex/
+% distribution. Some of these might eventually make it into the \latex/
+% kernel.
+%
+% \StopEventually{}
+%
+% Standard package info.
+% Using \cs{ProvidesFile} rather than \cs{ProvidesPackage} because
+% the latter, when input by, e.g, \cls{amsbook}, results in
+% \texttt{LaTeX warning: You have requested document class `amsbook',
+% but the document class provides `amsgen'.}
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\ProvidesFile{amsgen.sty}[1999/11/30 v2.0 generic functions]
+% \end{macrocode}
+%
+% \section{Implementation}
+% Some general macros shared by \fn{amsart.dtx}, \fn{amsmath.dtx},
+% \fn{amsfonts.dtx}, \dots
+%
+% \begin{macro}{\@saveprimitive}
+% The \pkg{amsmath} package redefines a number of \tex/ primitives.
+% In case some preceding package also decided to redefine one of
+% those same primitives, we had better do some checking to make
+% sure that we are able to save the primitive meaning for internal
+% use. This is handled by the \cs{@saveprimitive} function. We
+% follow the example of \cs{@@input} where the primitive meaning is
+% stored in an internal control sequence with a |@@| prefix.
+% Primitive control sequences can be distinguished by the fact that
+% \cs{string} and \cs{meaning} return the same information.
+% \begin{macrocode}
+\providecommand{\@saveprimitive}[2]{\begingroup\escapechar`\\\relax
+ \edef\@tempa{\string#1}\edef\@tempb{\meaning#1}%
+ \ifx\@tempa\@tempb \global\let#2#1%
+ \else
+% \end{macrocode}
+% Check to see if \arg{2} was already given the desired primitive
+% meaning somewhere else.
+% \begin{macrocode}
+ \edef\@tempb{\meaning#2}%
+ \ifx\@tempa\@tempb
+ \else
+ \@latex@error{Unable to properly define \string#2; primitive
+ \noexpand#1no longer primitive}\@eha
+ \fi
+ \fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xp}
+% \begin{macro}{\@nx}
+% Shorthands for long command names.
+% \begin{macrocode}
+\let\@xp=\expandafter
+\let\@nx=\noexpand
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@emptytoks}
+% A token register companion for \cs{@empty}. Saves a little main mem and
+% probably makes initializations such as |\toks@{}| run faster too.
+% \begin{macrocode}
+\newtoks\@emptytoks
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@oparg}
+% Use of \cs{@oparg} simplifies some constructions where a macro
+% takes an optional argument in square brackets. We can't use
+% \cn{newcommand} here because this function might be previously
+% defined by the \pkg{amsmath} package in a loading sequence such as
+% \begin{verbatim}
+% \usepackage{amsmath,amsthm}
+% \end{verbatim}
+% \begin{macrocode}
+\def\@oparg#1[#2]{\@ifnextchar[{#1}{#1[#2]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifempty}
+% \begin{macro}{\@ifnotempty}
+% |\@ifnotempty| and |\@ifempty| use category 11 |@| characters to
+% test whether the argument is empty or not, since these are highly
+% unlikely to occur in the argument. As with \cn{@oparg}, there is a
+% possibility that these commands were defined previously in
+% \fn{amsmath.sty}.
+% \begin{macrocode}
+\long\def\@ifempty#1{\@xifempty#1@@..\@nil}
+\long\def\@xifempty#1#2@#3#4#5\@nil{%
+ \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}
+% \end{macrocode}
+% \cs{@ifnotempty} is a shorthand that makes code read better when
+% no action is needed in the empty case. At a cost of double
+% argument-reading---so for often-executed code, avoiding
+% \cs{@ifnotempty} might be wise.
+% \begin{macrocode}
+\long\def\@ifnotempty#1{\@ifempty{#1}{}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Some abbreviations to conserve token mem.
+% \begin{macrocode}
+\def\FN@{\futurelet\@let@token}
+\def\DN@{\def\next@}
+\def\RIfM@{\relax\ifmmode}
+\def\setboxz@h{\setbox\z@\hbox}
+\def\wdz@{\wd\z@}
+\def\boxz@{\box\z@}
+\def\relaxnext@{\let\@let@token\relax}
+% \end{macrocode}
+%
+% \begin{macro}{\new@ifnextchar}
+% This macro is a new version of \latex/'s \verb+\@ifnextchar+,
+% macro that does not skip over spaces.
+% \begin{macrocode}
+\long\def\new@ifnextchar#1#2#3{%
+% \end{macrocode}
+% By including the space after the equals sign, we make it possible
+% for \cs{new@ifnextchar} to do look-ahead for any token, including a
+% space!
+% \begin{macrocode}
+ \let\reserved@d= #1%
+ \def\reserved@a{#2}\def\reserved@b{#3}%
+ \futurelet\@let@token\new@ifnch
+}
+%
+\def\new@ifnch{%
+ \ifx\@let@token\reserved@d \let\reserved@b\reserved@a \fi
+ \reserved@b
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifstar}
+% There will essentially never be a space before the \qc{\*}, so
+% using \cs{@ifnextchar} is unnecessarily slow.
+% \begin{macrocode}
+\def\@ifstar#1#2{\new@ifnextchar *{\def\reserved@a*{#1}\reserved@a}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% The hook \cs{every@size} was changed to \cs{every@math@size} in the
+% December 1994 release of \latex/ and its calling procedures changed.
+% If \cs{every@math@size} is undefined it means the user has an older
+% version of \latex/ so we had better define it and patch a couple of
+% functions (\cs{glb@settings} and \cs{set@fontsize}).
+% \begin{macrocode}
+\@ifundefined{every@math@size}{%
+% \end{macrocode}
+% Reuse the same token register; since it was never used except for
+% the purposes that are affected below, this is OK.
+% \begin{macrocode}
+\let\every@math@size=\every@size
+\def\glb@settings{%
+ \expandafter\ifx\csname S@\f@size\endcsname\relax
+ \calculate@math@sizes
+ \fi
+ \csname S@\f@size\endcsname
+ \ifmath@fonts
+% \ifnum \tracingfonts>\tw@
+% \@font@info{Setting up math fonts for
+% \f@size/\f@baselineskip}\fi
+ \begingroup
+ \escapechar\m@ne
+ \csname mv@\math@version \endcsname
+ \globaldefs\@ne
+ \let \glb@currsize \f@size
+ \math@fonts
+ \endgroup
+ \the\every@math@size
+ \else
+% \ifnum \tracingfonts>\tw@
+% \@font@info{No math setup for \f@size/\f@baselineskip}%
+% \fi
+ \fi
+}
+% \end{macrocode}
+% Remove |\the\every@size| from \cs{size@update}.
+% \begin{macrocode}
+\def\set@fontsize#1#2#3{%
+ \@defaultunits\@tempdimb#2pt\relax\@nnil
+ \edef\f@size{\strip@pt\@tempdimb}%
+ \@defaultunits\@tempskipa#3pt\relax\@nnil
+ \edef\f@baselineskip{\the\@tempskipa}%
+ \edef\f@linespread{#1}%
+ \let\baselinestretch\f@linespread
+ \def\size@update{%
+ \baselineskip\f@baselineskip\relax
+ \baselineskip\f@linespread\baselineskip
+ \normalbaselineskip\baselineskip
+ \setbox\strutbox\hbox{%
+ \vrule\@height.7\baselineskip
+ \@depth.3\baselineskip
+ \@width\z@}%
+%%% \the\every@size
+ \let\size@update\relax}%
+ }
+}{}% end \@ifundefined test
+% \end{macrocode}
+%
+% \begin{macro}{\ex@}
+% The \cs{ex@} variable provides a small unit of space for use in
+% math-mode constructions, that varies according to the current type
+% size. For example, the \cn{pmb} command uses \cs{ex@} units.
+% Since a macro or mu unit solution for the \meta{dimen} \cs{ex@} won't
+% work without changing a lot of current code in the \pkg{amsmath}
+% package, we set \cs{ex@} through the \cs{every@math@size} hook.
+% The value of \cs{ex@} is scaled nonlinearly in a range of roughly
+% 0.5pt to 1.5pt, by the function \cs{compute@ex@}.
+% \begin{macrocode}
+\newdimen\ex@
+\addto@hook\every@math@size{\compute@ex@}
+% \end{macrocode}
+% \end{macro}
+%
+% \cs{compute@ex@} computes \cs{ex@} as a nonlinear scaling from 10pt
+% to current font size (\cs{f@size}). Using .97 as the multiplier makes 1
+% |ex@| $\approx$ .9pt when the current type size is 8pt and 1 |ex@|
+% $\approx$ 1.1pt when the current type size is 12pt.
+%
+% The formula is essentially
+% \begin{displaymath}
+% \newcommand{\points}{\mbox{pt}}
+% \newcommand{\floor}[1]{\lfloor#1\rfloor}
+% 1\points \pm (1\points - (.97)^{\floor{\vert 10 - n\vert}})
+% \end{displaymath}
+% where $n$ = current type size, but adjusted to differentiate
+% half-point sizes as well as whole point sizes, and there is a
+% cutoff for extraordinarily large values of \cs{f@size} ($>$ 20pt)
+% so that the value of \cs{ex@} never exceeds 1.5pt.
+%
+% \begin{macrocode}
+\def\compute@ex@{%
+ \begingroup
+ \dimen@-\f@size\p@
+ \ifdim\dimen@<-20\p@
+% \end{macrocode}
+% Never make \cs{ex@} larger than 1.5pt.
+% \begin{macrocode}
+ \global\ex@ 1.5\p@
+ \else
+% \end{macrocode}
+% Adjust by the reference size and multiply by 2 to allow for
+% half-point sizes.
+% \begin{macrocode}
+ \advance\dimen@10\p@ \multiply\dimen@\tw@
+% \end{macrocode}
+% Save information about the current sign of \cs{dimen@}.
+% \begin{macrocode}
+ \edef\@tempa{\ifdim\dimen@>\z@ -\fi}%
+% \end{macrocode}
+% Get the absolute value of \cs{dimen@}.
+% \begin{macrocode}
+ \dimen@ \ifdim\dimen@<\z@ -\fi \dimen@
+ \advance\dimen@-\@m sp % fudge factor
+% \end{macrocode}
+% Here we use \cs{vfuzz} merely as a convenient scratch register
+% \begin{macrocode}
+ \vfuzz\p@
+% \end{macrocode}
+% Multiply in a loop.
+% \begin{macrocode}
+ \def\do{\ifdim\dimen@>\z@
+ \vfuzz=.97\vfuzz
+ \advance\dimen@ -\p@
+%\message{\vfuzz: \the\vfuzz, \dimen@: \the\dimen@}%
+ \@xp\do \fi}%
+ \do
+ \dimen@\p@ \advance\dimen@-\vfuzz
+ \global\ex@\p@
+ \global\advance\ex@ \@tempa\dimen@
+ \fi
+ \endgroup
+%\typeout{\string\f@size: \f@size}\showthe\ex@
+}
+% \end{macrocode}
+% Tests of the \cs{compute@ex@} function yield the following results:
+%
+% \begin{center}\begin{tabular}{rlrl}
+% \cs{f@size}& \cs{ex@}& \cs{f@size}& \cs{ex@}\\
+% 10& 1.0pt& 9& 0.94089pt\\
+% 11& 1.05911pt& 8.7& 0.91266pt\\
+% 12& 1.11473pt& 8.5& 0.91266pt\\
+% 14.4& 1.23982pt& 8.4& 0.88527pt\\
+% 17.28& 1.36684pt& 8& 0.88527pt\\
+% 20.74& 1.5pt& 7& 0.83293pt\\
+% 19.5& 1.4395pt& 6& 0.78369pt\\
+% && 5& 0.73737pt\\
+% && 1& 0.57785pt
+% \end{tabular}\end{center}
+%
+% \begin{macro}{\@addpunct}
+% Use of the \cs{@addpunct} function allows ending punctuation in
+% section headings and elsewhere to be intelligently omitted
+% when punctuation is already present.
+% \begin{macrocode}
+\def\@addpunct#1{\ifnum\spacefactor>\@m \else#1\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frenchspacing}
+% Change \cn{frenchspacing} to ensure that \cs{@addpunct} will
+% continue to work properly even when `french' spacing is in effect.
+% \begin{macrocode}
+\def\frenchspacing{\sfcode`\.1006\sfcode`\?1005\sfcode`\!1004%
+ \sfcode`\:1003\sfcode`\;1002\sfcode`\,1001 }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Miscellaneous}
+% \begin{macrocode}
+\def\nomath@env{\@amsmath@err{%
+ \string\begin{\@currenvir} allowed only in paragraph mode%
+}\@ehb% "You've lost some text"
+}
+% \end{macrocode}
+% A trade-off between main memory space and hash size; using
+% \verb+\Invalid@@+ saves 14 bytes of main memory for each use of
+% \verb+\Invalid@+, at the cost of one control sequence name.
+% \verb+\Invalid@+ is currently used about five times and
+% \verb+\Invalid@@+ is used by itself in some other instances,
+% which means that it saves us more memory than \verb+\FN@+,
+% \verb+\RIfM@+, and some of the other abbreviations above.
+% \begin{macrocode}
+\def\Invalid@@{Invalid use of \string}
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \CheckSum{337}
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amsgen.ins b/macros/latex-dev/required/amsmath/amsgen.ins
new file mode 100644
index 0000000000..8c5683cb5a
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsgen.ins
@@ -0,0 +1,50 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amsgen.sty}{\from{amsgen.dtx}{}}
+}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/amsmath/amsgen.pdf b/macros/latex-dev/required/amsmath/amsgen.pdf
new file mode 100644
index 0000000000..9078999dc0
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsgen.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsldoc.pdf b/macros/latex-dev/required/amsmath/amsldoc.pdf
new file mode 100644
index 0000000000..decc68fe74
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsldoc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsldoc.tex b/macros/latex-dev/required/amsmath/amsldoc.tex
new file mode 100644
index 0000000000..9e08f029f5
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsldoc.tex
@@ -0,0 +1,2770 @@
+%
+% Copyright (C) 1995, 2000, 2013 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+\documentclass[leqno,titlepage,openany]{amsldoc}[1999/12/13]
+
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+
+\ifx\UndEfiNed\url
+ \ClassError{amsldoc}{%
+ This version of amsldoc.tex must be processed\MessageBreak
+ with a newer version of amsldoc.cls (2.02 or later).}{}
+\fi
+
+\renewcommand\bibname{References}
+
+% Definitions that should be moved to amsldoc.cls
+% when it is next updated
+\makeatletter
+\let\cleardouble@page\cleardoublepage
+\AtBeginDocument{%
+ \ifx\cleardouble@page\cleardoublepage
+ \def\cleardoublepage{\clearpage{\pagestyle{empty}\cleardouble@page}}
+ \fi
+}
+
+% #1 is empty or one of class, environment, option, package
+% could use different font in each case
+\makeatletter
+\def\@category@index#1#2{%
+ \autoindex{%
+ #2\actualchar\string\index#1font{#2}%
+ \ifx\@nil#1\@nil\else\space#1\fi
+ }%
+}
+
+\let\indexpackagefont\textsf
+\let\indexclassfont\textsf
+\let\indexoptionfont\texttt
+\let\indexenvironmentfont\texttt
+\let\indexfont\texttt
+\makeatother
+% For a package that won't be indexed, i.e. amsmath
+\newcommand{\nipkg}{\textsf}
+\def\tikz/{Ti\textit{k}Z}
+% End definitions for amsldoc.cls
+
+\title{User's Guide for the \nipkg{amsmath} Package (Version~2.1)}
+\author{American Mathematical Society, \LaTeX3 Project}
+\date{1999-12-13 (revised 2002-02-25, 2016-11-14, 2018-04-05)}
+\makeatletter
+\def\@thanks{\bigskip\MaintainedByLaTeXTeam{amslatex}}
+\makeatother
+
+% Use the amsmath package and amscd package in order to print
+% examples.
+\usepackage{amsmath}
+\usepackage{amscd}
+
+\usepackage{imakeidx}
+% Need alternate coding for vertical bar to get it into index.
+% Based on \qcbang and \cnbang in amsldoc.cls, refined by David Carlisle.
+% Give it a sort field that will be at the end of the symbols;
+% must avoid " and | which have special meanings.
+\DeclareRobustCommand{\qcvert}{\qc\|\index{{z1}@{\ntt\char'174}}}
+\DeclareRobustCommand{\cnvert}{%
+ \ncn{\|}\index{{z0}@{\ntt\bslchar\char'174}}}
+% Need alternate index sort field for bang to allow & to sort first
+\DeclareRobustCommand{\altcnbang}{%
+ \ncn{\!}\index{"!b@{\ntt\bslchar\qcbang}}}
+\DeclareRobustCommand{\cnamp}{%
+ \index{"!a@\texttt{\&}}}
+
+\makeindex[intoc] % generate index data
+\providecommand{\see}[2]{\textit{see} #1}
+
+% The amsldoc class includes a number of features useful for
+% documentation about TeX, including:
+%
+% ---Commands \tex/, \amstex/, \latex/, ... for uniform treatment
+% of the various logos and easy handling of following spaces.
+%
+% ---Commands for printing various common elements: \cn for command
+% names, \fn for file names (including font-file names), \env for
+% environments, \pkg and \cls for packages and classes, etc.
+
+% Many of the command names used here are rather long and will
+% contribute to poor linebreaking if we follow the \latex/ practice
+% of not hyphenating anything set in tt font; instead we selectively
+% allow some hyphenation.
+\allowtthyphens % defined in amsldoc.cls
+
+\hyphenation{ac-cent-ed-sym-bol add-to-counter add-to-length align-at
+ aligned-at allow-dis-play-breaks ams-art ams-cd ams-la-tex amsl-doc
+ ams-symb ams-tex ams-text ams-xtra bmatrix bold-sym-bol cen-ter-tags
+ eqn-ar-ray idots-int int-lim-its latex med-space neg-med-space
+ neg-thick-space neg-thin-space no-int-lim-its no-name-lim-its
+ over-left-arrow over-left-right-arrow over-right-arrow pmatrix
+ qed-sym-bol set-length side-set small-er tbinom the-equa-tion
+ thick-space thin-space un-der-left-arrow un-der-left-right-arrow
+ un-der-right-arrow use-pack-age var-inj-lim var-proj-lim vmatrix
+ xalign-at xx-align-at}
+
+% Prepare for illustrating the \vec example
+\newcommand{\vect}[1]{\mathbf{#1}}
+
+\newcommand{\booktitle}[1]{\textit{#1}}
+\newcommand{\journalname}[1]{\textit{#1}}
+\newcommand{\seriesname}[1]{\textit{#1}}
+
+% Command to insert and index a particular phrase. Doesn't work for
+% certain kinds of special characters in the argument.
+\newcommand{\ii}[1]{#1\index{#1}}
+
+\newcommand{\vstrut}[1]{\vrule width0pt height#1\relax}
+
+% An environment for presenting comprehensive address information:
+\newenvironment{infoaddress}{%
+ \par\topsep\medskipamount
+ \trivlist\centering
+ \item[]%
+ \begin{minipage}{.7\columnwidth}%
+ \raggedright
+}{%
+ \end{minipage}%
+ \endtrivlist
+}
+
+\newenvironment{eqxample}{%
+ \par\addvspace\medskipamount
+ \noindent\begin{minipage}{.5\columnwidth}%
+ \def\producing{\end{minipage}\begin{minipage}{.5\columnwidth}%
+ \hbox\bgroup\kern-.2pt\vrule width.2pt%
+ \vbox\bgroup\parindent0pt\relax
+% The 3pt is to cancel the -\lineskip from \displ@y
+ \abovedisplayskip3pt \abovedisplayshortskip\abovedisplayskip
+ \belowdisplayskip0pt \belowdisplayshortskip\belowdisplayskip
+ \noindent}
+}{%
+ \par
+% Ensure that a lonely \[\] structure doesn't take up width less than
+% \hsize.
+ \hrule height0pt width\hsize
+ \egroup\vrule width.2pt\kern-.2pt\egroup
+ \end{minipage}%
+ \par\addvspace\medskipamount
+}
+
+% Errors in output shouldn't be \texttt, and they may also be longer
+% than one line, but they should be identified by the "errorbullet".
+% (They were formerly labeled as aubsections.)
+\newenvironment{erroro}[1]{%
+ \par\addvspace\medskipamount
+ \noindent\hangindent\parindent
+ \hbox to\parindent{\errorbullet\hfil}\ignorespaces
+ #1\par\vspace{\smallskipamount}
+}{%
+ \par\addvspace\medskipamount
+}
+
+% The chapters are so short, perhaps we shouldn't call them by the
+% name `Chapter'. We make \chaptername read an argument in order to
+% remove a following \space or "{} " (both possibilities are present
+% in book.cls).
+
+\renewcommand{\chaptername}[1]{}
+\newcommand{\chapnum}[1]{\mdash #1\mdash }
+\makeatletter
+\def\@makechapterhead#1{%
+ \vspace{1.5\baselineskip}%
+ {\parindent \z@ \raggedright \reset@font
+ \ifnum \c@secnumdepth >\m@ne
+ \large\bfseries \chapnum{\thechapter}%
+ \par\nobreak
+ \vskip.5\baselineskip\relax
+ \fi
+ #1\par\nobreak
+ \vskip\baselineskip
+ }}
+\makeatother
+
+% A command for ragged-right parbox in a tabular.
+\newcommand{\rp}{\let\PBS\\\raggedright\let\\\PBS}
+
+% Non-indexed file name
+\newcommand{\nfn}[1]{\texttt{#1}}
+
+% For the examples in the math spacing table.
+%%\newcommand{\lspx}{\mbox{\rule{5pt}{.6pt}\rule{.6pt}{6pt}}}
+%%\newcommand{\rspx}{\mbox{\rule[-1pt]{.6pt}{7pt}%
+%% \rule[-1pt]{5pt}{.6pt}}}
+\newcommand{\lspx}{\mathord{\Rightarrow\mkern-1mu}}
+\newcommand{\rspx}{\mathord{\mkern-1mu\Leftarrow}}
+\newcommand{\spx}[1]{$\lspx #1\rspx$}
+
+% For a list of characters representing document input.
+\newcommand{\clist}[1]{%
+ \mbox{\ntt\spaceskip.2em plus.1em \xspaceskip\spaceskip#1}}
+
+% Fix weird \latex/ definition of rightmark.
+\makeatletter
+\def\rightmark{\expandafter\@rightmark\botmark{}{}}
+% Also turn off section marks.
+\let\sectionmark\@gobble
+\renewcommand{\chaptermark}[1]{%
+ \uppercase{\markboth{\rhcn#1}{\rhcn#1}}}
+\newcommand{\rhcn}{\thechapter. }
+\makeatother
+
+% Include down to \section but not \subsection, in toc:
+\setcounter{tocdepth}{1}
+
+% Subheadings for the bibliography
+\newif\iffirstbibsubhead \firstbibsubheadtrue
+\newcommand{\bibsubhead}[1]{%
+ \iffirstbibsubhead \firstbibsubheadfalse
+ \else \addvspace{\medskipamount}
+ \fi
+ \item[]\hspace*{-\leftmargin}\textbf{#1}\par
+ \vspace{\smallskipamount}
+}
+
+\DeclareMathOperator{\ix}{ix}
+\DeclareMathOperator{\nul}{nul}
+\DeclareMathOperator{\End}{End}
+\DeclareMathOperator{\xxx}{xxx}
+
+\usepackage{hyperref}
+\hypersetup{pdfborder=0 0 0}
+\makeatletter
+\let\oldcs\cs
+\def\cs#1{\texorpdfstring{\oldcs{#1}}{\@backslashchar\@backslashchar#1}}
+\let\cn\cs
+\makeatother
+\begin{document}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\frontmatter
+
+\maketitle
+
+\pagestyle{headings}
+\tableofcontents
+\cleardoublepage % for better page number placement
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\mainmatter
+\chapter{Introduction}
+
+\index{amsmath@\texttt{amsmath} package|(}
+
+The \nipkg{amsmath} package is a \LaTeX{} package that provides
+miscellaneous enhancements for improving the information structure and
+printed output of documents that contain mathematical formulas. Readers
+unfamiliar with \LaTeX{} should refer to \cite{lamport}. If you have an
+up-to-date version of \LaTeX{}, the \nipkg{amsmath} package is normally
+provided along with it. Upgrading when a newer version of the
+\nipkg{amsmath} package is released can be done via
+\url{http://mirror.ctan.org/macros/latex/required/amsmath.zip}.
+
+This documentation describes the features of the \nipkg{amsmath} package
+and discusses how they are intended to be used. It also covers some
+ancillary packages:
+\begin{ctab}{lll}
+\pkg{amsbsy}& \pkg{amsopn}& \pkg{amsxtra}\\
+\pkg{amscd}& \pkg{amstext}\\
+\end{ctab}
+These all have something to do with the contents of math formulas. For
+information on extra math symbols and math fonts, see \cite{amsfonts}
+and \url{https://www.ams.org/tex/amsfonts.html}. For documentation of the
+\pkg{amsthm} package or AMS document classes (\cls{amsart},
+\cls{amsbook}, etc.\@) see \cite{amsthdoc} or \cite{amshandbk} and
+\url{https://www.ams.org/tex/author-info.html}.
+
+If you are a long-time \latex/ user and have lots of mathematics in what
+you write, then you may recognize solutions for some familiar problems
+in this list of \nipkg{amsmath} features:
+\begin{itemize}
+
+\item A convenient way to define new `operator name' commands analogous
+to \cn{sin} and \cn{lim}, including proper side spacing and automatic
+selection of the correct font style and size (even when used in
+sub- or superscripts).
+
+\item Multiple substitutes for the \env{eqnarray} environment to make
+various kinds of equation arrangements easier to write.
+
+\item Equation numbers automatically adjust up or down to avoid
+overprinting on the equation contents (unlike \env{eqnarray}).
+
+\item Spacing around equals signs matches the normal spacing in the
+\env{equation} environment (unlike \env{eqnarray}).
+
+\item A way to produce multiline subscripts as are often used with
+summation or product symbols.
+
+\item An easy way to substitute a variant equation number for a given
+equation instead of the automatically supplied number.
+
+\item An easy way to produce subordinate equation numbers of the form
+(1.3a) (1.3b) (1.3c) for selected groups of equations.
+
+\end{itemize}
+
+The \nipkg{amsmath} package is distributed together with some small
+auxiliary packages:
+\begin{description}
+\item[\nipkg{amsmath}] Primary package, provides various features for
+ displayed equations and other mathematical constructs.
+
+\item[\pkg{amstext}] Provides a \cn{text} command for
+ typesetting a fragment of text inside a display.
+
+\item[\pkg{amsopn}] Provides \cn{DeclareMathOperator} for defining new
+ `operator names' like \cn{sin} and \cn{lim}.
+
+\item[\pkg{amsbsy}] For backward compatibility this package continues
+to exist but use of the newer \pkg{bm} package that comes with \LaTeX{}
+is recommended instead.
+
+\item[\pkg{amscd}] Provides a \env{CD} environment for simple
+ commutative diagrams (no support for diagonal arrows).
+
+\item[\pkg{amsxtra}] Provides certain odds and ends such as
+ \cn{fracwithdelims} and \cn{accentedsymbol}, for compatibility with
+ documents created using version 1.1.
+
+\end{description}
+
+The \nipkg{amsmath} package incorporates \pkg{amstext}, \pkg{amsopn}, and
+\pkg{amsbsy}. The features of \pkg{amscd} and \pkg{amsxtra}, however,
+are available only by invoking those packages separately.
+
+The independent \pkg{mathtools} package \cite{mt} provides some
+enhancements to \nipkg{amsmath}; \pkg{mathtools} loads \nipkg{amsmath}
+automatically, so there is no need to separately load \nipkg{amsmath}
+if \pkg{mathtools} is used. Some \pkg{mathtools} facilities
+will be noted below as appropriate.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Options for the \nipkg{amsmath} package}\label{options}
+
+The \nipkg{amsmath} package has the following options:
+\index{options!amsmath@\texttt{amsmath} package options|(}
+\begin{description}
+
+\item[\opt{centertags}] (default) For an equation containing a
+\env{split} environment, place equation
+numbers\index{equationn@equation numbers!vertical placement}
+vertically centered on the total height of the equation.
+
+\item[\opt{tbtags}] `Top-or-bottom tags': For an equation containing
+a \env{split} environment, place equation
+numbers\index{equationn@equation numbers!vertical placement} level with the last
+(resp.\ first) line, if numbers are on the right (resp.\ left).
+
+\item[\opt{sumlimits}] (default) Place the subscripts and
+superscripts\index{subscripts and superscripts!placement}\relax
+\index{limits|see{subscripts and superscripts}} of summation symbols
+above and below, in displayed equations. This option also affects other
+symbols of the same type\mdash $\prod$, $\coprod$, $\bigotimes$,
+$\bigoplus$, and so forth\mdash but excluding integrals (see below).
+
+\item[\opt{nosumlimits}] Always place the subscripts and superscripts of
+summation-type symbols to the side, even in displayed equations.
+
+\item[\opt{intlimits}] Like \opt{sumlimits}, but for
+integral\index{integrals!placement of limits} symbols.
+
+\item[\opt{nointlimits}] (default) Opposite of \opt{intlimits}.
+
+\item[\opt{namelimits}] (default) Like \opt{sumlimits}, but for certain
+`operator names' such as $\det$, $\inf$, $\lim$, $\max$, $\min$, that
+traditionally have subscripts%
+\index{subscripts and superscripts!placement} placed underneath when
+they occur in a displayed equation.
+
+\item[\opt{nonamelimits}] Opposite of \opt{namelimits}.
+
+\end{description}
+
+\goodbreak
+
+\begin{description}
+\item[\opt{alignedleftspaceyes}]
+\item[\opt{alignedleftspaceno}]
+\item[\opt{alignedleftspaceyesifneg}]
+\end{description}
+
+To use one of these package options, put the option name in the optional
+argument of the \cn{usepackage} command\mdash e.g.,
+\verb"\usepackage[intlimits]{amsmath}".
+For AMS document classes and any other classes that preload \nipkg{amsmath}
+desired options must be specified with the \cn{documentclass}\mdash
+e.g.,\\
+\verb+\documentclass[intlimits,tbtags,reqno]{amsart}+.
+
+The \nipkg{amsmath} package also recognizes the following options which
+are normally selected (implicitly or explicitly) through the
+\cn{documentclass} command, and thus need not be repeated in the option
+list of the \cn{usepackage}|{amsmath}| statement.
+\begin{description}
+
+\item[\opt{leqno}] Place equation numbers on the left.%
+\index{equationn@equation numbers!left or right placement}
+
+\item[\opt{reqno}] Place equation numbers on the right.
+
+\item[\opt{fleqn}] Position equations at a fixed indent from the left
+margin rather than centered in the text column.%
+\index{displayed equations!centering}
+
+\end{description}
+
+Three options have been added to control the space to the left of
+\env{aligned} and \env{gathered} environments. Prior to the 2017 release
+a thin space was added to the left but not the right of these constructs.
+This appears to have been an accidental feature of the implementation and
+was typically corrected by prefixing the environments with \altcnbang.
+
+The new default behavior is aimed to ensure that the environments do
+not have a thin space added in most cases, and that existing documents
+using |\!\begin{aligned}| continue to work as before.
+
+\begin{description}
+\item[\opt{alignedleftspaceyes}] Always add \cn{\,} to the left of \env{aligned} and \env{gathered}.
+\item[\opt{alignedleftspaceno}] Never add \cn{\,} to the left of \env{aligned} and \env{gathered}.
+\item[\opt{alignedleftspaceyesifneg}] Only add \cn{\,} if the environment is prefixed by negative space. (New default behavior.)
+\end{description}
+
+\index{options!amsmath@\texttt{amsmath} package options|)}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Displayed equations}
+
+\section{Introduction}
+The \nipkg{amsmath} package provides a number of additional displayed
+equation structures\index{displayed equations}%
+\index{equations|see{displayed equations}} beyond the ones
+provided in basic \latex/. The augmented set includes:
+\begin{verbatim}
+ equation equation* align align*
+ gather gather* alignat alignat*
+ multline multline* flalign flalign*
+ split
+\end{verbatim}
+(Although the standard \env{eqnarray} environment remains available,
+it is better to use \env{align} or \env{equation}+\env{split} instead.
+Within \env{eqnarray}, spacing\index{horizontal spacing} around signs
+of relation is not the preferred mathematical spacing, and is
+inconsistent with that spacing as it appears in other environments.
+Long lines in this environment may result in misplaced or overprinted
+equation numbers. This environment also does not support the use of
+\cn{qed} or \cn{qedhere} as provided by theorem packages.)
+
+Except for \env{split}, each environment has both starred and unstarred
+forms, where the unstarred forms have automatic numbering using
+\latex/'s \env{equation} counter. You can suppress the number on any
+particular line by putting \cn{notag} before the end of that line;
+\cn{notag} should not be used outside a display environment as it will
+mess up the numbering. You can also
+override\index{equationn@equation numbers!overriding} a number with a tag
+of your own using \cn{tag}|{|\<label>|}|, where \<label> means arbitrary
+text such as |$*$| or |ii| used to \qq{number} the equation.
+A tag can reference a different tagged display by use of
+|\tag{\ref{|\<label>|}|\<modifier>|}| where \<modifier> is optional.
+If you are using \pkg{hyperref}, use \cn{ref*};
+use of the starred form of \cn{ref} prevents a reference to a modified
+tag containing a nested link from linking to the original display.
+
+There is also a
+\cn{tag*} command that causes the text you supply to be typeset
+literally, without adding parentheses around it. \cn{tag} and \cn{tag*}
+can also be used within the unnumbered versions of all the \nipkg{amsmath}
+alignment structures. Some examples of the use of \cn{tag} may be found
+in the sample files \fn{testmath.tex} and \fn{subeqn.tex} provided with
+the \nipkg{amsmath} package.
+
+The \env{split} environment is a special subordinate form that is used
+only \emph{inside} one of the others. It cannot be used inside
+\env{multline}, however. \env{split} supports only one alignment (|&|)
+column; if more are needed, \env{aligned} or \env{alignedat} should be
+used. The width of a \env{split} structure is the full line width.
+
+In the structures that do alignment (\env{split}, \env{align} and
+variants), relation symbols have an |&| before them but not
+after\mdash unlike \env{eqnarray}. Putting the |&| after the
+relation symbol will interfere with the normal spacing; it has to go
+before.
+
+In all multiline environments, lines are divided by \cn{\\}. The \cn{\\}
+should \emph{not} be used to end the last line. Using it there will
+result in unwanted extra vertical space following the display.
+
+In \emph{all} math environments (inline or display), blank lines
+(equivalent to \cn{par}) are not permitted, and will result in an error.
+
+\begin{table}[p]
+\caption[]{Comparison of displayed equation environments (vertical lines
+indicating nominal margins)}\label{displays}
+\renewcommand{\theequation}{\arabic{equation}}
+\begin{eqxample}
+\begin{verbatim}
+\begin{equation*}
+a=b
+\end{equation*}
+\end{verbatim}
+\producing
+\begin{equation*}
+a=b
+\end{equation*}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{equation}
+a=b
+\end{equation}
+\end{verbatim}
+\producing
+\begin{equation}
+a=b
+\end{equation}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{equation}\label{xx}
+\begin{split}
+a& =b+c-d\\
+ & \quad +e-f\\
+ & =g+h\\
+ & =i
+\end{split}
+\end{equation}
+\end{verbatim}
+\producing
+\begin{equation}\label{xx}
+\begin{split}
+a& =b+c-d\\
+ & \quad +e-f\\
+ & =g+h\\
+ & =i
+\end{split}
+\end{equation}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{multline}
+a+b+c+d+e+f\\
++i+j+k+l+m+n
+\end{multline}
+\end{verbatim}
+\producing
+\begin{multline}
+a+b+c+d+e+f\\
++i+j+k+l+m+n
+\end{multline}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{gather}
+a_1=b_1+c_1\\
+a_2=b_2+c_2-d_2+e_2
+\end{gather}
+\end{verbatim}
+\producing
+\begin{gather}
+a_1=b_1+c_1\\
+a_2=b_2+c_2-d_2+e_2
+\end{gather}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{align}
+a_1& =b_1+c_1\\
+a_2& =b_2+c_2-d_2+e_2
+\end{align}
+\end{verbatim}
+\producing
+\begin{align}
+a_1& =b_1+c_1\\
+a_2& =b_2+c_2-d_2+e_2
+\end{align}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{align}
+a_{11}& =b_{11}&
+ a_{12}& =b_{12}\\
+a_{21}& =b_{21}&
+ a_{22}& =b_{22}+c_{22}
+\end{align}
+\end{verbatim}
+\producing
+\begin{align}
+a_{11}& =b_{11}&
+ a_{12}& =b_{12}\\
+a_{21}& =b_{21}&
+ a_{22}& =b_{22}+c_{22}
+\end{align}
+\end{eqxample}
+
+\begin{eqxample}
+\begin{verbatim}
+\begin{flalign*}
+a_{11} + b_{11}& = c_{11}&
+ a_{12}& =b_{12}\\
+b_{21}& = c_{21}&
+ a_{22}& =b_{22}+c_{22}
+\end{flalign*}
+\end{verbatim}
+\producing
+\begin{flalign*}
+a_{11} + b_{11}& = c_{11}&
+ a_{12}& =b_{12}\\
+b_{21}& = c_{21}&
+ a_{22}& =b_{22}+c_{22}
+\end{flalign*}
+\end{eqxample}
+\end{table}
+
+%% ------------------------------------------------------------------ %%
+\enlargethispage{1\baselineskip}
+
+\section{Single equations}
+
+The \env{equation} environment is for a single equation with an
+automatically generated number. The \env{equation*} environment is the
+same except for omitting the number.%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\footnote{Basic \latex/ doesn't provide an \env{equation*} environment,
+but rather a functionally equivalent environment named
+\env{displaymath}.}
+The wrapper \verb+\[ ... \]+ is equivalent to \env{equation*}.%
+\index{[@\verb+\[ ... \]+}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Split equations without alignment}
+
+The \env{multline} environment is a variation of the \env{equation}
+environment used for equations that don't fit on a single line. The
+first line of a \env{multline} will be at the left margin and the last
+line at the right margin, except for an indention on both sides in the
+amount of \cn{multlinegap}. Any additional lines in between will be
+centered independently within the display width (unless the \opt{fleqn}
+option is in effect).%
+\index{options!behavior of particular options}
+
+Like \env{equation}, \env{multline} has only a single equation number
+(thus, none of the individual lines should be marked with \cn{notag}).
+The equation number is placed on the last line (\opt{reqno} option) or
+first line (\opt{leqno} option); vertical centering as for \env{split}
+is not supported by \env{multline}.%
+\index{options!behavior of particular options}
+
+It's possible to force one of the middle lines to the left or right with
+commands \cn{shoveleft}, \cn{shoveright}. These commands take the entire
+line as an argument, up to but not including the final \cn{\\}; for
+example
+\begin{multline}
+\framebox[.65\columnwidth]{A}\\
+\framebox[.5\columnwidth]{B}\\
+\shoveright{\framebox[.55\columnwidth]{C}}\\
+\framebox[.65\columnwidth]{D}
+\end{multline}
+\begin{verbatim}
+\begin{multline}
+\framebox[.65\columnwidth]{A}\\
+\framebox[.5\columnwidth]{B}\\
+\shoveright{\framebox[.55\columnwidth]{C}}\\
+\framebox[.65\columnwidth]{D}
+\end{multline}
+\end{verbatim}
+
+The value of \cn{multlinegap} can be changed with the usual \latex/
+commands \cn{setlength} or \cn{addtolength}.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Split equations with alignment}
+
+Like \env{multline}, the \env{split} environment is for \emph{single}
+equations that are too long to fit on one line and hence must be split
+into multiple lines. Unlike \env{multline}, however, the \env{split}
+environment provides for alignment among the split lines, using |&| to
+mark alignment points. Unlike the other \nipkg{amsmath} equation
+structures, the \env{split} environment provides no numbering, because
+it is intended to be used \emph{only inside some other displayed
+ equation structure}, usually an \env{equation}, \env{align}, or
+\env{gather} environment, which provides the numbering. For example:
+\begin{equation}\label{e:barwq}\begin{split}
+H_c&=\frac{1}{2n} \sum^n_{l=0}(-1)^{l}(n-{l})^{p-2}
+ \sum_{l _1+\dots+ l _p=l}\prod^p_{i=1} \binom{n_i}{l _i}\\
+&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot
+ \Bigl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\Bigr].
+ \kern-2em % adjust equation body to the right [mjd,13-Nov-1994]
+\end{split}\end{equation}
+
+\begin{verbatim}
+\begin{equation}\label{e:barwq}\begin{split}
+H_c&=\frac{1}{2n} \sum^n_{l=0}(-1)^{l}(n-{l})^{p-2}
+ \sum_{l _1+\dots+ l _p=l}\prod^p_{i=1} \binom{n_i}{l _i}\\
+&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot
+ \Bigl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\Bigr].
+\end{split}\end{equation}
+\end{verbatim}
+
+The \env{split} structure should constitute the entire body of the
+enclosing structure, apart from commands like \cn{label} that produce no
+visible material.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Equation groups without alignment}
+
+The \env{gather} environment is used for a group of consecutive
+equations when there is no alignment desired among them; each one is
+centered separately within the text width (see Table~\ref{displays}).
+Equations inside \env{gather} are separated by a \cn{\\} command.
+Any equation in a \env{gather} may consist of a \verb'\begin{split}'
+ \dots\ \verb'\end{split}' structure\mdash for example:
+\begin{verbatim}
+\begin{gather}
+ first equation\\
+ \begin{split}
+ second & equation\\
+ & on two lines
+ \end{split}
+ \\
+ third equation
+\end{gather}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Equation groups with mutual alignment}
+
+The \env{align} environment is used for two or more equations when
+vertical alignment is desired; usually binary relations such as equal
+signs are aligned (see Table~\ref{displays}).
+
+To have several equation columns side-by-side, use extra ampersands
+to separate the columns:
+\begin{align}
+x&=y & X&=Y & a&=b+c\\
+x'&=y' & X'&=Y' & a'&=b\\
+x+x'&=y+y' & X+X'&=Y+Y' & a'b&=c'b
+\end{align}
+%
+\begin{verbatim}
+\begin{align}
+x&=y & X&=Y & a&=b+c\\
+x'&=y' & X'&=Y' & a'&=b\\
+x+x'&=y+y' & X+X'&=Y+Y' & a'b&=c'b
+\end{align}
+\end{verbatim}
+Line-by-line annotations on an equation can be done by judicious
+application of \cn{text} inside an \env{align} environment:
+\begin{align}
+x& = y_1-y_2+y_3-y_5+y_8-\dots
+ && \text{by \eqref{eq:C}}\\
+ & = y'\circ y^* && \text{by \eqref{eq:D}}\\
+ & = y(0) y' && \text {by Axiom 1.}
+\end{align}
+%
+\begin{verbatim}
+\begin{align}
+x& = y_1-y_2+y_3-y_5+y_8-\dots
+ && \text{by \eqref{eq:C}}\\
+ & = y'\circ y^* && \text{by \eqref{eq:D}}\\
+ & = y(0) y' && \text {by Axiom 1.}
+\end{align}
+\end{verbatim}
+A variant environment \env{alignat} allows the horizontal space between
+equations to be explicitly specified. This environment takes one argument,
+the number of \qq{equation columns} (the number of pairs of right-left
+aligned columns; the argument is the number of pairs): count the maximum
+number of \verb'&'s in any row, add~1 and divide by~2.
+\begin{alignat}{2}
+x& = y_1-y_2+y_3-y_5+y_8-\dots
+ &\quad& \text{by \eqref{eq:C}}\\
+ & = y'\circ y^* && \text{by \eqref{eq:D}}\\
+ & = y(0) y' && \text {by Axiom 1.}
+\end{alignat}
+%
+\begin{verbatim}
+\begin{alignat}{2}
+x& = y_1-y_2+y_3-y_5+y_8-\dots
+ &\quad& \text{by \eqref{eq:C}}\\
+ & = y'\circ y^* && \text{by \eqref{eq:D}}\\
+ & = y(0) y' && \text {by Axiom 1.}
+\end{alignat}
+\end{verbatim}
+The environment \env{flalign} (``full length alignment'') stretches the
+space between the equation columns to the maximum possible width, leaving
+only enough space at the margin for the equation number, if present.
+\begin{flalign}
+x&=y & X&=Y\\
+x'&=y' & X'&=Y'\\
+x+x'&=y+y' & X+X'&=Y+Y'
+\end{flalign}
+%
+\begin{verbatim}
+\begin{flalign}
+x&=y & X&=Y\\
+x'&=y' & X'&=Y'\\
+x+x'&=y+y' & X+X'&=Y+Y'
+\end{flalign}
+\end{verbatim}
+%
+\begin{flalign*}
+x&=y & X&=Y\\
+x'&=y' & X'&=Y'\\
+x+x'&=y+y' & X+X'&=Y+Y'
+\end{flalign*}
+%
+\begin{verbatim}
+\begin{flalign*}
+x&=y & X&=Y\\
+x'&=y' & X'&=Y'\\
+x+x'&=y+y' & X+X'&=Y+Y'
+\end{flalign*}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Alignment building blocks}
+
+Like \env{equation}, the multi-equation environments \env{gather},
+\env{align}, and \env{alignat} are designed to produce a structure
+whose width is the full line width. This means, for example, that one
+cannot readily add parentheses around the entire structure. But
+variants\index{ed env@\texttt{-ed} environments|(}
+\env{gathered}, \env{aligned}, and \env{alignedat} are provided whose
+total width is the actual width of the contents; thus they can be used
+as a component in a containing expression. E.g.,
+\begin{equation*}
+\left.\begin{aligned}
+ B'&=-\partial\times E,\\
+ E'&=\partial\times B - 4\pi j,
+\end{aligned}
+\right\}
+\qquad \text{Maxwell's equations}
+\end{equation*}
+\begin{verbatim}
+\begin{equation*}
+\left.\begin{aligned}
+ B'&=-\partial\times E,\\
+ E'&=\partial\times B - 4\pi j,
+\end{aligned}
+\right\}
+\qquad \text{Maxwell's equations}
+\end{equation*}
+\end{verbatim}
+Like the \env{array} environment, these \texttt{-ed} variants also take
+an optional\index{options!positioning of \texttt{-ed} environments}
+|[t]|\index{t option@\texttt{t} (top) option},
+|[b]|\index{b option@\texttt{b} (bottom) option} or the default
+|[c]|\index{c option@\texttt{c} (center) option}
+argument to specify vertical
+positioning. For maximum interoperability, do not insert a
+space\index{options!space before \texttt{[}}
+or line break\index{line break} before the option. See
+also the note on page~\pageref{breaknote} regarding page breaking
+within the \texttt{-ed} environments.
+
+\qq{Cases} constructions like the following are common in
+mathematics:
+\begin{equation}\label{eq:C}
+P_{r-j}=
+ \begin{cases}
+ 0& \text{if $r-j$ is odd},\\
+ r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}.
+ \end{cases}
+\end{equation}
+and in the \nipkg{amsmath} package there is a \env{cases} environment to
+make them easy to write:
+\begin{verbatim}
+P_{r-j}=\begin{cases}
+ 0& \text{if $r-j$ is odd},\\
+ r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}.
+ \end{cases}
+\end{verbatim}
+Notice the use of \cn{text} (cf.~\secref{text}) and the nested math
+formulas. \env{cases} is set in \cn{textstyle}. If \cn{displaystyle}
+is wanted, it must be requested explicitly; \pkg{mathtools} provides
+a \env{dcases} environment for this purpose.
+
+The |-ed|\index{ed env@\texttt{-ed} environments|)} and \env{cases}
+environments must appear within an enclosing math environment, which can
+be either in text, between |$...$|, or in any of the display environments.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Adjusting tag placement}
+
+Placing equation numbers can be a rather complex problem in multiline
+displays. The environments of the \nipkg{amsmath} package try hard to
+avoid overprinting an equation number on the equation contents, if
+necessary moving the number down or up to a separate line. Difficulties
+in accurately calculating the profile of an equation can occasionally
+result in number movement that doesn't look right.
+A \cn{raisetag} command is provided to adjust the vertical position of the
+current equation number, if it has been shifted away from its normal
+position. To move a particular number up by six points, write
+|\raisetag{6pt}|. (At the end of a display, this also shifts up the
+text following the display.)
+This kind of adjustment is fine tuning like line
+breaks and page breaks, and should therefore be left undone until your
+document is nearly finalized, or you may end up redoing the fine tuning
+several times to keep up with changing document contents.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Vertical spacing and page breaks in multiline displays}
+
+You can use the \cn{\\}|[|\<dimension>|]|%
+\index{options!extra vertical space after \cn{\\}}
+command to get extra vertical
+space between lines in all the \nipkg{amsmath} displayed equation
+environments, as is usual in \latex/. Do not type a space between the%
+\index{options!space before \texttt{[}}
+\cn{\\} and the following |[|; \emph{only} for display environments
+defined by \nipkg{amsmath} the space is interpreted to mean that the
+bracketed material is part of the document content.
+
+When the \nipkg{amsmath} package is
+in use \ii{page breaks} between equation lines are normally disallowed;
+the philosophy is that page breaks in such material should receive
+individual attention from the author. To get an individual page break
+inside a particular displayed equation, a \cn{displaybreak} command is
+provided. \cn{displaybreak} is best placed immediately before the
+\cn{\\} where it is to take effect. Like \latex/'s \cn{pagebreak},
+\cn{displaybreak} takes an optional argument%
+\index{options!behavior of particular options} between 0 and 4 denoting
+the desirability of the pagebreak. |\displaybreak[0]| means \qq{it is
+ permissible to break here} without encouraging a break;
+\cn{displaybreak} with no optional argument is the same as
+|\displaybreak[4]| and forces a break.
+
+If you prefer a strategy of letting page breaks fall where they may,
+even in the middle of a multiline equation, then you might put
+\cn{allowdisplaybreaks}\texttt{[1]} in the preamble of your document. An
+optional argument\index{options!behavior of particular options}
+1\ndash 4 can be used for finer control: |[1]| means
+allow page breaks, but avoid them as much as possible; values of 2,3,4
+mean increasing permissiveness. When display breaks are enabled with
+\cn{allowdisplaybreaks}, the \cn{\\*} command can be used to prohibit a
+pagebreak after a given line, as usual.
+
+\begin{bfseries}
+Note:\label{breaknote} Certain equation environments wrap their contents
+in an unbreakable box, with the consequence that neither \cn{displaybreak}
+nor \cn{allowdisplaybreaks} will have any effect on them. These include
+\env{split}, \env{aligned}, \env{gathered}, and \env{alignedat}.
+\end{bfseries}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Interrupting a display}
+
+The command \cn{intertext} is used for a short interjection of one or
+two lines of text\index{text fragments inside math} in the middle of a
+multiple-line display structure (see also the \cn{text} command in
+\secref{text}). Its salient feature is preservation of the alignment,
+which would not happen if you simply ended the display and then started
+it up again afterwards. \cn{intertext} may only appear right after a
+\cn{\\} or \cn{\\*} command. Notice the position of the word \qq{and} in
+this example.
+\begin{align}
+ A_1&=N_0(\lambda;\Omega')-\phi(\lambda;\Omega'),\\
+ A_2&=\phi(\lambda;\Omega')-\phi(\lambda;\Omega),\\
+\intertext{and}
+ A_3&=\mathcal{N}(\lambda;\omega).
+\end{align}
+\begin{verbatim}
+\begin{align}
+ A_1&=N_0(\lambda;\Omega')-\phi(\lambda;\Omega'),\\
+ A_2&=\phi(\lambda;\Omega')-\phi(\lambda;\Omega),\\
+\intertext{and}
+ A_3&=\mathcal{N}(\lambda;\omega).
+\end{align}
+\end{verbatim}
+
+The \pkg{mathtools} package provides a command \cn{shortintertext} that
+is intended for use when the interjected text is only a few words; it uses
+less vertical space than \cn{intertext}. This
+is most effective when equation numbers are on the right.%
+\index{equationn@equation numbers!left or right placement}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Equation numbering}
+
+\subsection{Numbering hierarchy}
+In \latex/ if you wanted to have equations numbered within
+sections\mdash that is, have
+equation numbers (1.1), (1.2), \dots, (2.1), (2.2),
+\dots, in sections 1, 2, and so forth\mdash you could redefine
+\cn{theequation} as suggested in the \latex/ manual \cite[\S6.3, \S
+C.8.4]{lamport}:
+\begin{verbatim}
+\renewcommand{\theequation}{\thesection.\arabic{equation}}
+\end{verbatim}
+
+This works pretty well, except that the equation counter won't be reset
+to zero at the beginning of a new section or chapter, unless you do it
+yourself using \cn{setcounter}. To make this a little more convenient,
+the \nipkg{amsmath} package provides a
+command\index{equationn@equation numbers!hierarchy} \cn{numberwithin}.
+To have equation numbering tied to section numbering, with automatic
+reset of the equation counter, write
+\begin{verbatim}
+\numberwithin{equation}{section}
+\end{verbatim}
+As its name implies, the \cn{numberwithin} command can be applied to
+any counter, not just the \texttt{equation} counter.
+
+\subsection{Cross references to equation numbers}
+
+To make cross-references to equations easier, an \cn{eqref}
+command\index{equationn@equation numbers!cross-references} is provided. This
+automatically supplies the parentheses around the equation number. I.e.,
+if \verb'\ref{abc}' produces 3.2 then \verb'\eqref{abc}' produces
+(3.2). The parentheses around an \cn{eqref} equation number will be
+set in upright type regardless of type style of the context.
+
+\subsection{Subordinate numbering sequences}
+
+The \nipkg{amsmath} package provides also a wrapper environment,
+\env{subequations}\index{equationn@equation numbers!subordinate numbering}, to make it
+easy to number equations in a particular \cn{align} or similar group with
+a subordinate numbering scheme. For example
+\begin{verbatim}
+\begin{subequations}
+...
+\end{subequations}
+\end{verbatim}
+causes all numbered equations within that part of the document to be
+numbered (4.9a) (4.9b) (4.9c) \dots, if the preceding numbered
+equation was (4.8). A \cn{label} command immediately after
+\verb/\begin{subequations}/ will produce a \cn{ref} of the parent
+number 4.9, not 4.9a. The counters used by the subequations
+environment are \verb/parentequation/ and \verb/equation/ and
+\cn{addtocounter}, \cn{setcounter}, \cn{value}, etc., can be applied
+as usual to those counter names. To get anything other than lowercase
+letters for the subordinate numbers, use standard \latex/ methods for
+changing numbering style \cite[\S6.3, \S C.8.4]{lamport}. For example,
+redefining \cn{theequation} as follows will produce roman numerals.
+\begin{verbatim}
+\begin{subequations}
+\renewcommand{\theequation}{\theparentequation \roman{equation}}
+...
+\end{verbatim}
+
+\subsection{Numbering style}
+
+The default equation number is set in \cn{normalfont}. This means that
+in bold section headings, bold is suppressed; a workaround for this is
+to use \verb+(\ref{+\ldots\verb+})+ rather than \verb+\eqref{+\ldots\verb+}+.
+
+If smaller type is specified for a numbered display, the size of the
+equation number will also be small. The default size can be ensured
+throughout a document by applying this patch in the preamble:
+\begin{verbatim}
+\makeatletter
+\renewcommand{\maketag@@@}[1]{\hbox{\m@th\normalsize\normalfont#1}}%
+\makeatother
+\end{verbatim}
+(This modification may be included in a future version of
+\nipkg{amsmath}.)
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Miscellaneous mathematical features}
+
+\section{Matrices}\label{ss:matrix}
+
+The \nipkg{amsmath} package provides some environments for
+matrices\index{matrices} beyond the basic \env{array} environment of
+\latex/. The \env{pmatrix}, \env{bmatrix}, \env{Bmatrix}, \env{vmatrix}
+and \env{Vmatrix} have (respectively) $(\,)$, $[\,]$, $\lbrace\,\rbrace$,
+$\lvert\,\rvert$, and $\lVert\,\rVert$ delimiters\index{delimiters}
+built in. For naming consistency there is a
+\env{matrix} environment sans delimiters. This is not entirely redundant
+with the \env{array} environment; the matrix environments all use more
+economical horizontal spacing than the rather prodigal spacing of the
+\env{array} environment. Also, unlike the \env{array} environment, you
+don't have to give column specifications for any of the matrix
+environments; by default you can have up to 10 centered columns.%
+\footnote{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+More precisely: The maximum number of columns in a matrix is determined
+by the counter |MaxMatrixCols| (normal value = 10), which you can change
+if necessary using \latex/'s \cn{setcounter} or \cn{addtocounter}
+commands.%
+}\space%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+(If you need left or right alignment in a column or other special
+formats you may use \env{array}, or the \pkg{mathtools}
+package which provides \verb+*+ variants%
+\index{matrix@\indexenvironmentfont{matrix} environment!\verb+*+ variants}
+of these environments with
+an optional argument to specify left or right alignment.)
+
+To produce a small matrix suitable for use in text, there is a
+\env{smallmatrix} environment (e.g.,
+\begin{math}
+\bigl( \begin{smallmatrix}
+ a&b\\ c&d
+\end{smallmatrix} \bigr)
+\end{math})
+that comes closer to fitting within a single text line than a normal
+matrix. Delimiters\index{delimiters} must be provided. (The
+\pkg{mathtools} package provides |p|,|b|,|B|,|v|,|V| versions of
+\env{smallmatrix},%
+\index{smallmatrix@\indexenvironmentfont{smallmatrix} environment!variant delimiters}
+as well as |*| variants%
+\index{smallmatrix@\indexenvironmentfont{smallmatrix} environment!\verb+*+ variants}
+as described above.)
+The above example was produced by
+\begin{verbatim}
+\bigl( \begin{smallmatrix}
+ a&b\\ c&d
+\end{smallmatrix} \bigr)
+\end{verbatim}
+
+\cn{hdotsfor}|{|\<number>|}| produces a row of dots in a
+matrix\index{matrices!ellipsis dots}\index{ellipsis dots!in
+matrices}\index{dots|see{ellipsis dots}} spanning the given number of
+columns. For example,
+\begin{center}
+\begin{minipage}{.3\columnwidth}
+\noindent$\begin{matrix} a&b&c&d\\
+e&\hdotsfor{3} \end{matrix}$
+\end{minipage}%
+\qquad
+\begin{minipage}{.45\columnwidth}
+\begin{verbatim}
+\begin{matrix} a&b&c&d\\
+e&\hdotsfor{3} \end{matrix}
+\end{verbatim}
+\end{minipage}%
+\end{center}
+
+The spacing of the dots can be varied through use of a square-bracket
+option,\index{options!behavior of particular options}
+for example, |\hdotsfor[1.5]{3}|. The number in square brackets
+will be used as a multiplier (i.e., the normal value is 1.0).
+\begin{equation}\label{eq:D}
+\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\
+-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\
+\hdotsfor[2]{4}\\
+-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix},
+\end{equation}
+\begin{verbatim}
+\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\
+-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\
+\hdotsfor[2]{4}\\
+-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Math spacing commands}
+
+The \nipkg{amsmath} package slightly extends the set of math
+spacing\index{horizontal spacing} commands, as shown below.
+Both the spelled-out and abbreviated forms of these commands are robust,
+and they can also be used outside of math.
+\begin{ctab}{lll|lll}
+Abbrev.& Spelled out& Example & Abbrev.& Spelled out& Example\\
+\hline
+\vstrut{2.5ex}
+& no space& \spx{}& & no space & \spx{}\\
+\cn{\,}& \cn{thinspace}& \spx{\,}&
+ \altcnbang& \cn{negthinspace}& \spx{\!}\\
+\cn{\:}& \cn{medspace}& \spx{\:}&
+ & \cn{negmedspace}& \spx{\negmedspace}\\
+\cn{\;}& \cn{thickspace}& \spx{\;}&
+ & \cn{negthickspace}& \spx{\negthickspace}\\
+& \cn{quad}& \spx{\quad}\\
+& \cn{qquad}& \spx{\qquad}
+\end{ctab}
+For the greatest possible control over math spacing, use \cn{mspace}
+and `math units'. One math unit, or |mu|, is equal to 1/18 em. Thus to
+get a negative \cn{quad} you could write |\mspace{-18.0mu}|.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Dots}
+
+For preferred placement of ellipsis dots (raised or on-line) in various
+contexts there is no general consensus. It may therefore be considered a
+matter of taste. By using the semantically oriented commands
+\begin{itemize}
+\item \cn{dotsc} for \qq{dots with commas}
+\item \cn{dotsb} for \qq{dots with binary operators/relations}
+\item \cn{dotsm} for \qq{multiplication dots}
+\item \cn{dotsi} for \qq{dots with integrals}
+\item \cn{dotso} for \qq{other dots} (none of the above)
+\end{itemize}
+instead of \cn{ldots} and \cn{cdots}, you make it possible for your
+document to be adapted to different conventions on the fly, in case (for
+example) you have to submit it to a publisher who insists on following
+house tradition in this respect. The default treatment for the various
+kinds follows American Mathematical Society conventions:
+\begin{center}
+\begin{tabular}{@{}l@{}l@{}}
+\begin{minipage}[t]{.54\textwidth}
+\begin{verbatim}
+Then we have the series $A_1, A_2,
+\dotsc$, the regional sum $A_1
++A_2 +\dotsb $, the orthogonal
+product $A_1 A_2 \dotsm $, and
+the infinite integral
+\[\int_{A_1}\int_{A_2}\dotsi\].
+\end{verbatim}
+\end{minipage}
+&
+\begin{minipage}[t]{.45\textwidth}
+\noindent
+Then we have the series $A_1,A_2,\dotsc$,
+the regional sum $A_1+A_2+\dotsb$,
+the orthogonal product $A_1A_2\dotsm$,
+and the infinite integral
+\[\int_{A_1}\int_{A_2}\dotsi.\]
+\end{minipage}
+\end{tabular}
+\end{center}
+For most situations, the undifferentiated \cn{dots} can be used, and
+\nipkg{amsmath} will output the most suitable form based on the
+immediate context; if an inappropriate form results, it can be corrected
+after examining the output.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Nonbreaking dashes}
+
+A command \cn{nobreakdash} is provided to suppress the possibility of a
+line break\index{line break|(} after the following hyphen or dash. For
+example, if you write `pages 1\ndash 9' as |pages 1\nobreakdash--9|
+then a line break will never occur between the dash and the 9. You can
+also use \cn{nobreakdash} to prevent undesirable hyphenations in
+combinations like |$p$-adic|. For frequent use, it's advisable to make
+abbreviations, e.g.,
+\begin{verbatim}
+\newcommand{\p}{$p$\nobreakdash}% for "\p-adic"
+\newcommand{\Ndash}{\nobreakdash--}% for "pages 1\Ndash 9"
+% For "\n dimensional" ("n-dimensional"):
+\newcommand{\n}[1]{$n$\nobreakdash-\hspace{0pt}}
+\end{verbatim}
+The last example shows how to prohibit a line break\index{line break|)}
+after the hyphen but allow normal hyphenation in the following
+word. (It suffices to add a zero-width space after the hyphen.)
+
+%% ------------------------------------------------------------------ %%
+
+\section{Accents in math}
+
+In ordinary \LaTeX{} the placement of the second accent in doubled math
+accents is often poor. With the \nipkg{amsmath} package you
+will get improved placement of the second accent:
+$\hat{\hat{A}}$ (\cn{hat}|{\hat{A}}|).
+
+The commands \cn{dddot} and \cn{ddddot} are available to produce triple
+and quadruple dot accents in addition to the \cn{dot} and \cn{ddot}
+accents already available in \latex/.
+
+To get a superscripted hat or tilde character, load the \pkg{amsxtra}
+package and use \cn{sphat} or \cn{sptilde}. Usage is \verb'A\sphat'
+(note the absence of the \verb'^' character).
+
+
+To place an arbitrary symbol in math accent position, or to get under
+accents, see the \pkg{accents} package by Javier Bezos. (\nipkg{amsmath}
+must be loaded before \pkg{accents}.)
+
+%% ------------------------------------------------------------------ %%
+
+\section{Roots}
+
+In ordinary \latex/ the placement of root indices is sometimes not so
+good: $\sqrt[\beta]{k}$ (|\sqrt||[\beta]{k}|). In the
+\nipkg{amsmath} package \cn{leftroot} and \cn{uproot} allow you to adjust
+the position of the root:%
+\index{options!adjust positioning}
+\begin{verbatim}
+ \sqrt[\leftroot{-2}\uproot{2}\beta]{k}
+\end{verbatim}
+will move the beta up and to the right:
+$\sqrt[\leftroot{-2}\uproot{2}\beta]{k}$. The negative argument used
+with \cn{leftroot} moves the $\beta$ to the right. The units are a small
+amount that is a useful size for such adjustments.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Boxed formulas}
+
+The command \cn{boxed} puts a box around its
+argument, like \cn{fbox} except that the contents are in math mode:
+\begin{equation}
+\boxed{\eta \leq C(\delta(\eta) +\Lambda_M(0,\delta))}
+\end{equation}
+\begin{verbatim}
+ \boxed{\eta \leq C(\delta(\eta) +\Lambda_M(0,\delta))}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Over and under arrows}
+
+Basic \latex/ provides \cn{overrightarrow} and \cn{overleftarrow}
+commands. Some additional over and under arrow commands are provided
+by the \nipkg{amsmath} package to extend the set:
+
+\begin{tabbing}
+\qquad\=\ncn{overleftrightarrow}\qquad\=\kill
+\> \cn{overleftarrow} \> \cn{underleftarrow} \+\\
+ \cn{overrightarrow} \> \cn{underrightarrow} \\
+ \cn{overleftrightarrow}\> \cn{underleftrightarrow}
+\end{tabbing}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Extensible arrows}
+
+\cn{xleftarrow} and \cn{xrightarrow} produce
+arrows\index{arrows!extensible} that extend automatically to accommodate
+unusually wide subscripts or superscripts. These commands take one
+optional argument\index{options!behavior of particular options}
+(the subscript) and one mandatory argument (the
+superscript, possibly empty):
+\begin{equation}
+A\xleftarrow{n+\mu-1}B \xrightarrow[T]{n\pm i-1}C
+\end{equation}
+\begin{verbatim}
+ \xleftarrow{n+\mu-1}\quad \xrightarrow[T]{n\pm i-1}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Affixing symbols to other symbols}
+
+\latex/ provides \cn{stackrel} for placing a
+superscript\index{subscripts and superscripts} above a binary relation.
+In the \nipkg{amsmath} package there are somewhat more general commands,
+\cn{overset} and \cn{underset}, that can be used to place one symbol
+above or below another symbol, whether it's a relation or something
+else. The input |\overset{*}{X}| will place a superscript-size $*$ above
+the $X$: $\overset{*}{X}$; \cn{underset} is the analog for adding a
+symbol underneath.
+
+See also the description of \cn{sideset} in \secref{sideset}.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Fractions and related constructions}
+
+\subsection{The \cn{frac}, \cn{dfrac}, and \cn{tfrac} commands}
+
+The \cn{frac} command, which is in the basic command set of
+\latex/,\index{fractions|(} takes two arguments\mdash numerator and
+denominator\mdash and typesets them in normal fraction form. The
+\nipkg{amsmath} package provides also \cn{dfrac} and \cn{tfrac} as
+convenient abbreviations for |{\displaystyle\frac| |...| |}|
+and\indexcs{textstyle}\relax
+\indexcs{displaystyle} |{\textstyle\frac| |...| |}|.
+\begin{equation}
+\frac{1}{k}\log_2 c(f)\quad\tfrac{1}{k}\log_2 c(f)\quad
+\sqrt{\frac{1}{k}\log_2 c(f)}\quad\sqrt{\dfrac{1}{k}\log_2 c(f)}
+\end{equation}
+\begin{verbatim}
+\begin{equation}
+\frac{1}{k}\log_2 c(f)\;\tfrac{1}{k}\log_2 c(f)\;
+\sqrt{\frac{1}{k}\log_2 c(f)}\;\sqrt{\dfrac{1}{k}\log_2 c(f)}
+\end{equation}
+\end{verbatim}
+
+\subsection{The \cn{binom}, \cn{dbinom}, and \cn{tbinom} commands}
+
+For binomial expressions\index{binomials} such as $\binom{n}{k}$
+\nipkg{amsmath} has \cn{binom}, \cn{dbinom} and \cn{tbinom}:
+\begin{equation}
+2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}
+\end{equation}
+\begin{verbatim}
+2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}
+\end{verbatim}
+
+\subsection{The \cn{genfrac} command}
+
+The capabilities of \cn{frac}, \cn{binom}, and their variants are
+subsumed by a generalized fraction command \cn{genfrac} with six
+arguments. The last two correspond to \cn{frac}'s numerator and
+denominator; the first two are optional delimiters\index{delimiters} (as
+seen in \cn{binom}); the third is a line thickness override (\cn{binom}
+uses this to set the fraction line thickness to 0\mdash i.e., invisible);
+and the fourth argument is a mathstyle override: integer values 0\ndash 3
+select respectively \cn{displaystyle}, \cn{textstyle}, \cn{scriptstyle},
+and \cn{scriptscriptstyle}. If the third argument is left empty, the line
+thickness defaults to `normal'.
+
+\begin{center}\begin{minipage}{.85\columnwidth}
+\raggedright \normalfont\ttfamily \exhyphenpenalty10000
+\newcommand{\ma}[1]{%
+ \string{{\normalfont\itshape#1}\string}\penalty9999 \ignorespaces}
+\string\genfrac \ma{left-delim} \ma{right-delim} \ma{thickness}
+\ma{mathstyle} \ma{numerator} \ma{denominator}
+\end{minipage}\end{center}
+To illustrate, here is how \cn{frac}, \cn{tfrac}, and
+\cn{binom} might be defined.
+\begin{verbatim}
+\newcommand{\frac}[2]{\genfrac{}{}{}{}{#1}{#2}}
+\newcommand{\tfrac}[2]{\genfrac{}{}{}{1}{#1}{#2}}
+\newcommand{\binom}[2]{\genfrac{(}{)}{0pt}{}{#1}{#2}}
+\end{verbatim}
+If you find yourself repeatedly using \cn{genfrac} throughout a document
+for a particular notation, you will do yourself a favor (and your
+publisher) if you define a meaningfully-named abbreviation for that
+notation, along the lines of \cn{frac} and \cn{binom}.
+
+The primitive generalized fraction commands \cs{over}, \cs{overwithdelims},
+\cs{atop}, \cs{atopwithdelims}, \cs{above}, \cs{abovewithdelims} produce
+warning messages if used with the \nipkg{amsmath} package, for reasons
+discussed in \fn{technote.tex}.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Continued fractions}
+
+The continued fraction\index{continued fractions}
+\begin{equation}
+\cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+\cdots
+}}}
+\end{equation}
+can be obtained by typing
+{\samepage
+\begin{verbatim}
+\cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+\dotsb
+}}}
+\end{verbatim}
+}% End of \samepage
+This produces better-looking results than straightforward use of
+\cn{frac}. Left or right placement of any of the numerators is
+accomplished by using \cn{cfrac}|[l]| or \cn{cfrac}|[r]| instead of
+\cn{cfrac}.\index{options!adjust positioning}%
+\index{fractions|)}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Smash options}
+
+The command \cn{smash} is used to typeset a subformula with an
+effective height and depth of zero, which is sometimes
+useful in adjusting the subformula's position with respect to adjacent
+symbols. With the \nipkg{amsmath} package \cn{smash} has optional
+arguments\index{options!behavior of particular options}
+|[t]|\index{t option@\texttt{t} (top) option} and
+|[b]|\index{b option@\texttt{b} (bottom) option} because occasionally it is
+advantageous to be able to \qq{smash} only the top or only the bottom
+of something while retaining the natural depth or height. For example,
+when adjacent radical symbols are unevenly sized or positioned because
+of differences in the height and depth of their contents, \cn{smash}
+can be employed to make them more consistent. Compare
+$\sqrt{x}+\sqrt{y}+\sqrt{z}$ and $\sqrt{x}+\sqrt{\smash[b]{y}}+\sqrt{z}$,
+where the latter was produced by
+\verb"$\sqrt{x}" \verb"+"
+\verb"\sqrt{"\5\verb"\smash[b]{y}}" \verb"+" \verb"\sqrt{z}$".
+
+%% ------------------------------------------------------------------ %%
+
+\section{Delimiters}
+
+\index{delimiters|(}
+
+\subsection{Delimiter sizes}\label{bigdel}
+
+The automatic delimiter sizing done by \cn{left} and \cn{right} has two
+limitations: First, it is applied mechanically to produce delimiters
+large enough to encompass the largest contained item, and second, the
+range of sizes is not even approximately continuous but has fairly large
+quantum jumps. This means that a math fragment that is infinitesimally
+too large for a given delimiter size will get the next larger size, a
+jump of 3pt or so in normal-sized text. There are two or three
+situations where the delimiter size is commonly adjusted, using a set of
+commands that have `big' in their names.%
+\index{delimiters!fixed size|(}
+\begin{ctab}{l|llllll}
+Delimiter&
+ text& \ncn{left}& \ncn{bigl}& \ncn{Bigl}& \ncn{biggl}& \ncn{Biggl}\\
+size&
+ size& \ncn{right}& \ncn{bigr}& \ncn{Bigr}& \ncn{biggr}& \ncn{Biggr}\\
+\hline
+Result\vstrut{5ex}&
+ $\displaystyle(b)(\frac{c}{d})$&
+ $\displaystyle\left(b\right)\left(\frac{c}{d}\right)$&
+ $\displaystyle\bigl(b\bigr)\bigl(\frac{c}{d}\bigr)$&
+ $\displaystyle\Bigl(b\Bigr)\Bigl(\frac{c}{d}\Bigr)$&
+ $\displaystyle\biggl(b\biggr)\biggl(\frac{c}{d}\biggr)$&
+ $\displaystyle\Biggl(b\Biggr)\Biggl(\frac{c}{d}\Biggr)$
+\end{ctab}
+The first kind of situation is a cumulative operator with limits above
+and below. With \cn{left} and \cn{right} the delimiters usually turn out
+larger than necessary, and using the |Big| or |bigg|
+sizes\index{big@\cn{big}, \cn{Big}, \cn{bigg}, \dots\ delimiters}
+instead gives better results:
+\begin{equation*}
+\left[\sum_i a_i\left\lvert\sum_j x_{ij}\right\rvert^p\right]^{1/p}
+\quad\text{versus}\quad
+\biggl[\sum_i a_i\Bigl\lvert\sum_j x_{ij}\Bigr\rvert^p\biggr]^{1/p}
+\end{equation*}
+\begin{verbatim}
+\biggl[\sum_i a_i\Bigl\lvert\sum_j x_{ij}\Bigr\rvert^p\biggr]^{1/p}
+\end{verbatim}
+The second kind of situation is clustered pairs of delimiters where
+\cn{left} and \cn{right} make them all the same size (because that is
+adequate to cover the encompassed material) but what you really want
+is to make some of the delimiters slightly larger to make the nesting
+easier to see.
+\begin{equation*}
+\left((a_1 b_1) - (a_2 b_2)\right)
+\left((a_2 b_1) + (a_1 b_2)\right)
+\quad\text{versus}\quad
+\bigl((a_1 b_1) - (a_2 b_2)\bigr)
+\bigl((a_2 b_1) + (a_1 b_2)\bigr)
+\end{equation*}
+\begin{verbatim}
+\left((a_1 b_1) - (a_2 b_2)\right)
+\left((a_2 b_1) + (a_1 b_2)\right)
+\quad\text{versus}\quad
+\bigl((a_1 b_1) - (a_2 b_2)\bigr)
+\bigl((a_2 b_1) + (a_1 b_2)\bigr)
+\end{verbatim}
+The third kind of situation is a slightly oversize object in running
+text, such as $\left\lvert\frac{b'}{d'}\right\rvert$ where the
+delimiters produced by \cn{left} and \cn{right} cause too much line
+spreading. In that case \ncn{bigl} and \ncn{bigr}\index{big@\cn{big},
+\cn{Big}, \cn{bigg}, \dots\ delimiters} can be used to produce
+delimiters that are slightly larger than the base size but still able to
+fit within the normal line spacing:
+$\bigl\lvert\frac{b'}{d'}\bigr\rvert$.
+
+In ordinary \latex/ \ncn{big}, \ncn{bigg}, \ncn{Big}, and \ncn{Bigg}
+delimiters aren't scaled properly over the full range of \latex/ font
+sizes. With the \nipkg{amsmath} package they are.%
+\index{delimiters!fixed size|)}
+
+\subsection{Vertical bar notations}
+
+The \nipkg{amsmath} package provides commands \cn{lvert}, \cn{rvert},
+\cn{lVert}, \cn{rVert} (compare \cn{langle}, \cn{rangle}) to address the
+%problem of overloading for the vert bar character \qc{\|}. This
+problem of overloading for the vert bar character \qcvert. This
+character is currently used in \latex/ documents to represent a wide
+variety of mathematical objects: the `divides' relation in a
+number-theory expression like $p\vert q$, or the absolute-value
+operation $\lvert z\rvert$, or the `such that' condition in set
+notation, or the `evaluated at' notation $f_\zeta(t)\bigr\rvert_{t=0}$.
+The multiplicity of uses in itself is not so bad; what is bad, however,
+is that fact that not all of the uses take the same typographical
+treatment, and that the complex discriminatory powers of a knowledgeable
+reader cannot be replicated in computer processing of mathematical
+documents. It is recommended therefore that there should be a one-to-one
+correspondence in any given document between the vert bar character
+%\qc{\|} and a selected mathematical notation, and similarly for the
+\qcvert\ and a selected mathematical notation, and similarly for the
+%double-bar command \ncn{\|}\index{"|@\verb"*+"\"|+}. This immediately
+double-bar command \cnvert. This immediately
+rules out the use of \qc{|}
+%and \ncn{\|}\index{"|@\verb"*+"\"|+} for delimiters, because left and right
+and \cnvert\ for delimiters, because left and right
+delimiters are distinct usages that do not relate in the same way to
+adjacent symbols; recommended practice is therefore to define suitable
+commands in the document preamble for any paired-delimiter use of vert
+bar symbols:
+\begin{verbatim}
+\providecommand{\abs}[1]{\lvert#1\rvert}
+\providecommand{\norm}[1]{\lVert#1\rVert}
+\end{verbatim}
+whereupon the document would contain |\abs{z}| to produce $\lvert
+z\rvert$ and |\norm{v}| to produce $\lVert v\rVert$.
+The \pkg{mathools} provides the command \cn{DeclarePairedDelimiter}
+for defining |\abs|-like macros with scaling delimiters.
+\index{delimiters|)}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Operator names}
+
+\section{Defining new operator names}\label{s:opname}
+
+Math functions\index{operator names}\relax \index{function
+names|see{operator names}} such as $\log$, $\sin$, and $\lim$ are
+traditionally typeset in roman type to make them visually more distinct
+from one-letter math variables, which are set in math italic. The more
+common ones have predefined names, \cn{log}, \cn{sin}, \cn{lim}, and so
+forth, but new ones come up all the time in mathematical papers, so the
+\nipkg{amsmath} package provides a general mechanism for defining new
+`operator names'. To define a math function \ncn{xxx} to work like
+\cn{sin}, you write
+\begin{verbatim}
+\DeclareMathOperator{\xxx}{xxx}
+\end{verbatim}
+whereupon ensuing uses of \ncn{xxx} will produce {\upshape xxx} in the
+proper font and automatically add proper spacing\index{horizontal
+spacing!around operator names} on either side when necessary, so that you
+get $A\xxx B$ instead of $A\mathrm{xxx}B$. In the second argument of
+\cn{DeclareMathOperator} (the name text), a pseudo-text mode prevails:
+the hyphen character \qc{\-} will print as a text hyphen rather than a
+minus sign and an asterisk \qc{\*} will print as a raised text asterisk
+instead of a centered math star. (Compare
+\textit{a}-\textit{b}*\textit{c} and $a-b*c$.) But otherwise the name
+text is printed in math mode, so that you can use, e.g., subscripts and
+superscripts there.
+
+%%%%xxx%%%\enlargethispage{1\baselineskip}
+If the new operator should have subscripts and superscripts placed in
+`limits' position above and below as with $\lim$, $\sup$, or $\max$, use
+the \qc{\*} form of the \cn{DeclareMathOperator} command:
+\begin{verbatim}
+\DeclareMathOperator*{\Lim}{Lim}
+\end{verbatim}
+See also the discussion of subscript placement in
+Section~\ref{subplace}.
+
+\goodbreak
+
+The following operator names are predefined:
+
+\vspace{-1\baselineskip}
+\begin{ctab}{@{}rlrlrlrl}
+\cn{arccos}& $\arccos$ &\cn{deg}& $\deg$ & \cn{lg}& $\lg$ & \cn{projlim}& $\projlim$\\
+\cn{arcsin}& $\arcsin$ &\cn{det}& $\det$ & \cn{lim}& $\lim$ & \cn{sec}& $\sec$\\
+\cn{arctan}& $\arctan$ &\cn{dim}& $\dim$ & \cn{liminf}& $\liminf$ &\cn{sin}& $\sin$\\
+\cn{arg}& $\arg$ & \cn{exp}& $\exp$ & \cn{limsup}& $\limsup$ &\cn{sinh}& $\sinh$\\
+\cn{cos}& $\cos$ & \cn{gcd}& $\gcd$ & \cn{ln}& $\ln$ & \cn{sup}& $\sup$\\
+\cn{cosh}& $\cosh$ & \cn{hom}& $\hom$ & \cn{log}& $\log$ & \cn{tan}& $\tan$\\
+\cn{cot}& $\cot$ & \cn{inf}& $\inf$ & \cn{max}& $\max$ & \cn{tanh}& $\tanh$\\
+\cn{coth}& $\coth$ & \cn{injlim}& $\injlim$ &\cn{min}& $\min$\\
+\cn{csc}& $\csc$ & \cn{ker}& $\ker$ & \cn{Pr}& $\Pr$
+\end{ctab}
+\par\nobreak
+\vspace{-1.2\baselineskip}
+\begin{ctab}{rlrl}
+\cn{varinjlim}& $\displaystyle\varinjlim$&
+\cn{varliminf}& $\displaystyle\varliminf$\\
+\cn{varprojlim}& $\displaystyle\varprojlim$&
+\cn{varlimsup}& $\displaystyle\varlimsup$
+\end{ctab}
+
+There is also a command \cn{operatorname} such that using
+\begin{verbatim}
+\operatorname{abc}
+\end{verbatim}
+in a math formula is equivalent to a use of \ncn{abc} defined by
+\cn{DeclareMathOperator}. This may be occasionally useful for
+constructing more complex notation or other purposes. (Use the variant
+\cn{operatorname*} to get limits.)
+
+%% ------------------------------------------------------------------ %%
+
+\section{\cn{mod} and its relatives}
+
+Commands \cn{mod}, \cn{bmod}, \cn{pmod}, \cn{pod} are provided to deal
+with the special spacing conventions of \qq{mod} notation. \cn{bmod} and
+\cn{pmod} are available in \latex/, but with the \nipkg{amsmath} package
+the spacing of \cn{pmod} will adjust to a smaller value if it's used in
+a non-display-mode formula. \cn{mod} and \cn{pod} are variants of
+\cn{pmod} preferred by some authors; \cn{mod} omits the parentheses,
+whereas \cn{pod} omits the \qq{mod} and retains the parentheses.
+\begin{equation}
+\gcd(n,m\bmod n);\quad x\equiv y\pmod b;
+\quad x\equiv y\mod c;\quad x\equiv y\pod d
+\end{equation}
+\begin{verbatim}
+\gcd(n,m\bmod n);\quad x\equiv y\pmod b;
+\quad x\equiv y\mod c;\quad x\equiv y\pod d
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\enlargethispage{1\baselineskip}
+
+\chapter{The \cn{text} command}\label{text}
+
+The main use of the command \cn{text} is for words or
+phrases\index{text fragments inside math} in a display. It is very
+similar to the \latex/ command \cn{mbox} in its effects, but has a
+couple of advantages. If you want a word or phrase of text in a
+subscript, you can type |..._{\textrm{word or phrase}}|, which is slightly
+easier than the \cn{mbox} equivalent: |..._{\mbox{\rmfamily\scriptsize| |word|
+|or| |phrase}}|. Note that the standard \cn{textrm} command will use the
+\nipkg{amsmath} \cn{text} definition, but ensure the \verb+\rmfamily+
+font is used.
+\begin{equation}
+f_{[x_{i-1},x_i]} \text{ is monotonic,}
+\quad i = 1,\dots,c+1
+\end{equation}
+\begin{verbatim}
+f_{[x_{i-1},x_i]} \text{ is monotonic,}
+\quad i = 1,\dots,c+1
+\end{verbatim}
+
+The font used for \cn{text} is the same as that of the surrounding
+environment; i.e., within a theorem, the contents of \cn{text} will
+be set in italic.
+
+If a math expression is included in a \cn{text} string, it must be
+explicitly marked as math (|$...$|).
+\[
+\partial_s f(x) = \frac{\partial}{\partial x_0} f(x)\quad
+ \text{for $x= x_0 + I x_1$.}
+\]
+\begin{verbatim}
+\partial_s f(x) = \frac{\partial}{\partial x_0} f(x)\quad
+ \text{for $x= x_0 + I x_1$.}
+\end{verbatim}
+
+Function names should \emph{not} be entered as \cn{text}. Instead,
+use \cn{mathrm} or \cn{DeclareMathOperator} as appropriate. These are
+fixed entities that should not change depending on outside content
+(such as appearing within a theorem that is set in italic), and in the
+case of declared operators, proper spacing\index{horizontal
+spacing!around operator names} is applied automatically.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Integrals and sums}
+
+\section{Multiline subscripts and superscripts}
+
+The \cn{substack} command can be used to produce a multiline subscript
+or superscript:\index{subscripts and superscripts!multiline}\relax
+\index{superscripts|see{subscripts and superscripts}} for example
+\begin{ctab}{ll}
+\begin{minipage}[t]{.6\columnwidth}
+\begin{verbatim}
+\sum_{\substack{
+ 0\le i\le m\\
+ 0<j<n}}
+ P(i,j)
+\end{verbatim}
+\end{minipage}
+&
+$\displaystyle
+\sum_{\substack{0\le i\le m\\ 0<j<n}} P(i,j)$
+\end{ctab}
+A slightly more generalized form is the \env{subarray} environment which
+allows you to specify that each line should be left-aligned instead of
+centered, as here:
+\begin{ctab}{ll}
+\begin{minipage}[t]{.6\columnwidth}
+\begin{verbatim}
+\sum_{\begin{subarray}{l}
+ i\in\Lambda\\ 0<j<n
+ \end{subarray}}
+ P(i,j)
+\end{verbatim}
+\end{minipage}
+&
+$\displaystyle
+ \sum_{\begin{subarray}{l}
+ i\in \Lambda\\ 0<j<n
+ \end{subarray}}
+ P(i,j)$
+\end{ctab}
+
+%% ------------------------------------------------------------------ %%
+
+\section{The \cn{sideset} command}\label{sideset}
+
+There's also a command called \cn{sideset}, for a rather special
+purpose: putting symbols at the subscript and
+superscript\index{subscripts and superscripts!on sums} corners of a
+large operator symbol such as $\sum$ or $\prod$. \emph{Note: this
+command is not designed to be applied to anything other than sum-class
+symbols.} The prime
+example is the case when you want to put a prime on a sum symbol. If
+there are no limits above or below the sum, you could just use
+\cn{nolimits}: here's
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+|\sum\nolimits' E_n| in display mode:
+\begin{equation}
+\sum\nolimits' E_n
+\end{equation}
+If, however, you want not only the prime but also something below or
+above the sum symbol, it's not so easy\mdash indeed, without
+\cn{sideset}, it would be downright difficult. With \cn{sideset}, you
+can write
+\begin{ctab}{ll}
+\begin{minipage}[t]{.6\columnwidth}
+\begin{verbatim}
+\sideset{}{'}
+ \sum_{n<k,\;\text{$n$ odd}} nE_n
+\end{verbatim}
+\end{minipage}
+&$\displaystyle
+\sideset{}{'}\sum_{n<k,\;\text{$n$ odd}} nE_n
+$
+\end{ctab}
+The extra pair of empty braces is explained by the fact that
+\cn{sideset} has the capability of putting an extra symbol or symbols at
+each corner of a large operator; to put an asterisk at each corner of a
+product symbol, you would type
+\begin{ctab}{ll}
+\begin{minipage}[t]{.6\columnwidth}
+\begin{verbatim}
+\sideset{_*^*}{_*^*}\prod
+\end{verbatim}
+\end{minipage}
+&$\displaystyle
+\sideset{_*^*}{_*^*}\prod
+$
+\end{ctab}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Placement of subscripts and limits}\label{subplace}
+
+The default positioning for subscripts depends on the
+base symbol involved. The default for sum-class symbols is
+`displaylimits' positioning: When a sum-class symbol appears
+in a displayed formula, subscript and superscript are placed in `limits'
+position above and below, but in an inline formula, they are placed to
+the side, to avoid unsightly and wasteful spreading of the
+surrounding text lines.
+The default for integral-class symbols is to have sub- and
+superscripts always to the side, even in displayed formulas.
+(See the discussion of the \opt{intlimits} and related
+options\index{options!behavior of particular options} in
+Section~\ref{options}.)
+
+Operator names such as $\sin$ or $\lim$ may have either `displaylimits'
+or `limits' positioning depending on how they were defined. The standard
+operator names are defined according to normal mathematical usage.
+
+The commands \cn{limits} and \cn{nolimits} can be used to override the
+normal behavior of a base symbol:
+\begin{equation*}
+\sum\nolimits_X,\qquad \iint\limits_{A},
+\qquad\varliminf\nolimits_{n\to \infty}
+\end{equation*}
+To define a command whose subscripts follow the
+same `displaylimits' behavior as \cn{sum}, put
+\cn{displaylimits} at the tail end of the definition. When multiple
+instances of \cn{limits}, \cn{nolimits}, or \cn{displaylimits} occur
+consecutively, the last one takes precedence.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Multiple integral signs}
+
+\cn{iint}, \cn{iiint}, and \cn{iiiint} give multiple integral
+signs\index{integrals!multiple} with the spacing between them nicely
+adjusted, in both text and display style. \cn{idotsint} is an extension
+of the same idea that gives two integral signs with dots between them.
+\begin{gather}
+\iint\limits_A f(x,y)\,dx\,dy\qquad\iiint\limits_A
+f(x,y,z)\,dx\,dy\,dz\\
+\iiiint\limits_A
+f(w,x,y,z)\,dw\,dx\,dy\,dz\qquad\idotsint\limits_A f(x_1,\dots,x_k)
+\end{gather}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Commutative diagrams}\label{s:commdiag}
+\index{commutative diagrams}
+
+Some commutative diagram commands like the ones in \amstex/ are
+available as a separate package, \pkg{amscd}. For complex commutative
+diagrams authors will need to turn to more comprehensive packages like
+\tikz/\index{TikZ@\tikz/ package} (in particular, \pkg{tikz-cd})
+or \xypic/\index{XY-pic@\xypic/ package},
+but for simple diagrams without diagonal
+arrows\index{arrows!in commutative diagrams} the \pkg{amscd} commands
+may be more convenient. Here is one example.
+\begin{equation*}
+\begin{CD}
+S^{\mathcal{W}_\Lambda}\otimes T @>j>> T\\
+@VVV @VV{\End P}V\\
+(S\otimes T)/I @= (Z\otimes T)/J
+\end{CD}
+\end{equation*}
+\begin{verbatim}
+\begin{CD}
+S^{\mathcal{W}_\Lambda}\otimes T @>j>> T\\
+@VVV @VV{\End P}V\\
+(S\otimes T)/I @= (Z\otimes T)/J
+\end{CD}
+\end{verbatim}
+In the \env{CD} environment the commands |@>>>|,
+|@<<<|, |@VVV|, and |@AAA| give respectively right, left, down, and up
+arrows. For the horizontal arrows, material between the first and second
+|>| or |<| symbols will be typeset as a superscript, and material
+between the second and third will be typeset as a subscript. Similarly,
+material between the first and second or second and third |A|s or |V|s
+of vertical arrows will be typeset as left or right \qq{sidescripts}.
+The commands |@=| and \verb'@|' give horizontal and vertical double lines.
+A \qq{null arrow} command |@.| can be used instead of a visible arrow
+to fill out an array where needed.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Using math fonts}
+
+\section{Introduction}
+
+For more comprehensive information on font use in \latex/, see the
+\latex/ font guide (\fn{fntguide.tex}) or \booktitle{The \latex/
+Companion} \cite{tlc2}. The basic set of math font commands\index{math
+fonts}\relax \index{math symbols|see{math fonts}} in \latex/ includes
+\cn{mathbf}, \cn{mathrm}, \cn{mathcal}, \cn{mathsf}, \cn{mathtt},
+\cn{mathit}. Additional math alphabet commands such as
+\cn{mathbb} for blackboard bold, \cn{mathfrak} for Fraktur, and
+\cn{mathscr} for Euler script are available through the packages
+\pkg{amsfonts} and \pkg{euscript} (distributed separately).
+
+%% ------------------------------------------------------------------ %%
+\enlargethispage{1\baselineskip}
+
+\section{Recommended use of math font commands}
+
+If you find yourself employing math font commands frequently in your
+document, you might wish that they had shorter names, such as \ncn{mb}
+instead of \cn{mathbf}. Of course, there is nothing to keep you from
+providing such abbreviations for yourself by suitable \cn{newcommand}
+statements. But for \latex/ to provide shorter names would actually be a
+disservice to authors, as that would obscure a much better alternative:
+defining custom command names derived from the names of the underlying
+mathematical objects, rather than from the names of the fonts used to
+distinguish the objects. For example, if you are using bold to indicate
+vectors, then you will be better served in the long run if you define a
+`vector' command instead of a `math-bold' command:
+\begin{verbatim}
+ \newcommand{\vect}[1]{\mathbf{#1}}
+\end{verbatim}
+you can write |\vect{a} + \vect{b}| to produce $\vect{a} +
+\vect{b}$.
+If you decide several months down the road that you want to use the bold
+font for some other purpose, and mark vectors by a small over-arrow
+instead, then you can put the change into effect merely by changing the
+definition of \ncn{vect}; otherwise you would have to replace all
+occurrences of \cn{mathbf} throughout your document, perhaps even
+needing to inspect each one to see whether it is indeed
+an instance of a vector.
+
+It can also be useful to assign distinct
+command names for different letters of a particular font:
+\begin{verbatim}
+\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}% or use amsfonts package
+\DeclareMathSymbol{\C}{\mathalpha}{AMSb}{"43}
+\DeclareMathSymbol{\R}{\mathalpha}{AMSb}{"52}
+\end{verbatim}
+These statements would define the commands \cn{C} and \cn{R} to produce
+blackboard-bold letters from the `AMSb' math symbols font. If you refer
+often to the\break complex numbers or real numbers in your document, you
+might find this method more convenient than (let's say) defining a
+\ncn{field} command and writing\break |\field{C}|, |\field{R}|. But for
+maximum flexibility and control, define such a \ncn{field} command and
+then define \ncn{C} and \ncn{R} in terms of that
+command:\indexcs{mathbb}
+\begin{verbatim}
+\usepackage{amsfonts}% to get the \mathbb alphabet
+\newcommand{\field}[1]{\mathbb{#1}}
+\newcommand{\C}{\field{C}}
+\newcommand{\R}{\field{R}}
+\end{verbatim}
+
+%% ------------------------------------------------------------------ %%
+\enlargethispage{3\baselineskip}
+
+\section{Bold math symbols}
+
+The \cn{mathbf} command is commonly used to obtain bold Latin letters in
+math, but for most other kinds of math symbols it has no effect, or its
+effects depend unreliably on the set of math fonts that are in use. For
+example, writing
+\begin{verbatim}
+\Delta \mathbf{\Delta}\mathbf{+}\delta \mathbf{\delta}
+\end{verbatim}
+produces $\Delta \mathbf{\Delta}\mathbf{+}\delta
+\mathbf{\delta}$; the \cn{mathbf} has no effect on the plus
+sign or the small delta.
+% should be paragraph break; avoid overfull box on next line
+The \nipkg{amsmath} package therefore provides two additional commands,
+\cn{boldsymbol} and \cn{pmb}, that can be applied to other kinds of math
+symbols. \cn{boldsymbol} can be used for a math symbol that remains
+unaffected by \cn{mathbf} if (and only if) your current math font set
+includes a bold version of that symbol. \cn{pmb} can be used as a last
+resort for any math symbols that do not have a true bold version
+provided by your set of math fonts; \qq{pmb} stands for \qq{poor man's
+bold} and the command works by typesetting multiple copies of the symbol
+with slight offsets. The quality of the output is inferior, especially
+for symbols that contain any hairline strokes. When the standard default set of
+\latex/ math fonts are in use (Computer Modern), the only symbols that
+are likely to require \cn{pmb} are large operator symbols like \cn{sum},
+extended delimiter\index{delimiters} symbols, or the extra math symbols
+provided by the \pkg{amssymb} package \cite{amsfonts}.
+
+The following formula shows some of the results that are possible:
+\begin{verbatim}
+A_\infty + \pi A_0
+\sim \mathbf{A}_{\boldsymbol{\infty}} \boldsymbol{+}
+ \boldsymbol{\pi} \mathbf{A}_{\boldsymbol{0}}
+\sim\pmb{A}_{\pmb{\infty}} \pmb{+}\pmb{\pi} \pmb{A}_{\pmb{0}}
+\end{verbatim}
+\begin{equation*}
+A_\infty + \pi A_0
+\sim \mathbf{A}_{\boldsymbol{\infty}} \boldsymbol{+}
+ \boldsymbol{\pi} \mathbf{A}_{\boldsymbol{0}}
+\sim\pmb{A}_{\pmb{\infty}} \pmb{+}\pmb{\pi} \pmb{A}_{\pmb{0}}
+\end{equation*}
+If you want to use only the \cn{boldsymbol} command without loading the
+whole \nipkg{amsmath} package, the \pkg{bm} package is recommended (this
+is a standard \latex/ package, not an AMS package; you probably have it
+already if you have a 1997 or newer version of \latex/).
+
+%% ------------------------------------------------------------------ %%
+
+\section{Italic Greek letters}
+
+For italic versions of the capital Greek letters, the following commands
+are provided:
+\begin{ctab}{rlrl}
+\cn{varGamma}& $\varGamma$& \cn{varSigma}& $\varSigma$\\
+\cn{varDelta}& $\varDelta$& \cn{varUpsilon}& $\varUpsilon$\\
+\cn{varTheta}& $\varTheta$& \cn{varPhi}& $\varPhi$\\
+\cn{varLambda}& $\varLambda$& \cn{varPsi}& $\varPsi$\\
+\cn{varXi}& $\varXi$& \cn{varOmega}& $\varOmega$\\
+\cn{varPi}& $\varPi$
+\end{ctab}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Error messages and output problems}
+
+\section{General remarks}
+
+This is a supplement to Chapter~8 of the \latex/ manual \cite{lamport}
+(first edition: Chapter~6). Appendix~B of the
+\textit{Companion}~\cite{tlc2} lists all \latex/ errors including those
+for \nipkg{amsmath} with likely causes for each. For the reader's
+convenience, the set of error messages discussed here overlaps
+somewhat with the set in those references,
+but please be aware that we don't provide exhaustive coverage here.
+The error messages are arranged in alphabetical order, disregarding
+unimportant text such as |! LaTeX Error:| at the beginning, and
+nonalphabetical characters such as \qc{\\}. Where examples are given, we
+show also the help messages that appear on screen when you respond to an
+error message prompt by entering |h|.
+
+Remember that the important error message is the first for a given line.
+When running in nonstop mode, errors accumulate, and the first error
+may create a further error condition from which it is impossible to
+recover. In such a situation processing will stop after 100~errors,
+so the reporting of genuine errors may not be complete, and it may be
+impossible to determine which reported errors are genuine and which
+are not.
+
+A final section discusses some output errors, i.e., instances where
+the printed document has something wrong but there was no \latex/
+error during typesetting.
+
+%% ------------------------------------------------------------------ %%
+%% **********
+\enlargethispage{-2\baselineskip}
+
+\section{Error messages}
+
+\begin{error}{\begin{split} won't work here.}
+\errexa
+\begin{verbatim}
+! Package amsmath Error: \begin{split} won't work here.
+ ...
+
+l.8 \begin{split}
+
+? h
+\Did you forget a preceding \begin{equation}?
+If not, perhaps the `aligned' environment is what you want.
+?
+\end{verbatim}
+\errexpl
+The \env{split} environment does not construct a stand-alone displayed
+equation; it needs to be used within some other environment such as
+\env{equation} or \env{gather}.
+
+\end{error}
+
+\begin{error}{Erroneous nesting of equation structures}
+\errexa
+\begin{verbatim}
+! Package amsmath Error: Erroneous nesting of equation structures;
+(amsmath) trying to recover with `aligned'.
+
+See the amsmath package documentation for explanation.
+Type H <return> for immediate help.
+ ...
+
+l.260 \end{alignat*}
+ \end{equation*}
+\end{verbatim}
+\errexpl
+The structures \env{align}, \env{alignat}, etc., are designed
+for top-level use and for the most part cannot be nested inside some
+other displayed equation structure. The chief exception is that
+\env{align} and most of its variants can be used inside the
+\env{gather} environment.
+\end{error}
+
+\begin{error}{Extra & on this line}
+\errexa
+\begin{verbatim}
+! Package amsmath Error: Extra & on this line.
+
+See the amsmath package documentation for explanation.
+Type H <return> for immediate help.
+ ...
+
+l.9 \end{alignat}
+
+? h
+\An extra & here is so disastrous that you should probably exit
+ and fix things up.
+?
+\end{verbatim}
+\errexpl
+In an \env{alignat} structure the number of alignment points per line
+is dictated by the numeric argument given after |\begin{alignat}|.
+If you use more alignment points in a line it is assumed that you
+accidentally left out a newline command \cn{\\} and the above error is
+issued.
+\end{error}
+
+%% **********
+\enlargethispage{1.5\baselineskip}
+
+\begin{error}{Font OMX/cmex/m/n/7=cmex7 not loadable ...}
+\errexa
+\begin{verbatim}
+! Font OMX/cmex/m/n/7=cmex7 not loadable: Metric (TFM) file not found.
+<to be read again>
+ relax
+l.8 $a
+ b+b^2$
+? h
+I wasn't able to read the size data for this font,
+so I will ignore the font specification.
+[Wizards can fix TFM files using TFtoPL/PLtoTF.]
+You might try inserting a different font spec;
+e.g., type `I\font<same font id>=<substitute font name>'.
+?
+\end{verbatim}
+\errexpl
+Certain extra sizes of some Computer Modern fonts that were formerly
+available mainly through the AMSFonts\index{amsfont@AMSFonts collection}
+distribution are considered part of standard \latex/ (as of June 1994):
+\fn{cmex7}\ndash \texttt{9}, \fn{cmmib5}\ndash \texttt{9}, and
+\fn{cmbsy5}\ndash \texttt{9}. If these extra sizes are missing on your
+system, you should try first to get them from the source where you
+obtained \latex/. If that fails, you could try getting the fonts from
+CTAN (e.g., in the form of Metafont\index{Metafont source files} source
+files, directory \nfn{/tex-archive/fonts/latex/mf}, or in PostScript
+Type 1 format, directory
+\nfn{/tex-archive/fonts/cm/ps-type1/bakoma}\index{BaKoMa fonts}\relax
+\index{PostScript fonts}).
+
+If the font name begins with \fn{cmex}, there is a special option%
+\index{options!behavior of particular options}
+\opt{cmex10} for the \nipkg{amsmath} package that provides a temporary
+workaround. I.e., change the \cn{usepackage} to
+\begin{verbatim}
+\usepackage[cmex10]{amsmath}
+\end{verbatim}
+This will force the use of the 10-point size of the \fn{cmex} font in
+all cases. Depending on the contents of your document this may be
+adequate.
+\end{error}
+
+\enlargethispage{1\baselineskip}
+\begin{error}{Improper argument for math accent}
+\errexa
+\begin{verbatim}
+! Package amsmath Error: Improper argument for math accent:
+(amsmath) Extra braces must be added to
+(amsmath) prevent wrong output.
+
+See the amsmath package documentation for explanation.
+Type H <return> for immediate help.
+ ...
+
+l.415 \tilde k_{\lambda_j} = P_{\tilde \mathcal
+ {M}}
+?
+\end{verbatim}
+\errexpl
+Non-simple arguments for any \LaTeX{} command should be enclosed in
+braces. In this example extra braces are needed as follows:
+\begin{verbatim}
+... P_{\tilde{\mathcal{M}}}
+\end{verbatim}
+\end{error}
+
+\begin{error}{Math formula deleted: Insufficient extension fonts}
+\errexa
+\begin{verbatim}
+! Math formula deleted: Insufficient extension fonts.
+l.8 $ab+b^2$
+
+?
+\end{verbatim}
+\errexpl
+This usually follows a previous error |Font ... not loadable|; see the
+discussion of that error (above) for solutions.
+\end{error}
+
+\enlargethispage{1\baselineskip}
+\begin{error}{Missing number, treated as zero}
+\errexa
+\begin{verbatim}
+! Missing number, treated as zero.
+<to be read again>
+ a
+l.100 \end{alignat}
+
+? h
+A number should have been here; I inserted `0'.
+(If you can't figure out why I needed to see a number,
+look up `weird error' in the index to The TeXbook.)
+
+?
+\end{verbatim}
+\errexpl
+There are many possibilities that can lead to this error. However, one
+possibility that is relevant for the \nipkg{amsmath} package is that you
+forgot to give the number argument of an \env{alignat} environment, as
+in:
+\begin{verbatim}
+\begin{alignat}
+ a& =b& c& =d\\
+a'& =b'& c'& =d'
+\end{alignat}
+\end{verbatim}
+where the first line should read instead
+\begin{verbatim}
+\begin{alignat}{2}
+\end{verbatim}
+
+Another possibility is that you have a left bracket character |[|
+following a line break\index{line break} command \cn{\\} in a multiline
+construction such as \env{array}, \env{tabular}, or \env{eqnarray}.
+This will be interpreted by \latex/ as the beginning of an `additional
+vertical space request \cite[\S C.1.6]{lamport}, even if it occurs on the
+following line and is intended to be part of the contents. For example,
+\begin{verbatim}
+\begin{array}{c}
+a+b\\
+[f,g]\\
+m+n
+\end{array}
+\end{verbatim}
+To prevent the error message in such a case, you can
+add braces as discussed in the \latex/ manual \cite[\S C.1.1]{lamport}:
+\begin{verbatim}
+\begin{array}{c}
+a+b\\
+{[f,g]}\\
+m+n
+\end{array}
+\end{verbatim}
+or precede the bracketed expression by \cn{relax}.
+\end{error}
+
+\goodbreak
+
+\begin{error}{Missing \right. inserted}
+\errexa
+\begin{verbatim}
+! Missing \right. inserted.
+<inserted text>
+ \right .
+l.10 \end{multline}
+
+? h
+I've inserted something that you may have forgotten.
+(See the <inserted text> above.)
+With luck, this will get me unwedged. But if you
+really didn't forget anything, try typing `2' now; then
+my insertion and my current dilemma will both disappear.
+\end{verbatim}
+\errexpl
+This error typically arises when you try to insert a
+line break\index{line break} or |&|\cnamp\ between a
+\cn{left}-\cn{right} pair of delimiters\index{delimiters} in any
+multiline environment, including \env{split}.
+\begin{verbatim}
+\begin{multline}
+AAA\left(BBB\\
+ CCC\right)
+\end{multline}
+\end{verbatim}
+There are two possible solutions: (1)~instead of using \cn{left} and
+\cn{right}, use `big' delimiters\index{delimiters!fixed size} of fixed
+size (\cn{bigl} \cn{bigr} \cn{biggl} \cn{biggr} \dots; see
+\secref{bigdel}); or (2)~use null delimiters\index{delimiters!null} to
+break up the \cn{left}-\cn{right} pair into parts for each line (or cell):
+\begin{verbatim}
+AAA\left(BBB\right.\\
+ \left.CCC\right)
+\end{verbatim}
+The latter solution may result in mismatched
+delimiter\index{delimiters!mismatched sizes} sizes;
+ensuring that they match requires using \cn{vphantom} in the segment
+that has the smaller delimiter (or possibly \cn{smash} in the segment
+that has the larger delimiter). In the argument of \cn{vphantom} put a
+copy of the tallest element that occurs in the other segment, e.g.,
+\begin{verbatim}
+xxx \left(\int_t yyy\right.\\
+ \left.\vphantom{\int_t} zzz ... \right)
+\end{verbatim}
+\end{error}
+
+\goodbreak
+
+\begingroup
+\lccode`M=`M
+\lccode`@=`\}
+\lowercase{\endgroup
+\begin{error}{Missing @ inserted}}
+
+\errexa
+\begin{verbatim}
+! Missing } inserted.
+<inserted text>
+ \right .
+l.10 \end{multline}
+
+? h
+I've inserted something that you may have forgotten.
+(See the <inserted text> above.)
+With luck, this will get me unwedged. But if you
+really didn't forget anything, try typing `2' now; then
+my insertion and my current dilemma will both disappear.
+\end{verbatim}
+\errexpl
+This error is often the result of using \verb+$+ within a multiline
+display environment. Remove such \verb+$+ signs (except when they
+appear within \verb+\text{...}+).
+\end{error}
+
+\begin{error}{Old form `\pmatrix' should be \begin{pmatrix}.}
+\errexa
+\begin{verbatim}
+! Package amsmath Error: Old form `\pmatrix' should be
+ \begin{pmatrix}.
+
+See the amsmath package documentation for explanation.
+Type H <return> for immediate help.
+ ...
+
+\pmatrix ->\left (\matrix@check \pmatrix
+ \env@matrix
+l.16 \pmatrix
+ {a&b\cr c&d\cr}
+? h
+`\pmatrix{...}' is old Plain-TeX syntax whose use is
+ill-advised in LaTeX.
+?
+\end{verbatim}
+\errexpl
+When the \nipkg{amsmath} package is used, the old forms of \cn{pmatrix},
+\cn{matrix}, and \cn{cases} cannot be used any longer because of naming
+conflicts. Their syntax did not conform with standard \LaTeX{} syntax
+in any case.
+\end{error}
+
+\enlargethispage{2\baselineskip}
+\begin{error}{Paragraph ended before \xxx was complete}
+\errexa
+\begin{verbatim}
+Runaway argument?
+
+! Paragraph ended before \multline was complete.
+<to be read again>
+ \par
+l.100
+
+? h
+I suspect you've forgotten a `}', causing me to apply this
+control sequence to too much text. How can we recover?
+My plan is to forget the whole thing and hope for the best.
+?
+\end{verbatim}
+\errexpl
+This might be produced by a blank line between the |\begin| and |\end|.
+Another possibility is a misspelling in the |\end{multline}| command,
+e.g.,
+\begin{verbatim}
+\begin{multline}
+...
+\end{multiline}
+\end{verbatim}
+or by using abbreviations for certain environments, such as |\bal| and
+|\eal| for |\begin{align}| and |\end{align}|:
+\begin{verbatim}
+\bal
+...
+\eal
+\end{verbatim}
+For technical reasons that kind of abbreviation does not work with
+the more complex displayed equation environments of the \nipkg{amsmath} package
+(\env{gather}, \env{align}, \env{split}, etc.; cf.\ \fn{technote.tex}).
+\end{error}
+
+\begin{error}{Runaway argument?}
+See the discussion for the error message
+\texttt{Paragraph ended before \ncn{xxx} was complete}.
+\end{error}
+
+\begin{error}{Unknown option `xxx' for package `yyy'}
+\errexa
+\begin{verbatim}
+! LaTeX Error: Unknown option `intlim' for package `amsmath'.
+...
+? h
+The option `intlim' was not declared in package `amsmath', perhaps you
+misspelled its name. Try typing <return> to proceed.
+?
+\end{verbatim}
+\errexpl
+This means that you misspelled the option\index{options!unknown}
+name, or the package simply does not have an option that you expected
+it to have. Consult the documentation for the given package.
+\end{error}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Warning messages}
+
+\begin{error}{Cannot use `split' here}
+\errexa
+\begin{verbatim}
+Package amsmath Warning: Cannot use `split' here;
+(amsmath) trying to recover with `aligned'
+\end{verbatim}
+\errexpl The \env{split} environment is designed to serve as the entire
+body of an equation, or an entire line of an \env{align} or \env{gather}
+environment. There cannot be any printed material before or
+after it within the same enclosing structure:
+\begin{verbatim}
+\begin{equation}
+\left\{ % <-- Not allowed
+\begin{split}
+...
+\end{split}
+\right. % <-- Not allowed
+\end{equation}
+\end{verbatim}
+\end{error}
+
+\begin{error}{Foreign command \over [or \atop or \above]}
+\errexa
+\begin{verbatim}
+Package amsmath Warning: Foreign command \over; \frac or \genfrac
+(amsmath) should be used instead.
+\end{verbatim}
+\errexpl The primitive generalized fraction commands of \tex/\mdash
+\cs{over}, \cs{atop}, \cs{above}\mdash are deprecated when the
+\nipkg{amsmath} package is used because their syntax is foreign to \latex/
+and \nipkg{amsmath} provides native \latex/ equivalents. See
+\fn{technote.tex} for further information.
+\end{error}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Wrong output}
+
+\begin{erroro}{Section numbers 0.1, 5.1, 8.1 instead of 1, 2, 3}
+%
+This most likely means that you have the arguments for \cn{numberwithin}
+in reverse order:
+\begin{verbatim}
+\numberwithin{section}{equation}
+\end{verbatim}
+That means `print the section number as \textit{equation
+number}.\textit{section number} and reset to 1 every time an equation
+occurs' when what you probably wanted was the inverse
+\begin{verbatim}
+\numberwithin{equation}{section}
+\end{verbatim}
+\end{erroro}
+
+\begin{erroro}{The \cn{numberwithin} command had no effect on equation
+ numbers}
+%
+Are you looking at the first section in your document? Check the section
+numbers elsewhere to see if the problem is the one described in the
+previous item.
+\end{erroro}
+
+\begin{erroro}{Bracketed material disappears at the beginning of
+ \env{aligned} or \env{gathered}}
+%
+For most multiline equation environments, \nipkg{amsmath} disables the
+\latex/ convention to recognize a [bracketed] expression as an option%
+\index{ed env@\texttt{-ed} environments}%
+\index{options!positioning of \texttt{-ed} environments}%
+\index{options!space before \texttt{[}}
+when it occurs at the beginning of an environment or immediately
+following \cn{\\}, provided a space intervenes. This fails at the
+beginning of \env{aligned} and \env{gathered}, and is a bug. Insert
+\cn{relax} before the opening brace to restore the desired result.
+\end{erroro}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\chapter{Additional information}
+
+\section{Compatibility with other packages}
+
+Several packages have already been mentioned as providing facilities
+lacking in \nipkg{amsmath}.
+
+\begin{itemize}
+\item \pkg{bm} is recommended for specifying bold math symbols.
+\item \pkg{mathtools} provides enhancements to some \nipkg{amsmath}
+ environments as well as additional compatible features, such as
+ \env{rcases} (similar to \env{cases} but with the brace on the
+ right-hand side), \env{multlined} (a subsidiary environment
+ comparable to \env{multline}), and \cn{shortintertext} (more
+ compact spacing than \cn{intertext}). If \pkg{mathtools} is used,
+ \nipkg{amsmath} is loaded automatically, so it is not necessary
+ to load it separately.
+\item \pkg{unicode-math} provides commands for (most?)\ math symbols
+ in Unicode.
+%\item \pkg{empheq}
+\end{itemize}
+
+These packages have known problems when used with \nipkg{amsmath}.
+\begin{itemize}
+\item \pkg{lineno} may omit numbers before display environments.
+\item \pkg{breqn} redefines a number of commands from other packages,
+ so is best loaded after \nipkg{amsmath} and other packages with math
+ facilities.\\ \pkg{breqn} is not yet totally stable, and a number of
+ bugs have been reported via \texttt{tex.stackexchange} \cite{tex-sx}.
+\item \pkg{wasysym}, \pkg{mathabx} and perhaps other font packages also
+ define multiple integrals\index{integrals!multiple} using the same
+ names as \nipkg{amsmath}.
+\end{itemize}
+
+%% ------------------------------------------------------------------ %%
+
+\section{Converting existing documents}
+
+\subsection{Converting from plain \LaTeX{}}
+
+A \LaTeX{} document will typically continue to work the same in most
+respects if \verb'\usepackage{amsmath}' is added in the document
+preamble. By default, however, the \nipkg{amsmath} package suppresses page
+breaks inside multiple-line displayed equation structures such as
+\env{eqnarray}, \env{align}, and \env{gather}. To continue allowing page
+breaks inside \env{eqnarray} after switching to \nipkg{amsmath}, you will
+need to add the following line in your document preamble:
+\begin{verbatim}
+\allowdisplaybreaks[1]
+\end{verbatim}
+To ensure normal spacing around relation symbols, you might also want to
+change \env{eqnarray} to \env{align}, \env{multline}, or
+\env{equation}\slash\env{split} as appropriate.
+
+Most of the other differences in \nipkg{amsmath} usage can be considered
+optional refinements, e.g., using
+\begin{verbatim}
+\DeclareMathOperator{\Hom}{Hom}
+\end{verbatim}
+instead of \verb'\newcommand{\Hom}{\mbox{Hom}}'.
+
+\subsection{Converting from \texorpdfstring{\amslatex/}{amslatex} 1.1}
+See \fn{diffs-m.txt}.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Technical notes}
+The file \fn{technote.tex} contains some remarks on miscellaneous
+technical questions that are less likely to be of general interest.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Getting help}
+
+The \nipkg{amsmath} collection of packages is maintained by the \latex/
+team \cite{ltx-team}. Bugs should be reported using the instructions
+at \url{https://www.latex-project.org/bugs/}.
+Please be careful not to confuse \nipkg{amsmath} with the AMS document
+classes (\cls{amsart}, \cls{amsbook}, and \cls{amsproc}), which
+automatically incorporate \nipkg{amsmath}; bugs in the classes should
+be reported directly to AMS, by email to \mail{tech-support@ams.org}.
+
+%Questions or comments regarding \nipkg{amsmath} and related packages
+%should be sent to:
+%\begin{infoaddress}
+%American Mathematical Society\\
+%Technical Support\\
+%Electronic Products and Services\\
+%P. O. Box 6248\\
+%Providence, RI 02940\\[3pt]
+%Phone: 800-321-4AMS (321-4267) \quad or \quad 401-455-4080\\
+%Internet: \mail{tech-support@ams.org}
+%\end{infoaddress}
+%If you are reporting a problem you should include
+%the following information to make proper investigation possible:
+%\begin{enumerate}
+%\item The source file where the problem occurred, preferably reduced
+% to minimum size by removing any material that can be removed without
+% affecting the observed problem.
+%\item A \latex/ log file showing the error message (if applicable) and
+% the version numbers of the document class and option files being used.
+%\end{enumerate}
+
+The online forum\index{online Q\,\&\,A forum} \texttt{tex.stackexchange}
+\cite{tex-sx} is a good source of answers to common questions on usage.
+Look first in the archive to see if your question has already been asked
+and answered; if it has not, post your own question.
+
+There is an online discussion group called \fn{comp.text.tex} \cite{ctt}
+that is a fairly good source of information about \latex/ and \tex/ in
+general. This group, formerly a Unix newsgroup, predates
+\texttt{tex.stackexchange} by decades, and the archives can be a useful
+resource for historical investigation.
+
+%% ------------------------------------------------------------------ %%
+
+\section{Of possible interest}\label{a:possible-interest}
+Information about obtaining AMSFonts or other \tex/-related
+software from the AMS web server at \fn{www.ams.org}
+can be obtained by sending an email request to
+\mail{tech-support@ams.org}. This software is also posted on
+CTAN\index{CTAN (Comprehensive \TeX\ Archive Network)} and included
+in distributions based on \TeX\,Live\index{TEX Live@\TeX\,Live}.
+
+The \tex/ Users Group\index{TeX Users@\tex/ Users Group} is a nonprofit
+organization that publishes a journal
+(\journalname{TUGboat}\index{TUGboat@\journalname{TUGboat}}), holds
+meetings, and serves as a clearinghouse for general information about
+\tex/ and \tex/-related software.
+\begin{infoaddress}
+\tex/ Users Group\\
+PO Box 2311\\
+Portland, OR 97208-2311\\
+USA\\[3pt]
+Phone: +1-503-223-9994\\
+Email: \mail{office@tug.org}
+\end{infoaddress}
+Membership in the \tex/ Users Group is a good way to support continued
+development of free \tex/-related software. There are also many local
+\tex/ user groups in other countries; information about contacting a
+local user group can be gotten from the \tex/ Users Group.
+
+\index{amsmath@\texttt{amsmath} package|)}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newpage
+
+\begin{thebibliography}{10}
+\addcontentsline{toc}{chapter}{\bibname}
+
+\raggedright
+
+\bibsubhead{References in print}
+
+\bibitem{mil} George Gr\"atzer, \booktitle{More Math into \latex/}, fifth ed.,
+Springer, New York, 2016.
+% Deal with a line breaking problem
+%\begin{raggedright}
+%\bibitem{mil} G. Gr\"{a}tzer,
+%\emph{Math into \LaTeX{}: An Introduction to \LaTeX{} and AMS-\LaTeX{}}
+% \url{https://www.ams.org/cgi-bin/bookstore/bookpromo?fn=91&arg1=bookvideo&itmc=MLTEX},
+%Birkh\"{a}user, Boston, 1995.\par
+%\end{raggedright}
+
+\bibitem{kn} Donald E. Knuth, \booktitle{The \tex/book},
+Addison-Wesley, Reading, MA, 1984.
+
+\bibitem{lamport} Leslie Lamport, \booktitle{\latex/: A document preparation
+system}, 2nd revised ed., Addison-Wesley, Reading, MA, 1994.
+
+\bibitem{tlc2} Frank Mittelbach, Michel Goossens, et al.,
+\booktitle{The \latex/ companion}, second ed., Addison-Wesley, Reading,
+MA, 2004. This is now also available as an ebook, in both English and
+German; see \url{https://www.latex-project.org/help/books/}.
+The front matter, including the full Table of Contents, can be viewed
+online, from a link on the same page.
+%Michel Goossens, Frank Mittelbach, and Alexander Samarin,
+%\booktitle{The \latex/ companion}, Addison-Wesley, Reading, MA, 1994.
+% [\emph{Note: The 1994 edition is not a reliable guide for the
+% \nipkg{amsmath} package unless you refer to the errata for Chapter
+% 8\mdash file \fn{compan.err}, distributed with \LaTeX{}.}]
+
+\bibitem{msf} Frank Mittelbach and Rainer Sch\"opf,
+\textit{The new font family selection\mdash user
+interface to standard \latex/}, \journalname{TUGboat} \textbf{11},
+no.~2 (June 1990), pp.~297\ndash 305.
+
+\bibitem{jt} Michael Spivak, \booktitle{The joy of \tex/}, 2nd revised ed.,
+Amer. Math. Soc., Providence, RI, 1990.
+
+\bibsubhead{Package documentation}
+
+\bibitem{amshandbk}\booktitle{AMS author handbook}, separate versions
+for journal articles, monographs and proceedings articles, Amer. Math.
+Soc., Providence, RI, 2017;
+\url{https://www.ams.org/publications/authors/tex/author-handbook}.
+
+\bibitem{amsfonts}\booktitle{AMSFonts version \textup{2.2d}\mdash user's guide},
+Amer. Math. Soc., Providence, RI, 2002; distributed
+with the AMSFonts package
+\url{http://mirror.ctan.org/tex-archive/fonts/amsfonts/doc/amsfndoc.pdf}.
+
+\bibitem{amsthdoc}\booktitle{Using the \pkg{amsthm} Package}, version 2.20.3,
+Amer. Math. Soc., Providence, RI, 2017;
+\url{http://mirror.ctan.org/tex-archive/macros/latex/required/amscls/doc/amsthdoc.pdf}.
+
+\bibitem{mt} Morten H{\o}gholm, Lars Madsen, \booktitle{The \pkg{mathtools}
+package}, 2018;
+\url{http://mirror.ctan.org/tex-archive/macros/latex/contrib/mathtools/mathtools.pdf}.
+
+\bibsubhead{Online resources}
+
+\bibitem{ltx-team} The \latex/ Project, \url{https://www.latex-project.org}.
+
+\bibitem{ctt} Online discussion group \texttt{comp.text.tex},
+\url{https://groups.google.com/forum/\#!forum/comp.text.tex}.
+
+\bibitem{tex-sx} Online question and answer forum \texttt{tex.stackexchange},
+\url{https://tex.stackexchange.com}.
+
+\end{thebibliography}
+
+\printindex
+
+\end{document}
diff --git a/macros/latex-dev/required/amsmath/amsmath.dtx b/macros/latex-dev/required/amsmath/amsmath.dtx
new file mode 100644
index 0000000000..8671694b70
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsmath.dtx
@@ -0,0 +1,6383 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 2000, 2013 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\raggedbottom
+\let\savedarg\arg
+\usepackage{amsmath}
+\let\arg\savedarg
+\GetFileInfo{amsmath.sty}
+\begin{document}
+\title{The \pkg{amsmath} package}
+\author{Frank Mittelbach\and Rainer Sch\"opf\and Michael Downes\and
+ David M. Jones\and David Carlisle}
+\date{Version \fileversion, \filedate}
+\providecommand{\histnote}{}
+\renewenvironment{histnote}{%
+ \trivlist\item[\hspace{\labelsep}\bfseries Historical Note:]%
+}{%
+ \endtrivlist
+}
+\DocInput{amsmath.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+%
+% A \latex/ package named \pkg{amstex} was created in 1988--1989 by
+% adapting \fn{amstex.tex} for use within \latex/. The \pkg{amsmath}
+% package is the successor of the \pkg{amstex} package. It was
+% substantially overhauled to integrate it with \latex/2e, which
+% arrived on the scene in 1994. It provides more or less the same
+% features, but there are quite a few organizational differences as
+% well as some new features and bug fixes. For example, the
+% \pkg{amstex} package automatically loaded the \pkg{amsfonts}
+% package, but the \pkg{amsmath} package does not. At the present
+% time (November 1999) user-level documentation of the commands
+% provided here is found in the AMSmath Users' Guide,
+% \fn{amsldoc.tex}.
+%
+% \StopEventually{}
+%
+% Standard file identification.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must be December 1994 or later
+% \end{macrocode}
+%
+% Providing a rollback to earlier version(s)
+% \begin{macrocode}
+\providecommand\DeclareRelease[3]{}
+\providecommand\DeclareCurrentRelease[2]{}
+%
+\DeclareRelease{}{2018-12-01}{amsmath-2018-12-01.sty}
+\DeclareCurrentRelease{}{2019-04-01}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProvidesPackage{amsmath}[2019/04/01 v2.17c AMS math features]
+% \end{macrocode}
+%
+% \section{Catcode defenses}
+%
+% Some packages change the catcode of characters that are essential
+% in low-level \tex/ syntax. Any package that does so does not
+% qualify as a PWWO package (\qq{Plays Well With Others}) because it
+% can cause other packages to fail if they are loaded later. \LaTeX{}
+% is partly to blame for this because it fails to provide adequate
+% built-in safeguards in the package loading mechanisms. In the
+% absence of such safeguards, we will provide them here.
+% \begin{macrocode}
+\edef\@temp{\catcode 96=\number\catcode 96 }
+\catcode\string `\`=12
+\def\do#1{\catcode\number`#1=\number\catcode`#1}
+\edef\@temp{%
+ \noexpand\AtEndOfPackage{%
+ \@temp
+ \do\"\do\'\do\(\do\)\do\*\do\+\do\,\do\-\do\.%
+ \do\/\do\<\do\=\do\>\do\[\do\]\do\^\do\_\relax
+ }%
+}
+\@temp
+\def\do#1{\catcode\number`#1=12 }
+\do\"\do\'\do\(\do\)\do\*\do\+\do\,\do\-\do\.
+\do\/\do\<\do\=\do\>\do\[\do\]
+\catcode`\^=7 \catcode`\_=8
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Declare some options}
+%
+% Handling of limits on integrals, sums, operatornames.
+% \begin{macrocode}
+\DeclareOption{intlimits}{\let\ilimits@\displaylimits}
+\DeclareOption{nointlimits}{\let\ilimits@\nolimits}
+\DeclareOption{sumlimits}{\let\slimits@\displaylimits}
+\DeclareOption{nosumlimits}{\let\slimits@\nolimits}
+\DeclareOption{namelimits}{\PassOptionsToPackage{namelimits}{amsopn}}
+\DeclareOption{nonamelimits}{%
+ \PassOptionsToPackage{nonamelimits}{amsopn}}
+% \end{macrocode}
+%
+% The following two switches might have been defined already by the
+% documentclass, but it doesn't hurt to re-execute the \cs{newif}'s.
+% \begin{macrocode}
+\newif\ifctagsplit@
+\newif\iftagsleft@
+% \end{macrocode}
+% Right or left placement of equation numbers.
+% \begin{macrocode}
+\DeclareOption{leqno}{\tagsleft@true}
+\DeclareOption{reqno}{\tagsleft@false}
+\DeclareOption{centertags}{\ctagsplit@true}
+\DeclareOption{tbtags}{\ctagsplit@false}
+% \end{macrocode}
+%
+% The \opt{cmex10} option is an escape hatch for people who don't
+% happen to have sizes 7--9 of the \fn{cmex} fonts available to them
+% yet. (Strictly speaking they are considered part of a minimum
+% \latex/ distribution now, i.e., all \LaTeXe{} users should have
+% them, without needing to get the AMSFonts distrib.)
+% \begin{macrocode}
+\DeclareOption{cmex10}{%
+ \ifnum\cmex@opt=\@ne \def\cmex@opt{0}%
+ \else \def\cmex@opt{10}\fi
+}
+% \end{macrocode}
+% To help things work out better with various package loading orders
+% of \pkg{amsmath} and \pkg{amsfonts}, we establish a variable to
+% communicate the status of the cmex font definition. If the
+% \pkg{amsfonts} package was loaded first this variable might be
+% already defined, in which case we want to preserve its value.
+% \begin{macrocode}
+\@ifundefined{cmex@opt}{\def\cmex@opt{7}}{}
+% \end{macrocode}
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Flush-left equations [DMJ]}
+%
+% The left margin of math enviroments is controlled by
+% \cs{@mathmargin}. This can be set to \cs{@centering} to
+% implement the default behaviour, i.e., centered equations, and to
+% something else to implement the flushleft style.
+%
+% In theory, all that's needed to activate the flushleft mode
+% in the AMS document classes is something like this:
+% \begin{verbatim}
+% \DeclareOption{fleqn}{%
+% \AtBeginDocument{\@mathmargin30pt\relax}%
+% }
+% \end{verbatim}
+% (In fact, unless the document class wants to specify the
+% \cs{@mathmargin}, it doesn't need to do anything with the
+% \opt{fleqn} option.)
+% \begin{macrocode}
+\newif\if@fleqn
+%
+\newskip\@mathmargin
+\@mathmargin\@centering
+%
+\DeclareOption{fleqn}{%
+ \@fleqntrue
+ \@mathmargin = -1sp
+ \let\mathindent=\@mathmargin
+ \AtBeginDocument{%
+ \ifdim\@mathmargin= -1sp
+ \@mathmargin\leftmargini minus\leftmargini
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% DMJ: This ensures that \cs{@mathmargin} is given some sort of
+% sensible default if the class doesn't specify one, while still
+% allowing a user to override the default value in their document
+% preamble. (Incidentally, I'm initializing \cs{@mathmargin} to
+% \cs{leftmargini} for compatibility with \fn{fleqn.clo}, but I'm
+% not at all convinced that's the right thing to do.)
+%
+% The next question is what happens when amsmath is used with
+% one of the standard classes. Unfortunately, \latex/ implements
+% \opt{fleqn} somewhat clumsily; instead of paramaterizing the
+% definitions of the math structures (as I've attempted to do
+% here), \fn{fleqn.clo} declares a dimen \cn{mathindent} that is
+% much like my \cs{@mathmargin} and then redefines \cn\[, \cn\],
+% \cn{equation}, and \cn{eqnarray}. This means that things could
+% get rather messy in 2.09 compatibility mode, since \fn{fleqn.clo}
+% might be loaded after \fn{amsmath.sty}, which could cause a real
+% mess.
+%
+% [mjd,1999/07/07]: Let \cs{mathindent} = \cs{@mathmargin} as
+% envisioned by DMJ. Compatibility-mode documents will all use the
+% \pkg{amstex} package, not \pkg{amsmath}. There is a remote chance
+% of a problem if someone makes an assignment to \cs{mathindent} in a
+% way that implicitly assumes it is a dimen register (inasmuch as it
+% has now become a skip register), and the string ``plus'' follows in
+% the input stream, but if someone's document croaks in that way, I
+% think they will just have to bite the bullet and fix it. The
+% alternative is to penalize a lot of other users with a known
+% handicap.
+%
+% \section{Spacing around \cn{aligned} and \cn{gathered}}
+%
+% [dpc, 2016] Option to control the space to the left of aligned and gathered.
+%
+% Previously \cn{aligned} and \cn{gathered} inserted a thin space on
+% their left but not their right, there is no good reason for this
+% that anyone can remember, it has just always been that way
+% inherited from amstex. The usual advice to authors has been to use
+% |\!\begin{aligned}| to get better spacing.
+%
+% Here introduce:
+%
+% \opt{alignedleftspaceyes} to keep the behaviour of adding this space.
+%
+% \opt{alignedleftspaceno} to disable adding this space.
+%
+% \opt{alignedleftspaceyesifneg} the new default behaviour, do not add
+% the space unless the environment is preceded by a negative skip or
+% kern, so that |\!\begin{aligned}| works as before.
+%
+% \changes{v2.16a}{2016/11/05}{New options to control aligned spacing}
+% \begin{macrocode}
+\DeclareOption{alignedleftspaceyes}{\def\alignedspace@left{\null\,}}
+\DeclareOption{alignedleftspaceno}{\def\alignedspace@left{\null}}
+\DeclareOption{alignedleftspaceyesifneg}{%
+\def\alignedspace@left{%
+ \edef\@tempa{\expandafter\@car\the\lastskip\@nil}%
+ \if-\@tempa\null\,%
+ \else
+ \edef\@tempa{\expandafter\@car\the\lastkern\@nil}%
+ \if-\@tempa\null\,%
+ \else\null
+ \fi
+ \fi}%
+}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\DeclareOption{?}{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ExecuteOptions{%
+ nointlimits,sumlimits,namelimits,centertags,alignedleftspaceyesifneg}
+% \end{macrocode}
+% The \cs{par} after \cs{ProcessOptions} is to ensure the correct
+% line number on screen if an error occurs during option processing;
+% otherwise the lookahead for a \qc{\*} option would result in \tex/
+% showing the following line instead.
+% \begin{macrocode}
+\ProcessOptions\par
+% \end{macrocode}
+%
+% \begin{macrocode}
+\@ifpackagewith{amsmath}{?}{%
+ \typeout{^^J%
+Documentation for the amsmath package is found in amsldoc.dvi^^J%
+(or .pdf or .tex).^^J%
+^^J%
+See also https://www.ams.org/tex/amslatex.html.^^J%
+^^J%
+Note: Using the first edition of The LaTeX Companion (1994) without^^J%
+errata as a guide for amsmath use is not recommended.^^J%
+ }%
+}{%
+ \typeout{%
+For additional information on amsmath, use the \lq ?\rq\space option.%
+ }%
+}
+% \end{macrocode}
+%
+% Processing to handle the \opt{cmex10} option is a little tricky
+% because of different possible loading orders for \pkg{amsmath} and
+% \pkg{amsfonts}. The package \pkg{amsmath} sets the \cs{cmex@opt}
+% flag to 7 or 10, and the package \pkg{amsfonts} sets the flag to 1
+% or 0.
+% \begin{macrocode}
+\ifnum\cmex@opt=7 \relax
+ \DeclareFontShape{OMX}{cmex}{m}{n}{%
+ <-8>cmex7<8>cmex8<9>cmex9%
+ <10><10.95><12><14.4><17.28><20.74><24.88>cmex10%
+ }{}%
+ \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax
+\else
+ \ifnum\cmex@opt=\z@ % need to override cmex7 fontdef from amsfonts
+% \end{macrocode}
+% Force reloading of the OMX/cmex font definition file.
+% \begin{macrocode}
+ \begingroup
+ \fontencoding{OMX}\fontfamily{cmex}%
+ \expandafter\let\csname OMX+cmex\endcsname\relax
+ \try@load@fontshape
+ \endgroup
+% \end{macrocode}
+% The \fn{cmex10} font gets special preload handling in the building
+% of the \latex/ format file, need an extra bit here to work around
+% that.
+% \begin{macrocode}
+ \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax
+ \def\cmex@opt{10}%
+ \fi
+\fi
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Call some other packages}
+%
+% The \pkg{amstext} package provides the \cn{text} command. The
+% \pkg{amsbsy} package provides \cn{boldsymbol} and \cn{pmb}. (Since
+% 1997 it is usually better to use the \pkg{bm} package instead; but
+% I think we have to keep \pkg{amsbsy} here for backward
+% compatibility [mjd,1999/11/19].) The \pkg{amsopn} package provides
+% \cn{DeclareMathOperator}.
+% \begin{macrocode}
+\RequirePackage{amstext}[1995/01/25]
+\RequirePackage{amsbsy}[1995/01/20]
+\RequirePackage{amsopn}[1995/01/20]
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Miscellaneous}
+%
+% \begin{macro}{\ams@newcommand}
+% Where \pkg{stix} and \pkg{amsmath} define the same control
+% sequences, we want to avoid inadvertently overriding \pkg{stix}'s
+% definitions. If \pkg{stix} is loaded before \pkg{amsmath}, the
+% following conditional takes care of the problem. There is
+% similar code in the \pkg{stix} package in case \pkg{amsmath} is
+% loaded first.
+% \begin{macrocode}
+\@ifpackageloaded{stix}{%
+ \let\ams@newcommand\providecommand
+ \let\ams@renewcommand\providecommand
+ \let\ams@def\providecommand
+ \let\ams@DeclareRobustCommand\providecommand
+}{%
+ \let\ams@newcommand\newcommand
+ \let\ams@renewcommand\renewcommand
+ \let\ams@def\def
+ \let\ams@DeclareRobustCommand\DeclareRobustCommand
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@amsmath@err}
+% Defining this error function saves main mem.
+% \begin{macrocode}
+\def\@amsmath@err{\PackageError{amsmath}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AmS}
+% The \cs{AmS} prefix can be used to construct the combination
+% |\AmS-\LaTeX|.
+% \begin{macrocode}
+\providecommand{\AmS}{{\protect\AmSfont
+ A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
+% \end{macrocode}
+% In \cn{AmSfont} we call cmsy directly in lieu of trying to access
+% it through the math fonts setup (e.g. |\the\textfont2|) because
+% math fonts can't be relied on to be properly set up if we are not
+% inside a math formula. This means that if this command is used in a
+% document where CM fonts are not wanted, then a font substitution
+% will need to be declared, e.g.:
+% \begin{verbatim}
+% \DeclareFontShape{OMS}{cmsy}{m}{n}{ <-> sub * xxx/m/n }{}
+% \end{verbatim}
+% where |xxx| is some alternate font family.
+% Taking the first letter of \cs{f@series} will produce |b| or |m|
+% for the most common values (|b,bx,m|). It may produce nonsense for
+% more unusual values of \cs{f@series}, so for safety's sake we have
+% an additional \cs{if} test. We want to avoid setting the series to
+% |bx| because in a standard \latex/ installation the combination
+% |cmsy/bx/n| does not have a font definition, and the user
+% would get a font substitution warning on screen.
+% \begin{macrocode}
+\newcommand{\AmSfont}{%
+ \usefont{OMS}{cmsy}{\if\@xp\@car\f@series\@nil bb\else m\fi}{n}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mathmeasure}
+% The function |\@mathmeasure| takes three arguments; the third arg
+% is typeset as a math formula in an hbox, using arg |#2| as the
+% mathstyle, and the result is left in the box named by the first
+% arg. It is assumed that we are already in math mode, so we can turn
+% off |\everymath| (in particular, |\check@mathfonts|).
+%
+% As of 2018/12 release we don't turn off |\evermath| as this
+% optimization can be harmful.
+% \changes{v2.17b}{2018/12/01}{Don't drop \cs{frozen@everymath}}
+% \begin{macrocode}
+\ifx\leavevmode@ifvmode\@undefined % kernel is < 2018/12
+\def\@mathmeasure#1#2#3{\setbox#1\hbox{\frozen@everymath\@emptytoks
+ \m@th$#2#3$}}
+\else
+\def\@mathmeasure#1#2#3{\setbox#1\hbox{%
+ \m@th$#2#3$}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% The \cs{inf@bad} constant is for testing overfull boxes.
+% \begin{macrocode}
+\@ifundefined{inf@bad}{%
+ \newcount\inf@bad \inf@bad=1000000 \relax
+}{}
+% \end{macrocode}
+%
+%\subsection{Math spacing commands}
+%
+% \begin{macro}{\tmspace}
+% \begin{macro}{\,}
+% \begin{macro}{\thinspace}
+% \begin{macro}{\!}
+% \begin{macro}{\negthinspace}
+% \begin{macro}{\:}
+% \begin{macro}{\medspace}
+% \begin{macro}{\negmedspace}
+% \begin{macro}{\;}
+% \begin{macro}{\thickspace}
+% \begin{macro}{\negthickspace}
+% Here we fill in some gaps in the set of spacing commands, and make them
+% all work equally well in or out of math.
+% We want all these commands to be robust but declaring them all with
+% \cs{DeclareRobustCommand} uses up an control sequence name per
+% command; to avoid this, we define a common command \cs{tmspace}
+% (text-or-math space) which carries the robustness burden for all of
+% them. The standard \cs{relax} before the \cs{ifmmode} is not
+% necessary because of the \cs{protect} added by
+% \cs{DeclareRobustCommand}.
+% \changes{v2.17b}{2018/12/01}{Start LR-mode for \cs{thinspace} and
+% friends if necessary (github/49)}
+% \begin{macrocode}
+\ifx\leavevmode@ifvmode\@undefined
+\DeclareRobustCommand{\tmspace}[3]{%
+ \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
+\else
+\DeclareRobustCommand{\tmspace}[3]{%
+ \ifmmode\mskip#1#2\else\leavevmode@ifvmode\kern#1#3\fi\relax}
+\fi
+\renewcommand{\,}{\tmspace+\thinmuskip{.1667em}}
+\let\thinspace\,
+\renewcommand{\!}{\tmspace-\thinmuskip{.1667em}}
+\let\negthinspace\!
+\renewcommand{\:}{\tmspace+\medmuskip{.2222em}}
+\let\medspace\:
+\newcommand{\negmedspace}{\tmspace-\medmuskip{.2222em}}
+\renewcommand{\;}{\tmspace+\thickmuskip{.2777em}}
+\let\thickspace\;
+\newcommand{\negthickspace}{\tmspace-\thickmuskip{.2777em}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mspace}
+% And while we're at it, why don't we provide an equivalent of
+% \cn{hspace} for math mode use. This allows use of |mu| units in
+% (for example) constructing compound math symbols.
+% \begin{macrocode}
+\newcommand{\mspace}[1]{\mskip#1\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Vertical bar symbols}
+% \begin{macro}{\lvert}
+% \begin{macro}{\rvert}
+% \begin{macro}{\lVert}
+% \begin{macro}{\rVert}
+% Add left/right specific versions of \cn{vert}, \cn{Vert}. Don't
+% assume the delimiter codes are the CM defaults.
+% \begin{macrocode}
+\def\@tempa#1#2\@nil{%
+ \ifx\delimiter#1\@tempcnta#2\relax\else\@tempcnta\z@\fi
+}
+\@xp\@tempa\vert\@empty\@nil
+\ifnum\@tempcnta>\z@
+ \advance\@tempcnta "4000000
+ \xdef\lvert{\delimiter\number\@tempcnta\space }
+ \advance\@tempcnta "1000000
+ \xdef\rvert{\delimiter\number\@tempcnta\space }
+\else
+ \ifx\@@undefined\lvert
+ % Fall back to cmex encoding since we don't know what else to do.
+ \DeclareMathDelimiter{\lvert}
+ {\mathopen}{symbols}{"6A}{largesymbols}{"0C}
+ \DeclareMathDelimiter{\rvert}
+ {\mathclose}{symbols}{"6A}{largesymbols}{"0C}
+ \fi
+\fi
+\@xp\@tempa\Vert\@empty\@nil
+\ifnum\@tempcnta>\z@
+ \advance\@tempcnta "4000000
+ \xdef\lVert{\delimiter\number\@tempcnta\space }
+ \advance\@tempcnta "1000000
+ \xdef\rVert{\delimiter\number\@tempcnta\space }
+\else
+ \ifx\@@undefined\lVert
+ \DeclareMathDelimiter{\lVert}
+ {\mathopen}{symbols}{"6B}{largesymbols}{"0D}
+ \DeclareMathDelimiter{\rVert}
+ {\mathclose}{symbols}{"6B}{largesymbols}{"0D}
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Fractions}
+% Bury the generalized fraction primitives \cs{over}, \cs{atop},
+% etc., because of their bizarre syntax, which is decidedly out of
+% place in a \latex/ document.
+% \begin{macrocode}
+\@saveprimitive\over\@@over
+\@saveprimitive\atop\@@atop
+\@saveprimitive\above\@@above
+\@saveprimitive\overwithdelims\@@overwithdelims
+\@saveprimitive\atopwithdelims\@@atopwithdelims
+\@saveprimitive\abovewithdelims\@@abovewithdelims
+% \end{macrocode}
+%
+% \begin{macro}{\primfrac}
+% If someone insists on using \cs{over}, give a warning the first
+% time and then resurrect the old definition. Laissez-faire policy.
+% \begin{macrocode}
+\DeclareRobustCommand{\primfrac}[1]{%
+ \PackageWarning{amsmath}{%
+Foreign command \@backslashchar#1;\MessageBreak
+\protect\frac\space or \protect\genfrac\space should be used instead%
+\MessageBreak
+ }
+ \global\@xp\let\csname#1\@xp\endcsname\csname @@#1\endcsname
+ \csname#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\renewcommand{\over}{\primfrac{over}}
+\renewcommand{\atop}{\primfrac{atop}}
+\renewcommand{\above}{\primfrac{above}}
+\renewcommand{\overwithdelims}{\primfrac{overwithdelims}}
+\renewcommand{\atopwithdelims}{\primfrac{atopwithdelims}}
+\renewcommand{\abovewithdelims}{\primfrac{abovewithdelims}}
+% \end{macrocode}
+%
+% \cn{frac} calls \cn{@@over} directly instead of via \cn{genfrac}, for
+% better speed because it is so common. \cn{tfrac} and \cn{dfrac} are
+% abbreviations for some commonly needed mathstyle overrides. To
+% conserve csnames we avoid making \cn{dfrac} and \cn{tfrac} robust
+% (\cn{genfrac} is itself robust).
+% \begin{macrocode}
+\DeclareRobustCommand{\frac}[2]{{\begingroup#1\endgroup\@@over#2}}
+\newcommand{\dfrac}{\genfrac{}{}{}0}
+\newcommand{\tfrac}{\genfrac{}{}{}1}
+% \end{macrocode}
+% The \cn{binom} command for binomial notation works like \cn{frac}
+% and has similar variants. Note that we do not use \cs{z@} in
+% \cn{dbinom} and \cn{tbinom} because they are not top-level robust
+% like \cn{binom}, and so the \cs{z@} with the potentially
+% problematic \qc{\@} character would become visible when writing one
+% of those commands to a \fn{.toc} file.
+% \begin{macrocode}
+\DeclareRobustCommand{\binom}{\genfrac()\z@{}}
+\newcommand{\dbinom}{\genfrac(){0pt}0}
+\newcommand{\tbinom}{\genfrac(){0pt}1}
+% \end{macrocode}
+%
+% \begin{macro}{\genfrac}
+% \changes{v2.16a}{2016/11/05}{New genfrac implementation for extended
+% TeXs}
+% This command provides access to \tex/'s generalized fraction
+% primitives. Args: \arg{1} left delim, \arg{2} right delim, \arg{3}
+% line thickness, \arg{4} mathstyle override, \arg{5} numerator,
+% \arg{6} denominator. But we only read the first four args at first,
+% in order to give us a moment to select the proper generalized
+% fraction primitive. Any of those four args could be empty, and when
+% empty the obvious defaults are selected (no delimiters, default
+% line thickness (normally .4pt), and no mathstyle override).
+%
+% the |withdelims| primitives do not work in xetex with OpenType
+% fonts, and the relevant font dimen parameters are often not set
+% in luatex as theer are no matching values in the OpenType Math
+% table, so here we use variants that use the font parameters if
+% they are set, but scale using |\left\right| rather than the
+% |withdelims| primitives.
+%
+% \begin{macrocode}
+\ifx\directlua\@undefined
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ifx\XeTeXcharclass\@undefined
+% \end{macrocode}
+% Classic version
+% \begin{macrocode}
+\DeclareRobustCommand{\genfrac}[4]{%
+ \def\@tempa{#1#2}%
+ \edef\@tempb{\@nx\@genfrac\@mathstyle{#4}%
+ \csname @@\ifx @#3@over\else above\fi
+ \ifx\@tempa\@empty \else withdelims\fi\endcsname}
+ \@tempb{#1#2#3}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% XeTeX version
+% \begin{macrocode}
+\def\genfrac@rule#1#2#3#4{%
+\hbox{$\left#1\vcenter{\hrule \@width\z@
+ \@height
+ \ifdim\fontdimen#2#3\tw@=\z@
+ #4\fontdimen6#3\tw@
+ \else
+ \fontdimen#2#3\tw@
+ \fi
+ }\right.$}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\genfrac@choice#1#2{%
+\ifx @#2@\else
+% \end{macrocode}
+% \changes{v2.17a}{2017/09/02}{move \cs{nulldelimiterspace} correction}
+% \begin{macrocode}
+\ifx c#1\kern-\nulldelimiterspace\fi
+{\delimitershortfall\z@\delimiterfactor\@m
+ \mathsurround\z@\nulldelimiterspace\z@
+\mathchoice
+{\genfrac@rule{#2}{20}\textfont{2.39}}%
+{\genfrac@rule{#2}{21}\textfont{1}}%
+{\genfrac@rule{#2}{21}\scriptfont{1.45}}%
+{\genfrac@rule{#2}{21}\scriptscriptfont{1.35}}%
+}%
+\ifx o#1\kern-\nulldelimiterspace\fi
+\fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand{\genfrac}[6]{{%
+\@mathstyle{#4}%
+\genfrac@choice o{#1}%
+{\begingroup#5\endgroup\ifx @#3@\@@over\else\@@above\fi#3\relax#6}%
+\genfrac@choice c{#2}%
+}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+\else
+% \end{macrocode}
+% LuaTeX version
+% \begin{macrocode}
+\def\genfrac@rule#1#2#3{%
+\hbox{$\left#1\vcenter{\hrule \@width\z@
+ \@height
+ \ifdim\Umathfractiondelsize#2=\z@
+ #3\fontdimen6#3\tw@
+ \else
+ \Umathfractiondelsize#2%
+ \fi
+ }\right.$}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\genfrac@choice#1#2{%
+\ifx @#2@\else
+% \end{macrocode}
+% \changes{v2.17a}{2017/09/02}{move \cs{nulldelimiterspace} correction}
+% \begin{macrocode}
+\ifx c#1\kern-\nulldelimiterspace\fi
+{\delimitershortfall\z@\delimiterfactor\@m
+ \mathsurround\z@\nulldelimiterspace\z@
+\mathchoice
+{\genfrac@rule{#2}\displaystyle{2.39}}%
+{\genfrac@rule{#2}\textstyle{1}}%
+{\genfrac@rule{#2}\scriptstyle{1.45}}%
+{\genfrac@rule{#2}\scriptscriptstyle{1.35}}%
+}%
+\ifx o#1\kern-\nulldelimiterspace\fi
+\fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareRobustCommand{\genfrac}[6]{{%
+\@mathstyle{#4}%
+\genfrac@choice o{#1}%
+{\begingroup#5\endgroup\ifx @#3@\@@over\else\@@above\fi#3\relax#6}%
+\genfrac@choice c{#2}%
+}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% End of test for Lua\TeX/Xe\TeX.
+%
+% \cs{@genfrac} takes the preceding arguments and reads the
+% numerator and denominator. Note that there's no convenient way to
+% make the numerator and denominator \emph{contents}
+% displaystyle, through this interface.
+%
+% Args: \arg{1} mathstyle, \arg{2} fraction primitive,
+% \arg{3} delimiters and rule thickness,
+% \arg{4} numerator, \arg{5} denominator.
+% \begin{macrocode}
+\def\@genfrac#1#2#3#4#5{{#1{\begingroup#4\endgroup#2#3\relax#5}}}
+% \end{macrocode}
+% \end{macro}
+%
+% Empty mathstyle arg: no change; 0 = displaystyle, 1 = textstyle, 2
+% = scriptstyle, 3 = scriptscriptstyle.
+% \begin{macrocode}
+\def\@mathstyle#1{%
+ \ifx\@empty#1\@empty\relax
+ \else\ifcase#1\displaystyle % case 0
+ \or\textstyle\or\scriptstyle\else\scriptscriptstyle\fi\fi}
+% \end{macrocode}
+%
+% \subsection{Sums and Integrals}
+% Default value for sum limits is \cs{displaylimits}, see option
+% `nosumlimits'.
+%
+% We redefine all the cumulative operator symbols to use
+% \cs{slimits@} so that switching between \cs{displaylimits} and
+% \cs{nolimits} can be controlled by package options. Also add
+% \cs{DOTSB} for the benefit of the dots lookahead. But we'd better
+% make sure \cn{coprod} and the others are simple mathchars; if not,
+% the attempted changes will probably fail miserably.
+%
+% \changes{v2.15}{2016/02/20}{Accept \cs{Umathchar}}
+% \begin{macrocode}
+\begingroup
+% \end{macrocode}
+% \begin{macrocode}
+\edef\@tempa{\string\mathchar"}
+\edef\@tempd{\string\Umathchar"}
+\def\@tempb#1"#2\@nil{#1"}
+\edef\@tempc{\expandafter\@tempb\meaning\coprod "\@nil}
+\ifx\@tempc\@tempd\let\@tempc\@tempa\fi
+% \end{macrocode}
+% \begin{macrocode}
+\ifx\@tempa\@tempc
+ \global\let\coprod@\coprod
+ \gdef\coprod{\DOTSB\coprod@\slimits@}
+ \global\let\bigvee@\bigvee
+ \gdef\bigvee{\DOTSB\bigvee@\slimits@}
+ \global\let\bigwedge@\bigwedge
+ \gdef\bigwedge{\DOTSB\bigwedge@\slimits@}
+ \global\let\biguplus@\biguplus
+ \gdef\biguplus{\DOTSB\biguplus@\slimits@}
+ \global\let\bigcap@\bigcap
+ \gdef\bigcap{\DOTSB\bigcap@\slimits@}
+ \global\let\bigcup@\bigcup
+ \gdef\bigcup{\DOTSB\bigcup@\slimits@}
+ \global\let\prod@\prod
+ \gdef\prod{\DOTSB\prod@\slimits@}
+ \global\let\sum@\sum
+ \gdef\sum{\DOTSB\sum@\slimits@}
+ \global\let\bigotimes@\bigotimes
+ \gdef\bigotimes{\DOTSB\bigotimes@\slimits@}
+ \global\let\bigoplus@\bigoplus
+ \gdef\bigoplus{\DOTSB\bigoplus@\slimits@}
+ \global\let\bigodot@\bigodot
+ \gdef\bigodot{\DOTSB\bigodot@\slimits@}
+ \global\let\bigsqcup@\bigsqcup
+ \gdef\bigsqcup{\DOTSB\bigsqcup@\slimits@}
+\fi
+\endgroup
+% \end{macrocode}
+%
+% \subsection{Roots and radicals}
+%
+% \begin{macro}{\root}
+% This root stuff needs syntax work and implementation work. Surely
+% something more compact can be done?? [mjd, 1994/09/05]
+% \begin{macrocode}
+\newcommand{\leftroot}{\@amsmath@err{\Invalid@@\leftroot}\@eha}
+\newcommand{\uproot}{\@amsmath@err{\Invalid@@\uproot}\@eha}
+\newcount\uproot@
+\newcount\leftroot@
+\renewcommand{\root}{\relaxnext@
+ \DN@{\ifx\@let@token\uproot\let\next@\nextii@\else
+ \ifx\@let@token\leftroot\let\next@\nextiii@\else
+ \let\next@\plainroot@\fi\fi\next@}%
+ \def\nextii@\uproot##1{\uproot@##1\relax\FN@\nextiv@}%
+ \def\nextiv@{\ifx\@let@token\@sptoken\DN@. {\FN@\nextv@}\else
+ \DN@.{\FN@\nextv@}\fi\next@.}%
+ \def\nextv@{\ifx\@let@token\leftroot\let\next@\nextvi@\else
+ \let\next@\plainroot@\fi\next@}%
+ \def\nextvi@\leftroot##1{\leftroot@##1\relax\plainroot@}%
+ \def\nextiii@\leftroot##1{\leftroot@##1\relax\FN@\nextvii@}%
+ \def\nextvii@{\ifx\@let@token\@sptoken
+ \DN@. {\FN@\nextviii@}\else
+ \DN@.{\FN@\nextviii@}\fi\next@.}%
+ \def\nextviii@{\ifx\@let@token\uproot\let\next@\nextix@\else
+ \let\next@\plainroot@\fi\next@}%
+ \def\nextix@\uproot##1{\uproot@##1\relax\plainroot@}%
+ \bgroup\uproot@\z@\leftroot@\z@\FN@\next@}
+\def\plainroot@#1\of#2{\setbox\rootbox\hbox{%
+ $\m@th\scriptscriptstyle{#1}$}%
+ \mathchoice{\r@@t\displaystyle{#2}}{\r@@t\textstyle{#2}}
+ {\r@@t\scriptstyle{#2}}{\r@@t\scriptscriptstyle{#2}}\egroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \changes{v2.0}{1999/06/17}{Normalize @@sqrt to sqrtsign}
+
+% Name change from \cs{@@sqrt} to \cs{sqrtsign} happened in the
+% 1995/12/01 release of \latex/. If we were to assume that
+% \cs{sqrtsign} is defined then someone with the 1995/06/01 release
+% of \latex/ would have trouble using this package.
+% \begin{macrocode}
+\@ifundefined{sqrtsign}{\let\sqrtsign\@@sqrt}{}
+\def\r@@t#1#2{\setboxz@h{$\m@th#1\sqrtsign{#2}$}%
+ \dimen@\ht\z@\advance\dimen@-\dp\z@
+ \setbox\@ne\hbox{$\m@th#1\mskip\uproot@ mu$}%
+ \advance\dimen@ by1.667\wd\@ne
+ \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox
+ \mkern-10mu\mkern\leftroot@ mu\boxz@}
+% \end{macrocode}
+%
+% \subsection{Et cetera}
+%
+% \changes{v2.0}{1999/06/18}{Leave Greek cap letters unaltered}
+%
+% Specific names for the variant italic cap Greek letters are not
+% defined by \latex/. If no preceding package defined these, we will
+% define them now.
+% \begin{macrocode}
+\@ifundefined{varGamma}{%
+ \DeclareMathSymbol{\varGamma}{\mathord}{letters}{"00}
+ \DeclareMathSymbol{\varDelta}{\mathord}{letters}{"01}
+ \DeclareMathSymbol{\varTheta}{\mathord}{letters}{"02}
+ \DeclareMathSymbol{\varLambda}{\mathord}{letters}{"03}
+ \DeclareMathSymbol{\varXi}{\mathord}{letters}{"04}
+ \DeclareMathSymbol{\varPi}{\mathord}{letters}{"05}
+ \DeclareMathSymbol{\varSigma}{\mathord}{letters}{"06}
+ \DeclareMathSymbol{\varUpsilon}{\mathord}{letters}{"07}
+ \DeclareMathSymbol{\varPhi}{\mathord}{letters}{"08}
+ \DeclareMathSymbol{\varPsi}{\mathord}{letters}{"09}
+ \DeclareMathSymbol{\varOmega}{\mathord}{letters}{"0A}
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\overline}
+% \amstex/ redefines \cn{overline} as shown here, for reasons that
+% are probably less important in \latex/: Make it read its argument
+% as a macro argument rather than a ``math field'' (\emph{The
+% \tex/book}, Chapter 26), to avoid problems when something that is
+% apparently a single symbol is actually a non-simple macro (e.g.,
+% \cn{dag}) \emph{and} is given as a single-token argument without
+% enclosing braces.
+% \begin{macrocode}
+\@saveprimitive\overline\@@overline
+\DeclareRobustCommand{\overline}[1]{\@@overline{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\boxed}
+% The \cs{boxed} command is specifically intended to put a box around
+% an equation or piece of an equation. (Not including the equation
+% number.) This isn't trivial for end-users to do it properly
+% with \cs{fbox} so we provide a command for them.
+% \begin{macrocode}
+\newcommand{\boxed}[1]{\fbox{\m@th$\displaystyle#1$}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\implies}
+% \begin{macro}{\impliedby}
+% \begin{macrocode}
+\newcommand{\implies}{\DOTSB\;\Longrightarrow\;}
+\newcommand{\impliedby}{\DOTSB\;\Longleftarrow\;}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\And}
+% \begin{macrocode}
+\def\And{\DOTSB\;\mathchar"3026 \;}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nobreakdash}
+% The command \cn{nobreakdash} is designed only for use before a
+% hyphen or dash (|-|, |--|, or |---|).
+% Setting the hyphen in a box and then unboxing it means that the
+% normal penalty will not be added after it---and if the penalty is
+% not there a break will not be taken (unless an explicit penalty
+% or glue follows, thus the final \verb=\nobreak=).
+% \begin{macrocode}
+\newcommand{\nobreakdash}{\leavevmode
+ \toks@\@emptytoks \def\@tempa##1{\toks@\@xp{\the\toks@-}\FN@\next@}%
+ \DN@{\ifx\@let@token-\@xp\@tempa
+ \else\setboxz@h{\the\toks@\nobreak}\unhbox\z@\fi}%
+ \FN@\next@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\colon}
+% \cs{colon} is for a colon in math that resembles a text colon:
+% small space on the left, larger space on the right. The \qc{\:}
+% character by itself is treated as a \cs{mathrel} i.e. large, equal
+% spacing on both sides.
+% \begin{macrocode}
+\renewcommand{\colon}{\nobreak\mskip2mu\mathpunct{}\nonscript
+ \mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Ellipsis dots}
+%
+% We can't use \cs{newif} for \cs{ifgtest@} because we want
+% to include \cs{global} in the definitions of
+% \cs{gtest@true} and \cs{gtest@false}.
+% \begin{macrocode}
+\let\ifgtest@\iffalse % initial value
+\def\gtest@true{\global\let\ifgtest@\iftrue}
+\def\gtest@false{\global\let\ifgtest@\iffalse}
+\let\DOTSI\relax
+\let\DOTSB\relax
+\let\DOTSX\relax
+{\uccode`7=`\\ \uccode`8=`m \uccode`9=`a \uccode`0=`t \uccode`!=`h
+ \uppercase{%
+ \gdef\math@#1#2#3#4#5#6\math@{\gtest@false\ifx 7#1\ifx 8#2%
+ \ifx 9#3\ifx 0#4\ifx !#5\xdef\meaning@{#6}\gtest@true
+ \fi\fi\fi\fi\fi}}}
+{\uccode`7=`c \uccode`8=`h \uccode`9=`\"
+ \uppercase{\gdef\mathch@#1#2#3#4#5#6\mathch@{\gtest@false
+ \ifx 7#1\ifx 8#2\ifx 9#5\gtest@true\xdef\meaning@{9#6}\fi\fi\fi}}}
+% \end{macrocode}
+% \changes{v2.15}{2016/02/20}{Accept \cs{Umathchar}}
+% \begin{macrocode}
+{\uccode`(=`U \uccode`)=`m
+ \uppercase{\gdef\Umathch@#1#2#3#4"#5"#6\Umathch@{\gtest@false
+ \ifx(#2\ifx)#3\gtest@true
+ \ifcase"#5 \or\or\gdef\thedots@{\dotsb@}\or\gdef\thedots@{\dotsb@}\fi
+ \fi\fi
+ }}}
+% \end{macrocode}
+% \changes{v2.15}{2016/02/20}{Decode the mathcode of character tokens for Unicode TeX}
+% For Unicode TeXs, if the next token is a character token look up the (U)mathcode. Do not do this for classic TeX for compatibility reasons.
+% \begin{macrocode}
+\ifx\Umathcharnumdef\@undefined
+\gdef\thecharacter@#1\thecharacter@{}
+\else
+{\uccode`(=`t \uccode`)=`c
+ \uppercase{\gdef\thecharacter@#1#2#3#4#5\thecharacter@{%
+ \ifx(#1\ifx)#4%
+ \@xp\getmathcode@\meaning@\getmathcode@
+ \fi\fi
+}}}
+\def\getmathcode@#1 #2 #3#4\getmathcode@{%
+ \Umathcharnumdef\@tempa\Umathcodenum`#3\relax
+ \edef\meaning@{\meaning\@tempa}%
+ \@xp\Umathch@\meaning@\Umathch@
+}
+\fi
+% \end{macrocode}
+% \begin{macrocode}
+\newcount\classnum@
+\def\getmathch@#1.#2\getmathch@{\classnum@#1 \divide\classnum@4096
+ \ifcase\number\classnum@\or\or\gdef\thedots@{\dotsb@}\or
+ \gdef\thedots@{\dotsb@}\fi}
+{\uccode`4=`b \uccode`5=`i \uccode`6=`n
+ \uppercase{\gdef\mathbin@#1#2#3{\relaxnext@
+ \def\nextii@##1\mathbin@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\mathbin@{}%
+ \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}}
+{\uccode`4=`r \uccode`5=`e \uccode`6=`l
+ \uppercase{\gdef\mathrel@#1#2#3{\relaxnext@
+ \def\nextii@##1\mathrel@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\mathrel@{}%
+ \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}}
+{\uccode`5=`m \uccode`6=`a \uccode`7=`c
+ \uppercase{\gdef\macro@#1#2#3#4\macro@{\gtest@false
+ \ifx 5#1\ifx 6#2\ifx 7#3\gtest@true
+ \xdef\meaning@{\macro@@#4\macro@@}\fi\fi\fi}}}
+\def\macro@@#1->#2\macro@@{#2}
+\newcount\DOTSCASE@
+{\uccode`6=`\\ \uccode`7=`D \uccode`8=`O \uccode`9=`T \uccode`0=`S
+ \uppercase{\gdef\DOTS@#1#2#3#4#5{\gtest@false\DN@##1\DOTS@{}%
+ \ifx 6#1\ifx 7#2\ifx 8#3\ifx 9#4\ifx 0#5\let\next@\DOTS@@
+ \fi\fi\fi\fi\fi
+ \next@}}}
+{\uccode`3=`B \uccode`4=`I \uccode`5=`X
+ \uppercase{\gdef\DOTS@@#1{\relaxnext@
+ \def\nextii@##1\DOTS@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \DN@{\FN@\nextii@}%
+ \ifx 3#1\global\DOTSCASE@\z@\else
+ \ifx 4#1\global\DOTSCASE@\@ne\else
+ \ifx 5#1\global\DOTSCASE@\tw@\else\DN@##1\DOTS@{}%
+ \fi\fi\fi\next@}}}
+{\uccode`5=`\\ \uccode`6=`n \uccode`7=`o \uccode`8=`t
+ \uppercase{\gdef\not@#1#2#3#4{\relaxnext@
+ \def\nextii@##1\not@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\not@{}%
+ \ifx 5#1\ifx 6#2\ifx 7#3\ifx 8#4\DN@{\FN@\nextii@}\fi\fi\fi
+ \fi\next@}}}
+% \end{macrocode}
+% \changes{v2.15}{2016/02/20}{macro added to strip \cs{long} during tests}
+% \begin{macrocode}
+{\uccode`9=`\l %
+ \uppercase{\gdef\striplong@#1#2#3\relax{%
+ \ifx9#2 \@xp\@xp\@xp\zap@to@space\fi}}}
+\def\zap@to@space#1 {}
+% \end{macrocode}
+% \begin{macrocode}
+\def\keybin@{\gtest@true
+ \ifx\@let@token+\else\ifx\@let@token=\else
+ \ifx\@let@token<\else\ifx\@let@token>\else
+ \ifx\@let@token-\else\ifx\@let@token*\else\ifx\@let@token:\else
+ \gtest@false\fi\fi\fi\fi\fi\fi\fi}
+% \end{macrocode}
+% Patch to ensure \cs{@ldots} is defined. (Name changed to
+% \cn{mathellipsis} in Dec 94 release of \latex/.)
+% \begin{macrocode}
+\@ifundefined{@ldots}{\def\@ldots{\mathellipsis}}{}
+% \end{macrocode}
+% \begin{macro}{\ldots}
+% \begin{macro}{\dots}
+% Reiterate the standard definition of \cs{ldots} to keep it from
+% being clobbered by the redefinition of \cs{dots}.
+% \begin{macrocode}
+\DeclareRobustCommand{\ldots}{%
+ \ifmmode \mathellipsis \else \textellipsis \fi
+}
+\DeclareRobustCommand{\dots}{%
+ \ifmmode \@xp\mdots@\else \@xp\textellipsis \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\def\tdots@{\leavevmode\unskip\relaxnext@
+ \DN@{$\m@th\@ldots\,
+ \ifx\@let@token,\,$\else\ifx\@let@token.\,$\else
+ \ifx\@let@token;\,$\else\ifx\@let@token:\,$\else
+ \ifx\@let@token?\,$\else\ifx\@let@token!\,$\else
+ $ \fi\fi\fi\fi\fi\fi}%
+ \ \FN@\next@}
+\def\mdots@{\FN@\mdots@@}
+% \end{macrocode}
+% \changes{v2.15}{2016/02/20}{Indent \cs{mdots@@} for readability and add additional tests}
+% \begin{macrocode}
+\def\mdots@@{\gdef\thedots@{\dotso@}%
+ \ifx\@let@token\boldsymbol
+ \gdef\thedots@\boldsymbol{\boldsymboldots@}%
+ \else
+ \ifx,\@let@token \gdef\thedots@{\dotsc}%
+ \else
+ \ifx\not\@let@token
+ \gdef\thedots@{\dotsb@}%
+ \else
+ \keybin@
+ \ifgtest@ % if \keybin@ test
+ \gdef\thedots@{\dotsb@}%
+ \else
+% \end{macrocode}
+% \changes{v2.15d}{2016/06/28}{Add space token to prevent runaway argument error}
+% \begin{macrocode}
+ \xdef\meaning@{\meaning\@let@token. .........}%
+% \end{macrocode}
+% In previous versions \verb|\long| macros were not seen by the lokkahead.
+% That was bad as this file uses \verb|\(re)newcommand| for \verb|\implies| etc.
+% \begin{macrocode}
+ \xdef\meaning@@{\@xp\striplong@\meaning@\relax\meaning@}%
+% \end{macrocode}
+% \begin{macrocode}
+ \@xp\math@\meaning@\math@
+ \ifgtest@ % if \mathxxx test
+ \@xp\mathch@\meaning@\mathch@
+ \ifgtest@ % if \mathchar
+ \@xp\getmathch@\meaning@\getmathch@
+ \fi % end if \mathchar
+ \else % \not \mathxxx
+% \end{macrocode}
+% Test for \verb|\Umathchar| added.
+% \begin{macrocode}
+ \@xp\Umathch@\meaning@"0"\Umathch@
+ \ifgtest@ % if \Umathchar
+ \else % else not \Umathcar
+% \end{macrocode}
+% \begin{macrocode}
+ \@xp\macro@\meaning@@\macro@
+ \ifgtest@ % if macro test
+ \@xp\not@\meaning@\not@
+ \ifgtest@ % if macro starts \not test
+ \gdef\thedots@{\dotsb@}%
+ \else% else not \not
+ \@xp\DOTS@\meaning@\DOTS@
+ \ifgtest@ % \if DOTS
+ \ifcase\number\DOTSCASE@ %ifcase dots
+ \gdef\thedots@{\dotsb@}%
+ \or\gdef\thedots@{\dotsi}\else
+ \fi % endifcase dots
+ \else % not macro starts \DOTS
+ \@xp\math@\meaning@\math@
+ \ifgtest@ % \if macro starts \mathxxxx
+ \@xp\mathbin@\meaning@\mathbin@
+ \ifgtest@ % if macro starts \mathbin
+ \gdef\thedots@{\dotsb@}%
+ \else % not macro starting \mathbin
+ \@xp\mathrel@\meaning@\mathrel@
+ \ifgtest@ % if macro starts \mathrel
+ \gdef\thedots@{\dotsb@}%
+ \fi % endif macro starts \mathrel (no else)
+ \fi % endif macro starts \mathbin
+ \fi % endif macro starts with \mathxxx (no else)
+ \fi % endif macro starts \DOTS else
+ \fi % end macro starting \not \ifgtest@ test (no else)
+% \end{macrocode}
+% Additional test for a catcode 12 character.
+% \begin{macrocode}
+ \else
+ \@xp\thecharacter@\meaning@\thecharacter@
+% \end{macrocode}
+% \begin{macrocode}
+ \fi % end macro \ifgtest@ test (no else)
+ \fi % end if \Umathchar test
+ \fi % end \math@ \ifgtest@
+ \fi % end \keybin@ \ifgtest@ test (no else)
+ \fi % end if \not (no else)
+ \fi % end if comma (no else)
+ \fi % end if boldsymbol (no else)
+ \thedots@}
+% \end{macrocode}
+%
+% The \qc{\=} character is necessary in the two \cs{let} assignments
+% in \cs{boldsymboldots@}, because the symbol we are making
+% bold might be an \qc{\=} sign.
+% \begin{macrocode}
+\def\boldsymboldots@#1{%
+ \bold@true\let\@let@token=#1\let\delayed@=#1\mdots@@
+ \boldsymbol#1\bold@false}
+% \end{macrocode}
+%
+% The definition of \cs{@cdots} is merely the \fn{plain.tex}
+% definition of \cs{cdots}.
+% \begin{macrocode}
+\ams@def\@cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\newcommand{\dotsi}{\!\@cdots}
+\let\dotsb@\@cdots
+% \end{macrocode}
+%
+% If any new right delimiters are defined, they would need to be
+% added to the definition of \cs{rightdelim@} in order for \cn{dots}
+% to work properly in all cases.
+% \begin{macrocode}
+\def\rightdelim@{\gtest@true
+ \ifx\@let@token)\else
+ \ifx\@let@token]\else
+ \ifx\@let@token\rbrack\else
+ \ifx\@let@token\}\else
+ \ifx\@let@token\rbrace\else
+ \ifx\@let@token\rangle\else
+ \ifx\@let@token\rceil\else
+ \ifx\@let@token\rfloor\else
+ \ifx\@let@token\rgroup\else
+ \ifx\@let@token\rmoustache\else
+ \ifx\@let@token\right\else
+ \ifx\@let@token\bigr\else
+ \ifx\@let@token\biggr\else
+ \ifx\@let@token\Bigr\else
+ \ifx\@let@token\Biggr\else\gtest@false
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+\def\extra@{%
+ \rightdelim@\ifgtest@
+ \else\ifx\@let@token$\gtest@true
+ \else\xdef\meaning@{\meaning\@let@token..........}%
+ \@xp\macro@\meaning@\macro@\ifgtest@
+ \@xp\DOTS@\meaning@\DOTS@
+ \ifgtest@
+ \ifnum\DOTSCASE@=\tw@\gtest@true\else\gtest@false
+ \fi\fi\fi\fi\fi}
+\newif\ifbold@
+\def\dotso@{\relaxnext@
+ \ifbold@
+ \let\@let@token\delayed@
+ \def\nextii@{\extra@\@ldots\ifgtest@\,\fi}%
+ \else
+ \def\nextii@{\DN@{\extra@\@ldots\ifgtest@\,\fi}\FN@\next@}%
+ \fi
+ \nextii@}
+% \end{macrocode}
+% Why not save some tokens? (space vs. time).
+% \begin{macrocode}
+\def\extrap@#1{%
+ \DN@{#1\,}%
+ \ifx\@let@token,\else
+ \ifx\@let@token;\else
+ \ifx\@let@token.\else\extra@
+ \ifgtest@\else
+ \let\next@#1\fi\fi\fi\fi\next@}
+% \end{macrocode}
+%
+% \begin{macro}{\cdots}
+% \begin{macro}{\dotsb}
+% \begin{macro}{\dotsm}
+% \begin{macro}{\dotso}
+% \begin{macro}{\dotsc}
+% The \cn{cdots} command.
+% \begin{macrocode}
+\ams@DeclareRobustCommand{\cdots}{\DN@{\extrap@\@cdots}\FN@\next@}
+\let\dotsb\cdots
+\let\dotsm\cdots
+\DeclareRobustCommand{\dotso}{\relax
+ \ifmmode \DN@{\extrap@\@ldots}%
+ \else \let\next@\tdots@\fi
+ \FN@\next@}
+\DeclareRobustCommand{\dotsc}{%
+ \DN@{\ifx\@let@token;\@ldots\,%
+ \else \ifx\@let@token.\@ldots\,%
+ \else \extra@\@ldots \ifgtest@\,\fi
+ \fi\fi}%
+ \FN@\next@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\longrightarrow}
+% \begin{macro}{\Longrightarrow}
+% \begin{macro}{\longleftarrow}
+% \begin{macro}{\Longleftarrow}
+% \begin{macro}{\longleftrightarrow}
+% \begin{macro}{\Longleftrightarrow}
+% \begin{macro}{\mapsto}
+% \begin{macro}{\longmapsto}
+% \begin{macro}{\hookrightarrow}
+% \begin{macro}{\hookleftarrow}
+% \begin{macro}{\iff}
+% Various arrows.
+% \begin{macrocode}
+\renewcommand{\longrightarrow}{%
+ \DOTSB\protect\relbar\protect\joinrel\rightarrow}
+\renewcommand{\Longrightarrow}{%
+ \DOTSB\protect\Relbar\protect\joinrel\Rightarrow}
+\renewcommand{\longleftarrow}{%
+ \DOTSB\leftarrow\protect\joinrel\protect\relbar}
+\renewcommand{\Longleftarrow}{%
+ \DOTSB\Leftarrow\protect\joinrel\protect\Relbar}
+\renewcommand{\longleftrightarrow}{\DOTSB\leftarrow\joinrel\rightarrow}
+\renewcommand{\Longleftrightarrow}{\DOTSB\Leftarrow\joinrel\Rightarrow}
+\renewcommand{\mapsto}{\DOTSB\mapstochar\rightarrow}
+\renewcommand{\longmapsto}{\DOTSB\mapstochar\longrightarrow}
+\renewcommand{\hookrightarrow}{\DOTSB\lhook\joinrel\rightarrow}
+\renewcommand{\hookleftarrow}{\DOTSB\leftarrow\joinrel\rhook}
+\renewcommand{\iff}{\DOTSB\;\Longleftrightarrow\;}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\doteq}
+% The \cn{doteq} command formerly used \cs{buildrel}; we avoid that
+% because it requires `\cn{over}' as part of its syntax. Use 0pt
+% instead of \cs{z@} for robustitude.
+% \begin{macrocode}
+\renewcommand{\doteq}{%
+ \DOTSB\mathrel{\mathop{\kern0pt =}\limits^{\textstyle.}}}
+% \end{macrocode}
+% \end{macro}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Integral signs}
+%
+% \begin{macro}{\if@display}
+% The straightforward \cs{ifinner} test to see if the current math
+% context is non-display, fails if, for instance, we are typesetting
+% a multiline display within an \cs{halign}, with the pieces going
+% into constructions like
+% \begin{verbatim}
+% $\displaystyle...$
+% \end{verbatim}
+% So we need a better test to find out if we are `in a display'. We
+% therefore create \cs{if@display}.
+%
+% \begin{macrocode}
+\newif\if@display
+\everydisplay\@xp{\the\everydisplay \@displaytrue}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\int}
+% \begin{macro}{\oint}
+% \begin{macro}{\iint}
+% \begin{macro}{\iiint}
+% \begin{macro}{\iiiint}
+% \begin{macro}{\idotsint}
+% Default value for integral limits is \cs{nolimits}, see the
+% definition of the `nointlimits' option.
+% \begin{macrocode}
+\renewcommand{\int}{\DOTSI\intop\ilimits@}
+\renewcommand{\oint}{\DOTSI\ointop\ilimits@}
+\def\intkern@{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
+\def\intdots@{\mathchoice{\@cdots}%
+ {{\cdotp}\mkern1.5mu{\cdotp}\mkern1.5mu{\cdotp}}%
+ {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}%
+ {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}}
+%
+\ams@newcommand{\iint}{\DOTSI\protect\MultiIntegral{2}}
+\ams@newcommand{\iiint}{\DOTSI\protect\MultiIntegral{3}}
+\ams@newcommand{\iiiint}{\DOTSI\protect\MultiIntegral{4}}
+\newcommand{\idotsint}{\DOTSI\protect\MultiIntegral{0}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\MultiIntegral}
+% If the \cs{limits} option is applied, use \cs{mathop} and fudge
+% the left-hand space a bit to make the subscript visually centered.
+%
+% \verb'#1' is the multiplicity.
+% \begin{macrocode}
+\newcommand{\MultiIntegral}[1]{%
+ \edef\ints@c{\noexpand\intop
+ \ifnum#1=\z@\noexpand\intdots@\else\noexpand\intkern@\fi
+ \ifnum#1>\tw@\noexpand\intop\noexpand\intkern@\fi
+ \ifnum#1>\thr@@\noexpand\intop\noexpand\intkern@\fi
+ \noexpand\intop
+ \noexpand\ilimits@
+ }%
+ \futurelet\@let@token\ints@a
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\ints@a{%
+ \ifx\limits\@let@token \ints@b
+ \else \ifx\displaylimits\@let@token \ints@b
+ \else\ifx\ilimits@\displaylimits \ints@b
+ \fi\fi\fi
+ \ints@c
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\ints@b{%
+ \mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
+ \mathop\bgroup
+ \mkern7mu\mathchoice{\mkern2mu}{}{}{}%
+ \let\ilimits@\egroup
+}%
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Size dependent definitions}
+%
+% We now define all stuff which has to change whenever a new math
+% size is to be activated. \latex/ provides a hook called
+% |\every@math@size| to support such a need. All assignments in the
+% |\every@math@size| hook that need to take outside effect should be
+% global.
+%
+% \subsection{Struts for math}
+%
+% The various kinds of struts could use some analysis and perhaps
+% consolidation.
+%
+% For example perhaps the \cn{bBigg} delimiters could use
+% \begin{verbatim}
+% 1.2\ht\strutbox (1.8, 2.4, 3.0)
+% \end{verbatim}
+% instead of
+% \begin{verbatim}
+% 1.0\big@size (1.5, 2.0, 2.5)
+% \end{verbatim}
+% since \cs{strut} is reset with every size change [mjd, 1994/10/07].
+% But this change would introduce the possibility of changed line
+% and page breaks in existing documents, so would need to be
+% handled with care.
+%
+% \begin{macro}{\Mathstrut@}
+% \begin{macro}{\Mathstrutbox@}
+% \begin{macro}{\resetMathstrut@}
+% Here comes the code for Spivak's |\Mathstrut@|.
+% \begin{macrocode}
+\newbox\Mathstrutbox@
+\setbox\Mathstrutbox@=\hbox{}
+\def\Mathstrut@{\copy\Mathstrutbox@}
+% \end{macrocode}
+% The setting of the height and depth of the |\Mathstrutbox@| is done
+% in the |\every@math@size| hook since it depends on the height of a
+% paren. As \cs{every@math@size} is triggered by |$| after a font
+% size change, we want to avoid using another math formula |$...$| to
+% measure the math paren height; instead we go through the mathcode
+% of the \qc{\(} character. We assume that the mathcode has a leading
+% hex digit 4 indicating `open delimiter'; this allows us to make a
+% relatively simple function to get the correct font and character
+% position.
+%
+% \changes{v2.15}{2016/02/20}{Modify \cs{resetMathstrut@} for Unicode \TeX}
+% \changes{v2.15b}{2016/03/10}{Modify \cs{resetMathstrut@} for classic \TeX\ to preserve box 0}
+% Original code assuming |\mathcode| is kept for 8bit \TeX. Unicode \TeX{}
+% uses |\Umathcharnumdef| which works for xetex and luatex, which use
+% different forms for |\mathchardef|. (New luatex always reports
+% definitions using |\Umathchardef| syntax even if |\mathchardef| used.)
+%
+% The unicode version uses e-tex |\fontcharht| to avoid boxing which
+% could also be done for pdftex, but not done here.
+% \begin{macrocode}
+\ifx\Umathcharnumdef\@undefined
+% \end{macrocode}
+% Original code
+% \begin{macrocode}
+\def\resetMathstrut@{%
+ \begingroup
+ \setbox\z@\hbox{%
+ \mathchardef\@tempa\mathcode`\(\relax
+ \def\@tempb##1"##2##3{\the\textfont"##3\char"}%
+ \expandafter\@tempb\meaning\@tempa \relax
+ }%
+ \edef\@tempa{%
+ \ht\Mathstrutbox@\the\ht\z@\relax
+ \dp\Mathstrutbox@\the\dp\z@\relax}%
+ \expandafter\endgroup\@tempa
+}
+\else
+% \end{macrocode}
+% xetex/luatex version
+% \changes{v2.15a}{2016/03/03}{missing percent added}
+% \begin{macrocode}
+\def\resetMathstrut@{%
+ \begingroup
+ \Umathcharnumdef\@tempa\Umathcodenum`\(\relax
+ \def\@tempb##1"##2"##3"##4\relax{%
+ \endgroup
+ \ht\Mathstrutbox@=\fontcharht\textfont"##3 "##4\relax
+ \dp\Mathstrutbox@=\fontchardp\textfont"##3 "##4\relax}%
+ \expandafter\@tempb\meaning\@tempa \relax
+}
+% \end{macrocode}
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% These height and depth assignments are implicitly global.
+% \begin{macrocode}
+\addto@hook\every@math@size{\resetMathstrut@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\strut@}
+% \begin{macro}{\strutbox@}
+% Next follows a special internal strut which is supposed to match
+% the height and the depth of a normal |\strut| minus
+% |\normallineskiplimit| according to M. Spivak.
+%
+% This should really go into the definition of \cs{size@update}, and
+% then the box reset could be local; but \cs{size@update} doesn't
+% have any hook and is handled in such a way that it cannot even be
+% changed except by changing \cs{set@fontsize}. So instead we put
+% \cs{reset@strutbox@} into \cs{every@math@size} and make it global.
+% Then because of some complications in the way \cs{glb@settings} and
+% \cs{check@mathfonts} work, we have to re-invoke it at the beginning
+% of every environment that might use \cs{strut@}. Fortunately this
+% can be achieved (more or less) through the \cs{spread@equation}
+% hook. [mjd,2000/03/10]
+% \begin{macrocode}
+\newbox\strutbox@
+\def\strut@{\copy\strutbox@}
+\def\reset@strutbox@{%
+ \global\setbox\strutbox@\hbox{%
+ \lower.5\normallineskiplimit
+ \vbox{\kern-\normallineskiplimit\copy\strutbox}}}
+\addto@hook\every@math@size{\reset@strutbox@}
+\AtBeginDocument{\reset@strutbox@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Big delimiters}
+%
+% We are now going to redefine the plain \tex/ commands \cn{big},
+% \cn{bigl}, etc., to produce different results in different sizes.
+% Actually we only have to define \cn{big}, \cn{Big}, etc., since
+% they are used to construct the directional versions \cn{bigl},
+% \cn{bigr}, and the rest.
+%
+% \begin{macro}{\big}
+% \begin{macro}{\Big}
+% \begin{macro}{\bigg}
+% \begin{macro}{\Bigg}
+% To save token space we put everything into the common macro
+% |\bBigg@|. The macros are now simply a call to |\bBigg@| with a
+% factor to determine the correct height of the delimiter as an
+% argument. This code should better go into a future version of
+% the \latex/ kernel; the macro |\n@space| is then superfluous (since
+% it is only used once) and should be removed to avoid wasting hash
+% table space unnecessarily.
+% \begin{macrocode}
+\renewcommand{\big}{\bBigg@\@ne}
+\renewcommand{\Big}{\bBigg@{1.5}}
+\renewcommand{\bigg}{\bBigg@\tw@}
+\renewcommand{\Bigg}{\bBigg@{2.5}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bBigg@}
+% Now we tackle the macro which has to do the real work. It
+% actually has two arguments, the factor and the wanted delimiter.
+% \changes{v2.17b}{2018/12/01}{Start LR-mode for \cs{bigl} and
+% friends if necessary (github/49)}
+% \begin{macrocode}
+\ifx\leavevmode@ifvmode\@undefined
+\def\bBigg@#1#2{%
+% \end{macrocode}
+% We start with an extra set of braces because we want
+% constructions like |\def\bigl{\mathopen\big}| to work without the
+% overhead of extra arguments.
+% \begin{macrocode}
+ {\@mathmeasure\z@{\nulldelimiterspace\z@}%
+ {\left#2\vcenter to#1\big@size{}\right.}%
+ \box\z@}}
+\else
+\def\bBigg@#1#2{\leavevmode@ifvmode
+ {\@mathmeasure\z@{\nulldelimiterspace\z@}%
+ {\left#2\vcenter to#1\big@size{}\right.}%
+ \box\z@}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\big@size}
+% |\big@size| needs to be set to 1.2 times the height of a math
+% paren. This height is already recorded in |\Mathstrutbox@|.
+% \begin{macrocode}
+\addto@hook\every@math@size{%
+ \global\big@size 1.2\ht\Mathstrutbox@
+ \global\advance\big@size 1.2\dp\Mathstrutbox@ }
+\newdimen\big@size
+% \end{macrocode}
+% \end{macro}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Math accents}
+%
+% We want to change the leading digit of math accents to be
+% \cs{accentclass@} so that it can vary according to certain internal
+% purposes.
+% \begin{macrocode}
+\def\accentclass@{7}
+\def\noaccents@{\def\accentclass@{0}}
+% \end{macrocode}
+%
+% There are a few \meta{math alphabet}s in the standard fonts where
+% we have to change the extra macros because the standard definitions
+% don't account for these accent problems. The first is for the
+% \cs{mathit} command.
+% \begin{macrocode}
+\DeclareFontEncoding{OML}{}{\noaccents@}
+% \end{macrocode}
+% The next one corrects the \cs{cal} alphabet.
+% \begin{macrocode}
+\DeclareFontEncoding{OMS}{}{\noaccents@}
+% \end{macrocode}
+%
+% \begin{macro}{\dddot}
+% \begin{macro}{\ddddot}
+% Triple and quadruple dot accents.
+% \begin{macrocode}
+\ams@newcommand{\dddot}[1]{%
+ {\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
+ \hbox{\normalfont ...}\vss}}}}
+\ams@newcommand{\ddddot}[1]{%
+ {\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
+ \hbox{\normalfont....}\vss}}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% The following code deals with support for compound accents.
+% By redefining \cs{set@mathaccent} we ensure that
+% \cn{DeclareMathAccent} will define accent commands to run our
+% \cs{mathaccentV} function instead of the primitive \cs{mathaccent}.
+% \begin{macrocode}
+\def\set@mathaccent#1#2#3#4{%
+ \xdef#2{\@nx\protect\@nx\mathaccentV
+ {\@xp\@gobble\string#2}\hexnumber@#1#4}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\hat}
+% \begin{macro}{\check}
+% \begin{macro}{\tilde}
+% \begin{macro}{\acute}
+% \begin{macro}{\grave}
+% \begin{macro}{\dot}
+% \begin{macro}{\ddot}
+% \begin{macro}{\breve}
+% \begin{macro}{\bar}
+% \begin{macro}{\vec}
+% \begin{macro}{\mathring}
+% We redefine the standard math accent commands to
+% call \cs{mathaccentV}, using the mathgroup/encoding-number
+% information embedded in their previous definitions. If the
+% definition of an accent command does not have the expected form, we
+% leave the accent command alone, but give a warning. For widehat and
+% widetilde, we need to avoid clobbering the definitions done by the
+% \pkg{amsfonts} package. Arbitrating the contention between
+% \pkg{amsmath} and \pkg{amsfonts} to allow doubling a widetilde
+% accent looks tricky, so for the time being [mjd,1999/07/19] we just
+% leave \cn{widehat} and \cn{widetilde} alone. As a result, if the
+% \pkg{amsmath} package is loaded on top of a vanilla \latex/
+% documentclass, everything runs through with no warnings. If a
+% Lucida Math or other math fonts package is loaded in addition to
+% \pkg{amsmath}, there are greater difficulties, but those are
+% addressed elsewhere.
+%
+%
+% \changes{v2.15}{2016/02/20}{Detect \cs{Umathaccent} on package load}
+% Adjust the test made at package load to recognise
+% |\Umathaccent|. Although currently it is just used to give a
+% modified warning that the accents will not be redefined.
+%
+% Note that the engines behave quite differently here, luatex
+% even without these definitions using the OpenType accent set up by
+% unicode-math stacks |\hat{hat{f}}| correctly but xetex acts like
+% classic tex and needs this adjustment. This difference is not
+% addressed here at all.
+%
+% This test is just at package loading and has no affect on the
+% definitions used in 8bit TeX.
+% \begin{macrocode}
+%\def\@tempa#1{\@xp\@tempb\meaning#1\@nil#1}
+% \end{macrocode}
+% The extended definition below tests if the accent is already
+% robust (as newer \LaTeX{} kernels do this by default) and if so
+% picks up the robust definition. However, as of
+% now it still redefines it to be non-robust.
+% \begin{macrocode}
+\def\@tempa#1{%
+ \@ifundefined{\@xp\@gobble\string#1\space}%
+ {\@xp\@tempb\meaning#1\@nil#1}%
+ {\@xp\@xp\@xp\@tempb\@xp\meaning
+ \csname\@xp\@gobble\string#1\space\endcsname\@nil#1}%
+}
+\def\@tempb#1>#2#3 #4\@nil#5{%
+ \@xp\ifx\csname#3\endcsname\mathaccent
+ \@tempc#4?"7777\@nil#5%
+ \else
+ \@xp\ifx\csname#3\endcsname\Umathaccent
+ \@tempd#4\@nil#5%
+ \else
+ \PackageWarningNoLine{amsmath}{%
+ Unable to redefine math accent \string#5}%
+ \fi\fi}
+\def\@tempc#1"#2#3#4#5#6\@nil#7{%
+ \chardef\@tempd="#3\relax\set@mathaccent\@tempd{#7}{#2}{#4#5}}
+\def\@tempd#1\@nil#2{%
+ \PackageWarningNoLine{amsmath}{%
+ Unable to redefine \string\Umathaccent\space\string#2}%
+}
+% \end{macrocode}
+% \begin{macrocode}
+\@tempa{\hat}
+\@tempa{\check}
+\@tempa{\tilde}
+\@tempa{\acute}
+\@tempa{\grave}
+\@tempa{\dot}
+\@tempa{\ddot}
+\@tempa{\breve}
+\@tempa{\bar}
+\@tempa{\vec}
+\@ifundefined{mathring}{%
+ \DeclareMathAccent{\mathring}{\mathalpha}{operators}{"17}
+}{%
+ \@tempa{\mathring}
+}
+%%\@tempa\widetilde
+%%\@tempa\widehat
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% Regression testing of amsmath 2.0 showed that in some documents
+% there occurred fragments of the form
+% \begin{verbatim}
+% \hat\mathcal{G}
+% \end{verbatim}
+% This is not at all correct syntax for the argument of a \latex/
+% command but it produced the intended result anyway because of the
+% internal syntax of the \cs{mathaccent} primitive. With
+% \cs{mathaccentV}, it will yield an error message. We therefore do a
+% special check for such syntax problems in order to make the error
+% message more informative. (dmj: ??????)
+% \begin{macrocode}
+\newcommand{\acc@check}{}
+\newcommand{\acc@error}{}
+\def\acc@check{\@ifnextchar\@empty\relax\acc@error}
+% \end{macrocode}
+% We put most of the tokens in a separate macro so they do not get
+% scanned unless they are actually needed.
+% \begin{macrocode}
+\def\acc@error{%
+ \@amsmath@err{%
+ Improper argument for math accent:\MessageBreak
+ Extra braces must be added to prevent wrong output%
+ }\@ehc
+}
+% \end{macrocode}
+%
+% For \cs{mathaccentV} part of the processing is dependent on the
+% depth of nesting of math accent commands. We introduce a dedicated
+% counter for this instead of using chardef because we want to
+% increment/decrement it during processing, and incrementing a
+% chardef integer is more work.
+% \begin{macrocode}
+\newcount\macc@depth
+% \end{macrocode}
+%
+% Provide this function in case it is not already available.
+% \begin{macrocode}
+\long\def\@gobblethree#1#2#3{}
+% \end{macrocode}
+%
+% The \cs{mathaccentV} function first counts the number of nested
+% math accents by setting the argument in a throw-away box. (This is
+% not as risky as such an operation would normally be because the
+% argument is generally either a simple math symbol or a nested math
+% accent call with a simple math symbol at the bottom of the
+% nesting.)
+%
+% There are two benefits from counting the nesting levels first
+% before doing anything else: (1) we can fall back to a simple
+% \cs{mathaccent} call if the nesting depth is 1, and (2) if the
+% nesting depth is greater than 1, we would like to be able to tell
+% when we have reached the lowest level, because at that point we
+% want to save the argument for later use and place an accent on top
+% of a phantom copy.
+%
+% When we have multiple accents, they will be placed on top of the
+% invisible box, followed by some suitable kerns, then a visible copy
+% of the nucleus. To see why, let us look at what goes wrong with a
+% double application of the \cs{mathaccent} primitive. The standard
+% definition of \cs{hat} is \verb'\mathaccent"705E', so
+% \verb'\hat{\hat{F}}' expands to
+%\begin{verbatim}
+%\mathaccent"705E{\mathaccent"705E{F}}
+%\end{verbatim}
+% The result of this operation is
+%\begin{verbatim}
+%\vbox(12.11111+0.0)x7.81946
+%.\hbox(6.94444+0.0)x0.0, shifted 1.40973
+%..\OT1/cmr/m/n/10 ^
+%.\kern-4.30554
+%.\vbox(9.47221+0.0)x7.81946
+%..\hbox(6.94444+0.0)x0.0, shifted 2.24309
+%...\OT1/cmr/m/n/10 ^
+%..\kern-4.30554
+%..\hbox(6.83331+0.0)x7.81946
+%...\OML/cmm/m/it/10 F
+%\end{verbatim}
+% \tex/ starts by constructing a vbox with the hat character on top
+% of the F. Then it puts another hat character on top of the vbox;
+% but without skew information, because that is only applied by
+% \cs{mathaccent} when the base object is a simple symbol. So the
+% first accent is skewed to the correct position but all later
+% accents are not. By the way, the actual width of the F in the above
+% example is less than 7.81946; the box in which it is packed was
+% automatically lengthened by the width of the F's italic correction
+% (without actually putting in a kern for it).
+%
+% To get the second accent shifted farther to the right we
+% artificially increase the width of the innermost box and add
+% a compensating kern afterward. Furthermore, to get proper placement
+% of a following subscript or superscript, we take the base symbol
+% out, leaving a phantom in its place, and print it by itself
+% following the kern. We then need to increase the kern amount to
+% move the base character backward under the accents again.
+% Here is what the results look like:
+%\begin{verbatim}
+%\vbox(12.11111+0.0)x9.48618
+%.\hbox(6.94444+0.0)x0.0, shifted 2.24309
+%..\OT1/cmr/m/n/10 ^
+%.\kern-4.30554
+%.\vbox(9.47221+0.0)x9.48618
+%..\hbox(6.94444+0.0)x0.0, shifted 2.24309
+%...\OT1/cmr/m/n/10 ^
+%..\kern-4.30554
+%..\hbox(6.83331+0.0)x9.48618
+%...\hbox(6.83331+0.0)x7.81946
+%...\kern 1.66672
+%\kern -9.48618
+%\OML/cmm/m/it/10 F
+%\end{verbatim}
+%
+% Much of this implementation is based on code from the \pkg{accents}
+% package of Javier Bezos. I added the test to revert to a simple
+% \cs{mathaccent} when accents are not nested, and some other
+% refinements to reduce the number of kerns used (to conserve box
+% memory) and the number of cycles through \cs{mathchoice} (to make
+% things run a little faster). It was all rather difficult and my
+% first two attempts had serious bugs but I hope and believe that
+% this version will do better. [mjd,2000/03/15]
+%
+% The \qq{V} in \cs{mathaccentV} is just an indication that it takes
+% five arguments. It is important that the name includes
+% \texttt{mathaccent}, otherwise \cs{DeclareMathAccent} will balk at
+% redefining one of our accent commands, for example when an
+% alternative math font package is loaded.
+% \begin{macrocode}
+\def\mathaccentV#1#2#3#4#5{%
+ \ifmmode
+ \gdef\macc@tmp{\macc@depth\@ne}%
+ \setbox\z@\hbox{%
+ \let\mathaccentV\macc@test
+ \let\use@mathgroup\@gobbletwo \let\select@group\@gobblethree
+ \frozen@everymath{}$#5$%
+ }%
+ \macc@tmp
+ \ifnum\macc@depth=\@ne
+ \global\let\macc@nucleus\@empty
+ \mathaccent"\accentclass@
+ \else
+ \@xp\macc@nested
+ \fi
+ #2#3#4{#5}%
+ \macc@nucleus
+ \else
+ \@xp\nonmatherr@\csname#1\endcsname
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\macc@test#1#2#3#4{\xdef\macc@tmp{\macc@tmp\advance\macc@depth\@ne}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\macc@group{-1}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\macc@nested#1#2#3#4{%
+ \begingroup
+ \let\math@bgroup\@empty \let\math@egroup\macc@set@skewchar
+ \mathsurround\z@ \frozen@everymath{\mathgroup\macc@group\relax}%
+ \macc@set@skewchar\relax
+ \let\mathaccentV\macc@nested@a
+ \macc@nested@a\relax#1#2#3{#4}%
+ \endgroup
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\macc@palette\mathpalette
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\macc@nested@a#1#2#3#4#5{%
+% \end{macrocode}
+% This test saves some work that would otherwise be always repeated
+% fourfold thanks to \cs{mathchoice}.
+% \begin{macrocode}
+ \ifnum\macc@group=\mathgroup
+ \else \macc@set@skewchar\relax \edef\macc@group{\the\mathgroup}%
+ \fi
+ \mathchardef\macc@code "\accentclass@ #2#3#4\relax
+ \macc@palette\macc@a{#5}%
+}
+% \end{macrocode}
+%
+% The reason that \cs{macc@set@skewchar} takes an argument is so that
+% it can serve as a direct substitute for \cs{math@egroup}, in
+% addition to being used separately.
+%
+% Setting a skewchar with this method works for symbols of variable
+% mathgroup (class 7, letters and numbers) but not necessarily for
+% special symbols like \cn{partial} or \cs{xi} whose mathgroup
+% doesn't change; fortunately the most commonly used ones come from
+% mathgroup one, which is the fall-back mathgroup for skewchar.
+% \begin{macrocode}
+\def\macc@set@skewchar#1{%
+ \begingroup
+ \ifnum\mathgroup=\m@ne \let\@tempa\@ne
+ \else
+ \ifnum\skewchar\textfont\mathgroup=\m@ne \let\@tempa\@ne
+ \else \let\@tempa\mathgroup
+ \fi
+ \fi
+ \count@=\skewchar\textfont\@tempa
+ \advance\count@"7100
+ \edef\@tempa{\endgroup
+ \mathchardef\noexpand\macc@skewchar=\number\count@\relax}%
+ \@tempa
+ #1%
+}
+% \end{macrocode}
+%
+% Arg1 is math-style, arg2 is accent base object. We assume that math
+% style doesn't change within the nested group of accents; this means
+% we can set \cs{macc@style} only once and redefine \cs{macc@palette}
+% to use it, in order to run \cs{mathchoice} only once instead of
+% multiplying the calls exponentially as the nesting level increases.
+% \begin{macrocode}
+\def\macc@a#1#2{%
+ \begingroup
+ \let\macc@style#1\relax
+ \def\macc@palette##1{##1\macc@style}%
+ \advance\macc@depth\m@ne
+ \ifnum\macc@depth=\z@
+ \gdef\macc@nucleus{#2}%
+% \end{macrocode}
+% Extra \cs{@empty} tokens are to prevent low-level \tex/ errors from
+% the potential syntactic error that \cs{acc@check} checks for.
+% \begin{macrocode}
+ \setbox\z@\hbox{$#1#2\@empty{}\macc@skewchar$}%
+ \setbox\tw@\hbox{$#1#2\@empty\macc@skewchar$}%
+ \dimen@\tw@\wd\tw@ \advance\dimen@-\tw@\wd\z@
+ \xdef\macc@kerna{\the\dimen@\relax}%
+ \setbox4\hbox{$#1#2\acc@check\@empty$}%
+ \global\setbox\@ne\hbox to\wd4{}%
+ \ht\@ne\ht4 \dp\@ne\dp4
+ \xdef\macc@kernb{\the\wd4\relax}%
+ \mathaccent\macc@code{\box\@ne\kern\macc@kerna}%
+ \else
+ \mathaccent\macc@code{\let\macc@adjust\@empty #1#2\@empty}%
+ \macc@adjust
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\macc@adjust{%
+ \dimen@\macc@kerna\advance\dimen@\macc@kernb
+ \kern-\dimen@
+}
+% \end{macrocode}
+%
+% The commands \cs{Hat}, \cs{Tilde}, \ldots, are supported as
+% synonyms of \cs{hat}, \cs{tilde}, \ldots, for backward
+% compatibility.
+% \begin{macrocode}
+\def\Hat{\hat}
+\def\Check{\check}
+\def\Tilde{\tilde}
+\def\Acute{\acute}
+\def\Grave{\grave}
+\def\Dot{\dot}
+\def\Ddot{\ddot}
+\def\Breve{\breve}
+\def\Bar{\bar}
+\def\Vec{\vec}
+% \end{macrocode}
+%
+% This error message about math mode is used several times so we make
+% an abbreviation for it.
+% \begin{macrocode}
+\def\nonmatherr@#1{\@amsmath@err{\protect
+ #1 allowed only in math mode}\@ehd}
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Mods, continued fractions, etc.}
+%
+% \begin{macro}{\bmod}
+% \begin{macro}{\pmod}
+% \begin{macro}{\pod}
+% \begin{macro}{\mod}
+% The commands \cn{bmod}, \cn{pmod}, \cn{pod}, \cn{mod} aren't
+% currently robust. [mjd, 1994/09/05]
+% \begin{macrocode}
+\renewcommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
+ {\operator@font mod}\penalty900
+ \mkern5mu\nonscript\mskip-\medmuskip}
+\newcommand{\pod}[1]{\allowbreak
+ \if@display\mkern18mu\else\mkern8mu\fi(#1)}
+\renewcommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
+\newcommand{\mod}[1]{\allowbreak\if@display\mkern18mu
+ \else\mkern12mu\fi{\operator@font mod}\,\,#1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cfrac}
+% Continued fractions. The optional arg l or r controls horizontal
+% placement of the numerators. The |\kern-\nulldelimiterspace|
+% is needed in the definition if we want the right-hand sides of the
+% fraction rules to line up. The \cs{strut} keeps the numerator of
+% a subsidiary cfrac from coming too close to the fraction rule above
+% it.
+% \begin{macrocode}
+\newcommand{\cfrac}[3][c]{{\displaystyle\frac{%
+ \strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}%
+ \kern-\nulldelimiterspace}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\overset}
+% \begin{macro}{\underset}
+% \cn{overset} and \cn{underset} put symbols above, respectively
+% below, a symbol that is not a \cs{mathop} and therefore does not
+% naturally accept limits. \cs{binrel@@} uses information collected
+% by \cs{binrel@} to make the resulting construction be of type
+% mathrel or mathbin if the base symbol is either of those types.
+% \begin{macrocode}
+\newcommand{\overset}[2]{\binrel@{#2}%
+ \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\underset}[2]{\binrel@{#2}%
+ \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\overunderset}
+% This is the combination of the previous two commands which is
+% something that is sometimes needed.
+% \changes{v2.17c}{FMi}{New command \cs{overunderset}}
+% \begin{macrocode}
+\newcommand{\overunderset}[3]{\binrel@{#3}%
+ \binrel@@{\mathop{\kern\z@#3}\limits^{#1}_{#2}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sideset}
+% \cn{sideset} allows placing `adscript' symbols at the four
+% corners of a \cs{mathop}, \emph{in addition to} limits. Left-side
+% adscripts go into arg \arg{1}, in the form |_{...}^{...}|, and
+% right-side adscripts go into arg \arg{2}.
+%
+% As currently written [mjd, 1995/01/21] this is pretty haphazard.
+% In order to really make it work properly in full generality we'd
+% have to read and measure the top and bottom limits and use
+% mathchoice to always get the right mathstyle for each piece,
+% etc., etc.
+% \begin{macrocode}
+\newcommand{\sideset}[3]{%
+ \@mathmeasure\z@\displaystyle{#3}%
+% \end{macrocode}
+% Use a global box assignment here since the depth override is
+% implicitly global. Then move the constructed box to a local box
+% register (2) to ensure it won't get destroyed during the next two
+% mathmeasure statements. This precaution may be more extreme than
+% necessary in practice.
+% \begin{macrocode}
+ \global\setbox\@ne\vbox to\ht\z@{}\dp\@ne\dp\z@
+ \setbox\tw@\box\@ne
+ \@mathmeasure4\displaystyle{\copy\tw@#1}%
+ \@mathmeasure6\displaystyle{#3\nolimits#2}%
+ \dimen@-\wd6 \advance\dimen@\wd4 \advance\dimen@\wd\z@
+ \hbox to\dimen@{}\mathop{\kern-\dimen@\box4\box6}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\smash}
+% We add to the \cn{smash} command an optional argument
+% denoting the part of the formula to be smashed.
+% \changes{v2.17b}{2018/12/01}{Start LR-mode for \cs{smash}
+% if necessary (github/49)}
+% \begin{macrocode}
+\ifx\leavevmode@ifvmode\@undefined
+\renewcommand{\smash}[1][tb]{%
+ \def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
+ \edef\finsm@sh{\csname mb@#1\endcsname\z@\z@\box\z@}%
+ \ifmmode \@xp\mathpalette\@xp\mathsm@sh
+ \else \@xp\makesm@sh
+ \fi
+}
+\else
+\renewcommand{\smash}[1][tb]{%
+ \def\mb@t{\ht}\def\mb@b{\dp}\def\mb@tb{\ht\z@\z@\dp}%
+ \edef\finsm@sh{\csname mb@#1\endcsname\z@\z@ \leavevmode@ifvmode\box\z@}%
+ \ifmmode \@xp\mathpalette\@xp\mathsm@sh
+ \else \@xp\makesm@sh
+ \fi
+}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Extensible arrows}
+%
+% The minus sign used in constructing these arrow fills is smashed so
+% that superscripts above the arrows won't be too high. This
+% primarily affects the \cn{xleftarrow} and \cn{xrightarrow} arrows.
+%
+% \begin{macrocode}
+\mathchardef\std@minus\mathcode`\-\relax
+\mathchardef\std@equal\mathcode`\=\relax
+% \end{macrocode}
+% In case some alternative math fonts are loaded later:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \mathchardef\std@minus\mathcode`\-\relax
+ \mathchardef\std@equal\mathcode`\=\relax
+}
+% \end{macrocode}
+%
+% \begin{macro}{\relbar}
+% \begin{macro}{\Relbar}
+% \begin{macrocode}
+\ams@def\relbar{\mathrel{\mathpalette\mathsm@sh\std@minus}}
+\ams@def\Relbar{\mathrel\std@equal}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\def\arrowfill@#1#2#3#4{%
+ $\m@th\thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip
+ \relax#4#1\mkern-7mu%
+ \cleaders\hbox{$#4\mkern-2mu#2\mkern-2mu$}\hfill
+ \mkern-7mu#3$%
+}
+\def\leftarrowfill@{\arrowfill@\leftarrow\relbar\relbar}
+\def\rightarrowfill@{\arrowfill@\relbar\relbar\rightarrow}
+\def\leftrightarrowfill@{\arrowfill@\leftarrow\relbar\rightarrow}
+\def\Leftarrowfill@{\arrowfill@\Leftarrow\Relbar\Relbar}
+\def\Rightarrowfill@{\arrowfill@\Relbar\Relbar\Rightarrow}
+\def\Leftrightarrowfill@{\arrowfill@\Leftarrow\Relbar\Rightarrow}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\overarrow@#1#2#3{\vbox{\ialign{##\crcr#1#2\crcr
+ \noalign{\nointerlineskip}$\m@th\hfil#2#3\hfil$\crcr}}}
+\ams@renewcommand{\overrightarrow}{%
+ \mathpalette{\overarrow@\rightarrowfill@}}
+\ams@renewcommand{\overleftarrow}{%
+ \mathpalette{\overarrow@\leftarrowfill@}}
+\ams@newcommand{\overleftrightarrow}{%
+ \mathpalette{\overarrow@\leftrightarrowfill@}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\underarrow@#1#2#3{%
+ \vtop{\ialign{##\crcr$\m@th\hfil#2#3\hfil$\crcr
+ \noalign{\nointerlineskip\kern1.3\ex@}#1#2\crcr}}}
+\ams@newcommand{\underrightarrow}{%
+ \mathpalette{\underarrow@\rightarrowfill@}}
+\ams@newcommand{\underleftarrow}{%
+ \mathpalette{\underarrow@\leftarrowfill@}}
+\ams@newcommand{\underleftrightarrow}{%
+ \mathpalette{\underarrow@\leftrightarrowfill@}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
+\def\ext@arrow#1#2#3#4#5#6#7{%
+ \mathrel{\mathop{%
+% \end{macrocode}
+% Measure the superscript and subscript.
+% \begin{macrocode}
+ \setbox\z@\hbox{#5\displaystyle}%
+ \setbox\tw@\vbox{\m@th
+ \hbox{$\scriptstyle\mkern#3mu{#6}\mkern#4mu$}%
+ \hbox{$\scriptstyle\mkern#3mu{#7}\mkern#4mu$}%
+ \copy\z@
+ }%
+ \hbox to\wd\tw@{\unhbox\z@}}%
+% \end{macrocode}
+% We don't want to place an empty subscript since that will produce
+% too much blank space below the arrow.
+% \begin{macrocode}
+ \limits
+ \@ifnotempty{#7}{^{\if0#1\else\mkern#1mu\fi
+ #7\if0#2\else\mkern#2mu\fi}}%
+ \@ifnotempty{#6}{_{\if0#1\else\mkern#1mu\fi
+ #6\if0#2\else\mkern#2mu\fi}}}%
+}
+% \end{macrocode}
+%
+% Some extensible arrows to serve as mathrels and taking
+% sub/superscripts. These commands are robust because they take an
+% optional argument.
+% \begin{macrocode}
+\newcommand{\xrightarrow}[2][]{\ext@arrow 0359\rightarrowfill@{#1}{#2}}
+\newcommand{\xleftarrow}[2][]{\ext@arrow 3095\leftarrowfill@{#1}{#2}}
+% \end{macrocode}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Array-related environments}
+% \subsection{Remarks}
+%
+% Because these environments can be nested within the equation
+% structures that allow \cn{tag}, there is some cross-influence in
+% the internal workings of the \cn{\\} command.
+%
+% \subsection{The \env{subarray} environment and \cn{substack} command}
+%
+% The \cn{substack} command can be used to set subscripts
+% and superscripts that consist of several lines. Usage:
+% \begin{verbatim}
+% X_{\substack{a=1\\b=2}}
+% \end{verbatim}
+%
+% \changes{v2.0}{1999/06/17}{Removed environment definitions: Sb, Sp}
+%
+% \begin{environment}{subarray}
+% The \env{subarray} environment makes a small-size array suitable
+% for use in a subscript or superscript. At the moment the supported
+% arguments are not the full possibilities of \env{array} but only
+% |c| or |l| for centered or left-aligned. And only one column.
+% \begin{macrocode}
+\newenvironment{subarray}[1]{%
+% \end{macrocode}
+% Note: The predecessors of \env{subarray} (\env{Sb} and \env{Sp},
+% inherited from \amstex/) used \cs{vbox} instead of \cs{vcenter}.
+% But when a multiline subscript is placed in \cs{limits} position
+% \cs{vcenter} is no worse than \cs{vbox}, and when it is placed
+% in the \cs{nolimits} position (e.g., for an integral), \cs{vcenter}
+% provides clearly better positioning than \cs{vbox}.
+% \begin{macrocode}
+ \vcenter\bgroup
+% \end{macrocode}
+% Use \cs{Let@} to set the proper meaning of the \cn{\\} and \cn{\\*}
+% commands. And restore the meaning of \cs{math@cr@@@} to \cs{cr}
+% (see above) in case \env{subarray} is used inside one of the more
+% complicated alignment macros where the meaning of \cs{math@cr@@@}
+% is different. Similarly, call \cs{default@tag} to ensure that a
+% line break here doesn't get an equation number!
+% \begin{macrocode}
+ \Let@ \restore@math@cr \default@tag
+% \end{macrocode}
+% Set the line spacing to be the same as \cs{atop} (when \cs{atop}
+% occurs in \cs{textstyle} or smaller), cf \textit{The \tex/book},
+% Appendix G.
+% \begin{macrocode}
+ \baselineskip\fontdimen10 \scriptfont\tw@
+ \advance\baselineskip\fontdimen12 \scriptfont\tw@
+ \lineskip\thr@@\fontdimen8 \scriptfont\thr@@
+ \lineskiplimit\lineskip
+% \end{macrocode}
+% Start the \cs{vbox} \cs{halign} structure that encloses the
+% contents. Notice that we never get \cs{scriptscriptstyle}. That
+% would require a \cs{mathchoice} (ugh).
+% \begin{macrocode}
+ \ialign\bgroup\ifx c#1\hfil\fi
+ $\m@th\scriptstyle##$\hfil\crcr
+}{%
+ \crcr\egroup\egroup
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\substack}
+% The \cn{substack} command is just an abbreviation for the
+% most common use of \env{subarray}.
+% \begin{macrocode}
+\newcommand{\substack}[1]{\subarray{c}#1\endsubarray}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Matrices}
+%
+% \begin{environment}{smallmatrix}
+% \env{smallmatrix} is again an alignment, this time in a centered
+% box. The opening incantations are basically the same as those in
+% \cs{multilimits@}, followed by the alignment itself. A remark:
+% the baselineskip (|9\ex@|) used in \amstex/ is too large for
+% use in text with the usual baselineskip of $12$ or $13$ points; we
+% change it here to |6\ex@| and also adjust the \cs{lineskip}
+% and \cs{lineskiplimit} slightly to compensate. (MJD)
+% \begin{macrocode}
+\newenvironment{smallmatrix}{\null\,\vcenter\bgroup
+ \Let@\restore@math@cr\default@tag
+ \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip
+ \ialign\bgroup\hfil$\m@th\scriptstyle##$\hfil&&\thickspace\hfil
+ $\m@th\scriptstyle##$\hfil\crcr
+}{%
+ \crcr\egroup\egroup\,%
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{matrix}
+% The \env{matrix} environment is just an \env{array} that provides
+% up to ten centered columns, so that users don't have to give the
+% col-spec argument explicitly---unless they want some of the columns
+% noncentered, that is. The maximum number of columns is actually not
+% fixed at ten but given by the counter |MatrixCols|, and can
+% therefore be increased by changing that counter.
+%
+% The extra space of \cn{arraycolsep} that \env{array} adds on each
+% side is a waste so we remove it here (perhaps we should instead
+% remove it from \env{array} in general, but that's a harder task).
+%
+% TODO: Think about re-implementing \cn{matrix} to get rid of the
+% \cs{c@MatrixCols} limit and have hard-wired preamble that doesn't
+% have to be rebuilt each time.
+%
+% We must use \cn{renewenvironment} for \env{matrix} and
+% \env{pmatrix} because \latex/ doesn't kill the definitions found in
+% \fn{plain.tex}, even though it probably should because of their
+% foreign syntax.
+% \begin{macrocode}
+\renewenvironment{matrix}{%
+ \matrix@check\matrix\env@matrix
+}{%
+ \endarray \hskip -\arraycolsep
+}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{macro}{\env@matrix}
+%
+% \begin{macrocode}
+\def\env@matrix{\hskip -\arraycolsep
+ \let\@ifnextchar\new@ifnextchar
+ \array{*\c@MaxMatrixCols c}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@MaxMatrixCols}
+% \begin{macrocode}
+\newcount\c@MaxMatrixCols \c@MaxMatrixCols=10
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\matrix@check}
+% For various reasons, authors sometimes use the Plain \TeX{} form of
+% \cn{matrix} or \cn{pmatrix} in \LaTeX{} documents. If they later
+% add an invocation of the \pkg{amsmath} package to their document,
+% the Plain \TeX{} syntax would lead to rather unintelligible error
+% messages. The \cs{matrix@check} function does some checking to
+% forestall that problem.
+% \begin{macrocode}
+\def\matrix@check#1{%
+ \@xp\ifx\csname\@currenvir\endcsname#1%
+ \else\matrix@error#1%
+% \end{macrocode}
+% This error recovery is not that good but is better than the
+% infinite loop that can result from calling \cs{array} without a
+% matching \cs{endarray}. (The array setup leaves \cs{par} empty.)
+% \begin{macrocode}
+ \@xp\@gobble
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\matrix@error}
+%
+% \begin{macrocode}
+\def\matrix@error#1{%
+ \@amsmath@err{%
+Old form `\string#1' should be \string\begin{\@xp\@gobble\string#1}%
+ }{%
+`\string#1{...}' is old Plain-TeX syntax whose use is
+ill-advised in LaTeX.%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\renewenvironment{pmatrix}{%
+ \left(%
+ \matrix@check\pmatrix\env@matrix
+}{
+ \endmatrix\right)%
+}
+\newenvironment{bmatrix}{\left[\env@matrix}{\endmatrix\right]}
+\newenvironment{Bmatrix}{%
+ \left\lbrace\env@matrix
+}{%
+ \endmatrix\right\rbrace
+}
+\newenvironment{vmatrix}{\left\lvert\env@matrix}{\endmatrix\right\rvert}
+\newenvironment{Vmatrix}{\left\lVert\env@matrix}{\endmatrix\right\rVert}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\hdots\@ldots
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\hdotsfor}[1]{%
+ \ifx[#1\@xp\shdots@for\else\hdots@for\@ne{#1}\fi}
+\newmuskip\dotsspace@
+\def\shdots@for#1]{\hdots@for{#1}}
+\def\hdots@for#1#2{\multicolumn{#2}c%
+ {\m@th\dotsspace@1.5mu\mkern-#1\dotsspace@
+ \xleaders\hbox{$\m@th\mkern#1\dotsspace@.\mkern#1\dotsspace@$}%
+ \hfill
+ \mkern-#1\dotsspace@}%
+ }
+% \end{macrocode}
+%
+% \begin{environment}{cases}
+% The easiest way to produce the \env{cases} environment is to base
+% it on the \env{array} environment. We must use
+% \cn{renewenvironment} to override the definition of \cn{cases} that
+% \latex/ (unwisely) leaves in place from \fn{plain.tex}.
+% \begin{macrocode}
+\renewenvironment{cases}{%
+ \matrix@check\cases\env@cases
+}{%
+ \endarray\right.%
+}
+\def\env@cases{%
+ \let\@ifnextchar\new@ifnextchar
+ \left\lbrace
+ \def\arraystretch{1.2}%
+ \array{@{}l@{\quad}l@{}}%
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Equation sub-numbering}
+%
+% \begin{macrocode}
+\newcounter{parentequation}% Counter for ``parent equation''.
+% \end{macrocode}
+%
+% We can't assume \cs{ignorespacesafterend} is defined since it was
+% not there in the earliest releases of \latex/ 2e. And we need to
+% include the \cs{global} for the same reason.
+% \begin{macrocode}
+\@ifundefined{ignorespacesafterend}{%
+ \def\ignorespacesafterend{\global\@ignoretrue}%
+}{}
+% \end{macrocode}
+%
+% \begin{environment}{subequations}
+% \begin{macrocode}
+\newenvironment{subequations}{%
+% \end{macrocode}
+% Before sending down the `equation' counter to the subordinate
+% level, add 1 using standard \cn{refstepcounter}.
+% \begin{macrocode}
+ \refstepcounter{equation}%
+% \end{macrocode}
+% Define \cn{theparentequation} equivalent to current
+% \cn{theequation}. \cn{edef} is necessary to expand the current
+% value of the equation counter. This might in rare cases cause
+% something to blow up, in which case the user needs to add
+% \cn{protect}.
+% \begin{macrocode}
+ \protected@edef\theparentequation{\theequation}%
+ \setcounter{parentequation}{\value{equation}}%
+% \end{macrocode}
+% And set the equation counter to 0, so that the normal incrementing
+% processes in the various equation environments will produce the
+% desired results.
+% \begin{macrocode}
+ \setcounter{equation}{0}%
+ \def\theequation{\theparentequation\alph{equation}}%
+ \ignorespaces
+}{%
+ \setcounter{equation}{\value{parentequation}}%
+ \ignorespacesafterend
+}
+% \end{macrocode}
+% \end{environment}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Equation numbering}
+%
+% In the multiline equation environments provided here, the task
+% of equation numbering is linked to the task of line breaking
+% in the sense that it is the \cn{\\} command that marks where an
+% equation number for the current line will be processed and added to
+% the page.
+%
+% \begin{macro}{\numberwithin}
+% Provide a convenient way to specify that equations should be
+% numbered within sections.
+% \begin{macrocode}
+\newcommand{\numberwithin}[3][\arabic]{%
+ \@ifundefined{c@#2}{\@nocounterr{#2}}{%
+ \@ifundefined{c@#3}{\@nocnterr{#3}}{%
+ \@addtoreset{#2}{#3}%
+ \@xp\xdef\csname the#2\endcsname{%
+ \@xp\@nx\csname the#3\endcsname .\@nx#1{#2}}}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eqref}
+% To make references to equation numbers easier, we provide
+% \cn{eqref}. We almost don't need \cn{textup}, except that
+% \cs{tagform@} doesn't supply the italic correction.
+% \begin{macrocode}
+\newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Preliminary macros}
+%
+% The following macros implement the \latex/ syntax for the
+% \cn{\\} command, i.e. the possibility to add an asterisk to
+% inhibit a page break, or an optional argument to denote additional
+% vertical space. They are modelled more or less after the
+% corresponding macros for \latex/'s \env{eqnarray} and \env{array}
+% environments.
+%
+% [We can perhaps use the eqnarray mechanism if we change it so that
+% it also uses \cs{openup}.]
+%
+% \begin{macro}{\dspbrk@lvl}
+% We begin by defining the \cs{dspbrk@lvl} counter. This counter
+% records the desirability of a break after the current row, as a
+% number between $0$ and $4$. Its default value is $-1$ meaning that
+% no explicit \cn{displaybreak} command was given, and the default
+% \cs{interdisplaylinepenalty} is to be used.
+% \begin{macrocode}
+\newcount\dspbrk@lvl
+\dspbrk@lvl=-1
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\interdisplaylinepenalty}
+% We set the \cs{interdisplaylinepenalty} to $10000$.
+% \begin{macrocode}
+\interdisplaylinepenalty\@M
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\allowdisplaybreaks}
+% The \cn{allowdisplaybreaks} command. Since this is intended for use
+% outside displayed formulas (typically in the preamble), it does not
+% need to use \cs{new@ifnextchar}.
+% \begin{macrocode}
+\newcommand{\allowdisplaybreaks}[1][4]{%
+ \interdisplaylinepenalty\getdsp@pen{#1}\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\getdsp@pen}
+% Modelled after \latex/'s \cs{@getpen}. We use higher numbers
+% than would normally be provided by \cs{@lowpenalty},
+% \cs{@medpenalty}, and \cs{@highpenalty}, since display
+% breaks are almost always less desirable.
+% \begin{macrocode}
+\def\getdsp@pen#1{%
+ \ifcase #1\@M \or 9999 \or 6999 \or 2999 \or \z@\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\displaybreak}
+% \begin{macro}{\dspbrk@}
+% \begin{macro}{\dspbrk@context}
+% \begin{macro}{\nogood@displaybreak}
+% For breaks in a certain row of a alignment.
+% \begin{macrocode}
+\newcommand{\displaybreak}{\new@ifnextchar[\dspbrk@{\dspbrk@[4]}}
+\chardef\dspbrk@context=\sixt@@n
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\dspbrk@[#1]{%
+ \ifmeasuring@
+ \else
+ \ifcase\dspbrk@context % case 0 --- OK
+ \global\dspbrk@lvl #1\relax
+ \or % case 1 --- inside a box
+ \nogood@displaybreak
+ \else % other cases --- outside of a display
+ \@amsmath@err{\Invalid@@\displaybreak}\@eha
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% This is the value of \cn{displaybreak} when it occurs inside some
+% structure where it will not work.
+% \begin{macrocode}
+\def\nogood@displaybreak{%
+ \@amsmath@err{\protect
+\displaybreak\space cannot be applied here}%
+{One of the enclosing environments creates an
+ unbreakable box\MessageBreak
+(e.g., split, aligned, gathered, ...).}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\math@cr}
+% The macro \cs{math@cr} ends a row inside one of the equation
+% environments, i.e., this is the internal name of the \cn{\\}
+% commands in these environments. As usual for this kind of macro
+% inside of alignments we insert a special brace into \tex/'s input
+% stream. The initial \cs{relax} is needed to trigger entry into the
+% \textit{u} template of the current column if the author ended the
+% current row with an empty column (i.e., the mathcr was immediately
+% preceded by an ampersand).
+% \begin{macrocode}
+\def\math@cr{\relax\iffalse{\fi\ifnum0=`}\fi
+% \end{macrocode}
+% The first step is now to check whether an asterisk follows.
+% \cs{@eqpen} is used to hold the penalty value to be put on
+% the vertical list.
+% Then we call up \cs{math@cr@} which performs the next step.
+% If an asterisk is read page breaking is inhibited.
+% \begin{macrocode}
+ \@ifstar{\global\@eqpen\@M\math@cr@}%
+% \end{macrocode}
+% Otherwise we have to check the \cs{dspbrk@lvl} value.
+% \begin{macrocode}
+ {\global\@eqpen
+ \ifnum\dspbrk@lvl <\z@ \interdisplaylinepenalty
+ \else -\@getpen\dspbrk@lvl \fi
+ \math@cr@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@}
+% The purpose of \cs{math@cr@} is to check whether an optional
+% argument follows. If not it provides \cs{z@} as default
+% value.
+% \begin{macrocode}
+\def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@}
+% \cs{math@cr@@} closes the special brace opened in
+% \cs{math@cr}, and calls \cs{math@cr@@@} which is supposed
+% the `real' row ending command. The meaning of this macro depends
+% on the environment in which it is used.
+% \begin{macrocode}
+\def\math@cr@@[#1]{\ifnum0=`{\fi \iffalse}\fi\math@cr@@@
+% \end{macrocode}
+% Finally we put the additional space onto the vertical list.
+% \begin{macrocode}
+ \noalign{\vskip#1\relax}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Let@}
+% \cs{Let@} is called by all environments where \cn{\\}
+% ends a row of an alignment.
+% \begin{macrocode}
+\def\Let@{\let\\\math@cr}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\restore@math@cr}
+% We mentioned already that the exact meaning of \cs{math@cr@@@}
+% depends on the current environment. Since it is often a simple
+% \cs{cr} we provide \cs{restore@math@cr} to reset it.
+% \begin{macrocode}
+\def\restore@math@cr{\def\math@cr@@@{\cr}}
+% \end{macrocode}
+% This is also the default case.
+% \begin{macrocode}
+\restore@math@cr
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intertext}
+% \begin{macro}{\intertext@}
+% The \cn{intertext} command is used for inserting text between the
+% rows of an alignment. It might better be done as an environment,
+% but the \cs{begingroup} from \cn{begin} would cause the
+% \cs{noalign} to fail.
+% \begin{macrocode}
+\newcommand{\intertext}{\@amsmath@err{\Invalid@@\intertext}\@eha}
+% \end{macrocode}
+% \cs{intertext@} is called by all environments that allow the use of
+% the \cn{intertext} command.
+% \begin{macrocode}
+\def\intertext@{%
+ \def\intertext##1{%
+% \end{macrocode}
+% If current mode is not vmode, the most likely reason is that the
+% writer forgot the \cn{\\} that is supposed to precede
+% \cn{intertext}. All right, then, let's try adding it our ownself.
+% But, to be slightly careful: \cn{\\} does a futurelet, and it's
+% slightly dangerous to allow a letted token to barge around loose in
+% our internal code when it has been let to a conditional token
+% like \cs{fi}. So let's interpose something in front of the \cs{fi}
+% for the futurelet to take instead. (And careful again: it has to be
+% something evanescent, not (e.g.) \cs{relax} which would cause the
+% next halign cell to fire up and keep \cs{noalign} from working.)
+% \begin{macrocode}
+ \ifvmode\else\\\@empty\fi
+ \noalign{%
+ \penalty\postdisplaypenalty\vskip\belowdisplayskip
+ \vbox{\normalbaselines
+% \end{macrocode}
+% We need to do something extra if the outside environment is a list
+% environment. I don't see offhand an elegant way to test ``are we
+% inside any list environment'' that is both easy and reliable (for
+% example, checking for zero \cs{@totalleftmargin} wouldn't catch the
+% case where \cs{@totalleftmargin} is zero but \cs{linewidth} is less
+% than \cs{columnwidth}), so it seems to me checking \cs{linewidth}
+% is the best practical solution.
+% \changes{v2.15c}{2016/05/23}{\cs{ignorespaces} at the start of the argument}
+% \begin{macrocode}
+ \ifdim\linewidth=\columnwidth
+ \else \parshape\@ne \@totalleftmargin \linewidth
+ \fi
+ \noindent\ignorespaces##1\par}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip%
+ }%
+}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Implementing tags and labels}
+%
+% In this section we describe some of the macros needed to make the
+% \cn{tag} command work in various places. We start by defining a
+% help text to be used when a \cn{tag} command is used somewhere
+% it should not appear.
+%
+% \begin{macro}{\tag@help}
+% This is the default error help text provided when \cn{tag}
+% generates an error message.
+% Note that \cs{newhelp} generates a control sequence name
+% from the string given as its argument so that a leading
+% backslash is provided automatically.
+% \begin{macrocode}
+\newhelp\tag@help
+ {tag cannot be used at this point.\space
+ If you don't understand why^^Jyou should consult
+ the documentation.^^JBut don't worry: just continue, and I'll
+ forget what happened.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\gobble@tag}
+% This macro is to be used when \cn{tag} should silently
+% skip its argument.
+% It is made to handle the \qc{\*}-form of \cn{tag} as well.
+% \begin{macrocode}
+\def\gobble@tag{\@ifstar\@gobble\@gobble}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\invalid@tag}
+% \cs{invalid@tag} is a macro that should be used whenever
+% \cn{tag} appears in an illegal place.
+% It sets up \cs{tag@help} (as defined above) as help message,
+% prints its argument as error message, and skips \cn{tag}'s
+% argument.
+% \begin{macrocode}
+\def\invalid@tag#1{\@amsmath@err{#1}{\the\tag@help}\gobble@tag}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\dft@tag}
+% \begin{macro}{\default@tag}
+% \cs{dft@tag} provides a convenient way to disallow the
+% use of \cn{tag} at certain points.
+% One simply has to write
+% \begin{verbatim}
+%\let\tag\dft@tag
+% \end{verbatim}
+% and the \cn{tag} command will produce an error message,
+% with a suitable error help text, and discard its argument.
+% \begin{macrocode}
+\def\dft@tag{\invalid@tag{\string\tag\space not allowed here}}
+% \end{macrocode}
+% Since this is used several times we provide an abbreviation for
+% it.
+% \begin{macrocode}
+\def\default@tag{\let\tag\dft@tag}
+% \end{macrocode}
+% Since this is also the default, i.e.\ the \cn{tag} command
+% should not be used except in special places, we issue a
+% \cs{default@tag} command.
+% \begin{macrocode}
+\default@tag
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now that we have taken care of the case that \cn{tag} is not
+% allowed we will provide some macros to process tags appropriately.
+% As the user documentation states, a \cn{tag} command (without
+% the asterisk typesets its argument according to the document
+% styles' conventions, whereas a \cn{tag*} command typesets its
+% argument exactly as given. We define therefore the following
+% interface:
+%
+% \begin{macro}{\maketag@@}
+% \begin{macro}{\maketag@@@}
+% \begin{macro}{\tagform@}
+% \cn{tag} is supposed to call \cs{maketag@@} which checks
+% whether an asterisk follows. If this is the case it calls up
+% \cs{maketag@@@} which sets its argument `as is'. Otherwise
+% \cs{tagform@} is called to do the job. (This macro is to be
+% defined appropriately by the document style.)
+% \begin{macrocode}
+\def\maketag@@{\@ifstar\maketag@@@\tagform@}
+% \end{macrocode}
+% We define \cs{maketag@@@} to use the normal font of the document
+% text (since this is the usual practice for numbering of document
+% elements) and to put a box around the tag. Furthermore we use
+% \cs{m@th} for exceptional cases where the tag involves a
+% superscript or some such math. (Probably from an explicit use of
+% \cs{tag*} rather than from the automatic numbering.)
+% \begin{macrocode}
+\def\maketag@@@#1{\hbox{\m@th\normalfont#1}}
+% \end{macrocode}
+% We use the following default definition for \cs{tagform@}
+% that puts only parentheses around the tag.
+% \begin{macrocode}
+\def\tagform@#1{\maketag@@@{(\ignorespaces#1\unskip\@@italiccorr)}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% We need to insinuate \cs{tagform@} into \cs{@eqnnum} in case
+% \env{eqnarray} is used (probably in a document that was originally
+% written without use of the \pkg{amsmath} package).
+% \begin{macrocode}
+\iftagsleft@
+ \def\@eqnnum{\hbox to1sp{}\rlap{\normalfont\normalcolor
+ \hskip -\displaywidth\tagform@\theequation}}
+\else
+ \def\@eqnnum{{\normalfont\normalcolor \tagform@\theequation}}
+\fi
+% \end{macrocode}
+%
+% \begin{macro}{\thetag}
+% Sometimes one needs to set a literal tag according to the rules of
+% the document style. To achieve this we provide the \cn{thetag}
+% command. It typesets its argument by calling \cs{tagform@} on
+% it.
+% \begin{macrocode}
+\newcommand{\thetag}{\leavevmode\tagform@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\df@tag}
+% \begin{macro}{\make@df@tag}
+% \begin{macro}{\make@df@tag@@}
+% \begin{macro}{\make@df@tag@@@}
+% Sometimes it is necessary for a \cn{tag} command to store a tag
+% in a safe place and to process it later, e.g., for a tag in a row
+% of an alignment where the tag can only be typeset when the
+% \cn{\\} at the end of the row was seen. Such a tag is stored in
+% the macro \cs{df@tag} (for `deferred tag'). For this purpose we
+% provide the \cs{make@df@tag} macro. It is built very similar to
+% the \cs{maketag@@} macro above.
+% \begin{macrocode}
+\let\df@tag\@empty
+\def\make@df@tag{\@ifstar\make@df@tag@@\make@df@tag@@@}
+% \end{macrocode}
+% \cs{make@df@tag} sets \cs{@currentlabel} and defines
+% \cs{df@tag} appropriately.
+%
+% To simplify the task of tracking \cs{tag} and \cs{label}
+% commands inside math display environments, we defer \cs{label}
+% commands until the tag is typeset, similar to the way that
+% \cs{tag}s themselves are deferred. This allows arbitrary
+% placement of \cs{label} and \cs{tag} commands and also means we
+% only increment the \cs{equation} counter when we really need to,
+% thus avoiding the \cs{setb@ck} nonsense that used to be required.
+%
+% \begin{macrocode}
+\def\make@df@tag@@#1{%
+ \gdef\df@tag{\maketag@@@{#1}\def\@currentlabel{#1}}}
+% \end{macrocode}
+% Autogenerated number:
+% \begin{macrocode}
+\def\make@df@tag@@@#1{\gdef\df@tag{\tagform@{#1}%
+ \toks@\@xp{\p@equation{#1}}\edef\@currentlabel{\the\toks@}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ltx@label}
+% \begin{macro}{\label@in@display}
+% \begin{macro}{\df@label}
+% Next, we store the default definition of \cs{label} in
+% \cs{ltx@label} and then define a new version of \cs{label} for use
+% in math display environments. \cs{label@in@display} merely issues a
+% warning message if there is already a pending label (which will be
+% discarded) and then stores the label in \cs{df@label}.
+% \begin{macrocode}
+\let\ltx@label\label
+%
+\def\label@in@display{%
+ \ifx\df@label\@empty\else
+ \@amsmath@err{Multiple \string\label's:
+ label '\df@label' will be lost}\@eha
+ \fi
+ \gdef\df@label
+}
+% \end{macrocode}
+% In case there is an enumerate inside a minipage inside an equation,
+% we need to reset \cn{label} to its normal value:
+% \begin{macrocode}
+\toks@\@xp{\@arrayparboxrestore \let\label\ltx@label}%
+\edef\@arrayboxrestore{\the\toks@}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\df@label\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\make@display@tag}
+% Now we define a macro to process \cs{tag} and \cs{label} commands
+% in various display environments. If the |@eqnsw| switch is set,
+% then we should supply an equation number; otherwise, if the
+% |@tag| switch is set, we should use the tag stored in
+% \cs{df@tag}. Finally, we process any pending \cs{label}s.
+%
+% TODO: Arguably, \cs{make@display@tag} should issue a warning
+% message if there is a \cs{label} but neither a tag nor an
+% equation number. Also, it would probably be worthwhile to
+% explore whether \cs{iftag@} could be done away with and replaced
+% by checks to see if \cs{df@tag} is empty or not.
+% \begin{macrocode}
+\def\make@display@tag{%
+ \if@eqnsw \incr@eqnum \print@eqnum
+ \else \iftag@ \df@tag \global\let\df@tag\@empty \fi
+ \fi
+% \end{macrocode}
+% Need to check the \cs{ifmeasuring@} flag otherwise the \cs{write}
+% node from \cn{label} might be discarded in a temp box and clearing
+% \cs{df@label} will keep it from being reiterated on the real
+% typesetting pass.
+% \begin{macrocode}
+ \ifmeasuring@
+ \else
+ \ifx\df@label\@empty
+ \else
+ \@xp\ltx@label\@xp{\df@label}%
+ \global\let\df@label\@empty
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now we define the special versions of \cn{tag} used within the
+% \env{align} environments.
+%
+% \begin{macro}{\tag@in@align}
+% The \cn{tag} command may only appear once in a row of
+% an alignment. Therefore we first check the switch |tag@|
+% that is set to false at the begin of every row.
+% If this switch is true a \cn{tag} was already given in this
+% row and we define \cs{next@} to expand to a call to
+% \cs{invalid@tag}.
+% \begin{macrocode}
+\def\tag@in@align{%
+ \relax
+ \iftag@
+ \DN@{\invalid@tag{Multiple \string\tag}}%
+ \else
+% \end{macrocode}
+% Otherwise we set the |tag@| switch. But there is more to
+% be done: we must also prevent the automatic generation of a
+% tag. Therefore we also reset the |@eqnsw|.
+% \begin{macrocode}
+ \global\tag@true
+% \end{macrocode}
+% Changed to \cs{nonumber}, since that seems to be all that's
+% required.---dmj, 1994/12/21
+% \begin{macrocode}
+ \nonumber
+% \end{macrocode}
+% Within a row of an \env{align} environment the \cn{tag}
+% command must not typeset the tag immediately since its
+% position can be determined only later.
+% Therefore we use the \cs{make@df@tag} macro defined
+% earlier.
+% Finally we call \cs{next@} to process the argument
+% that follows.
+% \begin{macrocode}
+ \let\next@\make@df@tag
+ \fi
+ \next@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\raisetag}
+% Usage: \cn{raisetag} \meta{dimen}
+%
+% This will modify the vertical placement of the tag of the current
+% equation by \meta{dimen}. Note that according to the current uses
+% of \cs{raise@tag} in e.g., \cs{place@tag@gather}, no adjustment
+% occurs if the tag falls in its normal position; i.e., \cn{raisetag}
+% has no effect unless the tag has already been shifted off-line.
+%
+% \begin{macrocode}
+\newcommand{\raisetag}[1]{\skip@#1\relax
+ \xdef\raise@tag{\vskip\iftagsleft@\else-\fi\the\skip@\relax}%
+}
+% \end{macrocode}
+% \cn{raise@tag} will be reemptied at the beginning of each equation,
+% which might occur at a |\begin{xxx}| or \cn{\\}.
+% \begin{macrocode}
+\let\raise@tag\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\notag}
+% For consistency we provide \cn{notag}, equivalent to
+% \cn{nonumber}. The alternative would have been to rename
+% \cn{tag} as \cn{number} to go along with \cn{nonumber},
+% but of course \cs{number} is a \tex/ primitive that should not
+% be redefined.
+% \begin{macrocode}
+\newcommand{\notag}{\nonumber}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\nonumber}
+% Need to add some additional code to \cn{nonumber} to deal with some
+% complications related to nested environments.
+% \begin{macrocode}
+\renewcommand{\nonumber}{%
+ \if@eqnsw
+ \ifx\incr@eqnum\@empty \addtocounter{equation}\m@ne \fi
+ \fi
+ \let\print@eqnum\@empty \let\incr@eqnum\@empty
+ \global\@eqnswfalse
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\print@eqnum{\tagform@\theequation}
+\def\incr@eqnum{\refstepcounter{equation}\let\incr@eqnum\@empty}
+% \end{macrocode}
+% \end{macro}
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% \section{Multiline equation environments}
+%
+% \subsection{Remarks}
+%
+% In late 1994 David M. Jones did a thorough overhaul of these
+% environments so that the number placement and a few other aspects
+% are substantially improved over the original versions that were
+% ported essentially unchanged from \fn{amstex.tex} in 1989. Most of
+% the commentary in this section is DMJ's, and comments of any
+% significance that I added are marked by my initials and date
+% [mjd, 1995/01/11].
+%
+% \subsection{Preliminaries}
+%
+% \begin{macro}{\ifinalign@}
+% \begin{macro}{\ifingather@}
+% We define two switches that are set to true in certain
+% alignments: |inalign@| and |ingather@| inside of
+% the \env{align} and \env{gather} environments.
+% These switches are needed to control certain actions that
+% depend on the surrounding conditions, more specifically:
+% on the setting already done by the surrounding environments.
+% \begin{macrocode}
+\newif\ifinalign@
+\newif\ifingather@
+% \end{macrocode}
+% \begin{histnote}
+% Removed the \cs{ifinany@} test [mjd,1999/06/28] since it was mainly
+% used for the purpose now handled by \cs{spread@equation}.
+% \changes{v1.2g}{1999/06/28}{Removed ifinany@}
+% \end{histnote}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@arrayparboxrestore}
+% Here we must reset a few additional parameters.
+% \begin{macrocode}
+\@xp\def\@xp\@arrayparboxrestore\@xp{\@arrayparboxrestore
+ \ingather@false\inalign@false \default@tag
+ \let\spread@equation\@spread@equation
+ \let\reset@equation\@empty
+ \def\print@eqnum{\tagform@\theequation}%
+ \def\incr@eqnum{\refstepcounter{equation}\let\incr@eqnum\@empty}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\iftag@}
+% The switch |tag@| is set to false at the beginning of every
+% row and set to true by a \cn{tag} command.
+% This allows us to check whether there is more than one tag on
+% a row.
+% \begin{macrocode}
+\newif\iftag@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifst@rred}
+% The switch |st@rred| is set to true by all starred
+% environments
+% and set to false by the unstarred versions.
+% \begin{macrocode}
+\newif\ifst@rred
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifmeasuring@}
+% All display environments get typeset twice---once during a
+% ``measuring'' phase and then again during a ``production'' phase;
+% \cs{ifmeasuring@} will be used to determine which case we're in,
+% so we can take appropriate action.
+%
+% \begin{macrocode}
+\newif\ifmeasuring@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifshifttag@}
+% \cs{ifshifttag@} is used by \env{gather} to communicate between
+% \cs{calc@shift@gather} and \cs{place@tag@gather} whether an
+% equation tag should be shifted to a separate line. It's also
+% used by \env{multline}.
+% \begin{macrocode}
+\newif\ifshifttag@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\row@}
+% \begin{macrocode}
+\newcount\row@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\column@}
+% The counter \cs{column@} is used by the alignment macros to
+% keep track of the current column.
+%
+% \begin{macrocode}
+\newcount\column@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\column@plus}
+% \cs{\column@plus} is a useful abbreviation.
+% \begin{macrocode}
+\def\column@plus{%
+ \global\advance\column@\@ne
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maxfields@}
+% \begin{macrocode}
+\newcount\maxfields@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\add@amp}
+% \begin{macro}{\add@amps}
+% \begin{macrocode}
+\def\add@amp#1{\if m#1&\@xp\add@amp\fi}
+\def\add@amps#1{%
+ \begingroup
+ \count@#1\advance\count@-\column@
+ \edef\@tempa{\endgroup
+ \@xp\add@amp\romannumeral\number\count@ 000q}%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\andhelp@}
+% The help text stored in \cs{andhelp@} is used for errors
+% generated by too many \qc{\&} characters in a row.
+% \begin{macrocode}
+\newhelp\andhelp@
+{An extra & here is so disastrous that you should probably exit^^J
+and fix things up.}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\eqnshift@}
+% \cs{eqnshift@} is used by \env{align} and \env{gather} as the
+% indentation of the lines of the environment from the left margin.
+% \begin{macrocode}
+\newdimen\eqnshift@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\alignsep@}
+% \begin{macrocode}
+\newdimen\alignsep@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tagshift@}
+% \begin{macrocode}
+\newdimen\tagshift@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mintagsep}
+% \cs{mintagsep} is the minimum allowable separation between an
+% equation and its tag. We set it to half a quad in
+% \cs{textfont}2, which is \tex/'s built-in value.
+% \begin{macrocode}
+\newcommand{\mintagsep}{.5\fontdimen6\textfont\tw@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\minalignsep}
+% This should probably be a skip register [mjd,1999/06/18]
+% \begin{macrocode}
+\newcommand{\minalignsep}{10pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tagwidth@}
+% \begin{macrocode}
+\newdimen\tagwidth@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\totwidth@}
+% \begin{macrocode}
+\newdimen\totwidth@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lineht@}
+% The dimen register \cs{lineht@} is used to keep track of the
+% height (or depth, if tags are on the right) of a row in an
+% alignment.
+% \begin{macrocode}
+\newdimen\lineht@
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tag@width}
+% \begin{macro}{\savetaglength@}
+% \begin{macro}{\shift@tag}
+% \begin{macro}{\tag@shifts}
+% \begin{macrocode}
+\def\tag@width#1{%
+ \ifcase\@xp#1\tag@lengths\fi
+}
+
+\def\savetaglength@{%
+ \begingroup
+ \let\or\relax
+ \xdef\tag@lengths{\tag@lengths\or \the\wdz@}%
+ \endgroup
+}
+
+\def\shift@tag#1{%
+ \ifcase\@xp#1\tag@shifts\fi\relax
+}
+
+\let\tag@shifts\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\saveshift@}
+% \begin{macrocode}
+\def\saveshift@#1{%
+ \begingroup
+ \let\or\relax
+ \xdef\tag@shifts{\or#1\tag@shifts}%
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\spread@equation}
+% This does the line-spacing adjustment that is normally wanted for
+% displayed equations. We also call \cs{reset@strutbox@} here because
+% otherwise a preceding font size change might leave \cs{strutbox@}
+% with wrong contents. This is a less-than-ideal solution but
+% probably good enough for now, until the situation can be
+% overhauled.
+% \begin{macrocode}
+\def\spread@equation{\reset@strutbox@
+ \openup\jot \let\spread@equation\@empty}
+\let\@spread@equation\spread@equation
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\displ@y}
+% \begin{macro}{\displ@y@}
+% \begin{macro}{\@display@init}
+% \cs{displ@y} is from \fn{plain.tex}, with
+% \cs{interdisplaylinepenalty} changed to \cs{@eqpen}. Also we
+% transplanted most of its internal organs to \cs{@display@init} to
+% support \cs{displ@y@} and other possibilities. Don't try to make
+% sense of these naming conventions! They are a narrowly calculated
+% mishmash of Knuth/Spivak/Lamport/Mittelbach precedents. The reason
+% for not cleaning them up and forcing all names to a consistent
+% scheme is that then in principle we'd have to do it everywhere else
+% too. And we programmers are paranoid about the side effects of name
+% changes.
+% \begin{macrocode}
+\def\displ@y{\@display@init{}}
+\def\@display@init#1{%
+ \global\dt@ptrue \spread@equation
+ \everycr{%
+ \noalign{%
+ #1%
+ \ifdt@p
+ \global\dt@pfalse
+ \vskip-\lineskiplimit
+ \vskip\normallineskiplimit
+ \else
+ \penalty\@eqpen \global\dspbrk@lvl\m@ne
+ \fi
+ }%
+ }%
+}
+% \end{macrocode}
+% \cs{displ@y@} is nearly the same; it additionally sets the |tag@|
+% switch and the \cs{column@} and \cs{dspbrk@lvl} counters to their
+% default values. The argument is normally a bit of code to empty out
+% \cs{raise@tag}, but in \env{multline} we don't want that to happen
+% in \cs{everycr}.
+% \begin{macrocode}
+\def\displ@y@{\@display@init{%
+ \global\column@\z@ \global\dspbrk@lvl\m@ne
+ \global\tag@false \global\let\raise@tag\@empty
+}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\black@}
+% \changes{v2.17a}{2017/09/02}{add fixed width box so overfull warning generated in centred environments in lists}
+% This macro is made to produce an overfull box message and
+% possibly (depending on the value of \cs{overfullrule})
+% a rule in the margin if the total width of an alignment
+% is larger than the value of \cs{displaywidth}.
+% \begin{macrocode}
+\def\black@#1{%
+ \noalign{%
+ \ifdim#1>\displaywidth
+ \dimen@\prevdepth
+ \nointerlineskip
+ \vskip-\ht\strutbox@
+ \vskip-\dp\strutbox@
+ \vbox{\noindent\hbox to\displaywidth{\hbox to#1{\strut@\hfill}}}%
+ \prevdepth\dimen@
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\savecounters@}
+% \begin{macro}{\restorecounters@}
+% These are used during the measuring phase of the various display
+% math environments to save and restore the values of all \latex/
+% counters. We make these local to a group, so nested environments
+% works.
+%
+% Changed \cn{stepcounter} to |\csname c@...\endcsname| to avoid
+% overhead of ifundefined test [mjd, 1995/01/20].
+% \begin{macrocode}
+\def\savecounters@{%
+ \begingroup
+ \def\@elt##1{%
+ \global\csname c@##1\endcsname\the\csname c@##1\endcsname}%
+ \xdef\@gtempa{%
+ \cl@@ckpt
+ \let\@nx\restorecounters@\@nx\@empty
+ }%
+ \endgroup
+ \let\restorecounters@\@gtempa
+}
+%
+\let\restorecounters@\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\savealignstate@}
+% \begin{macro}{\restorealignstate@}
+% These are used to save the values of various parameters that are
+% shared by \env{align} and \env{gather} when the former is used
+% inside the latter.
+% \begin{macrocode}
+\def\savealignstate@{%
+ \begingroup
+ \let\or\relax
+ \xdef\@gtempa{%
+ \global\totwidth@\the\totwidth@
+ \global\row@\the\row@
+ \gdef\@nx\tag@lengths{\tag@lengths}%
+ \let\@nx\restorealignstate@\@nx\@empty
+ }%
+ \endgroup
+ \let\restorealignstate@\@gtempa
+}
+
+\let\restorealignstate@\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\savecolumn@}
+% \begin{macro}{\restorecolumn@}
+%
+% \begin{macrocode}
+\def\savecolumn@{%
+ \edef\restorecolumn@{%
+ \global\column@\number\column@
+ \let\@nx\restorecolumn@\@nx\@empty
+ }%
+}
+\let\restorecolumn@\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Scanning the environment's body}
+%
+% Several of the math alignment macros must scan their body twice:
+% once to determine how wide the columns are and then to actually
+% typeset them. This means that we must collect all text in this body
+% before calling the environment macros.
+%
+% \begin{macro}{\@envbody}
+% We start by defining a token register to contain the body.
+% \begin{macrocode}
+\newtoks\@envbody
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addto@envbody}
+% Then we define a macro to add something (i.e.\ its argument) to the
+% token register \cs{@envbody}.
+% \begin{macrocode}
+\def\addto@envbody#1{\global\@envbody\@xp{\the\@envbody#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collect@body}
+% The macro \cs{collect@body} starts the scan for the |\end{...}|
+% command of the current environment. It takes a macro name as
+% argument. This macro is supposed to take the whole body of the
+% environment as its argument. For example, |\begin{align}| would
+% call |\collect@body\@align| if |@align#1{...}| is the macro that
+% sets the alignment with body \arg{1}.
+%
+% \begin{macrocode}
+\def\collect@body#1{%
+ \@envbody{\@xp#1\@xp{\the\@envbody}}%
+ \edef\process@envbody{\the\@envbody\@nx\end{\@currenvir}}%
+ \@envbody\@emptytoks \def\begin@stack{b}%
+% \end{macrocode}
+%
+% If we simply called \cs{collect@@body} directly,
+% the error message for a \cn{par} token (usually from a blank line)
+% would be
+% \begin{verbatim}
+% ! Paragraph ended before \collect@@body was complete.
+% \end{verbatim}
+% But we use a little finesse to get a more intelligible error
+% message:
+% \begin{verbatim}
+% ! Paragraph ended before \multline* was complete.
+% \end{verbatim}
+% In order to avoid using up csnames unnecessarily we use the actual
+% environment name as the name of the temporary function that is
+% \cs{let} to \cs{collect@@body}; but then in order to preserve the
+% theoretical possibility of nesting for environments that use
+% \cs{collect@body} (not currently required by any \pkg{amsmath}
+% environment [mjd,1999/06/23]), we do the \cs{let} inside a group.
+% \begin{macrocode}
+ \begingroup
+ \@xp\let\csname\@currenvir\endcsname\collect@@body
+% \end{macrocode}
+% This small twist eliminates the need for \cs{expandafter}'s in
+% \cs{collect@@body}.
+% \begin{macrocode}
+ \edef\process@envbody{\@xp\@nx\csname\@currenvir\endcsname}%
+ \process@envbody
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\push@begins}
+% When adding a piece of the current environment's contents to
+% \cs{@envbody}, we scan it to check for additional \cn{begin}
+% tokens, and add a `b' to the stack for any that we find.
+% \begin{macrocode}
+\def\push@begins#1\begin#2{%
+ \ifx\end#2\else b\@xp\push@begins\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\collect@@body}
+% \cs{collect@@body} takes two arguments: the first will consist of
+% all text up to the next \cn{end} command, the second will be the
+% \cn{end} command's argument. If there are any extra \cn{begin}
+% commands in the body text, a marker is pushed onto a stack by the
+% \cs{push@begins} function. Empty state for this stack means that we
+% have reached the \cn{end} that matches our original \cn{begin}.
+% Otherwise we need to include the \cn{end} and its argument in the
+% material that we are adding to our environment body accumulator.
+%
+% \begin{histnote}
+% In a former implementation, the error messages resulting from a
+% typo in the environment name were unsatisfactory, because it was
+% matching of the environment name that was used to determine the end
+% of our environment body, instead of counting begin-end pairs.
+% Thanks to Lars Hellstr\"{o}m for a suggestion that led to this
+% improvement. [mjd,1999/06/23]
+% \end{histnote}
+% \begin{macrocode}
+\def\collect@@body#1\end#2{%
+ \edef\begin@stack{\push@begins#1\begin\end \@xp\@gobble\begin@stack}%
+ \ifx\@empty\begin@stack
+ \endgroup
+ \@checkend{#2}%
+ \addto@envbody{#1}%
+ \else
+ \addto@envbody{#1\end{#2}}%
+ \fi
+ \process@envbody % A little tricky! Note the grouping
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Simple aligning environments}
+%
+% \begin{macro}{\math@cr@@@aligned}
+% From tabskip we get an extra space of minalignsep after every
+% second column; but when this falls at the right edge of the whole
+% aligned structure, we need to cancel that space.
+% \begin{macrocode}
+\def\math@cr@@@aligned{%
+ \ifodd\column@ \let\next@\@empty
+ \else \def\next@{&\kern-\alignsep@}%
+ \fi
+ \next@ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\start@aligned}
+% The \env{aligned} and \env{alignedat} environments are identical
+% except that the latter takes a mandatory argument to specify the
+% number of align structures, while the former allows any number of
+% align structures automatically (the use of \env{alignedat} is
+% deprecated). So, they will be defined in terms of
+% \cs{start@aligned}, which will take two arguments. The first
+% argument specifies the placement of the environments; it is
+% either |c|, |t|, or |b|. The second is the number of align
+% structures; a value of~$-1$ means that an arbitrary number are
+% allowed.
+% \begin{macrocode}
+\newcommand{\start@aligned}[2]{%
+ \RIfM@\else
+ \nonmatherr@{\begin{\@currenvir}}%
+ \fi
+ \savecolumn@ % Assumption: called inside a group
+% \end{macrocode}
+% The \cs{null} here is to keep the \cs{,} glue from causing the
+% invocation of the clause in \tex/'s built-in tag placement
+% algorithm that can cause an equation to be shifted all the way over
+% to the margin.
+% \begin{macrocode}
+ \alignedspace@left
+ \if #1t\vtop \else \if#1b \vbox \else \vcenter \fi \fi \bgroup
+ \maxfields@#2\relax
+ \ifnum\maxfields@>\m@ne
+ \multiply\maxfields@\tw@
+% \end{macrocode}
+% Introduced new \cs{math@cr@@@} so we can provide standard error
+% message for too many \qc{\&}'s in \env{alignedat}.
+% \begin{macrocode}
+ \let\math@cr@@@\math@cr@@@alignedat
+ \alignsep@\z@skip
+ \else
+ \let\math@cr@@@\math@cr@@@aligned
+ \alignsep@\minalignsep
+ \fi
+% \end{macrocode}
+% Reset the meaning of \cn{\\}.
+% \begin{macrocode}
+ \Let@ \chardef\dspbrk@context\@ne
+% \end{macrocode}
+% Restore the default definition of \cn{tag} (error message), in
+% case \env{aligned} is used inside, e.g., a \env{gather}
+% environment that accepts \cn{tag}.
+% \begin{macrocode}
+ \default@tag
+ \spread@equation % no-op if already called
+% \end{macrocode}
+% Finally we start the alignment itself. For \env{aligned} we add
+% \cs{minalignsep} after every second column to mimic the
+% behavior of \env{align}. For \env{alignedat} the user has to
+% specify interalign space explicitly.
+% \begin{macrocode}
+ \global\column@\z@
+ \ialign\bgroup
+ &\column@plus
+ \hfil
+ \strut@
+ $\m@th\displaystyle{##}$%
+ \tabskip\z@skip
+ &\column@plus
+ $\m@th\displaystyle{{}##}$%
+ \hfil
+ \tabskip\alignsep@
+ \crcr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@@alignedat}
+% \cs{math@cr@@@alignedat} checks to make sure the user hasn't put in
+% too many \qc{\&}s in \env{alignedat}. Since \env{alignedat}
+% doesn't use \cs{displ@y@}, we also reset \cs{column@} here. Note
+% than in \env{aligned}, \cs{column@} will increase without bound,
+% since it never gets reset, but this is harmless.
+% \begin{macrocode}
+\def\math@cr@@@alignedat{%
+ \ifnum\column@>\maxfields@
+ \begingroup
+ \measuring@false
+ \@amsmath@err{Extra & on this line}%
+ {\the\andhelp@}% "An extra & here is disastrous"
+ \endgroup
+ \fi
+ \global\column@\z@
+ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\alignsafe@testopt}
+% Testing for an optional argument can be really, really tricky in
+% certain complicated contexts. This we discovered by getting some
+% bug reports for uses of \env{aligned}. So here is a safer
+% form of \latex/'s \cs{@testopt} function.
+% \begin{macrocode}
+\def\alignsafe@testopt#1#2{%
+ \relax\iffalse{\fi\ifnum`}=0\fi
+ \@ifnextchar[%
+ {\let\@let@token\relax \ifnum`{=\z@\fi\iffalse}\fi#1}%
+ {\let\@let@token\relax \ifnum`{=\z@\fi\iffalse}\fi#1[#2]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{aligned}
+% The \env{aligned} environment takes an optional argument that
+% indicates its vertical position in relation to surrounding
+% material: |t|, |c|, or |b| for top, center, or bottom.
+% \begin{macrocode}
+\newenvironment{aligned}{%
+ \let\@testopt\alignsafe@testopt
+ \aligned@a
+}{%
+ \crcr\egroup
+ \restorecolumn@
+ \egroup
+}
+\newcommand{\aligned@a}[1][c]{\start@aligned{#1}\m@ne}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{alignedat}
+% To get a top or bottom positioned \env{alignedat} structure, you
+% would write something like
+% \begin{verbatim}
+% \begin{alignedat}[t]{3}
+% \end{verbatim}
+%
+% \begin{macrocode}
+\newenvironment{alignedat}{%
+ \let\@testopt\alignsafe@testopt
+ \alignedat@a
+}{%
+ \endaligned
+}
+\newcommand{\alignedat@a}[1][c]{\start@aligned{#1}}
+% \end{macrocode}
+% \end{environment}
+%
+% \begin{environment}{gathered}
+% The \env{gathered} environment is for several lines that are
+% centered independently.
+% \begin{macrocode}
+\newenvironment{gathered}[1][c]{%
+ \RIfM@\else
+ \nonmatherr@{\begin{gathered}}%
+ \fi
+ \alignedspace@left
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi \bgroup
+ \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
+ \spread@equation
+ \ialign\bgroup
+ \hfil\strut@$\m@th\displaystyle##$\hfil
+ \crcr
+}{%
+ \endaligned
+}
+% \end{macrocode}
+% \end{environment}
+%
+%
+% \subsection{The \env{gather} environment}
+%
+% \begin{macro}{\start@gather}
+% \begin{macrocode}
+\def\start@gather#1{%
+ \RIfM@
+ \nomath@env
+ \DN@{\@namedef{end\@currenvir}{}\@gobble}%
+ \else
+ $$%
+ #1%
+ \ifst@rred \else \global\@eqnswtrue \fi
+ \let\next@\gather@
+ \fi
+ \collect@body\next@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{gather}
+% \begin{environment}{gather*}
+% \begin{macrocode}
+\newenvironment{gather}{%
+ \start@gather\st@rredfalse
+}{%
+ \math@cr \black@\totwidth@ \egroup
+ $$\ignorespacesafterend
+}
+
+\newenvironment{gather*}{%
+ \start@gather\st@rredtrue
+}{%
+ \endgather
+}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\gather@}
+% \begin{macrocode}
+\def\gather@#1{%
+ \ingather@true \let\split\insplit@
+ \let\tag\tag@in@align \let\label\label@in@display
+ \chardef\dspbrk@context\z@
+ \intertext@ \displ@y@ \Let@
+ \let\math@cr@@@\math@cr@@@gather
+ \gmeasure@{#1}%
+ \global\shifttag@false
+ \tabskip\z@skip
+ \global\row@\@ne
+ \halign to\displaywidth\bgroup
+ \strut@
+ \setboxz@h{$\m@th\displaystyle{##}$}%
+ \calc@shift@gather
+ \set@gather@field
+ \tabskip\@centering
+ &\setboxz@h{\strut@{##}}%
+ \place@tag@gather
+ \tabskip \iftagsleft@ \gdisplaywidth@ \else \z@skip \span\fi
+ \crcr
+ #1%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\gmeasure@}
+% \begin{macrocode}
+\def\gmeasure@#1{%
+ \begingroup
+ \measuring@true
+ \totwidth@\z@
+ \global\let\tag@lengths\@empty
+ \savecounters@
+ \setbox\@ne\vbox{%
+ \everycr{\noalign{\global\tag@false
+ \global\let\raise@tag\@empty \global\column@\z@}}%
+ \let\label\@gobble
+ \halign{%
+ \setboxz@h{$\m@th\displaystyle{##}$}%
+ \ifdim\wdz@>\totwidth@
+ \global\totwidth@\wdz@
+ \fi
+ &\setboxz@h{\strut@{##}}%
+ \savetaglength@
+ \crcr
+ #1%
+ \math@cr@@@
+ }%
+ }%
+ \restorecounters@
+ \if@fleqn
+ \global\advance\totwidth@\@mathmargin
+ \fi
+ \iftagsleft@
+ \ifdim\totwidth@>\displaywidth
+ \global\let\gdisplaywidth@\totwidth@
+ \else
+ \global\let\gdisplaywidth@\displaywidth
+ \fi
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@@gather}
+% Modified \cs{math@cr@@@gather} so that it always puts in the
+% final field, which needs to be done under the new method for
+% determining tag placement. This is probably more efficient
+% anyway.
+%
+% \begin{macrocode}
+\def\math@cr@@@gather{%
+ \ifst@rred\nonumber\fi
+ &\relax
+ \make@display@tag
+ \ifst@rred\else\global\@eqnswtrue\fi
+% \end{macrocode}
+% We advance \cs{row@} here, rather than at the beginning of the
+% preamble, because otherwise the \env{split} environment will
+% cause \cs{row@} to be advanced twice instead of once.
+% \begin{macrocode}
+ \global\advance\row@\@ne
+ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calc@shift@gather}
+% \cs{calc@shift@gather} has must make two decisions: (1) whether the
+% equation tag for the current line should be put on a separate
+% line and (2) what the distance between the equation and the
+% equation tag should be. We implement \tex/'s built-in
+% tag-placement as well as possible, with one improvement: the
+% minimum separation between tag and equation is now a
+% user-settable parameter.
+%
+% [1995/01/17] Added a check to make sure that the width of the tag
+% on the current line is $>0$ before testing to see if tagwidth +
+% linewidth + mintagsep $>$ displaywidth. Since an imbedded align
+% shows up as line with width \cn{displaywidth}, and even lines
+% without a tag get processed as if an empty tag were present, the
+% result was that the empty tag assigned to the line containing the
+% align was being shifted downwards, creating extra space after the
+% align.
+% \begin{macrocode}
+\def\calc@shift@gather{%
+ \dimen@\mintagsep\relax
+ \tagwidth@\tag@width\row@\relax
+% \end{macrocode}
+% If we're in \opt{fleqn} mode, there is no flexibility about
+% placement of the equation, so all we can do is see if there's
+% room for the tag in the given margin.
+% \begin{macrocode}
+ \if@fleqn
+ \global\eqnshift@\@mathmargin
+ \ifdim\tagwidth@>\z@
+ \advance\dimen@\tagwidth@
+ \iftagsleft@
+ \ifdim\dimen@>\@mathmargin
+ \global\shifttag@true
+ \fi
+ \else
+ \advance\dimen@\@mathmargin
+ \advance\dimen@\wdz@
+ \ifdim\dimen@>\displaywidth
+ \global\shifttag@true
+ \fi
+ \fi
+ \fi
+ \else
+ \global\eqnshift@\displaywidth
+ \global\advance\eqnshift@-\wdz@
+ \ifdim\tagwidth@>\z@
+ \multiply\dimen@\tw@
+ \advance\dimen@\wdz@
+ \advance\dimen@\tagwidth@
+ \ifdim\dimen@>\displaywidth
+ \global\shifttag@true
+ \else
+ \ifdim\eqnshift@<4\tagwidth@
+ \global\advance\eqnshift@-\tagwidth@
+ \fi
+ \fi
+ \fi
+ \global\divide\eqnshift@\tw@
+ \iftagsleft@
+ \global\eqnshift@-\eqnshift@
+ \global\advance\eqnshift@\displaywidth
+ \global\advance\eqnshift@-\wdz@
+ \fi
+ \ifdim\eqnshift@<\z@
+ \global\eqnshift@\z@
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\place@tag@gather}
+% \begin{macro}{\set@gather@field}
+% \begin{macrocode}
+\def\place@tag@gather{%
+ \iftagsleft@
+ \kern-\gdisplaywidth@
+ \ifshifttag@
+ \rlap{\vbox{%
+ \normalbaselines
+ \boxz@
+ \vbox to\lineht@{}%
+ \raise@tag
+ }}%
+ \global\shifttag@false
+ \else
+ \rlap{\boxz@}%
+ \fi
+ \else
+ \ifdim\totwidth@>\displaywidth
+ \dimen@\totwidth@
+ \advance\dimen@-\displaywidth
+ \kern-\dimen@
+ \fi
+ \ifshifttag@
+ \llap{\vtop{%
+ \raise@tag
+ \normalbaselines
+ \setbox\@ne\null
+ \dp\@ne\lineht@
+ \box\@ne
+ \boxz@
+ }}%
+ \global\shifttag@false
+ \else
+ \llap{\boxz@}%
+ \fi
+ \fi
+}
+%
+\def\set@gather@field{%
+ \iftagsleft@
+ \global\lineht@\ht\z@
+ \else
+ \global\lineht@\dp\z@
+ \fi
+ \kern\eqnshift@
+ \boxz@
+ \hfil
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{The \env{align} family of environments}
+%
+% The \env{align}, \env{flalign}, \env{alignat}, \env{xalignat},
+% and \env{xxalignat} environments are virtually
+% identical, and thus will share much code. We'll refer to the
+% environments generically as ``\env{align}'' and will
+% distinguish between them explicitly
+% only when necessary.
+%
+% \begin{macro}{\ifxxat@}
+% \begin{macro}{\ifcheckat@}
+% \begin{macro}{\xatlevel@}
+% The \cs{xatlevel@} macro will be used, informally speaking, to
+% distinguish between the \env{alignat} and \env{xalignat}, and
+% \env{xxalignat} environments.
+%
+% \begin{macrocode}
+\newif\ifxxat@
+
+\newif\ifcheckat@
+
+\let\xatlevel@\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\start@align}
+% \cs{start@align} will be called by all of the \env{align}-like
+% environments. The first argument will be the \cs{xatlevel@},
+% i.e., 0, 1, or~2; the second argument will be either
+% \cs{st@rredtrue} or \cs{st@rredfalse}. The third argument will
+% be the number of aligned
+% structures in the environment (either as supplied by the user, or
+% $-1$ to indicate that checking shouldn't be done). After
+% performing the appropriate error detection and initialization,
+% \cs{start@align} calls \cs{align@}.
+%
+% Note that the \cs{equation} counter is no longer stepped at the
+% beginning of these environments.
+%
+% TODO: Implement \cs{shoveleft} and \cs{shoveright} for
+% \env{align}.
+% \begin{macrocode}
+\def\start@align#1#2#3{%
+ \let\xatlevel@#1% always \z@, \@ne, or \tw@
+ \maxfields@#3\relax
+ \ifnum\maxfields@>\m@ne
+ \checkat@true
+ \ifnum\xatlevel@=\tw@
+ \xxat@true
+ \fi
+ \multiply\maxfields@\tw@
+ \else
+ \checkat@false
+ \fi
+ \ifingather@
+ \iffalse{\fi\ifnum0=`}\fi
+ \DN@{\vcenter\bgroup\savealignstate@\align@#2}%
+ \else
+ \ifmmode
+ \if@display
+ \DN@{\align@recover}%
+ \else
+ \nomath@env
+ \DN@{\@namedef{end\@currenvir}{}\@gobble}%
+ \fi
+ \else
+ $$%
+ \let\split\insplit@
+ \DN@{\align@#2}%
+ \fi
+ \fi
+ \collect@body\next@
+}
+% \end{macrocode}
+%
+% With version 1.2 of \pkg{amsmath}, it was possible to use
+% \env{align*} and relatives in certain wrong contexts without
+% getting an error, e.g.
+% \begin{verbatim}
+% \begin{equation*}
+% \begin{align*}
+% ...
+% \end{align*}
+% \end{equation*}
+% \end{verbatim}
+%
+% For backward compatibility we therefore give only a warning for
+% this condition instead of a full error, and try to recover using
+% the \env{aligned} environment. The alignment of the material may be
+% adversely affected but it will at least remain readable.
+% \begin{macrocode}
+\def\align@recover#1#2#3{%
+ \endgroup
+ \@amsmath@err{%
+Erroneous nesting of equation structures;\MessageBreak
+trying to recover with `aligned'%
+ }\@ehc
+ \begin{aligned}\relax#1\end{aligned}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{align}
+% \begin{environment}{align*}
+% \begin{environment}{flalign}
+% \begin{environment}{flalign*}
+% \begin{environment}{alignat}
+% \begin{environment}{alignat*}
+% \begin{environment}{xalignat}
+% \begin{environment}{xalignat*}
+% \begin{environment}{xxalignat}
+% The definitions of the various \env{align} environments are quite
+% straight-forward.
+%
+% \begin{macrocode}
+\newenvironment{alignat}{%
+ \start@align\z@\st@rredfalse
+}{%
+ \endalign
+}
+\newenvironment{alignat*}{%
+ \start@align\z@\st@rredtrue
+}{%
+ \endalign
+}
+\newenvironment{xalignat}{%
+ \start@align\@ne\st@rredfalse
+}{%
+ \endalign
+}
+\newenvironment{xalignat*}{%
+ \start@align\@ne\st@rredtrue
+}{%
+ \endalign
+}
+\newenvironment{xxalignat}{%
+ \start@align\tw@\st@rredtrue
+}{%
+ \endalign
+}
+\newenvironment{align}{%
+ \start@align\@ne\st@rredfalse\m@ne
+}{%
+ \math@cr \black@\totwidth@
+ \egroup
+ \ifingather@
+ \restorealignstate@
+ \egroup
+ \nonumber
+ \ifnum0=`{\fi\iffalse}\fi
+ \else
+ $$%
+ \fi
+ \ignorespacesafterend
+}
+\newenvironment{align*}{%
+ \start@align\@ne\st@rredtrue\m@ne
+}{%
+ \endalign
+}
+\newenvironment{flalign}{%
+ \start@align\tw@\st@rredfalse\m@ne
+}{%
+ \endalign
+}
+\newenvironment{flalign*}{%
+ \start@align\tw@\st@rredtrue\m@ne
+}{%
+ \endalign
+}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+%
+%
+% \begin{macro}{\align@}
+% TODO: Some of these sets of initializations show up in multiple
+% places. It might be worth making an abbreviation for them.
+%
+% \begin{macrocode}
+\def\align@#1#2{%
+ \inalign@true \intertext@ \Let@ \chardef\dspbrk@context\z@
+ \ifingather@\else\displ@y@\fi
+ \let\math@cr@@@\math@cr@@@align
+ \ifxxat@\else \let\tag\tag@in@align \fi
+ \let\label\label@in@display
+ #1% set st@r
+ \ifst@rred\else \global\@eqnswtrue \fi
+ \measure@{#2}%
+ \global\row@\z@
+ \tabskip\eqnshift@
+ \halign\bgroup
+ \span\align@preamble\crcr
+ #2%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@@align}
+% \begin{macrocode}
+\def\math@cr@@@align{%
+ \ifst@rred\nonumber\fi
+ \if@eqnsw \global\tag@true \fi
+ \global\advance\row@\@ne
+ \add@amps\maxfields@
+ \omit
+ \kern-\alignsep@
+ \iftag@
+ \setboxz@h{\@lign\strut@{\make@display@tag}}%
+ \place@tag
+ \fi
+ \ifst@rred\else\global\@eqnswtrue\fi
+ \global\lineht@\z@
+ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\math@cr@@@align@measure}
+% \begin{macrocode}
+\def\math@cr@@@align@measure{%
+ &\omit
+ \global\advance\row@\@ne
+ \ifst@rred\nonumber\fi
+ \if@eqnsw \global\tag@true \fi
+ \ifnum\column@>\maxfields@
+ \ifcheckat@
+ \begingroup
+ \measuring@false
+ \@amsmath@err{Extra & on this line}%
+ {\the\andhelp@}% "An extra & here is disastrous"
+ \endgroup
+ \else
+ \global\maxfields@\column@
+ \fi
+ \fi
+ \setboxz@h{\@lign\strut@{%
+ \if@eqnsw
+ \stepcounter{equation}%
+ \tagform@\theequation
+ \else
+ \iftag@\df@tag\fi
+ \fi
+ }}%
+ \savetaglength@
+ \ifst@rred\else\global\@eqnswtrue\fi
+ \cr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\field@lengths}
+% \begin{macro}{\savefieldlength@}
+% \begin{macro}{\fieldlengths@}
+% \begin{macrocode}
+\let\field@lengths\@empty
+
+\def\savefieldlength@{%
+ \begingroup
+ \let\or\relax
+ \xdef\field@lengths{%
+ \field@lengths
+ \ifnum\column@=0
+ \or
+ \else
+ ,%
+ \fi
+ \the\wdz@
+ }%
+ \endgroup
+}
+
+\def\fieldlengths@#1{%
+ \ifcase\@xp#1\field@lengths\fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\maxcolumn@widths}
+% \cs{maxcolumn@widths} will be used to hold the widths of the
+% fields of the \env{alignat} environment. The widths will be
+% separated by the token \cn{or}, making it easy to extract a given
+% width using \cn{ifcase}.
+% \begin{macrocode}
+\let\maxcolumn@widths\@empty
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\maxcol@width}
+% \cs{maxcol@width} $n$ = maximum width of $n$th column of the current
+% \env{alignat} (i.e., the $n$th field of \cs{maxcolumn@widths}.)
+% It expands to a \<dimen>, so it can be used as the right-hand
+% side of a \<variable assignment> or \<arithmetic> statement.
+% It's argument can be any \<number>, \<integer variable> or macro
+% that expands to one of these. [Check to make sure this is true.]
+%
+% This is subtler than it looks.
+% \begin{macrocode}
+\def\maxcol@width#1{%
+ \ifcase\@xp#1\maxcolumn@widths\fi\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Now comes the real fun. A typical \env{align} environments looks
+% something like this, where the vertical bars mark the edges of
+% the fields of the underlying \cs{halign}:
+% \[
+% \makeatletter\tabskip\@centering\offinterlineskip
+% \halign to\displaywidth{%^^A
+% &$\strut$\vrule\hfil$\m@th\displaystyle{\@lign#}$\vrule
+% \tabskip1pt&\vrule$\m@th\displaystyle{\@lign#}$\hfil\vrule
+% \tabskip\@centering\cr
+% \omit\small\hfil 1\hfil &\omit\small\hfil 2 &\omit\small\hfil
+% 3\hfil &\omit\small\hfil 4\hfil & \omit\small\hfil 5\hfil
+% &\omit\small\hfil 6\hfil\cr
+% \noalign{\vskip8pt\relax}
+% V_i + q_i v_j & =v_i , & X_i & = x_i - q_i x_j,
+% & U_i & = u_i,\qquad
+% \hbox{for $i\ne j$;} %&\omit\hfill \llap{(3)}
+% \cr
+% V_j & = v_j, & X_j & = x_j,
+% & U_j & = u_j + \sum_{i\ne j} q_i u_i. %&\omit\hfill \llap{(4)}
+% \cr}
+% \]
+% Note that each align structure consists of two fields, with no
+% space between them (a small space has been added here to
+% highlight the boundaries). Furthermore, the text inside the
+% odd-numbered fields is flushright, while the text inside the
+% even-numbered fields is flushleft. The equation tags (shown on
+% the right here) can be on either the right or the left. If there
+% is not room (in a sense to be defined shortly) for the tag on the
+% same line as the equation, the tag will be shifted to a separate
+% line.
+%
+% Each environment also has a certain number of ``flexible
+% spaces,'' meaning spaces whose width we are allowed to adjust to
+% take up the amount of ``free space'' in the line, meaning the
+% space not taken up by the equation tag and the fields of the
+% underlying \cs{halign}.
+%
+% The flexible spaces come in two flavors: interalign spaces and
+% margin spaces. If there are $n$ align structures ($n=3$ in the
+% illustration above), there are $n-1$ interalign spaces, unless we
+% are in an \env{alignat} environment, in which case there are no
+% flexible interalign spaces.
+%
+% The number of margin spaces is a little more complicated:
+% Normally, there are two, but if we're in \opt{fleqn} mode, there
+% is only one. Furthermore, if we're in an \env{xxalignat} or
+% \env{flalign} environment (corresponding to $\cs{xatlevel@} = 2$,
+% then there are no flexible margin spaces.
+%
+% Calculating the interalign and margin spaces is done in two
+% stages.
+%
+% First, the total amount of free space is divided uniformly among
+% all the flexible spaces, without regard for the lengths of the tags
+% on the various lines. For the non-\opt{fleqn} case, this
+% corresponds to centering the align structures between the margins.
+% Note that in \opt{fleqn} mode, the right margin is still allowed to
+% be larger than \cs{@mathmargin}. This introduces an element of
+% asymmetry into the appearance of the environment, but it has the
+% advantage of leaving more space for equation tags in the right
+% margin. If the right margin were constrained to be equal to the
+% left margin in this case, tags would need to be shifted to a
+% separate line more often than would be desirable.
+%
+% Ordinarily, all flexible spaces will be given the same width.
+% However, this is not invariably true, since the interalign spaces
+% are constrained to be at least \cs{minalignsep} wide, while---in
+% the absence of equation tags, at least---the margin spaces are
+% allowed to shrink to zero. As we shall see in a minute, if there
+% are tags in the environment, then the margins are also bounded
+% below by \cs{mintagsep}.
+%
+% Next, we examine each line of the environment that has a tag to
+% see if there is a gap of at least \cs{mintagsep} between the
+% equation and its tag. If there isn't, we attempt to center the
+% equation between the tag and the opposite margin, leaving a gap
+% of at least \cs{mintagsep} on either side, in order to preserve
+% some symmetry, i.e., we want the equation to \emph{look} like
+% it's centered between the margin and the tag, so we don't want
+% the margin space to be less than the gap between the tag and the
+% equation. (Arguably, it would be better to allow the margin
+% space to shrink to zero in this case in order to avoid shifting
+% the tag to a separate line at any cost, but that would require
+% all of our calculations to be a little more complicated and hence
+% a little slower.) Finally, if no values of the interalign spaces
+% and the margins (with the constraints outlined above) will
+% produce an acceptable distance between the equation and its tag,
+% then the tag will be shifted to a separate line.
+%
+% \begin{macro}{\measure@}
+% \cs{measure@} collects the various bits of information that we'll
+% need to perform the calculations outlined above, namely, the
+% number of align structures in the environment, the natural
+% lengths of the fields on each row, the maximum widths of each
+% column, and the widths of the equation tags on each line. It
+% also calculates the number of flexible interalign and margin
+% spaces and computes the initial values of the parameters
+% \cs{eqnshift@} and \cs{alignsep@}, which correspond to the widths
+% of the margins and the interalign spaces, respectively.
+% \begin{macrocode}
+\def\measure@#1{%
+ \begingroup
+ \measuring@true
+ \global\eqnshift@\z@
+ \global\alignsep@\z@
+ \global\let\tag@lengths\@empty
+ \global\let\field@lengths\@empty
+ \savecounters@
+ \global\setbox0\vbox{%
+ \let\math@cr@@@\math@cr@@@align@measure
+ \everycr{\noalign{\global\tag@false
+ \global\let\raise@tag\@empty \global\column@\z@}}%
+ \let\label\@gobble
+ \global\row@\z@
+ \tabskip\z@
+ \halign{\span\align@preamble\crcr
+ #1%
+ \math@cr@@@
+ \global\column@\z@
+ \add@amps\maxfields@\cr
+ }%
+ }%
+ \restorecounters@
+% \end{macrocode}
+% It's convenient to have \cs{maxfields@} rounded up to the nearest
+% even number, so that \cs{maxfields@} is precisely twice the
+% number of align structures.
+% \begin{macrocode}
+ \ifodd\maxfields@
+ \global\advance\maxfields@\@ne
+ \fi
+% \end{macrocode}
+% It doesn't make sense to have a single align structure in either
+% \env{flalign} or \env{xxalignat}. So, we check for that case now
+% and, if necessary, switch to an \env{align} or \env{alignat}.
+% Arguably, we should issue a warning message, but why bother?
+% \begin{macrocode}
+ \ifnum\xatlevel@=\tw@
+ \ifnum\maxfields@<\thr@@
+ \let\xatlevel@\z@
+ \fi
+ \fi
+% \end{macrocode}
+% |\box0| now contains the lines of the \cs{halign}. After the
+% following maneuver, |\box1| will contain the last line of the
+% \cs{halign}, which is what we're interested in. (Incidentally,
+% the penalty we're removing is the \cs{@eqpen} inserted by
+% \cs{math@cr}. Normally, this is \cs{interdisplaylinepenalty},
+% unless the user has overridden that with a \cs{displaybreak}
+% command.)
+% \begin{macrocode}
+ \setbox\z@\vbox{%
+ \unvbox\z@ \unpenalty \global\setbox\@ne\lastbox
+ }%
+% \end{macrocode}
+% |\box1| begins with \cs{tabskip} glue and contains alternating
+% \cs{hbox}es (the fields whose widths we're trying to get) and
+% \cs{tabskip} glue [need better diagram]:
+% \begin{verbatim}
+% \hbox{\tabskip\hbox\tabskip...\hbox\tabskip}\end{verbatim}
+% In fact, all the \cs{tabskip} glue will be 0pt, because all the
+% \cs{tabskip}s in an \env{alignat} environment have a natural
+% width of 0pt, and the \cs{halign} has been set in its natural
+% width.
+%
+% One nice result of this is that we can read \cs{totwidth@} off
+% immediately, since it is just the width of |\box1|, plus
+% \cs{@mathmargin} if we're in \opt{fleqn} mode. (Actually, we
+% also have to take \cs{minalignsep} into account, but we'll do
+% that later):
+% \begin{macrocode}
+ \global\totwidth@\wd\@ne
+ \if@fleqn \global\advance\totwidth@\@mathmargin \fi
+% \end{macrocode}
+% Now we initialize \cs{align@lengths} and start peeling the boxes
+% off, one by one, and adding their widths to \cs{align@lengths}.
+% We stop when we run out of boxes, i.e., when \cs{lastbox} returns
+% a void box. We're going to build a list using \cs{or} as a
+% delimiter, so we want to disable it temporarily.
+% \begin{macrocode}
+ \global\let\maxcolumn@widths\@empty
+ \begingroup
+ \let\or\relax
+ \loop
+ \global\setbox\@ne\hbox{%
+ \unhbox\@ne \unskip \global\setbox\thr@@\lastbox
+ }%
+ \ifhbox\thr@@
+ \xdef\maxcolumn@widths{ \or \the\wd\thr@@ \maxcolumn@widths}%
+ \repeat
+ \endgroup
+% \end{macrocode}
+% Now we calculate the number of flexible spaces and the initial
+% values of \cs{eqnshift@} and \cs{alignsep@}.
+% We start by calculating $\cs{displaywidth}-\cs{totwidth@}$,
+% which gives us the total amount of ``free space'' in a row.
+% \begin{macrocode}
+ \dimen@\displaywidth
+ \advance\dimen@-\totwidth@
+% \end{macrocode}
+% Next we calculate the number of columns of flexible spaces in the
+% display, which depends on whether we're in \opt{fleqn} mode and
+% in which particular environment we are in.
+%
+% We use \cs{@tempcnta} to store the total number of flexible spaces
+% in the align and \cs{@tempcntb} for the number of interalign
+% spaces.
+% \begin{macrocode}
+ \ifcase\xatlevel@
+% \end{macrocode}
+% In \env{alignat}, the interalign spaces are under user control,
+% not ours. So, we set \cs{alignsep@} and \cs{minalignsep} both
+% equal to 0pt. Later, when calculating a new value for
+% \cs{alignsep@}, we will only save the new value if it is less
+% than the current value of \cs{alignsep@} (i.e., \cs{alignsep@}
+% will never increase). Since the values we calculate will never
+% be negative, this will ensure that \cs{alignsep@} remains zero in
+% \env{alignat}.
+% \begin{macrocode}
+ \global\alignsep@\z@
+ \let\minalignsep\z@
+ \@tempcntb\z@
+% \end{macrocode}
+% In \opt{fleqn} mode, the left margin---and hence the right margin
+% in this case---is fixed. Otherwise, we divide the free space
+% equally between the two margins.
+% \begin{macrocode}
+ \if@fleqn
+ \@tempcnta\@ne
+ \global\eqnshift@\@mathmargin
+ \else
+ \@tempcnta\tw@
+ \global\eqnshift@\dimen@
+ \global\divide\eqnshift@\@tempcnta
+ \fi
+ \or
+% \end{macrocode}
+% In an \env{align} or \env{xalignat} environment with $n$ aligned
+% structures, there are $n-1$ interalign spaces and either 1 or~2
+% flexible margins, depending on whether we're in \opt{fleqn} mode
+% or not.
+% \begin{macrocode}
+ \@tempcntb\maxfields@
+ \divide\@tempcntb\tw@
+ \@tempcnta\@tempcntb
+ \advance\@tempcntb\m@ne
+% \end{macrocode}
+% If we are in \opt{fleqn} mode, we fix the left margin and divide
+% the free space equally among the interalign spaces and the right
+% margin.
+% \begin{macrocode}
+ \if@fleqn
+ \global\eqnshift@\@mathmargin
+ \global\alignsep@\dimen@
+ \global\divide\alignsep@\@tempcnta
+ \else
+% \end{macrocode}
+% Otherwise, we divide the free space equally among the interalign
+% spaces and both margins.
+% \begin{macrocode}
+ \global\advance\@tempcnta\@ne
+ \global\eqnshift@\dimen@
+ \global\divide\eqnshift@\@tempcnta
+ \global\alignsep@\eqnshift@
+ \fi
+ \or
+% \end{macrocode}
+% Finally, if we're in an \env{flalign} or \env{xxalignat}
+% environment, there are no flexible margins and $n-1$ flexible
+% interalign spaces.
+% \begin{macrocode}
+ \@tempcntb\maxfields@
+ \divide\@tempcntb\tw@
+ \global\advance\@tempcntb\m@ne
+ \global\@tempcnta\@tempcntb
+ \global\eqnshift@\z@
+ \global\alignsep@\dimen@
+% \end{macrocode}
+% If we're in \opt{fleqn} mode, we need to add back the
+% \cs{@mathmargin} that was removed when \cs{dimen@} was originally
+% calculated above.
+% \begin{macrocode}
+ \if@fleqn
+ \global\advance\alignsep@\@mathmargin\relax
+ \fi
+ \global\divide\alignsep@\@tempcntb
+ \fi
+% \end{macrocode}
+% Now we make sure \cs{alignsep@} isn't too small.
+% \begin{macrocode}
+ \ifdim\alignsep@<\minalignsep\relax
+ \global\alignsep@\minalignsep\relax
+ \ifdim\eqnshift@>\z@
+ \if@fleqn\else
+ \global\eqnshift@\displaywidth
+ \global\advance\eqnshift@-\totwidth@
+ \global\advance\eqnshift@-\@tempcntb\alignsep@
+ \global\divide\eqnshift@\tw@
+ \fi
+ \fi
+ \fi
+ \ifdim\eqnshift@<\z@
+ \global\eqnshift@\z@
+ \fi
+ \calc@shift@align
+% \end{macrocode}
+% Next, we calculate the value of \cs{tagshift@}. This is the glue
+% that will be inserted in front of the equation tag to make sure
+% it lines up flush against the appropriate margin.
+% \begin{macrocode}
+ \global\tagshift@\totwidth@
+ \global\advance\tagshift@\@tempcntb\alignsep@
+ \if@fleqn
+ \ifnum\xatlevel@=\tw@
+ \global\advance\tagshift@-\@mathmargin\relax
+ \fi
+ \else
+ \global\advance\tagshift@\eqnshift@
+ \fi
+ \iftagsleft@ \else
+ \global\advance\tagshift@-\displaywidth
+ \fi
+% \end{macrocode}
+% Finally, we increase \cs{totwidth@} by an appropriate multiple of
+% \cs{minalignsep}. If the result is greater than
+% \cs{displaywidth}, it means that at least one line in the
+% \env{align} is overfull and we will issue an appropriate warning
+% message (via \cs{bl@ck}) at the end of the environment.
+% \begin{macrocode}
+ \dimen@\minalignsep\relax
+ \global\advance\totwidth@\@tempcntb\dimen@
+ \ifdim\totwidth@>\displaywidth
+ \global\let\displaywidth@\totwidth@
+ \else
+ \global\let\displaywidth@\displaywidth
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% The code for calculating the appropriate placement of equation
+% tags in the \env{align} environments is quite complicated and
+% varies wildly depending on the settings of the |tagsleft@| and
+% |@fleqn| switches. To minimize memory and hash space usage, we
+% only define the variant appropriate for the current setting of
+% those switches.
+%
+% It would be worthwhile to examine this code more closely someday
+% and see if it could be optimized any.
+%
+% \paragraph{Tag placement when \cs{tagsleft@true},
+% \cs{@fleqntrue}.}
+%
+% We begin with the version of \cs{calc@shift@align} appropriate
+% for flush-left equations with tags on the left.
+%
+% \begin{macro}{\calc@shift@align}
+% This is the simplest case. Since the left margin is fixed, in
+% general the only thing to do is check whether there is room for
+% the tag in the left margin. The only exception is that if
+% $\cs{eqnshift@} = 0\,\mathrm{pt}$---meaning that we're in a
+% \env{flalign} environment and this is the first line with a tag
+% that we've encountered---then we set $\cs{eqnshift@} =
+% \cs{@mathmargin}$ and recalculate \cs{alignsep@}. This is done
+% by \cs{x@calc@shift@lf}.
+% \begin{macrocode}
+\iftagsleft@\if@fleqn
+ \def\calc@shift@align{%
+ \global\let\tag@shifts\@empty
+ \begingroup
+% \end{macrocode}
+% \cs{@tempdima} is initialized to $\cs{@mathmargin} -
+% \cs{mintagsep}$, which yields the maximum size of a tag that will
+% not be shifted to another line.
+% \begin{macrocode}
+ \@tempdima\@mathmargin\relax
+ \advance\@tempdima-\mintagsep\relax
+% \end{macrocode}
+% Now we examine each row in turn. If the width of the tag on the
+% line is non-positive---meaning either that there is no tag or
+% else that the user has forced it to have zero width---we mark the
+% tag to remain unshifted. Otherwise, we call \cs{x@calc@shift@lf}
+% to determine whether any adjustments need to be made to
+% \cs{eqnshift@} and \cs{alignsep@}. Note the difference in
+% treatment of zero-width tags between this code and \tex/'s
+% built-in algorithm: here, a width of zero prohibits the tag from
+% being shifted, while in \tex/'s built-in algorithm, a width of
+% zero forces the tag to be shifted.
+% \begin{macrocode}
+ \loop
+ \ifnum\row@>0
+ \ifdim\tag@width\row@>\z@
+ \x@calc@shift@lf
+ \else
+ \saveshift@0%
+ \fi
+ \advance\row@\m@ne
+ \repeat
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@calc@shift@lf}
+% As mentioned above, \cs{x@calc@shift@lf} first checks to see if
+% the current left margin is set to 0 and, if so, resets it to
+% \cs{@mathmargin} and recalculates \cs{alignsep@}. Next, it
+% checks whether the length of the current tag exceeds the
+% previously calculated limit and, if so, marks the tag to be
+% shifted to a separate line.
+% \begin{macrocode}
+ \def\x@calc@shift@lf{%
+ \ifdim\eqnshift@=\z@
+ \global\eqnshift@\@mathmargin\relax
+ \alignsep@\displaywidth
+ \advance\alignsep@-\totwidth@
+ \global\divide\alignsep@\@tempcntb
+ \ifdim\alignsep@<\minalignsep\relax
+ \global\alignsep@\minalignsep\relax
+ \fi
+ \fi
+ \ifdim\tag@width\row@>\@tempdima
+ \saveshift@1%
+ \else
+ \saveshift@0%
+ \fi
+ }
+\fi\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Tag placement when \cs{tagsleft@false},
+% \cs{@fleqntrue}.}
+%
+% Next we consider the case when equations are flush-left, but tags
+% are on the right. This case is somewhat more complicated than
+% the previous one, since we can adjust the right margin by varying
+% the inter-align separatin. Thus, when a tag is found to be too
+% close to its equation, we first attempt to decrease
+% \cs{alignsep@} enough to move the equation off to an acceptable
+% distance. Only if that would require a value of \cs{alignsep@}
+% less than \cs{minalignsep} do we move the tag to a separate line.
+%
+% \begin{macro}{\calc@shift@align}
+% This version of \cs{calc@shift@align} differs from the previous
+% version only in calling \cs{x@calc@shift@rf} rather than
+% \cs{x@calc@shift@lf}.
+% \begin{macrocode}
+\iftagsleft@\else\if@fleqn
+ \def\calc@shift@align{%
+ \global\let\tag@shifts\@empty
+ \begingroup
+ \loop
+ \ifnum\row@>0
+ \ifdim\tag@width\row@>\z@
+ \x@calc@shift@rf
+ \else
+ \saveshift@0%
+ \fi
+ \advance\row@\m@ne
+ \repeat
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@calc@shift@rf}
+% To start, we need to know two quantities: the number of align
+% structures in the current row and the ``effective length'' of the
+% row, defined as the distance from the left margin to the
+% right edge of the text assuming that \cs{eqnshift@} and
+% \cs{alignsep@} are both~0. To get the number of align
+% structures, we first count the number of columns by counting the
+% number of entries in the \cs{fieldlengths@} for the current row.
+% The effective length is calcuated by \cs{x@rcalc@width} and put
+% in the temporary register \cs{@tempdimc}, using \cs{@tempdimb} as
+% an auxiliary variable.
+% \begin{macrocode}
+ \def\x@calc@shift@rf{%
+ \column@\z@
+ \@tempdimb\z@
+ \@tempdimc\z@
+ \edef\@tempb{\fieldlengths@\row@}%
+ \@for\@tempa:=\@tempb\do{%
+ \advance\column@\@ne
+ \x@rcalc@width
+ }%
+ \begingroup
+% \end{macrocode}
+% If there are $n$ columns in the current row, then there are
+% $\lfloor (n+1)/2 \rfloor$ align structures and $\lfloor (n-1)/2
+% \rfloor$ interalign spaces.
+% \begin{macrocode}
+ \advance\column@\m@ne
+ \divide\column@\tw@
+% \end{macrocode}
+% If this is smaller than the maximum number of interalign spaces
+% in the environment, then we need to reduce \cs{@tempcnta} (the
+% total number of flexible spaces in the current line) by
+% $\cs{@tempcntb} - \cs{column@}$ and reset \cs{@tempcntb} to
+% \cs{column@}.
+% \begin{macrocode}
+ \ifnum\@tempcntb>\column@
+ \advance\@tempcnta-\@tempcntb
+ \advance\@tempcnta\column@
+ \@tempcntb\column@
+ \fi
+% \end{macrocode}
+% Next, we add the width of the tag and the (fixed) left margin to
+% the effective length calculated above. This can be used to
+% calculate how much ``free space'' there is in the current line
+% and thus how much leeway we have to increase the amount of space
+% between the tag and the equation.
+% \begin{macrocode}
+ \tagwidth@\tag@width\row@\relax
+ \@tempdima\eqnshift@
+ \advance\@tempdima\@tempdimc\relax
+ \advance\@tempdima\tagwidth@
+% \end{macrocode}
+% The first thing to check is whether the tag should be shifted to
+% a separate line. To do this, we add the minimum interalign
+% separation and the \cs{mintagsep} to the value of \cs{@tempdima}
+% just calculated. This yields the minimum acceptable length of
+% the current line. If that is greater than \cs{displaywidth}, we
+% mark the tag to be calculated. Otherwise, we mark the tag to be
+% kept on the same line and then check to see if the \cs{alignsep@}
+% needs to be reduced to make room for the tag.
+% \begin{macrocode}
+ \dimen@\minalignsep\relax
+ \multiply\dimen@\@tempcntb
+ \advance\dimen@\mintagsep\relax
+ \advance\dimen@\@tempdima
+ \ifdim\dimen@>\displaywidth
+ \saveshift@1%
+ \else
+ \saveshift@0%
+% \end{macrocode}
+% Now we perform essentially the same calculation, but using the
+% current value of \cs{alignsep@} instead of \cs{minalignsep}.
+% This gives the current length of the line. If this is greater
+% than \cs{displaywidth}, we recalculate \cs{alignsep@} to make
+% room for the tag.
+% \begin{macrocode}
+ \dimen@\alignsep@\relax
+ \multiply\dimen@\@tempcntb
+ \advance\dimen@\@tempdima
+ \advance\dimen@\tagwidth@
+ \ifdim\dimen@>\displaywidth
+ \dimen@\displaywidth
+ \advance\dimen@-\@tempdima
+ \ifnum\xatlevel@=\tw@
+ \advance\dimen@-\mintagsep\relax
+ \fi
+ \divide\dimen@\@tempcnta
+ \ifdim\dimen@<\minalignsep\relax
+ \global\alignsep@\minalignsep\relax
+ \else
+ \global\alignsep@\dimen@
+ \fi
+ \fi
+ \fi
+ \endgroup
+ }
+\fi\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Tag placement when \cs{tagsleft@false},
+% \cs{@fleqnfalse}.}
+%
+% This is similar to the previous case, except for the added
+% complication that both \cs{alignsep@} and \cs{eqnshift@} can
+% vary, which makes the computations correspondingly more
+% complicated.
+%
+% \begin{macro}{\calc@shift@align}
+% \begin{macrocode}
+\iftagsleft@\else\if@fleqn\else
+ \def\calc@shift@align{%
+ \global\let\tag@shifts\@empty
+ \begingroup
+ \loop
+ \ifnum\row@>0
+ \ifdim\tag@width\row@>\z@
+ \x@calc@shift@rc
+ \else
+ \saveshift@0%
+ \fi
+ \advance\row@\m@ne
+ \repeat
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@calc@shift@rc}
+% \begin{macrocode}
+ \def\x@calc@shift@rc{%
+ \column@\z@
+ \@tempdimb\z@
+ \@tempdimc\z@
+ \edef\@tempb{\fieldlengths@\row@}%
+ \@for\@tempa:=\@tempb\do{%
+ \advance\column@\@ne
+ \x@rcalc@width
+ }%
+ \begingroup
+ \advance\column@\m@ne
+ \divide\column@\tw@
+ \ifnum\@tempcntb>\column@
+ \advance\@tempcnta-\@tempcntb
+ \advance\@tempcnta\column@
+ \@tempcntb\column@
+ \fi
+ \tagwidth@\tag@width\row@\relax
+ \@tempdima\@tempdimc
+ \advance\@tempdima\tagwidth@
+ \dimen@\minalignsep\relax
+ \multiply\dimen@\@tempcntb
+ \advance\dimen@\mintagsep\relax
+ \ifnum\xatlevel@=\tw@ \else
+ \advance\dimen@\mintagsep\relax
+ \fi
+ \advance\dimen@\@tempdima
+ \ifdim\dimen@>\displaywidth
+ \saveshift@1%
+ \else
+ \saveshift@0%
+ \dimen@\eqnshift@
+ \advance\dimen@\@tempdima
+ \advance\dimen@\@tempcntb\alignsep@
+ \advance\dimen@\tagwidth@
+ \ifdim\dimen@>\displaywidth
+ \dimen@\displaywidth
+ \advance\dimen@-\@tempdima
+ \ifnum\xatlevel@=\tw@
+ \advance\dimen@-\mintagsep\relax
+ \fi
+ \divide\dimen@\@tempcnta
+ \ifdim\dimen@<\minalignsep\relax
+ \global\alignsep@\minalignsep\relax
+ \eqnshift@\displaywidth
+ \advance\eqnshift@-\@tempdima
+ \advance\eqnshift@-\@tempcntb\alignsep@
+ \global\divide\eqnshift@\tw@
+ \else
+ \ifdim\dimen@<\eqnshift@
+ \ifdim\dimen@<\z@
+ \global\eqnshift@\z@
+ \else
+ \global\eqnshift@\dimen@
+ \fi
+ \fi
+ \ifdim\dimen@<\alignsep@
+ \global\alignsep@\dimen@
+ \fi
+ \fi
+ \fi
+ \fi
+ \endgroup
+ }
+\fi\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@rcalc@width}
+% \begin{macrocode}
+\iftagsleft@\else
+ \def\x@rcalc@width{%
+ \ifdim\@tempa > \z@
+ \advance\@tempdimc\@tempdimb
+ \ifodd\column@
+ \advance\@tempdimc\maxcol@width\column@
+ \@tempdimb\z@
+ \else
+ \advance\@tempdimc\@tempa\relax
+ \@tempdimb\maxcol@width\column@
+ \advance\@tempdimb-\@tempa\relax
+ \fi
+ \else
+ \advance\@tempdimb\maxcol@width\column@\relax
+ \fi
+ }
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Tag placement when \cs{tagsleft@true},
+% \cs{@fleqnfalse}.}
+%
+% \begin{macro}{\calc@shift@align}
+% \begin{macrocode}
+\iftagsleft@\if@fleqn\else
+ \def\calc@shift@align{%
+ \global\let\tag@shifts\@empty
+ \begingroup
+ \loop
+ \ifnum\row@>\z@
+ \ifdim\tag@width\row@>\z@
+ \x@calc@shift@lc
+ \else
+ \saveshift@0%
+ \fi
+ \advance\row@\m@ne
+ \repeat
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@calc@shift@lc}
+% \begin{macrocode}
+ \def\x@calc@shift@lc{%
+ \column@\z@
+% \end{macrocode}
+% \cs{@tempdima} will (eventually) be set to the effective width of
+% the current row, defined as the distance from the leftmost point
+% of the current line to the end of the last field of the
+% \cs{halign}, ignoring any intervening \cs{tabskip}s, plus the
+% width of the current tag. That is, it will be the width of the
+% first non-empty field plus the sum of the maximum widths of all
+% following fields, plus the tag width.
+%
+% \cs{@tempdimb} will be the ``indentation'' of leftmost end of
+% text, ignoring the \cs{tabskip} glue, i.e., it will be the sum of
+% the maximum widths of any fields to the left of the first
+% non-empty field, plus whatever empty space there is at the
+% beginning of the first non-empty field.
+% \begin{macrocode}
+ \@tempdima\z@ % ``width of equation''
+ \@tempdimb\z@ % ``indent of equation''
+ \edef\@tempb{\fieldlengths@\row@}%
+ \@for\@tempa:=\@tempb\do{%
+ \advance\column@\@ne
+ \x@lcalc@width
+ }%
+ \begingroup
+ \tagwidth@\tag@width\row@\relax
+% \end{macrocode}
+% \cs{@tempdima} is now easy to calculate, since it is just
+% $\cs{totwidth@} - \cs{@tempdimb} + \cs{tagwidth@}$.
+% \begin{macrocode}
+ \@tempdima\totwidth@
+ \advance\@tempdima-\@tempdimb
+ \advance\@tempdima\tagwidth@
+% \end{macrocode}
+% Next, we check to see whether there is room for both the equation
+% and the tag on the same line, by calculating the minimum
+% acceptable length of the current row and comparing that to
+% \cs{displaywidth}. Note that here we use \cs{@tempcntb}, i.e.,
+% the number of interalign spaces after the first non-empty align
+% structure.
+% \begin{macrocode}
+ \dimen@\minalignsep\relax
+ \multiply\dimen@\@tempcntb
+ \advance\dimen@\mintagsep\relax
+ \ifnum\xatlevel@=\tw@ \else
+ \advance\dimen@\mintagsep\relax
+ \fi
+ \advance\dimen@\@tempdima
+% \end{macrocode}
+% If the minimum acceptable width of the current line is greater
+% than \cs{displaywidth}, we mark the current tag to be shifted to
+% a separate line.
+% \begin{macrocode}
+ \ifdim\dimen@>\displaywidth
+ \saveshift@1%
+ \else
+% \end{macrocode}
+% Otherwise, the tag can stay on the same line as the equation, but
+% we need to check whether it is too close to the equation. So, we
+% calculate the distance between the left margin and the left side
+% of the equation, using the current values of \cs{eqnshift@} and
+% \cs{alignsep@}. Note that we use \cs{count@} here, not
+% \cs{@tempcntb}, as above.
+% \begin{macrocode}
+ \saveshift@0%
+ \dimen@\alignsep@
+ \multiply\dimen@\count@
+ \advance\dimen@\eqnshift@
+ \advance\dimen@\@tempdimb
+% \end{macrocode}
+% If the left margin is less than twice the tag width, we calculate
+% new values of \cs{eqnshift@} and \cs{alignsep@} to move the
+% equation further away from the tag. In particular, we center the
+% current line between its tag and the right margin. Note that
+% although we later will need to transform \cs{dimen@} into a value
+% suitable for use as \cs{eqnshift@}, for the time being it is more
+% useful to think of it as the space separating the tag from the
+% equation.
+% \begin{macrocode}
+ \ifdim\dimen@<2\tagwidth@
+ \dimen@\displaywidth
+ \advance\dimen@-\@tempdima
+ \ifnum\xatlevel@=\tw@
+ \advance\dimen@-\mintagsep\relax
+ \fi
+% \end{macrocode}
+% In certain circumstances we will get a divide-by-zero error here
+% unless we guard against it. Use of \cs{@tempcnta} is complicated,
+% sometimes it is assigned globally, sometimes locally. Need to sort
+% it out one of these days [mjd,2000/06/02].
+% \begin{macrocode}
+ \ifnum\@tempcnta>\z@
+ \divide\dimen@\@tempcnta
+ \else \dimen@\z@
+ \fi
+% \end{macrocode}
+% As usual, we check to make sure we don't set \cs{alignsep@}
+% smaller than \cs{minalignsep} and, in any case, that we don't
+% replace \cs{alignsep@} by a larger value.
+% \begin{macrocode}
+ \ifdim\dimen@<\minalignsep\relax
+ \global\alignsep@\minalignsep\relax
+ \dimen@\displaywidth
+ \advance\dimen@-\@tempdima
+ \advance\dimen@-\@tempcntb\alignsep@
+ \global\divide\dimen@\tw@
+ \else
+ \ifdim\dimen@<\alignsep@
+ \global\alignsep@\dimen@
+ \fi
+ \fi
+% \end{macrocode}
+% Next, we calculate an appropriate value of \cs{eqnshift@},
+% assuming that \cs{dimen@} is the desired separation between the
+% tag and equation of the current line. This means that we first
+% need to adjust \cs{dimen@} if we're in an \env{flalign}
+% environment.
+% \begin{macrocode}
+ \ifnum\xatlevel@=\tw@
+ \dimen@\mintagsep\relax
+ \fi
+% \end{macrocode}
+% Now we calculate the value of \cs{eqnshift@} needed to produce a
+% separation of \cs{dimen@} between the equation tag and the
+% beginning of the equation. To do this, we need the following
+% equation to hold:
+% \[
+% \cs{eqnshift@} + n\cs{alignsep@} + \cs{@tempdimb}
+% = \cs{tagwidth@} + \cs{dimen@}
+% \]
+% where $n = \cs{count@}$ is the number of interalign spaces before
+% the first non-empty field of the current line.
+% \begin{macrocode}
+ \advance\dimen@\tagwidth@
+ \advance\dimen@-\@tempdimb
+ \advance\dimen@-\count@\alignsep@
+% \end{macrocode}
+% The value of \cs{eqnshift@} just calculated is the minimum
+% acceptable value; thus, we save it only if it is larger than the
+% current value.
+% \begin{macrocode}
+ \ifdim\dimen@>\eqnshift@
+ \global\eqnshift@\dimen@
+ \fi
+ \fi
+ \fi
+ \endgroup
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\x@lcalc@width}
+% This macro calculates the ``indentation'' of the current row, as
+% defined above under the description of \cs{x@calc@shift@lc}.
+% This macro is called for each field of the current line, with
+% \cs{@tempa} set to the width of the current field. Ideally, the
+% loop enclosing \cs{x@lcalc@width} would terminate as soon as
+% \cs{@tempa} is non-zero, but that would be a bit tricky to
+% arrange. Instead, we use \cs{@tempdima} as a flag to signal when
+% we've encountered the first non-empty field.
+%
+% \begin{macrocode}
+ \def\x@lcalc@width{%
+ \ifdim\@tempdima = \z@
+% \end{macrocode}
+% If the current field is empty (i.e., $\cs{@tempa} =
+% \mathrm{0\,pt}$, then we increment \cs{@tempdimb} by the width of
+% the current field). Otherwise, we set $\cs{@tempdima} =
+% \mathrm{1\,pt}$ as a signal value and increment \cs{@tempdimb} by
+% the width of whatever empty space there might be at the left of
+% the current field.
+% \begin{macrocode}
+ \ifdim\@tempa > \z@
+ \@tempdima\p@
+ \ifodd\column@
+ \advance\@tempdimb \maxcol@width\column@
+ \advance\@tempdimb-\@tempa
+ \fi
+% \end{macrocode}
+% In addition, we need to adjust the values of \cs{@tempcnta} and
+% \cs{@tempcntb} to account for any empty align structures that
+% might occur at the beginning of the current line. More
+% specifically, we first set \cs{count@} equal to the number of
+% interalign spaces preceding the current field (namely, $\lfloor
+% (\cs{\column@}-1)/2 \rfloor$), and then subtract \cs{count@} from
+% both \cs{@tempcnta} and \cs{@tempcntb}. The rationale is that
+% for the purposes of adjusting the spacing between the tag and the
+% equation, the only flexible interalign spaces are those after
+% the first non-empty align structure, so we need to treat those
+% different from the ones before the first non-empty align
+% structure.
+% \begin{macrocode}
+ \count@\column@
+ \advance\count@\m@ne
+ \divide\count@\tw@
+ \advance\@tempcnta-\count@
+ \advance\@tempcntb-\count@
+ \else
+ \advance\@tempdimb \maxcol@width\column@\relax
+ \fi
+ \fi
+ }
+\fi\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\place@tag}
+% \cs{place@tag} takes care of the placment of tags in the
+% \env{align} environments.
+% \begin{macrocode}
+\def\place@tag{%
+ \iftagsleft@
+ \kern-\tagshift@
+ \if1\shift@tag\row@\relax
+ \rlap{\vbox{%
+ \normalbaselines
+ \boxz@
+ \vbox to\lineht@{}%
+ \raise@tag
+ }}%
+ \else
+ \rlap{\boxz@}%
+ \fi
+ \kern\displaywidth@
+ \else
+ \kern-\tagshift@
+ \if1\shift@tag\row@\relax
+% \end{macrocode}
+% Added depth to correct vertical spacing of shifted
+% equation tags.---dmj, 1994/12/29
+% \begin{macrocode}
+ \llap{\vtop{%
+ \raise@tag
+ \normalbaselines
+ \setbox\@ne\null
+ \dp\@ne\lineht@
+ \box\@ne
+ \boxz@
+ }}%
+ \else
+ \llap{\boxz@}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\align@preamble}
+% \begin{macrocode}
+\def\align@preamble{%
+ &\hfil
+ \strut@
+ \setboxz@h{\@lign$\m@th\displaystyle{##}$}%
+ \ifmeasuring@\savefieldlength@\fi
+ \set@field
+ \tabskip\z@skip
+ &\setboxz@h{\@lign$\m@th\displaystyle{{}##}$}%
+ \ifmeasuring@\savefieldlength@\fi
+ \set@field
+ \hfil
+ \tabskip\alignsep@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@field}
+% \cs{set@field} increments the column counter, tracks the value of
+% \cs{lineht@} and finally inserts the box containing the contents
+% of the current field.
+% \begin{macrocode}
+\def\set@field{%
+ \column@plus
+ \iftagsleft@
+ \ifdim\ht\z@>\lineht@
+ \global\lineht@\ht\z@
+ \fi
+ \else
+ \ifdim\dp\z@>\lineht@
+ \global\lineht@\dp\z@
+ \fi
+ \fi
+ \boxz@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection {The \env{split} environment}
+%
+% \begin{macro}{\split@err}
+% A special error function for \env{split} to conserve main mem (at a
+% cost of string pool/hash size.
+% \begin{macrocode}
+\edef\split@err#1{%
+ \@nx\@amsmath@err{%
+ \string\begin{split} won't work here%
+ }{%
+ \@xp\@nx\csname
+ Did you forget a preceding \string\begin{equation}?^^J%
+ If not, perhaps the `aligned' environment is what
+ you want.\endcsname}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{split}
+% If the \env{split} environment occurs inside \env{align} or
+% \env{gather}, it can make use of the enclosing halign; if it is
+% called inside a simple equation, we add an implicit `gather'
+% container.
+%
+% \begin{macrocode}
+\newenvironment{split}{%
+ \if@display
+ \ifinner
+ \@xp\@xp\@xp\split@aligned
+ \else
+ \ifst@rred \else \global\@eqnswtrue \fi
+ \fi
+ \else \let\endsplit\@empty \@xp\collect@body\@xp\split@err
+ \fi
+ \collect@body\gather@split
+}{%
+ \crcr
+ \egroup
+ \egroup
+ \iftagsleft@ \@xp\lendsplit@ \else \@xp\rendsplit@ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\split@tag\relax % init
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\gather@split#1#2#3{%
+ \@xp\endgroup \reset@equation % math@cr will handle equation numbering
+ \iftag@
+ \toks@\@xp{\df@tag}%
+ \edef\split@tag{%
+ \gdef\@nx\df@tag{\the\toks@}%
+ \global\@nx\tag@true \@nx\nonumber
+ }%
+ \else \let\split@tag\@empty
+ \fi
+ \spread@equation
+% \end{macrocode}
+% The extra vcenter wrapper here is not really a good thing but
+% without it there are compatibility problems with old documents that
+% throw in some extra material between \verb'\begin{equation}' and
+% \verb'\begin{split}' (for example, \verb'\hspace{-1pc}' or
+% \verb'\left\{'). [mjd,1999/09/20]
+% \begin{macrocode}
+ \vcenter\bgroup
+ \gather@{\split@tag \begin{split}#1\end{split}}%
+ \def\endmathdisplay@a{%
+ \math@cr \black@ \totwidth@ \egroup
+ \egroup
+ }%
+}
+% \end{macrocode}
+%
+% \end{environment}
+%
+% \begin{macro}{\insplit@}
+% \begin{macrocode}
+\def\insplit@{%
+ \global\setbox\z@\vbox\bgroup
+ \Let@ \chardef\dspbrk@context\@ne \restore@math@cr
+ \default@tag % disallow use of \tag here
+ \ialign\bgroup
+ \hfil
+ \strut@
+ $\m@th\displaystyle{##}$%
+ &$\m@th\displaystyle{{}##}$%
+ \hfill % Why not \hfil?---dmj, 1994/12/28
+ \crcr
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rendsplit@}
+% Moved the box maneuvers inside the \cs{ifinalign@}, since that is
+% the only place they are needed.---dmj, 1994/12/28
+%
+% TODO: Explore interaction of tag-placement algorithm with
+% \env{split}. Is there any way for \env{split} to pass the
+% relevant information out to the enclosing \env{gather} or
+% \env{align}?
+% \begin{macrocode}
+\def\rendsplit@{%
+ \ifinalign@
+% \end{macrocode}
+% Changed |\box9| into a \cs{vtop} here for better spacing.
+% \begin{macrocode}
+ \global\setbox9 \vtop{%
+ \unvcopy\z@
+ \global\setbox8 \lastbox
+ \unskip
+ }%
+ \setbox\@ne\hbox{%
+ \unhcopy8
+ \unskip
+ \global\setbox\tw@\lastbox
+ \unskip
+ \global\setbox\thr@@\lastbox
+ }%
+ \ifctagsplit@
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}%
+ &\vcenter{\vbox{\moveleft\wd\thr@@\boxz@}}%
+ }%
+ \else
+ \global\setbox7 \hbox{\unhbox\tw@\unskip}%
+% \end{macrocode}
+% Added \cs{add@amps} to make sure we put the last line of the
+% \env{split} into the proper column of an \env{align} environment
+% with multiple align structures.---dmj, 1994/12/28
+%
+% Special care has to be taken in this case because the \env{split}
+% turns into two lines of the \env{align} instead of just one. So,
+% we have to make sure that the first line produced by the
+% \env{split} doesn't upset our bookkeeping, hence we call
+% \cs{savetaglength@} to insert 0\,pt as the tag for this
+% pseudo-line, and we advance the \cs{row@} counter and reset
+% \cs{lineht@} afterwards. It would be nice if we could just
+% replace the \cs{crcr} by \cs{math@cr@@@}, but that would cause
+% problems with the tag processing.
+% \begin{macrocode}
+ \gdef\split@{%
+ \global\@tempcnta\column@
+ &\setboxz@h{}%
+ \savetaglength@
+ \global\advance\row@\@ne
+ \vbox{\moveleft\wd\thr@@\box9}%
+ \crcr
+ \noalign{\global\lineht@\z@}%
+ \add@amps\@tempcnta
+ \box\thr@@
+ &\box7
+ }%
+ \fi
+ \else
+ \ifctagsplit@
+ \gdef\split@{\vcenter{\boxz@}}%
+ \else
+% \end{macrocode}
+% Changed to just \cs{boxz@}, otherwise last line gets centered
+% rather than aligned properly with respect to the rest of the
+% lines. But this means that we can't see inside of the last line
+% to decide whether the tag needs to be moved. Will have to think
+% about this.---dmj, 1994/12/28
+% \begin{macrocode}
+ \gdef\split@{%
+ \boxz@
+% \box9
+% \crcr
+% \hbox{\box\thr@@\box7}%
+ }%
+ \fi
+ \fi
+ \aftergroup\split@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lendsplit@}
+% \begin{macrocode}
+\def\lendsplit@{%
+ \global\setbox9\vtop{\unvcopy\z@}%
+ \ifinalign@
+% \end{macrocode}
+% Moved following two boxes inside the \cs{ifinalign@}, since they
+% are only used in that case. In fact, if we just kept track of
+% the width of the first column, we could dispense with this
+% entirely. Surely that would be more efficient than all these box
+% copies.---dmj, 1994/12/28
+% \begin{macrocode}
+ \setbox\@ne\vbox{%
+ \unvcopy\z@
+ \global\setbox8\lastbox
+ }%
+ \setbox\@ne\hbox{%
+ \unhcopy8%
+ \unskip
+ \setbox\tw@\lastbox
+ \unskip
+ \global\setbox\thr@@\lastbox
+ }%
+ \ifctagsplit@
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}%
+ &\vcenter{\vbox{\moveleft\wd\thr@@\box9}}%
+ }%
+ \else
+ \gdef\split@{%
+ \hbox to\wd\thr@@{}%
+ &\vbox{\moveleft\wd\thr@@\box9}%
+ }%
+ \fi
+ \else
+ \ifctagsplit@
+ \gdef\split@{\vcenter{\box9}}%
+ \else
+ \gdef\split@{\box9}%
+ \fi
+ \fi
+ \aftergroup\split@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% With \pkg{amsmath} 1.2 it was possible to put things like
+% \verb'\left\{' between \verb'\begin{equation}' and
+% \verb'\begin{split}' without getting any error message. For
+% backward compatibility we try to avoid a fatal error in this case
+% and instead attempt recovery with \env{aligned}.
+% \begin{macrocode}
+\def\split@aligned#1#2{%
+ \iffalse{\fi\ifnum0=`}\fi
+ \collect@body\split@al@a}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\split@al@a#1#2#3{%
+ \split@warning
+ \endgroup
+% \end{macrocode}
+% If the \opt{fleqn} and \opt{tbtags} options are both in effect then
+% we will need to add an optional argument on the \env{aligned}
+% environment.
+% \begin{macrocode}
+ \toks@{\begin{aligned}}%
+ \if@fleqn \split@al@tagcheck \fi
+% \end{macrocode}
+% The \cs{relax} here is to prevent \cs{@let@token} from being left
+% equal to an ampersand if that happens to be the first thing in the body.
+% \begin{macrocode}
+ \the\toks@\relax#1\end{aligned}%
+ \ifnum0=`{\fi\iffalse}\fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\split@al@tagcheck{%
+ \ifctagsplit@
+ \else
+ \iftagsleft@ \toks@\@xp{\the\toks@ [t]}%
+ \else \toks@\@xp{\the\toks@ [b]}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\split@warning{%
+ \PackageWarning{amsmath}{%
+Cannot use `split' here;\MessageBreak trying to recover with `aligned'}%
+}
+% \end{macrocode}
+%
+% \subsection{The \env{multline} environment}
+%
+% In the original \amstex/, \cn{multlinegap} is a macro with an
+% argument that resets an internal dimension (one with an \qc{\@}
+% character in its name). Here, to save control sequence names, we
+% define \cn{multlinegap} to be the dimension itself and the
+% documentation instructs users to use \cn{setlength} if they
+% need to change it.
+% \begin{macro}{\multlinegap}
+% \begin{macro}{\multlinetaggap}
+% Changed \cs{multlinegap} and \cs{multlinetaggap} to skip
+% registers. Also changed name to \cs{multlinetaggap} from
+% \cs{multlinetaggap@}.
+% \begin{macrocode}
+\newskip\multlinegap
+\multlinegap10pt
+\newskip\multlinetaggap
+\multlinetaggap10pt
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\start@multline}
+% \begin{macrocode}
+\def\start@multline#1{%
+ \RIfM@
+ \nomath@env
+ \DN@{\@namedef{end\@currenvir}{}\@gobble}%
+ \else
+ $$%
+ #1%
+ \ifst@rred
+ \nonumber
+ \else
+ \global\@eqnswtrue
+ \fi
+ \let\next@\multline@
+ \fi
+ \collect@body\next@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{multline}
+% \begin{environment}{multline*}
+% \begin{macrocode}
+\newenvironment{multline}{%
+ \start@multline\st@rredfalse
+}{%
+ \iftagsleft@ \@xp\lendmultline@ \else \@xp\rendmultline@ \fi
+ \ignorespacesafterend
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newenvironment{multline*}{\start@multline\st@rredtrue}{\endmultline}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+%
+% \begin{macro}{\multline@}
+% \begin{macrocode}
+\def\multline@#1{%
+ \Let@
+% \end{macrocode}
+%
+% For multline neither \cs{displ@y} no \cs{displ@y@} is quite right;
+% we want to advance the row number and (I suppose?) the
+% display-pagebreak level, but we only want to do tag-related stuff
+% once before the first line, not repeat it for every line. (Recall
+% that the arg of \cs{@display@init} goes into \cs{everycr}.)
+% \begin{macrocode}
+ \@display@init{\global\advance\row@\@ne \global\dspbrk@lvl\m@ne}%
+ \chardef\dspbrk@context\z@
+ \restore@math@cr
+% \end{macrocode}
+% The \env{multline} environment is somewhat unusual, in that
+% \cs{tag} and \cs{label} are enabled only during the measuring
+% phase and disabled during the production phase.
+% Here we disable \cs{tag} and \cs{label}; \cs{mmeasure@} will
+% re-enable them temporarily.
+% \begin{macrocode}
+ \let\tag\tag@in@align
+ \global\tag@false \global\let\raise@tag\@empty
+ \mmeasure@{#1}%
+ \let\tag\gobble@tag \let\label\@gobble
+ \tabskip \if@fleqn \@mathmargin \else \z@skip \fi
+ \totwidth@\displaywidth
+ \if@fleqn
+ \advance\totwidth@-\@mathmargin
+ \fi
+ \halign\bgroup
+ \hbox to\totwidth@{%
+% \end{macrocode}
+% In order to get the spacing of the last line right in fleqn
+% mode, we need to play a little game here. Normally the
+% stretchability of the \cs{hskip} here will be suppressed by the
+% \cs{hfil} at the end of the template, except inside the last line,
+% when that \cs{hfil} will be removed by the \cs{hfilneg} in
+% \cs{lendmultline@}.
+% \begin{macrocode}
+ \if@fleqn
+ \hskip \@centering \relax
+ \else
+ \hfil
+ \fi
+ \strut@
+ $\m@th\displaystyle{}##\endmultline@math
+ \hfil
+ }%
+ \crcr
+% \end{macrocode}
+% In \opt{fleqn} mode, it's the \cs{tabskip} of \cs{@mathmargin}
+% that needs to be removed in the first line, not the \cs{hfil} at
+% the beginning of the template.
+% \begin{macrocode}
+ \if@fleqn
+ \hskip-\@mathmargin
+ \def\multline@indent{\hskip\@mathmargin}% put it back
+ \else
+ \hfilneg
+ \def\multline@indent{\hskip\multlinegap}%
+ \fi
+ \iftagsleft@
+ \iftag@
+ \begingroup
+ \ifshifttag@
+ \rlap{\vbox{%
+ \normalbaselines
+ \hbox{%
+ \strut@
+ \make@display@tag
+ }%
+ \vbox to\lineht@{}%
+ \raise@tag
+ }}%
+% \end{macrocode}
+% If the equation tag doesn't fit on the same line with the first
+% line of the display, we'll indent the first line by
+% \cn{multlinegap}. This is a change from \pkg{amstex}, where the
+% first line would have been flush against the left margin in this
+% case. A corresponding change will be made in \cs{rendmultline@}.
+% \begin{macrocode}
+ \multline@indent
+ \else
+ \setbox\z@\hbox{\make@display@tag}%
+ \dimen@\@mathmargin \advance\dimen@-\wd\z@
+ \ifdim\dimen@<\multlinetaggap
+ \dimen@\multlinetaggap
+ \fi
+ \box\z@ \hskip\dimen@\relax
+ \fi
+ \endgroup
+ \else
+ \multline@indent
+ \fi
+ \else
+ \multline@indent
+ \fi
+ #1%
+}
+% \end{macrocode}
+%
+% An extra level of indirection for the closing \verb'$' in multline
+% allows us to avoid getting an extra thinmuskip from a final
+% mathpunct in the equation contents, when equation numbers are on
+% the right. If we did not use this workaround, the sequence of
+% elements for a final comma would be, e.g.,
+% \begin{verbatim}
+% ... ,<hskip><box containing equation number>
+% \end{verbatim}
+% which is equivalent to a sequence \verb'<mathpunct><mathord>' as
+% far as the automatic math spacing is concerned.
+% \begin{macrocode}
+\def\endmultline@math{$}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lendmultline@}
+% Bug fix: changed \cs{crcr} to \cs{math@cr} so that \cs{@eqpen}
+% gets reset properly if \cs{displaybreak} is used on the
+% penultimate line of an \env{align}.
+% \begin{macrocode}
+\def\lendmultline@{%
+ \hfilneg
+ \hskip\multlinegap
+ \math@cr
+ \egroup
+ $$%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\rendmultline@}
+% \begin{macrocode}
+\def\rendmultline@{%
+ \iftag@
+ $\let\endmultline@math\relax
+ \ifshifttag@
+ \hskip\multlinegap
+% \end{macrocode}
+% Added depth to correct vertical spacing of shifted equation
+% tags.---dmj, 1994/12/29
+% \begin{macrocode}
+ \llap{\vtop{%
+ \raise@tag
+ \normalbaselines
+ \setbox\@ne\null
+ \dp\@ne\lineht@
+ \box\@ne
+ \hbox{\strut@\make@display@tag}%
+ }}%
+ \else
+ \hskip\multlinetaggap
+ \make@display@tag
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ \hfilneg
+% \end{macrocode}
+% Use \cs{math@cr} rather than just \cs{crcr} so that \cs{@eqpen}
+% gets reset properly if \cs{displaybreak} is used.
+% \begin{macrocode}
+ \math@cr
+ \egroup$$%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mmeasure@}
+% \begin{macrocode}
+\def\mmeasure@#1{%
+ \begingroup
+ \measuring@true
+% \end{macrocode}
+% We use \cs{begin/endgroup} rather than |{}| in this definition of
+% \cn{label} because the latter would create an extra (wasteful of
+% main mem) null box in the current math list. [mjd, 1995/01/17]
+% \begin{macrocode}
+ \def\label##1{%
+ \begingroup\measuring@false\label@in@display{##1}\endgroup}%
+ \def\math@cr@@@{\cr}%
+ \let\shoveleft\@iden \let\shoveright\@iden
+ \savecounters@
+ \global\row@\z@
+ \setbox\@ne\vbox{%
+ \global\let\df@tag\@empty
+ \halign{%
+ \setboxz@h{\@lign$\m@th\displaystyle{}##$}%
+ \iftagsleft@
+ \ifnum\row@=\@ne
+ \global\totwidth@\wdz@
+ \global\lineht@\ht\z@
+ \fi
+ \else
+ \global\totwidth@\wdz@
+ \global\lineht@\dp\z@
+ \fi
+ \crcr
+ #1%
+ \crcr
+ }%
+ }%
+ \ifx\df@tag\@empty\else\global\tag@true\fi
+ \if@eqnsw\global\tag@true\fi
+ \iftag@
+ \setboxz@h{%
+ \if@eqnsw
+ \stepcounter{equation}%
+ \tagform@\theequation
+ \else
+ \df@tag
+ \fi
+ }%
+ \global\tagwidth@\wdz@
+ \dimen@\totwidth@
+ \advance\dimen@\tagwidth@
+ \advance\dimen@\multlinetaggap
+ \iftagsleft@\else
+ \if@fleqn
+ \advance\dimen@\@mathmargin
+ \fi
+ \fi
+ \ifdim\dimen@>\displaywidth
+ \global\shifttag@true
+ \else
+ \global\shifttag@false
+ \fi
+ \fi
+ \restorecounters@
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\shoveleft}
+% \begin{macro}{\shoveright}
+% \cs{shoveleft} and \cs{shoveright} need to do slightly different
+% things depending on whether tags are on the left or the right and
+% whether we're in \opt{fleqn} mode. For compactness of code, we
+% make the appropriate decisions at ``compile'' time rather than at
+% load time.
+%
+% TODO: Investigate making \cs{shoveright} behave ``properly''(?) if
+% used on the first line of a \env{multline} and make \cs{shoveleft}
+% behave properly if used on the last line of a \env{multline}. But
+% in his \fn{amstex.doc} Spivak indicates those commands should never
+% be used on a first or last line. Perhaps better to leave the
+% question open unless/until real-life examples turn up.
+% \begin{macrocode}
+\iftagsleft@
+ \def\shoveright#1{%
+ #1%
+ \hfilneg
+ \hskip\multlinegap
+ }
+\else
+ \def\shoveright#1{%
+ #1%
+ \hfilneg
+ \iftag@
+ \ifshifttag@
+ \hskip\multlinegap
+ \else
+ \hskip\tagwidth@
+ \hskip\multlinetaggap
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ }
+\fi
+
+\if@fleqn
+ \def\shoveleft#1{#1}%
+\else
+ \iftagsleft@
+ \def\shoveleft#1{%
+ \setboxz@h{$\m@th\displaystyle{}#1$}%
+ \setbox\@ne\hbox{$\m@th\displaystyle#1$}%
+ \hfilneg
+ \iftag@
+ \ifshifttag@
+ \hskip\multlinegap
+ \else
+ \hskip\tagwidth@
+ \hskip\multlinetaggap
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ \hskip.5\wd\@ne
+ \hskip-.5\wdz@
+ #1%
+ }
+ \else
+ \def\shoveleft#1{%
+ \setboxz@h{$\m@th\displaystyle{}#1$}%
+ \setbox\@ne\hbox{$\m@th\displaystyle#1$}%
+ \hfilneg
+ \hskip\multlinegap
+ \hskip.5\wd\@ne
+ \hskip-.5\wdz@
+ #1%
+ }
+ \fi
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The \env{equation} environment}
+%
+% Rewritten from the ground up for version 2.0 to fix no-shrink and
+% no-shortskips bugs [mjd,2000/01/06].
+%
+% Standard \latex/ provides three environments for one-line equations:
+% \cn{[}\cn{]}, \env{equation}, and \env{displaymath}. We add
+% \env{equation*} as a synonym for \env{displaymath}.
+% \begin{macrocode}
+\@saveprimitive\leqno\@@leqno
+\@saveprimitive\eqno\@@eqno
+\def\eqno{\@@eqno\let\eqno\relax\let\leqno\relax}
+\def\leqno{\@@leqno\let\leqno\relax\let\eqno\relax}
+%
+\let\veqno=\@@eqno
+\iftagsleft@ \let\veqno=\@@leqno \fi
+% \end{macrocode}
+%
+% Support for the \pkg{showkeys} package: provide no-op definitions
+% for a couple of SK functions, if they are not already defined. Then
+% we can just call them directly in our code without any extra fuss.
+% If the \pkg{showkeys} package is loaded later, our trivial
+% definitions will get overridden and everything works fine.
+% \begin{macrocode}
+\@ifundefined{SK@@label}{%
+ \let\SK@@label\relax \let\SK@equationtrue\relax
+}{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\reset@equation\@empty
+% \end{macrocode}
+%
+% Cf \cs{tag@in@align}. This is a bit of a mess though. Could use
+% some work. [mjd,1999/12/21]
+% \begin{macrocode}
+\let\alt@tag\@empty
+\def\tag@in@display#1#{\relax\tag@in@display@a{#1}}
+\def\tag@in@display@a#1#2{%
+ \iftag@
+ \invalid@tag{Multiple \string\tag}\relax
+ \else
+ \global\tag@true \nonumber \reset@equation \st@rredtrue
+ \if *\string#1%
+ \gdef\alt@tag{\def\SK@tagform@{#2\@gobble}%
+ \ifx\SK@@label\relax \let\tagform@\SK@tagform@ \fi
+ }%
+ \make@df@tag@@{#2}%
+ \else
+ \make@df@tag@@@{#2}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\restore@hfuzz\@empty
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\mathdisplay#1{%
+ \ifmmode \@badmath
+ \else
+ $$\def\@currenvir{#1}%
+% \end{macrocode}
+% Allow use of \cn{displaybreak}.
+% \begin{macrocode}
+ \let\dspbrk@context\z@
+% \end{macrocode}
+% Although in some cases simpler label handling would seem to be
+% sufficient, always using \cs{label@in@display} makes it easier to
+% support the \pkg{showkeys} package.
+% \begin{macrocode}
+ \let\tag\tag@in@display \let\label\label@in@display \SK@equationtrue
+ \global\let\df@label\@empty \global\let\df@tag\@empty
+ \global\tag@false
+ \let\mathdisplay@push\mathdisplay@@push
+ \let\mathdisplay@pop\mathdisplay@@pop
+ \if@fleqn
+% \end{macrocode}
+% Turn off overfull box messages temporarily\mdash otherwise there
+% would be unwanted extra ones emitted during our measuring
+% operations.
+% \begin{macrocode}
+ \edef\restore@hfuzz{\hfuzz\the\hfuzz\relax}%
+ \hfuzz\maxdimen
+% \end{macrocode}
+% Initially set the equation body in a box of displaywidth. Then if
+% the box is not overfull, as we find by checking \cs{badness}, we
+% have acquired useful information for the subsequent processing.
+% \begin{macrocode}
+ \setbox\z@\hbox to\displaywidth\bgroup
+ \let\split@warning\relax \restore@hfuzz
+ \everymath\@emptytoks \m@th $\displaystyle
+ \fi
+ \fi
+}
+% \end{macrocode}
+%
+% Arg 1 is not currently used. I thought it might come in handy for
+% error messages.
+% \begin{macrocode}
+\def\endmathdisplay#1{%
+ \ifmmode \else \@badmath \fi
+ \endmathdisplay@a
+ $$%
+% \end{macrocode}
+% I guess the following code means this structure is non-reentrant.
+% But there is plenty of scope for tricky bugs here; suppressing them
+% by brute force at least makes it possible to get things working
+% correctly for normal use. [mjd,2000/01/06]
+% \begin{macrocode}
+ \global\let\df@label\@empty \global\let\df@tag\@empty
+ \global\tag@false \global\let\alt@tag\@empty
+ \global\@eqnswfalse
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\endmathdisplay@a{%
+ \if@eqnsw \gdef\df@tag{\tagform@\theequation}\fi
+ \if@fleqn \@xp\endmathdisplay@fleqn
+ \else \ifx\df@tag\@empty \else \veqno \alt@tag \df@tag \fi
+ \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi
+ \fi
+ \ifnum\dspbrk@lvl>\m@ne
+ \postdisplaypenalty -\@getpen\dspbrk@lvl
+ \global\dspbrk@lvl\m@ne
+ \fi
+}
+% \end{macrocode}
+%
+% A boolean variable: Was that last box overfull or not? A value of 0
+% means yes, it was overfull.
+% \begin{macrocode}
+\let\too@wide\@ne
+% \end{macrocode}
+%
+% Special handling is needed for flush-left equations. We need to
+% measure the equation body (found in box 0 after we close it with
+% the \cs{egroup}). Then after a fairly normal test to see if it fits
+% within the available space, we need to consider overlapping into
+% the displayindent area if displayindent is nonzero (as in an
+% indented list). If there is an equation number we may have to shift
+% it by hand to a separate line when there is not enough room;
+% we can no longer take advantage of the automatic shifting provided
+% by the \cn{leqno}, \cn{eqno} primitives.
+%
+% We initially add \cs{@mathmargin} glue at the end of box 0 to get
+% an accurate overfull test. If \cs{@mathmargin} contains any shrink
+% then we cannot reliably tell whether the box will be overfull or
+% not simply by doing hand calculations from the actual width of the
+% equation body. We have to actually set the box and find out what
+% happens.
+%
+% On the other hand if we put the \cs{@mathmargin} glue at the
+% beginning of the box it's awkward to remove it afterwards. So we
+% first put it in at the end and later we will move it to the
+% beginning as needed.
+%
+% \begin{macrocode}
+\def\endmathdisplay@fleqn{%
+ $\hfil\hskip\@mathmargin\egroup
+% \end{macrocode}
+% We need to save the information about whether box 0 was overfull in
+% a variable, otherwise it will disappear in the next setbox
+% operation. And we couldn't set the equation number box earlier than
+% now, because the body of the equation might have contained a
+% \cs{tag} command (well, it could have been done, but this way
+% we can reuse the tag-handling code from elsewhere).
+% \begin{macrocode}
+ \ifnum\badness<\inf@bad \let\too@wide\@ne \else \let\too@wide\z@ \fi
+ \ifx\@empty\df@tag
+ \else
+ \setbox4\hbox{\df@tag
+ \ifx\df@label\@empty \else \@xp\ltx@label\@xp{\df@label}\fi
+ }%
+ \fi
+ \csname emdf@%
+ \ifx\df@tag\@empty U\else \iftagsleft@ L\else R\fi\fi
+ \endcsname
+}
+% \end{macrocode}
+%
+% For an unnumbered flush-left equation we hope first that the
+% the contents fit within displaywidth. If not we need to fall back
+% on a more complicated reboxing operation.
+% \begin{macrocode}
+\def\emdf@U{%
+ \restore@hfuzz
+ \ifodd\too@wide % not too wide: just need to swap the glue around
+ \hbox to\displaywidth{\hskip\@mathmargin\unhbox\z@\unskip}%
+ \else % M+B > displaywidth
+ \emdf@Ua
+ \fi
+}
+% \end{macrocode}
+%
+% Some notation: $M$ \cs{@mathmargin}, $B$ the width of the equation
+% body, $I$ \cs{displayindent}, $D$ \cs{displaywidth}, $N$ the width
+% of the equation number (aka the tag), $S$ \cs{mintagsep}, $C$
+% \cs{columnwidth}. If $M+B > \mbox{displaywidth}$, and if we assume
+% $M$ contains shrink, then the only solution left is to encroach
+% into the displayindent space.
+% \begin{macrocode}
+\def\emdf@Ua{%
+ \hbox to\columnwidth{%
+ \ifdim\displayindent>\z@
+ \hskip\displayindent minus\displayindent
+ \fi
+ \hskip\@mathmargin \unhbox\z@ \unskip
+ }%
+ \displayindent\z@ \displaywidth\columnwidth
+}
+% \end{macrocode}
+%
+% Find out first if the tag fits in ideal position. If so we can just
+% plunk down box 2. Otherwise we need to do something more complicated.
+% \begin{macrocode}
+\def\emdf@R{%
+ \setbox\tw@\hbox to\displaywidth{%
+ \hskip\@mathmargin \unhcopy\z@\unskip\hfil\hskip\mintagsep\copy4
+ }%
+ \restore@hfuzz
+ \ifnum\badness<\inf@bad \box\tw@ \else \emdf@Ra \fi
+}
+% \end{macrocode}
+%
+% We shift the equation number to line 2 if it does not fit within
+% \cs{displaywidth}. Note that we do not first attempt to let the
+% equation body shift leftward into the \cs{displayindent} space. If
+% that is desired it will have to be done by hand by adding negative
+% space at the beginning of the equation body. I don't expect this to
+% arise very often in practice since most of the time
+% \cs{displayindent} is zero anyway.
+% \begin{macrocode}
+\def\emdf@Ra{%
+ \skip@\displayindent minus\displayindent
+ \displayindent\z@ \displaywidth\columnwidth
+ \spread@equation \everycr{}\tabskip\z@skip
+ \halign{\hbox to\displaywidth{##}\cr
+ \relax
+ \ifdim\skip@>\z@ \hskip\skip@ \fi
+ \hskip\@mathmargin\unhbox\z@\unskip\hfil\cr
+ \noalign{\raise@tag}%
+ \hfil\box4 \cr}%
+}
+% \end{macrocode}
+%
+% Find out first if the tag fits in ideal position. If so we can just
+% plunk down box 2. Otherwise we need to do something more
+% complicated.
+% \begin{macrocode}
+\def\emdf@L{%
+% \end{macrocode}
+% Calculate the difference between $M$ and $N+S$. If the latter is
+% greater, we don't want to add any extra glue between the number and
+% the equation body. Otherwise the amount that we want to add is
+% \verb'x minus x' where $x=M-(N+S)$. I.e., the distribution of
+% spaces across the line is $N,S,x minus x,B,hfil$.
+% \begin{macrocode}
+ \@tempdima\@mathmargin
+ \advance\@tempdima-\wd4 \advance\@tempdima-\mintagsep
+ \skip@\@tempdima minus\@tempdima
+ \setbox\tw@\hbox to\displaywidth{%
+ \copy4\hskip\mintagsep
+ \ifdim\skip@>\z@ \hskip\skip@\fi
+ \unhcopy\z@\unskip
+ }%
+ \restore@hfuzz
+ \ifnum\badness<\inf@bad \box\tw@ \else \emdf@La \fi
+}
+% \end{macrocode}
+%
+% If the equation body and equation number will not fit on the same
+% line, we put the number on line 1 and the body on line 2, with the
+% body positioned as for an unnumbered equation.
+% \begin{macrocode}
+\def\emdf@La{%
+ \spread@equation \everycr{}\tabskip\z@skip
+ \halign{\hbox to\displaywidth{##}\cr
+ \box4 \hfil \cr
+ \noalign{\raise@tag}%
+ \hskip\@mathmargin\unhbox\z@\unskip\hfil\cr}%
+}
+% \end{macrocode}
+%
+% If someone has \verb'\[ \]' nested inside a minipage environment
+% nested inside a numbered equation, the mathdisplay variables that
+% are global will get out of whack unless we take extra care. So we
+% make a stack and push all the variables before entering mathdisplay
+% and pop them afterwards. But we can save a little work by not doing
+% this at the top level, only at inner levels.
+% \begin{macrocode}
+\newtoks\mathdisplay@stack
+\let\mathdisplay@push\@empty
+\def\mathdisplay@@push{%
+ \begingroup
+ \toks@\@xp{\df@label}\@temptokena\@xp{\df@tag}%
+ \toks8\@xp{\alt@tag}%
+ \edef\@tempa{%
+ \global\if@eqnsw\@nx\@eqnswtrue\else\@nx\@eqnswfalse\fi
+ \global\iftag@\@nx\tag@false\else\@nx\tag@true\fi
+ \gdef\@nx\df@label{\the\toks@}\gdef\@nx\df@tag{\the\@temptokena}%
+ \gdef\@nx\alt@tag{\the\toks8}%
+ \global\mathdisplay@stack{\the\mathdisplay@stack}%
+ }%
+ \global\mathdisplay@stack\@xp{\@tempa}
+ \endgroup
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\mathdisplay@pop\@empty
+\def\mathdisplay@@pop{\the\mathdisplay@stack}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\renewenvironment{equation}{%
+ \incr@eqnum
+ \mathdisplay@push
+ \st@rredfalse \global\@eqnswtrue
+ \mathdisplay{equation}%
+}{%
+ \endmathdisplay{equation}%
+ \mathdisplay@pop
+ \ignorespacesafterend
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newenvironment{equation*}{%
+ \mathdisplay@push
+ \st@rredtrue \global\@eqnswfalse
+ \mathdisplay{equation*}%
+}{%
+ \endmathdisplay{equation*}%
+ \mathdisplay@pop
+ \ignorespacesafterend
+}
+% \end{macrocode}
+%
+% Note: \latex/ defines the \env{displaymath} environment in
+% terms of \cn{[} and \cn{]}.
+% \begin{macrocode}
+\DeclareRobustCommand{\[}{\begin{equation*}}
+\DeclareRobustCommand{\]}{\end{equation*}}
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \section{Credits}
+%
+% Much of the code for the \pkg{amsmath} package had its orgin in
+% \fn{amstex.tex}, written by Michael Spivak. The initial work of
+% porting \fn{amstex.tex} to \fn{amstex.sty} was done in 1988--1989
+% by Frank Mittelbach and Rainer Sch\"opf. In 1994 David M. Jones
+% added the support for the \opt{fleqn} option and did extensive
+% improvements to the \env{align[at]} family of environments and to
+% the equation number handling in general. Michael Downes at the AMS
+% served as coordinator for the efforts of Mittelbach, Sch\"opf, and
+% Jones, and has contributed various bug fixes and additional
+% refinements over time.
+%
+% Versions 1.0 and 1.1 of the package carried the name \pkg{amstex}
+% instead of \pkg{amsmath}, to indicate its origins; the name was
+% changed in 1994 to make it user-oriented rather than
+% history-oriented.
+%
+\endinput
diff --git a/macros/latex-dev/required/amsmath/amsmath.ins b/macros/latex-dev/required/amsmath/amsmath.ins
new file mode 100644
index 0000000000..7a6a087359
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsmath.ins
@@ -0,0 +1,50 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999, 2000, 2013 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amsmath.sty}{\from{amsmath.dtx}{}}
+}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/amsmath/amsmath.pdf b/macros/latex-dev/required/amsmath/amsmath.pdf
new file mode 100644
index 0000000000..94a460afa4
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsmath.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsopn.dtx b/macros/latex-dev/required/amsmath/amsopn.dtx
new file mode 100644
index 0000000000..b7047377f3
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsopn.dtx
@@ -0,0 +1,263 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\let\savedarg\arg
+\usepackage{amsopn}
+\let\arg\savedarg
+\GetFileInfo{amsopn.sty}
+\begin{document}
+\title{The \pkg{amsopn} package}
+\author{Michael Downes}
+\date{Version \fileversion, \filedate}
+\DocInput{amsopn.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+%
+% The \pkg{amsopn} package provides a command
+% \cn{DeclareMathOperator} for defining new `math operator names'
+% similar to the standard function names \cn{sin}, \cn{lim},
+% \cn{max}, etc.
+%
+% \StopEventually{}
+%
+% Standard file identification.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\ProvidesPackage{amsopn}[2016/03/08 v2.02 operator names]
+% \end{macrocode}
+%
+% What \cs{nolimits@} does is keep a \cn{limits} typed by the user
+% from having any effect. This is used for operatornames whose
+% standard usage is never to have limits.
+% \begin{macrocode}
+\def\nolimits@{\@ifnextchar\limits{\nolimits\@gobble}{\nolimits}}
+% \end{macrocode}
+%
+% In operator names, it is sometimes desired to have text-mode
+% punctuation characters such as |*-/:'|.
+% Because the body of an
+% operator name is set in math mode, these few punctuation
+% characters will not come out right (wrong symbol/and or wrong
+% spacing). The purpose of \cs{newmcodes@} is to make them act like
+% their normal text versions.
+%
+% Where practical, we use decimal numbers to cut down main mem
+% usage (\qc{\"} not needed).
+% use |\Umathcodedefnum| with xetex and LuaTeX to avoid problems
+% using |\mathcode| if |-| has already been defined using |\Umathcode|.
+% \changes{v2.02}{2016/03/08}{Unicode TeX version of \cs{newmcodes@}}
+% \begin{macrocode}
+\begingroup \catcode`\"=12
+\ifx\Umathcode\@undefined
+\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
+% \end{macrocode}
+% Define \cs{std@minus} for \cs{relbar} use; otherwise there are
+% problems with arrows constructed with relbar.
+% \begin{macrocode}
+ \ifnum\mathcode`\-=45 \else
+ \mathchardef\std@minus\mathcode`\-\relax
+ \fi
+ \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
+% \end{macrocode}
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% \begin{macrocode}
+\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
+ \ifnum\Umathcodenum`\-=45 \else
+ \Umathcharnumdef\std@minus\Umathcodenum`\-\relax
+ \fi
+ \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
+% \end{macrocode}
+% \begin{macrocode}
+\fi
+\endgroup
+% \end{macrocode}
+%
+% The command \cs{operatorname} prints its argument as a `math
+% operator' like \cs{sin} or \cs{det}, with proper font and spacing.
+% \begin{macrocode}
+\DeclareRobustCommand{\operatorname}{%
+ \@ifstar{\qopname\newmcodes@ m}%
+ {\qopname\newmcodes@ o}}%
+% \end{macrocode}
+% In the interior of the \cs{mathop} we need a null object (we choose
+% a zero kern for minimum waste of main mem) in order to guard
+% against the case where \arg{3} is a single letter; \tex/ will seize
+% it and center it on the math axis if there is nothing else inside
+% the \cs{mathop} atom.
+% \begin{macrocode}
+\DeclareRobustCommand{\qopname}[3]{%
+ \mathop{#1\kern\z@\operator@font#3}%
+ \csname n#2limits@\endcsname}
+% \end{macrocode}
+%
+% \begin{macro}{\DeclareMathOperator}
+% The command \cn{DeclareMathOperator} defines the first argument to
+% be an operator name whose text is the second argument. The star
+% form means that the operator name should take limits (like \cn{max}
+% or \cn{lim}).
+% \begin{macrocode}
+\newcommand{\DeclareMathOperator}{%
+ \@ifstar{\@declmathop m}{\@declmathop o}}
+% \end{macrocode}
+% \end{macro}
+%
+% In the basic set of operator names (below) we did not use
+% \cn{DeclareRobustCommand} because of the hash table cost. But we
+% use it here to minimize the chances of trouble, since we are
+% producing a user-defined command.
+% \begin{macrocode}
+\long\def\@declmathop#1#2#3{%
+ \@ifdefinable{#2}{%
+ \DeclareRobustCommand{#2}{\qopname\newmcodes@#1{#3}}}}
+%
+\@onlypreamble\DeclareMathOperator
+\@onlypreamble\@declmathop
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\arccos{\qopname\relax o{arccos}}
+\def\arcsin{\qopname\relax o{arcsin}}
+\def\arctan{\qopname\relax o{arctan}}
+\def\arg{\qopname\relax o{arg}}
+\def\cos{\qopname\relax o{cos}}
+\def\cosh{\qopname\relax o{cosh}}
+\def\cot{\qopname\relax o{cot}}
+\def\coth{\qopname\relax o{coth}}
+\def\csc{\qopname\relax o{csc}}
+\def\deg{\qopname\relax o{deg}}
+\def\det{\qopname\relax m{det}}
+\def\dim{\qopname\relax o{dim}}
+\def\exp{\qopname\relax o{exp}}
+\def\gcd{\qopname\relax m{gcd}}
+\def\hom{\qopname\relax o{hom}}
+\def\inf{\qopname\relax m{inf}}
+\def\injlim{\qopname\relax m{inj\,lim}}
+\def\ker{\qopname\relax o{ker}}
+\def\lg{\qopname\relax o{lg}}
+\def\lim{\qopname\relax m{lim}}
+\def\liminf{\qopname\relax m{lim\,inf}}
+\def\limsup{\qopname\relax m{lim\,sup}}
+\def\ln{\qopname\relax o{ln}}
+\def\log{\qopname\relax o{log}}
+\def\max{\qopname\relax m{max}}
+\def\min{\qopname\relax m{min}}
+\def\Pr{\qopname\relax m{Pr}}
+\def\projlim{\qopname\relax m{proj\,lim}}
+\def\sec{\qopname\relax o{sec}}
+\def\sin{\qopname\relax o{sin}}
+\def\sinh{\qopname\relax o{sinh}}
+\def\sup{\qopname\relax m{sup}}
+\def\tan{\qopname\relax o{tan}}
+\def\tanh{\qopname\relax o{tanh}}
+% \end{macrocode}
+%
+% \begin{macro}{\operator@font}
+% \begin{macro}{\operatorfont}
+% This command is provided to allow the document styles to decide in
+% which way math operators like `max' or `log' are typeset. The
+% default is to set them in \meta{math group} zero of the current
+% math version. The original name was \cs{operator@font}, retained
+% for compatibility; the second name was added to make it
+% more accessible so that users can call this font for use in special
+% constructs that are not ordinary operator names but conceptually
+% related.
+% \begin{macrocode}
+\def\operator@font{\mathgroup\symoperators}
+\def\operatorfont{\operator@font}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% For backwards compatibility we keep this old command name for the
+% time being:
+% \begin{macrocode}
+\def\operatornamewithlimits{\operatorname*}
+% \end{macrocode}
+%
+% These macros use \cs{mathpalette}s so that they will change size
+% in script and scriptscript styles, though it's hard to imagine they
+% will ever be used there (the arrows, particularly, look bad in
+% subscript sizes). Notice that the use of \cs{ex@} means that the
+% vertical spacing may not be optimal in script and scriptscript
+% sizes. Unfortunately \tex/ provides no easy way to do math mode
+% vertical spacing that varies with current math style like mu units.
+% \begin{macrocode}
+\def\varlim@#1#2{%
+ \vtop{\m@th\ialign{##\cr
+ \hfil$#1\operator@font lim$\hfil\cr
+ \noalign{\nointerlineskip\kern1.5\ex@}#2\cr
+ \noalign{\nointerlineskip\kern-\ex@}\cr}}%
+}
+\def\varinjlim{%
+ \mathop{\mathpalette\varlim@{\rightarrowfill@\textstyle}}\nmlimits@
+}
+\def\varprojlim{%
+ \mathop{\mathpalette\varlim@{\leftarrowfill@\textstyle}}\nmlimits@
+}
+\def\varliminf{\mathop{\mathpalette\varliminf@{}}\nmlimits@}
+\def\varliminf@#1{\@@underline{\vrule\@depth.2\ex@\@width\z@
+ \hbox{$#1\m@th\operator@font lim$}}}
+\def\varlimsup{\mathop{\mathpalette\varlimsup@{}}\nmlimits@}
+\def\varlimsup@#1{\@@overline{\hbox{$#1\m@th\operator@font lim$}}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\nmlimits@\displaylimits
+\DeclareOption{namelimits}{\let\nmlimits@\displaylimits}
+\DeclareOption{nonamelimits}{\let\nmlimits@\nolimits}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+% If we don't load the \pkg{amsgen} package then the use of \cs{ex@}
+% in \cs{varlim@} will lead to trouble.
+% \begin{macrocode}
+\RequirePackage{amsgen}\relax
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \changes{v1.2a}{1995/02/20}{Fixed operatorname
+% (shouldn't have same limits behavior as operatorname*)}
+%
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amsopn.ins b/macros/latex-dev/required/amsmath/amsopn.ins
new file mode 100644
index 0000000000..8c977446cc
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsopn.ins
@@ -0,0 +1,50 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amsopn.sty}{\from{amsopn.dtx}{}}
+}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/amsmath/amsopn.pdf b/macros/latex-dev/required/amsmath/amsopn.pdf
new file mode 100644
index 0000000000..f854a4246b
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsopn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amstex.sty b/macros/latex-dev/required/amsmath/amstex.sty
new file mode 100644
index 0000000000..edb57c1214
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amstex.sty
@@ -0,0 +1,2025 @@
+%
+% \iffalse meta-comment
+%
+% Copyright 1995, 1999 American Mathematical Society.
+% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+% This file was generated from version 1.2beta of amstex.dtx and then
+% underwent additional hand-editing.
+\if@compatibility \else \catcode`\%=9 \fi
+%\PackageError{amstex}{%
+%Package `amstex' is obsolete, substituting `amsmath'}{You
+%should use \string\usepackage{amsmath} instead. If
+%that does not give satisfactory results, rename your previous copy
+%of amstex.sty to amstex12beta.sty and call it with
+%\string\usepackage{amstex12beta}.}
+%\catcode`\%=14 \relax \input{amsmath.sty}\endinput
+%
+\ProvidesPackage{amstex}[1999/11/15 v1.2f AMS extra math features]
+\let\@amsfonts=T
+\DeclareOption{noamsfonts}{\let\@amsfonts=F}
+\DeclareOption{psamsfonts}{\let\@amsfonts=P}
+\DeclareOption{intlimits}{\let\ilimits@\displaylimits}
+\DeclareOption{nointlimits}{\let\ilimits@\nolimits}
+\DeclareOption{sumlimits}{\let\slimits@\displaylimits}
+\DeclareOption{nosumlimits}{\let\slimits@\nolimits}
+\DeclareOption{namelimits}{\let\nlimits@\displaylimits}
+\DeclareOption{nonamelimits}{\let\nlimits@\nolimits}
+\newif\ifctagsplit@
+\newif\iftagsleft@
+\DeclareOption{leqno}{\tagsleft@true}
+\DeclareOption{reqno}{\tagsleft@false}
+\DeclareOption{centertags}{\ctagsplit@true}
+\DeclareOption{tbtags}{\ctagsplit@false}
+\newif\if@fleqn
+\newskip\@mathmargin
+\@mathmargin\@centering
+\DeclareOption{fleqn}{%
+ \@fleqntrue
+ \@mathmargin\m@ne sp
+ \AtBeginDocument{%
+ \ifdim\@mathmargin=\m@ne sp
+ \@mathmargin\leftmargini
+ \fi
+ }%
+}
+\DeclareOption{righttag}{\tagsleft@false}
+\DeclareOption{ctagsplt}{\ctagsplit@true}
+\DeclareOption{intlim}{\let\ilimits@\displaylimits}
+\DeclareOption{nosumlim}{\let\slimits@\nolimits}
+\DeclareOption{nonamelm}{\let\nlimits@\nolimits}
+\ExecuteOptions{nointlimits,sumlimits,namelimits,centertags}
+\ProcessOptions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% In this section \RequirePackage statements were replaced with the
+%% contents of the referenced files.
+%%% filename = "amsgen.dtx",
+%%% version = "1.2beta",
+%%% date = "1994/12/13",
+\providecommand{\@saveprimitive}[2]{\begingroup\escapechar`\\\relax
+ \edef\@tempa{\string#1}\edef\@tempb{\meaning#1}%
+ \ifx\@tempa\@tempb \global\let#2#1%
+ \else
+ \edef\@tempb{\meaning#2}%
+ \ifx\@tempa\@tempb
+ \else
+ \@latex@error{Unable to properly define \string#2; primitive
+ \noexpand#1no longer primitive}\@eha
+ \fi
+ \fi
+ \endgroup}
+\let\@xp=\expandafter
+\let\@nx=\noexpand
+\newtoks\@emptytoks
+\def\@oparg#1[#2]{\@ifnextchar[{#1}{#1[#2]}}
+\def\@ifempty#1{\@xifempty#1@@..\@nil}
+\long\def\@xifempty#1#2@#3#4#5\@nil{%
+ \ifx#3#4\@xp\@firstoftwo\else\@xp\@secondoftwo\fi}
+\long\def\@ifnotempty#1{\@ifempty{#1}{}}
+\def\FN@{\futurelet\@let@token}
+\def\DN@{\def\next@}
+\def\RIfM@{\relax\ifmmode}
+\def\setboxz@h{\setbox\z@\hbox}
+\def\wdz@{\wd\z@}
+\def\boxz@{\box\z@}
+\def\relaxnext@{\let\@let@token\relax}
+\def\new@ifnextchar#1#2#3{%
+ \let\@tempe #1\def\@tempa{#2}\def\@tempb{#3}\futurelet
+ \@tempc\new@ifnch}
+\def\new@ifnch{\ifx\@tempc \@tempe \let\@tempd\@tempa
+ \else\let\@tempd\@tempb\fi\@tempd}
+\def\new@ifstar#1#2{\new@ifnextchar *{\def\@tempa*{#1}\@tempa}{#2}}
+\@ifundefined{every@math@size}{%
+\let\every@math@size=\every@size
+\def\glb@settings{%
+ \expandafter\ifx\csname S@\f@size\endcsname\relax
+ \calculate@math@sizes
+ \fi
+ \csname S@\f@size\endcsname
+ \ifmath@fonts
+ \begingroup
+ \escapechar\m@ne
+ \csname mv@\math@version \endcsname
+ \globaldefs\@ne
+ \let \glb@currsize \f@size
+ \math@fonts
+ \endgroup
+ \the\every@math@size
+ \else
+ \fi
+}
+\def\set@fontsize#1#2#3{%
+ \@defaultunits\@tempdimb#2pt\relax\@nnil
+ \edef\f@size{\strip@pt\@tempdimb}%
+ \@defaultunits\@tempskipa#3pt\relax\@nnil
+ \edef\f@baselineskip{\the\@tempskipa}%
+ \edef\f@linespread{#1}%
+ \let\baselinestretch\f@linespread
+ \def\size@update{%
+ \baselineskip\f@baselineskip\relax
+ \baselineskip\f@linespread\baselineskip
+ \normalbaselineskip\baselineskip
+ \setbox\strutbox\hbox{%
+ \vrule\@height.7\baselineskip
+ \@depth.3\baselineskip
+ \@width\z@}%
+%%% \the\every@size
+ \let\size@update\relax}%
+ }
+}{}% end \@ifundefined test
+\newdimen\ex@
+\addto@hook\every@math@size{\compute@ex@}
+\def\compute@ex@{%
+ \begingroup
+ \dimen@-\f@size\p@
+ \ifdim\dimen@<-20\p@
+ \global\ex@ 1.5\p@
+ \else
+ \advance\dimen@10\p@ \multiply\dimen@\tw@
+ \edef\@tempa{\ifdim\dimen@>\z@ -\fi}%
+ \dimen@ \ifdim\dimen@<\z@ -\fi \dimen@
+ \advance\dimen@-\@m sp % fudge factor
+ \vfuzz\p@
+ \def\do{\ifdim\dimen@>\z@
+ \vfuzz=.97\vfuzz
+ \advance\dimen@ -\p@
+ \@xp\do \fi}%
+ \do
+ \dimen@\p@ \advance\dimen@-\vfuzz
+ \global\ex@\p@
+ \global\advance\ex@ \@tempa\dimen@
+ \fi
+ \endgroup
+}
+\def\@addpunct#1{\ifnum\spacefactor>\@m \else#1\fi}
+\def\frenchspacing{\sfcode`\.1006\sfcode`\?1005\sfcode`\!1004%
+ \sfcode`\:1003\sfcode`\;1002\sfcode`\,1001 }
+\def\@mathmeasure#1#2#3{\setbox#1\hbox{\frozen@everymath\@emptytoks
+ \m@th$#2#3$}}
+\def\nomath@env{\PackageError{amstex}{%
+ \string\begin{\@currenvir} allowed only in paragraph mode%
+}\@ehb% "You've lost some text"
+}
+\def\Invalid@@{Invalid use of \string}
+\def\nonmatherr@#1{\PackageError{amsfonts}%
+ {\noexpand#1allowed only in math mode}\@ehd}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% filename = "amstext.dtx",
+%%% version = "1.2beta",
+%%% date = "1994/12/13",
+\DeclareRobustCommand{\text}{%
+ \ifmmode\expandafter\text@\else\expandafter\mbox\fi}
+\let\nfss@text\text
+\def\text@#1{\mathchoice
+ {\textdef@\displaystyle\f@size{#1}}%
+ {\textdef@\textstyle\tf@size{\firstchoice@false #1}}%
+ {\textdef@\textstyle\sf@size{\firstchoice@false #1}}%
+ {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}%
+ \check@mathfonts
+}
+\def\textdef@#1#2#3{\hbox{{%
+ \everymath{#1}%
+ \let\f@size#2\selectfont
+ #3}}}
+\newif\iffirstchoice@
+\firstchoice@true
+\def\stepcounter#1{%
+ \iffirstchoice@
+ \global\expandafter\advance\csname c@#1\endcsname \@ne
+ \begingroup
+ \let\@elt\@stpelt
+ \csname cl@#1\endcsname
+ \endgroup
+ \fi}
+\toks@{\iffirstchoice@\else\@xp\@gobblefour\fi\protect}
+\edef\GenericInfo{\the\toks@
+ \@xp\@nx\csname GenericInfo \endcsname}
+\edef\GenericWarning{\the\toks@
+ \@xp\@nx\csname GenericWarning \endcsname}
+\toks@{\iffirstchoice@\else
+ \@xp\@xp\@xp\@gobblefour
+ \@xp\@gobbletwo\fi\protect}
+\edef\GenericError{\the\toks@
+ \@xp\@nx\csname GenericError \endcsname}
+\def\label#1{\@bsphack\iffirstchoice@\if@filesw {\let\thepage\relax
+ \def\protect{\noexpand\noexpand\noexpand}%
+\xdef\@gtempa{\write\@auxout{\string
+ \newlabel{#1}{{\@currentlabel}{\thepage}}}}}\@gtempa
+ \if@nobreak \ifvmode\nobreak\fi\fi\fi\fi\@esphack}
+\begingroup \catcode`\"=12
+\gdef\mathhexbox#1#2#3{\text{$\m@th\mathchar"#1#2#3$}}
+\endgroup
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% filename = "amsfonts.dtx",
+%%% version = "1.2beta",
+%%% date = "1994/12/13",
+\newbox\Mathstrutbox@
+\setbox\Mathstrutbox@=\hbox{}
+\def\Mathstrut@{\copy\Mathstrutbox@}
+\addto@hook\every@math@size{\setbox\z@\hbox{\normalfont(}%
+ \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
+\newbox\strutbox@
+\def\strut@{\copy\strutbox@}
+\addto@hook\every@math@size{%
+ \global\setbox\strutbox@\hbox{\lower.5\normallineskiplimit
+ \vbox{\kern-\normallineskiplimit\copy\strutbox}}}
+\def\big{\bBigg@\@ne}
+\def\Big{\bBigg@{1.5}}
+\def\bigg{\bBigg@\tw@}
+\def\Bigg{\bBigg@{2.5}}
+\def\bBigg@#1#2{%
+ {%
+ \hbox{$\left#2\vcenter to#1\big@size{}\right.%
+ \n@space
+ $}}}
+\addto@hook\every@math@size{%
+ \global\big@size 1.2\ht\Mathstrutbox@
+ \global\advance\big@size 1.2\dp\Mathstrutbox@ }
+\newdimen\big@size
+%% msam, msbm, eufm fonts dealt with at end of file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%% filename = "amsbsy.dtx",
+%%% version = "1.2beta",
+%%% date = "1994/10/27",
+\DeclareRobustCommand{\boldsymbol}[1]{%
+ \begingroup
+ \let\@nomath\@gobble \mathversion{bold}%
+ \math@atom{#1}{%
+ \mathchoice%
+ {\hbox{$\m@th\displaystyle#1$}}%
+ {\hbox{$\m@th\textstyle#1$}}%
+ {\hbox{$\m@th\scriptstyle#1$}}%
+ {\hbox{$\m@th\scriptscriptstyle#1$}}}%
+ \endgroup}
+\def\math@atom#1#2{%
+ \binrel@{#1}\binrel@@{#2}}
+\DeclareRobustCommand{\pmb}{%
+ \ifmmode\else \expandafter\pmb@@\fi\mathpalette\pmb@}
+\def\pmb@@#1#2#3{\leavevmode\setboxz@h{#3}%
+ \dimen@-\wdz@
+ \kern-.5\ex@\copy\z@
+ \kern\dimen@\kern.25\ex@\raise.4\ex@\copy\z@
+ \kern\dimen@\kern.25\ex@\box\z@
+}
+\newdimen\pmbraise@
+\def\pmb@#1#2{\setbox8\hbox{$\m@th#1{#2}$}%
+ \setboxz@h{$\m@th#1\mkern.5mu$}\pmbraise@\wdz@
+ \binrel@{#2}%
+ \dimen@-\wd8 %
+ \binrel@@{%
+ \mkern-.8mu\copy8 %
+ \kern\dimen@\mkern.4mu\raise\pmbraise@\copy8 %
+ \kern\dimen@\mkern.4mu\box8 }%
+}
+\def\binrel@#1{\begingroup
+ \setboxz@h{\thinmuskip0mu
+ \medmuskip\m@ne mu\thickmuskip\@ne mu
+ \setbox\tw@\hbox{$#1\m@th$}\kern-\wd\tw@
+ ${}#1{}\m@th$}%
+ \edef\@tempa{\endgroup\let\noexpand\binrel@@
+ \ifdim\wdz@<\z@ \mathbin
+ \else\ifdim\wdz@>\z@ \mathrel
+ \else \relax\fi\fi}%
+ \@tempa
+}
+\let\binrel@@\relax
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\AmSTeX{\protect\AmS-\protect\TeX{}}
+\def\AmS{{\protect\AmSfont
+ A\kern-.1667em\lower.5ex\hbox{M}\kern-.125emS}}
+\def\AmSfont{%
+ \usefont{OMS}{cmsy}{\if\@xp\@car\f@series\@nil bb\else m\fi}{n}}
+\def\prim@s{\prime\futurelet\@let@token\pr@m@s}
+\def\pr@m@s{%
+ \ifx\@let@token'\DN@##1{\prim@s}\else\let\next@\egroup\fi\next@}
+\let\@prime=\prime
+\renewcommand{\prime}{{\kern\z@\@prime}}
+\DeclareRobustCommand{\mspace}[3]{%
+ \ifmmode\mskip#1#2\else\kern#1#3\fi\relax}
+\renewcommand{\,}{\mspace+\thinmuskip{.1667em}}
+\let\thinspace\,
+\renewcommand{\!}{\mspace-\thinmuskip{.1667em}}
+\let\negthinspace\!
+\renewcommand{\:}{\mspace+\medmuskip{.2222em}}
+\let\medspace\:
+\newcommand{\negmedspace}{\mspace-\medmuskip{.2222em}}
+\renewcommand{\;}{\mspace+\thickmuskip{.2777em}}
+\let\thickspace\;
+\newcommand{\negthickspace}{\mspace-\thickmuskip{.2777em}}
+\def\implies{\DOTSB\;\Longrightarrow\;}
+\def\impliedby{\DOTSB\;\Longleftarrow\;}
+\begingroup \catcode`\"=12 % in case activated by a preceding package
+\gdef\And{\DOTSB\;\mathchar"3026 \;}
+\gdef\lvert{\delimiter"426A30C }
+\gdef\rvert{\delimiter"526A30C }
+\gdef\lVert{\delimiter"426B30D }
+\gdef\rVert{\delimiter"526B30D }
+\endgroup % restore "
+\DeclareRobustCommand{\frac}{\new@ifnextchar[{\frfrac{}}{\frfrac{}[]}}
+\def\frfrac#1[#2]#3#4{\def\next@{#2}%
+ \ifx\next@\@empty \def\next@{#1{#3\over#4}}%
+ \else \def\next@{{#1{#3\above#2\relax#4}}}%
+ \fi
+ \next@}
+\def\dfrac{\protect\frfrac\displaystyle[]}
+\def\tfrac{\protect\frfrac\textstyle[]}
+\DeclareRobustCommand{\binom}{\frbinom{}}
+\def\frbinom#1#2#3{{#1{#2\atopwithdelims()#3}}}
+\def\dbinom{\protect\frbinom\displaystyle}
+\def\tbinom{\protect\frbinom\textstyle}
+\def\colon{\nobreak\mskip2mu\mathpunct{}\nonscript
+ \mkern-\thinmuskip{:}\mskip6muplus1mu\relax}
+\begingroup \catcode`\"=12
+\DeclareMathSymbol{\coprod@}{\mathop}{largesymbols}{"60}
+\gdef\coprod{\DOTSB\coprod@\slimits@}
+\DeclareMathSymbol{\bigvee@}{\mathop}{largesymbols}{"57}
+\gdef\bigvee{\DOTSB\bigvee@\slimits@}
+\DeclareMathSymbol{\bigwedge@}{\mathop}{largesymbols}{"56}
+\gdef\bigwedge{\DOTSB\bigwedge@\slimits@}
+\DeclareMathSymbol{\biguplus@}{\mathop}{largesymbols}{"55}
+\gdef\biguplus{\DOTSB\biguplus@\slimits@}
+\DeclareMathSymbol{\bigcap@}{\mathop}{largesymbols}{"54}
+\gdef\bigcap{\DOTSB\bigcap@\slimits@}
+\DeclareMathSymbol{\bigcup@}{\mathop}{largesymbols}{"53}
+\gdef\bigcup{\DOTSB\bigcup@\slimits@}
+\DeclareMathSymbol{\prod@}{\mathop}{largesymbols}{"51}
+\gdef\prod{\DOTSB\prod@\slimits@}
+\DeclareMathSymbol{\sum@}{\mathop}{largesymbols}{"50}
+\gdef\sum{\DOTSB\sum@\slimits@}
+\DeclareMathSymbol{\bigotimes@}{\mathop}{largesymbols}{"4E}
+\gdef\bigotimes{\DOTSB\bigotimes@\slimits@}
+\DeclareMathSymbol{\bigoplus@}{\mathop}{largesymbols}{"4C}
+\gdef\bigoplus{\DOTSB\bigoplus@\slimits@}
+\DeclareMathSymbol{\bigodot@}{\mathop}{largesymbols}{"4A}
+\gdef\bigodot{\DOTSB\bigodot@\slimits@}
+\DeclareMathSymbol{\bigsqcup@}{\mathop}{largesymbols}{"46}
+\gdef\bigsqcup{\DOTSB\bigsqcup@\slimits@}
+\endgroup
+\def\dddot#1{{\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
+ \hbox{\normalfont ...}\vss}}}}
+\def\ddddot#1{{\mathop{#1}\limits^{\vbox to-1.4\ex@{\kern-\tw@\ex@
+ \hbox{\normalfont....}\vss}}}}
+\def~{\nobreakspace}
+\DeclareRobustCommand{\nobreakspace}{\unskip\nobreak\ \ignorespaces}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newif\if@display
+\everydisplay\expandafter{\the\everydisplay \@displaytrue}
+\def\int{\DOTSI\intop\ilimits@}
+\def\oint{\DOTSI\ointop\ilimits@}
+\def\intkern@{\mkern-6mu\mathchoice{\mkern-3mu}{}{}{}}
+\def\intdots@{\mathchoice{\@cdots}%
+ {{\cdotp}\mkern1.5mu{\cdotp}\mkern1.5mu{\cdotp}}%
+ {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}%
+ {{\cdotp}\mkern1mu{\cdotp}\mkern1mu{\cdotp}}}
+
+\def\iint{\DOTSI\protect\ints@\tw@}
+\def\iiint{\DOTSI\protect\ints@\thr@@}
+\def\iiiint{\DOTSI\protect\ints@{4}}
+\def\idotsint{\DOTSI\protect\ints@\z@}
+
+\def\ints@#1{%
+ \mkern-7mu\mathchoice{\mkern-2mu}{}{}{}%
+ \mathop{\mkern7mu\mathchoice{\mkern2mu}{}{}{}%
+ \intop\ifnum#1=\z@\intdots@
+ \else\intkern@\fi
+ \ifnum#1>\tw@\intop\intkern@\fi
+ \ifnum#1>\thr@@\intop\intkern@\fi
+ \intop
+ }\ilimits@
+}
+\def\nolimits@{%
+ \DN@{\nolimits\ifx\@let@token\limits\expandafter\@gobble\fi}%
+ \FN@\next@}
+\begingroup \catcode`\"=12
+\gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A%
+ \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax}
+\endgroup
+\DeclareRobustCommand{\operatorname}{%
+ \@ifstar{\qopname\newmcodes@ n}%
+ {\qopname\newmcodes@{no}}}%
+\DeclareRobustCommand{\qopname}[3]{\mathop{#1\kern\z@\operator@font#3}%
+ \csname #2limits@\endcsname}
+\def\arccos{\qopname\relax{no}{arccos}}
+\def\arcsin{\qopname\relax{no}{arcsin}}
+\def\arctan{\qopname\relax{no}{arctan}}
+\def\arg{\qopname\relax{no}{arg}}
+\def\cos{\qopname\relax{no}{cos}}
+\def\cosh{\qopname\relax{no}{cosh}}
+\def\cot{\qopname\relax{no}{cot}}
+\def\coth{\qopname\relax{no}{coth}}
+\def\csc{\qopname\relax{no}{csc}}
+\def\deg{\qopname\relax{no}{deg}}
+\def\det{\qopname\relax n{det}}
+\def\dim{\qopname\relax{no}{dim}}
+\def\exp{\qopname\relax{no}{exp}}
+\def\gcd{\qopname\relax n{gcd}}
+\def\hom{\qopname\relax{no}{hom}}
+\def\inf{\qopname\relax n{inf}}
+\def\injlim{\qopname\relax n{inj\,lim}}
+\def\ker{\qopname\relax{no}{ker}}
+\def\lg{\qopname\relax{no}{lg}}
+\def\lim{\qopname\relax n{lim}}
+\def\liminf{\qopname\relax n{lim\,inf}}
+\def\limsup{\qopname\relax n{lim\,sup}}
+\def\ln{\qopname\relax{no}{ln}}
+\def\log{\qopname\relax{no}{log}}
+\def\max{\qopname\relax n{max}}
+\def\min{\qopname\relax n{min}}
+\def\Pr{\qopname\relax n{Pr}}
+\def\projlim{\qopname\relax n{proj\,lim}}
+\def\sec{\qopname\relax{no}{sec}}
+\def\sin{\qopname\relax{no}{sin}}
+\def\sinh{\qopname\relax{no}{sinh}}
+\def\sup{\qopname\relax n{sup}}
+\def\tan{\qopname\relax{no}{tan}}
+\def\tanh{\qopname\relax{no}{tanh}}
+\def\operator@font{\mathgroup\symoperators}
+\def\operatornamewithlimits{\operatorname*}
+\def\varlim@#1#2{\mathop{\vtop{\ialign{##\crcr
+ \hfil$#1\m@th\operator@font lim$\hfil\crcr
+ \noalign{\nointerlineskip\kern\ex@}#2#1\crcr
+ \noalign{\nointerlineskip\kern-\ex@}\crcr}}}}
+\def\varinjlim{\mathpalette\varlim@\rightarrowfill@}
+\def\varprojlim{\mathpalette\varlim@\leftarrowfill@}
+\def\varliminf{\mathpalette\varliminf@{}}
+\def\varliminf@#1{\mathop{\@@underline{\vrule\@depth.2\ex@\@width\z@
+ \hbox{$#1\m@th\operator@font lim$}}}}
+\def\varlimsup{\mathpalette\varlimsup@{}}
+\def\varlimsup@#1{\mathop{\@@overline
+ {\hbox{$#1\m@th\operator@font lim$}}}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\numberwithin#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}{%
+ \@ifundefined{c@#2}{\@nocnterr{#2}}{%
+ \@addtoreset{#1}{#2}%
+ \toks@\expandafter\expandafter\expandafter{\csname the#1\endcsname}%
+ \expandafter\xdef\csname the#1\endcsname
+ {\expandafter\noexpand\csname the#2\endcsname
+ .\the\toks@}}}}
+\def\eqref#1{\textup{\tagform@{\ref{#1}}}}
+\def\bmod{\mskip-\medmuskip\mkern5mu\mathbin
+ {\operator@font mod}\penalty900
+ \mkern5mu\mskip-\medmuskip}
+\def\pod#1{\allowbreak\if@display\mkern18mu\else\mkern8mu\fi(#1)}
+\def\pmod#1{\pod{{\operator@font mod}\mkern6mu#1}}
+\def\mod#1{\allowbreak\if@display\mkern18mu
+ \else\mkern12mu\fi{\operator@font mod}\,\,#1}
+\newcommand{\cfrac}[3][c]{{\displaystyle\frac{%
+ \strut\ifx r#1\hfill\fi#2\ifx l#1\hfill\fi}{#3}}%
+ \kern-\nulldelimiterspace}
+\def\lcfrac{\cfrac[l]}
+\def\rcfrac{\cfrac[r]}
+\def\overset#1#2{\binrel@{#2}%
+ \binrel@@{\mathop{\kern\z@#2}\limits^{#1}}}
+\def\underset#1#2{\binrel@{#2}%
+ \binrel@@{\mathop{\kern\z@#2}\limits_{#1}}}
+\def\sideset#1#2#3{%
+ \setbox\z@\hbox{$\displaystyle{\vphantom{#3}}#1{#3}\m@th$}%
+ \setbox\tw@\hbox{$\displaystyle{#3}#2\m@th$}%
+ \hskip\wd\z@\hskip-\wd\tw@\mathop{\hskip\wd\tw@\hskip-\wd\z@
+ {\vphantom{#3}}#1{#3}#2}}
+\renewcommand{\smash}[2][tb]{%
+ \def\smash@{#1}%
+ \ifmmode\expandafter\mathpalette\expandafter\mathsm@sh\else
+ \expandafter\makesm@sh\fi{#2}}
+\def\finsm@sh{\def\mb@t{\ht\z@\z@}\def\mb@b{\dp\z@\z@}%
+ \def\mb@tb{\mb@t\mb@b}%
+ {\csname mb@\smash@\endcsname}%
+ \leavevmode\boxz@}
+\def\rightarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
+ $#1\copy\z@\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\leftarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
+ $#1\mathord\leftarrow\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\copy\z@\mkern-2mu$}\hfill
+ \mkern-6mu\box\z@$}
+\def\leftrightarrowfill@#1{\m@th\setboxz@h{$#1\relbar$}\ht\z@\z@
+ $#1\mathord\leftarrow\mkern-6mu\cleaders
+ \hbox{$#1\mkern-2mu\box\z@\mkern-2mu$}\hfill
+ \mkern-6mu\mathord\rightarrow$}
+\def\overarrow@#1#2#3{\vbox{\ialign{##\crcr#1#2\crcr
+ \noalign{\kern-\ex@\nointerlineskip}$\m@th\hfil#2#3\hfil$\crcr}}}
+\def\overrightarrow{\mathpalette{\overarrow@\rightarrowfill@}}
+\def\overleftarrow{\mathpalette{\overarrow@\leftarrowfill@}}
+\def\overleftrightarrow{\mathpalette{\overarrow@\leftrightarrowfill@}}
+\def\underarrow@#1#2#3{%
+ \vtop{\ialign{##\crcr$\m@th\hfil#2#3\hfil$\crcr
+ \noalign{\nointerlineskip\kern-.5\ex@}#1#2\crcr}}}
+\def\underrightarrow{\mathpalette{\underarrow@\rightarrowfill@}}
+\def\underleftarrow{\mathpalette{\underarrow@\leftarrowfill@}}
+\def\underleftrightarrow{\mathpalette{\underarrow@\leftrightarrowfill@}}
+\let\ifgtest@\iffalse % initial value
+\def\gtest@true{\global\let\ifgtest@\iftrue}
+\def\gtest@false{\global\let\ifgtest@\iffalse}
+\let\DOTSI\relax
+\let\DOTSB\relax
+\let\DOTSX\relax
+{\uccode`7=`\\ \uccode`8=`m \uccode`9=`a \uccode`0=`t \uccode`!=`h
+ \uppercase{%
+ \gdef\math@#1#2#3#4#5#6\math@{\gtest@false\ifx 7#1\ifx 8#2%
+ \ifx 9#3\ifx 0#4\ifx !#5\xdef\meaning@{#6}\gtest@true
+ \fi\fi\fi\fi\fi}}}
+{\uccode`7=`c \uccode`8=`h \uccode`9=`\"
+ \uppercase{\gdef\mathch@#1#2#3#4#5#6\mathch@{\gtest@false
+ \ifx 7#1\ifx 8#2\ifx 9#5\gtest@true\xdef\meaning@{9#6}\fi\fi\fi}}}
+\newcount\classnum@
+\def\getmathch@#1.#2\getmathch@{\classnum@#1 \divide\classnum@4096
+ \ifcase\number\classnum@\or\or\gdef\thedots@{\dotsb@}\or
+ \gdef\thedots@{\dotsb@}\fi}
+{\uccode`4=`b \uccode`5=`i \uccode`6=`n
+ \uppercase{\gdef\mathbin@#1#2#3{\relaxnext@
+ \def\nextii@##1\mathbin@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\mathbin@{}%
+ \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}}
+{\uccode`4=`r \uccode`5=`e \uccode`6=`l
+ \uppercase{\gdef\mathrel@#1#2#3{\relaxnext@
+ \def\nextii@##1\mathrel@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\mathrel@{}%
+ \ifx 4#1\ifx 5#2\ifx 6#3\DN@{\FN@\nextii@}\fi\fi\fi\next@}}}
+{\uccode`5=`m \uccode`6=`a \uccode`7=`c
+ \uppercase{\gdef\macro@#1#2#3#4\macro@{\gtest@false
+ \ifx 5#1\ifx 6#2\ifx 7#3\gtest@true
+ \xdef\meaning@{\macro@@#4\macro@@}\fi\fi\fi}}}
+\def\macro@@#1->#2\macro@@{#2}
+\newcount\DOTSCASE@
+{\uccode`6=`\\ \uccode`7=`D \uccode`8=`O \uccode`9=`T \uccode`0=`S
+ \uppercase{\gdef\DOTS@#1#2#3#4#5{\gtest@false\DN@##1\DOTS@{}%
+ \ifx 6#1\ifx 7#2\ifx 8#3\ifx 9#4\ifx 0#5\let\next@\DOTS@@
+ \fi\fi\fi\fi\fi
+ \next@}}}
+{\uccode`3=`B \uccode`4=`I \uccode`5=`X
+ \uppercase{\gdef\DOTS@@#1{\relaxnext@
+ \def\nextii@##1\DOTS@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \DN@{\FN@\nextii@}%
+ \ifx 3#1\global\DOTSCASE@\z@\else
+ \ifx 4#1\global\DOTSCASE@\@ne\else
+ \ifx 5#1\global\DOTSCASE@\tw@\else\DN@##1\DOTS@{}%
+ \fi\fi\fi\next@}}}
+{\uccode`5=`\\ \uccode`6=`n \uccode`7=`o \uccode`8=`t
+ \uppercase{\gdef\not@#1#2#3#4{\relaxnext@
+ \def\nextii@##1\not@{\ifx\@sptoken\@let@token\gtest@true\fi}%
+ \gtest@false\DN@##1\not@{}%
+ \ifx 5#1\ifx 6#2\ifx 7#3\ifx 8#4\DN@{\FN@\nextii@}\fi\fi\fi
+ \fi\next@}}}
+\def\keybin@{\gtest@true
+ \ifx\@let@token+\else\ifx\@let@token=\else\ifx\@let@token<%
+ \else\ifx\@let@token>\else\ifx\@let@token-\else\ifx\@let@token*%
+ \else\ifx\@let@token:\else\gtest@false\fi\fi\fi\fi\fi\fi\fi}
+\@ifundefined{@ldots}{\def\@ldots{\mathellipsis}}{}
+\DeclareRobustCommand{\dots}{\relax
+ \csname\ifmmode m\else t\fi dots@\endcsname}
+\def\tdots@{\leavevmode\unskip\relaxnext@
+ \DN@{$\m@th\@ldots\,
+ \ifx\@let@token,\,$\else\ifx\@let@token.\,$\else\ifx\@let@token;\,$%
+ \else\ifx\@let@token:\,$\else\ifx\@let@token?\,$%
+ \else\ifx\@let@token!\,$\else$ \fi\fi\fi\fi\fi\fi}%
+ \ \FN@\next@}
+\def\mdots@{\FN@\mdots@@}
+\def\mdots@@{\gdef\thedots@{\dotso@}%
+ \ifx\@let@token\boldsymbol\gdef\thedots@\boldsymbol{\boldsymboldots@}%
+ \else\ifx,\@let@token\gdef\thedots@{\dotsc}%
+ \else\ifx\not\@let@token\gdef\thedots@{\dotsb@}%
+ \else\keybin@
+ \ifgtest@\gdef\thedots@{\dotsb@}%
+ \else\xdef\meaning@{\meaning\@let@token..........}%
+ \xdef\meaning@@{\meaning@}%
+ \expandafter\math@\meaning@\math@
+ \ifgtest@
+ \expandafter\mathch@\meaning@\mathch@
+ \ifgtest@\expandafter\getmathch@\meaning@\getmathch@\fi
+ \else\expandafter\macro@\meaning@@\macro@
+ \ifgtest@
+ \expandafter\not@\meaning@\not@\ifgtest@\gdef\thedots@{\dotsb@}%
+ \else\expandafter\DOTS@\meaning@\DOTS@
+ \ifgtest@
+ \ifcase\number\DOTSCASE@\gdef\thedots@{\dotsb@}%
+ \or\gdef\thedots@{\dotsi}\else\fi
+ \else\expandafter\math@\meaning@\math@
+ \ifgtest@\expandafter\mathbin@\meaning@\mathbin@
+ \ifgtest@\gdef\thedots@{\dotsb@}%
+ \else\expandafter\mathrel@\meaning@\mathrel@
+ \ifgtest@\gdef\thedots@{\dotsb@}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \thedots@}
+\def\boldsymboldots@#1{%
+ \bold@true\let\@let@token=#1\let\delayed@=#1\mdots@@
+ \boldsymbol#1\bold@false}
+\def\@cdots{\mathinner{\cdotp\cdotp\cdotp}}
+\def\dotsi{\!\@cdots}
+\let\dotsb@\@cdots
+\def\rightdelim@{\gtest@true
+ \ifx\@let@token)\else
+ \ifx\@let@token]\else
+ \ifx\@let@token\rbrack\else
+ \ifx\@let@token\}\else
+ \ifx\@let@token\rbrace\else
+ \ifx\@let@token\rangle\else
+ \ifx\@let@token\rceil\else
+ \ifx\@let@token\rfloor\else
+ \ifx\@let@token\rgroup\else
+ \ifx\@let@token\rmoustache\else
+ \ifx\@let@token\right\else
+ \ifx\@let@token\bigr\else
+ \ifx\@let@token\biggr\else
+ \ifx\@let@token\Bigr\else
+ \ifx\@let@token\Biggr\else\gtest@false
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
+\def\extra@{%
+ \rightdelim@\ifgtest@
+ \else\ifx\@let@token$\gtest@true
+ \else\xdef\meaning@{\meaning\@let@token..........}%
+ \expandafter\macro@\meaning@\macro@\ifgtest@
+ \expandafter\DOTS@\meaning@\DOTS@
+ \ifgtest@
+ \ifnum\DOTSCASE@=\tw@\gtest@true\else\gtest@false
+ \fi\fi\fi\fi\fi}
+\newif\ifbold@
+\def\dotso@{\relaxnext@
+ \ifbold@
+ \let\@let@token\delayed@
+ \def\nextii@{\extra@\@ldots\ifgtest@\,\fi}%
+ \else
+ \def\nextii@{\DN@{\extra@\@ldots\ifgtest@\,\fi}\FN@\next@}%
+ \fi
+ \nextii@}
+\def\extrap@#1{%
+ \DN@{#1\,}%
+ \ifx\@let@token,\else
+ \ifx\@let@token;\else
+ \ifx\@let@token.\else\extra@
+ \ifgtest@\else
+ \let\next@#1\fi\fi\fi\fi\next@}
+\DeclareRobustCommand{\ldots}{\relax
+ \ifmmode \DN@{\extrap@\@ldots}%
+ \else \let\next@\tdots@\fi
+ \FN@\next@}
+\DeclareRobustCommand{\cdots}{\DN@{\extrap@\@cdots}\FN@\next@}
+\let\dotso\ldots
+\let\dotsb\cdots
+\let\dotsm\dotsb
+\DeclareRobustCommand{\dotsc}{%
+ \DN@{\ifx\@let@token;\@ldots\,%
+ \else \ifx\@let@token.\@ldots\,%
+ \else \extra@\@ldots \ifgtest@\,\fi
+ \fi\fi}%
+ \FN@\next@}
+\def\longrightarrow{\DOTSB\relbar\joinrel\rightarrow}
+\def\Longrightarrow{\DOTSB\Relbar\joinrel\Rightarrow}
+\def\longleftarrow{\DOTSB\leftarrow\joinrel\relbar}
+\def\Longleftarrow{\DOTSB\Leftarrow\joinrel\Relbar}
+\def\longleftrightarrow{\DOTSB\leftarrow\joinrel\rightarrow}
+\def\Longleftrightarrow{\DOTSB\Leftarrow\joinrel\Rightarrow}
+\def\mapsto{\DOTSB\mapstochar\rightarrow}
+\def\longmapsto{\DOTSB\mapstochar\longrightarrow}
+\def\hookrightarrow{\DOTSB\lhook\joinrel\rightarrow}
+\def\hookleftarrow{\DOTSB\leftarrow\joinrel\rhook}
+\def\doteq{\DOTSB\buildrel\textstyle.\over=}
+\def\iff{\DOTSB\;\Longleftrightarrow\;}
+\begingroup \catcode`\"=12
+\mathchardef\@tempa="7000
+\ifx\@tempa\Gamma
+ \DeclareMathSymbol{\Gamma}{\mathord}{operators}{"00}
+ \DeclareMathSymbol{\Delta}{\mathord}{operators}{"01}
+ \DeclareMathSymbol{\Theta}{\mathord}{operators}{"02}
+ \DeclareMathSymbol{\Lambda}{\mathord}{operators}{"03}
+ \DeclareMathSymbol{\Xi}{\mathord}{operators}{"04}
+ \DeclareMathSymbol{\Pi}{\mathord}{operators}{"05}
+ \DeclareMathSymbol{\Sigma}{\mathord}{operators}{"06}
+ \DeclareMathSymbol{\Upsilon}{\mathord}{operators}{"07}
+ \DeclareMathSymbol{\Phi}{\mathord}{operators}{"08}
+ \DeclareMathSymbol{\Psi}{\mathord}{operators}{"09}
+ \DeclareMathSymbol{\Omega}{\mathord}{operators}{"0A}
+ \DeclareMathSymbol{\varGamma}{\mathord}{letters}{"00}
+ \DeclareMathSymbol{\varDelta}{\mathord}{letters}{"01}
+ \DeclareMathSymbol{\varTheta}{\mathord}{letters}{"02}
+ \DeclareMathSymbol{\varLambda}{\mathord}{letters}{"03}
+ \DeclareMathSymbol{\varXi}{\mathord}{letters}{"04}
+ \DeclareMathSymbol{\varPi}{\mathord}{letters}{"05}
+ \DeclareMathSymbol{\varSigma}{\mathord}{letters}{"06}
+ \DeclareMathSymbol{\varUpsilon}{\mathord}{letters}{"07}
+ \DeclareMathSymbol{\varPhi}{\mathord}{letters}{"08}
+ \DeclareMathSymbol{\varPsi}{\mathord}{letters}{"09}
+ \DeclareMathSymbol{\varOmega}{\mathord}{letters}{"0A}
+\fi
+\endgroup
+\def\accentclass@{7}
+\def\noaccents@{\def\accentclass@{0}}
+\DeclareFontEncoding{OML}{}{\noaccents@}
+\DeclareFontEncoding{OMS}{}{\noaccents@}
+\edef\@tempa#1#2{\def#1{\mathaccent\string"\noexpand\accentclass@#2 }}
+\@tempa\hat{05E}\@tempa\check{014}\@tempa\tilde{07E}\@tempa\acute{013}
+\@tempa\grave{012}\@tempa\dot{05F}\@tempa\ddot{07F}\@tempa\breve{015}
+\@tempa\bar{016}
+\newcount\skewcharcount@
+\newcount\familycount@
+\def\theskewchar@{\familycount@\@ne
+ \global\skewcharcount@\the\skewchar\textfont\@ne
+ \ifnum\mathgroup>\m@ne\ifnum\mathgroup<16
+ \global\familycount@\the\mathgroup\relax
+ \global\skewcharcount@\the\skewchar\textfont\the\mathgroup\relax\fi\fi
+ \ifnum\skewcharcount@>\m@ne
+ \ifnum\skewcharcount@<128
+ \multiply\familycount@256
+ \global\advance\skewcharcount@\familycount@
+ \global\advance\skewcharcount@28672
+ \mathchar\skewcharcount@\else
+ \global\skewcharcount@\m@ne\fi\else
+ \global\skewcharcount@\m@ne\fi}
+\newcount\pointcount@
+\def\getpoints@#1.#2\getpoints@{\pointcount@#1 }
+\newdimen\accentdimen@
+\newcount\accentmu@
+\def\dimentomu@{\multiply\accentdimen@ 100
+ \expandafter\getpoints@\the\accentdimen@\getpoints@
+ \multiply\pointcount@18
+ \divide\pointcount@\@m
+ \global\accentmu@\pointcount@}
+\def\mathaccent@#1#2{\ifnum\mathgroup=\m@ne\xdef\thefam@{1}\else
+ \xdef\thefam@{\the\mathgroup}\fi
+ \accentdimen@\z@
+ \setboxz@h{\unbracefonts@$\m@th\mathgroup\thefam@\relax#2$}%
+ \ifdim\accentdimen@=\z@\DN@{\mathaccent#1{#2}}%
+ \setbox\@ne\hbox{\unbracefonts@
+ $\m@th\mathgroup\thefam@\relax#2\theskewchar@$}
+ \setbox\tw@\hbox{$\m@th\ifnum\skewcharcount@=\m@ne\else
+ \mathchar\skewcharcount@\fi$}%
+ \global\accentdimen@\wd\@ne\global\advance\accentdimen@-\wdz@
+ \global\advance\accentdimen@-\wd\tw@
+ \global\multiply\accentdimen@\tw@
+ \dimentomu@\global\advance\accentmu@\@ne
+ \else\DN@{{\mathaccent#1{#2\mkern\accentmu@ mu}%
+ \mkern-\accentmu@ mu}{}}\fi
+ \next@}
+\def\unbracefonts@{\let\math@bgroup\@empty\let\math@egroup\@empty}
+\begingroup \catcode`\"=12
+\def\@tempa#1#2{\gdef#1{\RIfM@\DN@{\mathaccent@{"\accentclass@#2 }}%
+ \else\DN@{\nonmatherr@{#1}}\fi\next@}}
+\@tempa\Hat{05E}\@tempa\Check{014}\@tempa\Tilde{07E}\@tempa\Acute{013}
+\@tempa\Grave{012}\@tempa\Dot{05F}\@tempa\Ddot{07F}\@tempa\Breve{015}
+\@tempa\Bar{016}
+\gdef\Vec{\RIfM@\DN@{\mathaccent@{"017E }}\else
+ \DN@{\nonmatherr@\Vec}\fi\next@}
+\endgroup
+\begingroup \catcode`\"=12
+\gdef\@@sqrt#1{\radical"270370 {#1}}
+\endgroup
+\@saveprimitive\overline\@@overline
+\def\overline#1{\@@overline{#1}}
+\def\boxed#1{\fbox{\m@th$\displaystyle#1$}}
+\def\setb@ck{\iffirstchoice@\global\advance\c@equation\m@ne\fi}
+\newcount\dspbrk@lvl
+\dspbrk@lvl=-1
+\interdisplaylinepenalty\@M
+\def\allowdisplaybreaks{%
+ \new@ifnextchar[\allowdspbrks@{\allowdspbrks@[4]}}
+\def\allowdspbrks@[#1]{%
+ \interdisplaylinepenalty\getdsp@pen{#1}}
+\def\getdsp@pen#1{%
+ \ifcase #1\relax \@M
+ \or 9999
+ \or 6999
+ \or 2999
+ \or \z@\fi}
+\def\displaybreak{\PackageError{amstex}{\Invalid@@\displaybreak}\@eha}
+\def\displaybreak@{%
+ \def\displaybreak{\new@ifnextchar[\dspbrk@{\dspbrk@[4]}}}
+\def\dspbrk@[#1]{\global\dspbrk@lvl #1\relax}
+\def\math@cr{{\ifnum0=`}\fi
+ \new@ifstar{\global\@eqpen\@M\math@cr@}%
+ {\global\@eqpen
+ \ifnum\dspbrk@lvl <\z@ \interdisplaylinepenalty
+ \else -\@getpen\dspbrk@lvl \fi
+ \math@cr@}}
+\def\math@cr@{\new@ifnextchar[\math@cr@@{\math@cr@@[\z@]}}
+\def\math@cr@@[#1]{\ifnum0=`{\fi}\math@cr@@@
+ \noalign{\vskip#1\relax}}
+\def\Let@{\let\\\math@cr}
+\def\restore@math@cr{\def\math@cr@@@{\cr}}
+\restore@math@cr
+\def\intertext{\PackageError{amstex}{\Invalid@@\intertext}\@eha}
+\def\intertext@{\def\intertext##1{\noalign{%
+ \penalty\postdisplaypenalty\vskip\belowdisplayskip
+ \vbox{\normalbaselines\noindent##1}%
+ \penalty\predisplaypenalty\vskip\abovedisplayskip}}}
+\newhelp\tag@help
+ {tag cannot be used at this point.\space
+ If you don't understand why^^Jyou should consult
+ the documentation.^^JBut don't worry: just continue, and I'll
+ forget what happened.}
+\def\gobble@tag{\new@ifstar\@gobble\@gobble}
+\def\invalid@tag#1{\PackageError{amstex}{#1}{\the\tag@help}\gobble@tag}
+\def\dft@tag{\invalid@tag{\string\tag\space not allowed here}}
+\def\default@tag{\let\tag\dft@tag}
+\default@tag
+\def\maketag@@{\new@ifstar\maketag@@@\tagform@}
+\def\maketag@@@#1{\hbox{\m@th\normalfont#1}}
+\def\tagform@#1{\maketag@@@{(\ignorespaces#1\unskip)}}
+\def\thetag{\leavevmode\tagform@}
+\def\make@df@tag{\new@ifstar\make@df@tag@@\make@df@tag@@@}
+\def\make@df@tag@@#1{%
+ \def\@currentlabel{#1}%
+ \gdef\df@tag{\maketag@@@{#1}}}
+\def\make@df@tag@@@#1{\@seteqlabel{#1}\gdef\df@tag{\tagform@{#1}}}
+\def\@seteqlabel#1{\toks@\@xp{\p@equation{#1}}%
+ \edef\@currentlabel{\the\toks@}}
+\def\notag{\nonumber}
+\iftagsleft@
+\def\@eqnnum{\hbox to1sp{}\rlap{\normalfont
+ \hskip -\displaywidth\tagform@\theequation}}
+\fi
+
+\let\@adjusttag\@empty
+
+\def\adjusttag#1{\skip@#1\relax\gdef\@adjusttag{#1}}
+
+\def\@movetag{%
+ \ifx\@adjusttag\@empty \else
+ \vskip\@adjusttag\relax
+ \global\let\@adjusttag\@empty
+ \fi
+}
+\def\multilimits@{\bgroup
+ \Let@
+ \restore@math@cr
+ \default@tag
+ \baselineskip\fontdimen10 \scriptfont\tw@
+ \advance\baselineskip\fontdimen12 \scriptfont\tw@
+ \lineskip\thr@@\fontdimen8 \scriptfont\thr@@
+ \lineskiplimit\lineskip
+ \vbox\bgroup\ialign\bgroup\hfil$\m@th\scriptstyle{##}$\hfil\crcr}
+\def\Sb{_\multilimits@}
+\def\Sp{^\multilimits@}
+\def\endSb{\crcr\egroup\egroup\egroup}
+\let\endSp=\endSb
+\def\smallmatrix{\null\,\vcenter\bgroup
+ \Let@\restore@math@cr\default@tag
+ \baselineskip6\ex@ \lineskip1.5\ex@ \lineskiplimit\lineskip
+ \ialign\bgroup\hfil$\m@th\scriptstyle{##}$\hfil&&\thickspace\hfil
+ $\m@th\scriptstyle{##}$\hfil\crcr}
+\def\endsmallmatrix{\crcr\egroup\egroup\,}
+\newcount\c@MaxMatrixCols
+\c@MaxMatrixCols=10
+
+\def\matrix{\hskip -\arraycolsep\array{*\c@MaxMatrixCols c}}
+\def\endmatrix{\endarray \hskip -\arraycolsep}
+\@ifundefined{prepnext@tok}{%
+ \def\@array[#1]#2{%
+ \setbox\@arstrutbox\hbox{\vrule\@height\arraystretch\ht\strutbox
+ \@depth\arraystretch\dp\strutbox \@width\z@}%
+ \@mkpream{#2}\edef\@preamble{\ialign \noexpand\@halignto
+ \bgroup \tabskip\z@ \@arstrut \@preamble \tabskip\z@ \cr}%
+ \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
+ \bgroup \let\par\@empty
+ \let\@sharp##\let\protect\relax
+ \lineskip\z@\baselineskip\z@\@preamble}%
+\begingroup \lccode`\~=`\@ \catcode`\~=\active % just to be sure!
+\lowercase{%
+\gdef\@xexpast#1*#2#3#4\@@{\begingroup
+ \def~{@}\edef\reserved@a{#1}\@tempcnta#2\relax
+ \ifnum\@tempcnta >\z@
+ \@whilenum\@tempcnta >\z@\do
+ {\edef\reserved@a{\reserved@a#3}\advance\@tempcnta \m@ne}%
+ \let\reserved@b\@xexpast
+ \else \let\reserved@b\@xexnoop\fi
+ \expandafter\reserved@b \reserved@a #4\@@
+ \expandafter\endgroup
+ \expandafter\def\expandafter\reserved@a\expandafter{\reserved@a}%
+ \let\@tempa\reserved@a
+}% End of \@xexpast
+}% End of \lowercase
+\endgroup
+}{}% End of \@ifundefined test.
+\def\pmatrix{\left(\matrix}
+\def\endpmatrix{\endmatrix\right)}
+\def\bmatrix{\left[\matrix}
+\def\endbmatrix{\endmatrix\right]}
+\def\vmatrix{\left|\matrix}
+\def\endvmatrix{\endmatrix\right|}
+\def\Vmatrix{\left\|\matrix}
+\def\endVmatrix{\endmatrix\right\|}
+\let\hdots\@ldots
+\def\hdotsfor#1{\if\noexpand#1[\expandafter\shdots@for\else
+ \hdots@for\@ne{#1}\fi}
+\newmuskip\dotsspace@
+\def\shdots@for#1]{\hdots@for{#1}}
+\def\hdots@for#1#2{\multicolumn{#2}c%
+ {\m@th\dotsspace@1.5mu\mkern-#1\dotsspace@
+ \xleaders\hbox{$\m@th\mkern#1\dotsspace@.\mkern#1\dotsspace@$}%
+ \hfill
+ \mkern-#1\dotsspace@}%
+ }
+\def\cases{\left\{\def\arraystretch{1.2}\hskip-\arraycolsep
+ \array{l@{\quad}l}}
+\def\endcases{\endarray\hskip-\arraycolsep\right.}
+\newif\ifinany@
+\newif\ifinalign@
+\newif\ifingather@
+\newcount\and@
+\newif\iftag@
+\newhelp\andhelp@
+{An extra & here is so disastrous that you should probably exit^^J
+and fix things up.}
+\newif\ifst@rred
+\newtoks\@envbody
+\def\addto@envbody#1{\@envbody\expandafter{\the\@envbody#1}}
+\def\collect@body#1{%
+ \@envbody{}%
+ \def\process@envbody{%
+ \expandafter#1\expandafter{\the\@envbody}}%
+ \expandafter\let\csname\@currenvir\endcsname\collect@@body
+ \csname\@currenvir\endcsname}
+\def\collect@@body#1\end#2{%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@currenvir
+ \addto@envbody{#1}%
+ \expandafter\edef\csname\@currenvir\endcsname
+ {\noexpand\process@envbody\noexpand\end{\@tempa}}%
+ \else
+ \addto@envbody{#1\end{#2}}%
+ \fi
+ \csname\@currenvir\endcsname}
+\newenvironment{aligned}{%
+ \relax\ifmmode\else\nonmatherr@{\begin{aligned}}\fi
+ \null\,\new@ifnextchar[{\aligned@}{\aligned@[c]}%
+}{%
+ \crcr\egroup\egroup
+}
+\def\aligned@[#1]{%
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
+ \bgroup
+ \Let@\restore@math@cr
+ \default@tag
+ \ifinany@\else\openup\jot\fi
+ \ialign\bgroup\hfil\strut@$\m@th\displaystyle{##}$&%
+ $\m@th\displaystyle{{}##}$\hfil\crcr}
+\newtoks\hashtoks@
+\hashtoks@{#}
+\newcount\atcount@
+\def\doat@#1{\toks@{\hfil\strut@$\m@th
+ \displaystyle{\the\hashtoks@}$&$\m@th\displaystyle
+ {{}\the\hashtoks@}$\hfil}%
+ \atcount@#1\relax\advance\atcount@\m@ne
+ \loop\ifnum\atcount@>\z@\toks@\expandafter{\the\toks@&\hfil$\m@th
+ \displaystyle{\the\hashtoks@}$&$\m@th
+ \displaystyle{{}\the\hashtoks@}$\hfil}\advance
+ \atcount@\m@ne\repeat
+ \xdef\preamble@{\the\toks@}\xdef\preamble@@{\preamble@}}
+\newenvironment{alignedat}[2][c]{%
+ \null\,%
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
+ \bgroup\doat@{#2}\Let@ \restore@math@cr\default@tag
+ \ifinany@\else\openup\jot\fi\ialign\bgroup\span\preamble@@\crcr
+}{%
+ \endaligned
+}
+\newenvironment{gathered}[1][c]{%
+ \relax\ifmmode\else\nonmatherr@{\begin{gathered}}\fi
+ \null\,%
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi
+ \bgroup\Let@\restore@math@cr
+ \ifinany@\else\openup\jot\fi\ialign
+ \bgroup\hfil\strut@$\m@th\displaystyle##$\hfil\crcr
+}{%
+ \endaligned
+}
+\def\tag@in@align{\relax
+ \iftag@\DN@{\invalid@tag{Multiple \string\tag}}\else
+ \global\tag@true
+ \if@eqnsw\global\@eqnswfalse\fi
+ \let\next@\make@df@tag\fi
+ \next@}
+\def\math@cr@@@align{%
+ \if@eqnsw\global\tag@true\fi
+ \iftag@
+ \ifcase\and@
+ \DN@{&&}\else
+ \DN@{&}\fi\else
+ \let\next@\relax\fi
+ \next@
+ \relax
+ \if@eqnsw\tagform@\theequation\stepcounter{equation}\else
+ \iftag@\df@tag\fi\fi
+ \global\@eqnswtrue\cr}
+\def\Tag@{\relax\iftag@\else\firstchoice@true
+ \PackageError{amstex}{%
+ Extra & on this line%
+ }{\the\andhelp@% "An extra & here is disastrous"
+}\fi}
+\newdimen\lwidth@
+\newdimen\rwidth@
+\newdimen\maxlwidth@
+\newdimen\maxrwidth@
+\newdimen\totwidth@
+\def\measure@#1{\lwidth@\z@\rwidth@\z@\maxlwidth@\z@\maxrwidth@\z@
+ \global\and@\z@
+ \setbox\@ne\vbox{%
+ \everycr{\noalign{\global\tag@false\global\and@\z@}}\Let@
+ \let\tag\gobble@tag
+ \let\notag\@empty \let\nonumber\@empty
+ \firstchoice@false
+ \halign{\setboxz@h{$\m@th\displaystyle{\@lign##}$}%
+ \global\lwidth@\wdz@
+ \ifdim\lwidth@>\maxlwidth@\global\maxlwidth@\lwidth@\fi
+ \global\advance\and@\@ne
+ &\setboxz@h{$\m@th\displaystyle{{}\@lign##}$}%
+ \global\rwidth@\wdz@
+ \ifdim\rwidth@>\maxrwidth@\global\maxrwidth@\rwidth@\fi
+ \global\advance\and@\@ne
+ &\Tag@\@gobble{##}\crcr#1\crcr}}%
+ \totwidth@\maxlwidth@\advance\totwidth@\maxrwidth@}
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse
+ \vskip-\lineskiplimit \vskip\normallineskiplimit
+ \else \penalty\@eqpen \fi}}}
+\def\displ@y@{\global\dt@ptrue\openup\jot
+ \everycr{\noalign{\global\tag@false
+ \global\and@\z@
+ \global\dspbrk@lvl\m@ne
+ \ifdt@p\global\dt@pfalse
+ \vskip-\lineskiplimit\vskip\normallineskiplimit\else
+ \penalty\@eqpen\fi}}}
+\def\black@#1{\noalign{\ifdim#1>\displaywidth
+ \dimen@\prevdepth\nointerlineskip
+ \vskip-\ht\strutbox@\vskip-\dp\strutbox@
+ \vbox{\noindent\hbox to#1{\strut@\hfill}}%
+ \prevdepth\dimen@
+ \fi}}
+\def\align{\ifingather@
+ {\ifnum0=`}\fi
+ \DN@{\@nameuse{align (in \string\gather)}}%
+ \else \ifmmode\nomath@env
+ \DN@{\let\endalign\relax\@gobble}\else
+ $$\stepcounter{equation}%
+ \st@rredfalse\let\next@\align@\fi\fi
+ \collect@body\next@}
+\@namedef{align*}{\ifingather@
+ {\ifnum0=`}\fi
+ \DN@{\@nameuse{align* (in \string\gather)}}\else
+ \ifmmode\nomath@env
+ \DN@{\@namedef{endalign*}{}\@gobble}\else
+ $$\st@rredtrue
+ \let\next@\align@\fi\fi
+ \collect@body\next@}
+\newdimen\lineht@
+\def\align@{\inalign@true\inany@true
+ \displaybreak@\intertext@
+ \let\math@cr@@@\math@cr@@@align
+ \let\tag\tag@in@align
+ \global\and@\z@\global\dspbrk@lvl\m@ne
+ \iftagsleft@\DN@{\@nameuse{align }}\else
+ \DN@{\@nameuse{align \space}}\fi\next@}
+\@namedef{align }#1{%
+ \measure@{#1}%
+ \global\and@\z@
+ \global\dspbrk@lvl\m@ne
+ \if@fleqn %%*F
+ \advance\totwidth@\@mathmargin %%*F
+ \fi %%*F
+ \ifdim\totwidth@>\displaywidth
+ \let\displaywidth@\totwidth@
+ \else
+ \let\displaywidth@\displaywidth
+ \fi
+ \ifingather@
+ \everycr{%
+ \noalign{%
+ \global\and@\z@
+ \global\dspbrk@lvl\m@ne
+ }%
+ }%
+ \else
+ \displ@y@
+ \fi
+ \Let@
+ \ifst@rred\else\@seteqlabel\theequation\fi
+ \tabskip\@mathmargin %%*F
+ \dimen@\displaywidth %%*F
+ \if@fleqn %%*F
+ \ifingather@ %%*F
+ \tabskip\z@skip %%*F
+ \advance\dimen@-\@mathmargin %%*F
+ \fi %%*F
+ \fi %%*F
+ \halign to\dimen@\bgroup %%*F
+ \ifst@rred\nonumber\fi
+ \hfil
+ \strut@
+ \setboxz@h{\global\tag@false$\m@th\displaystyle{\@lign##}$}%
+ \global\lwidth@\wdz@
+ \global\lineht@\ht\z@
+ \boxz@
+ \global\advance\and@\@ne
+ \tabskip\z@skip
+ &\setboxz@h{$\m@th\displaystyle{{}\@lign##}$}%
+ \global\rwidth@\wdz@
+ \ifdim\ht\z@>\lineht@
+ \global\lineht@\ht\z@
+ \fi
+ \boxz@
+ \hfil
+ \global\advance\and@\@ne
+ \tabskip\@centering
+ &\kern-\displaywidth@
+ \setboxz@h{\@lign\strut@{##}}%
+ \if@fleqn %%*F
+ \dimen@\@mathmargin %%*F
+ \advance\dimen@\maxlwidth@ %%*F
+ \advance\dimen@-\lwidth@ %%*F
+ \else %%*F
+ \dimen@\displaywidth
+ \advance\dimen@-\totwidth@
+ \divide\dimen@\tw@
+ \advance\dimen@\maxlwidth@
+ \advance\dimen@-\lwidth@
+ \fi %%*F
+ \ifdim\dimen@<\tw@\wdz@
+ \rlap{\vbox{\normalbaselines\boxz@\vbox to\lineht@{}}}%
+ \else
+ \rlap{\boxz@}%
+ \fi
+ \tabskip\displaywidth@
+ \crcr
+ #1%
+}
+\@namedef{align \space}#1{%
+ \measure@{#1}%
+ \if@fleqn %%*F
+ \advance\totwidth@\@mathmargin %%*F
+ \fi %%*F
+ \global\and@\z@
+ \global\dspbrk@lvl\m@ne
+ \ifingather@
+ \everycr{\noalign{\global\and@\z@\global\dspbrk@lvl\m@ne}}%
+ \else
+ \displ@y@
+ \fi
+ \Let@
+ \ifst@rred\else\@seteqlabel\theequation\fi
+ \tabskip\@mathmargin %%*F
+ \dimen@\displaywidth %%*F
+ \if@fleqn %%*
+ \ifingather@ %%*F
+ \tabskip\z@skip %%*F
+ \advance\dimen@-\@mathmargin %%*F
+ \fi %%*F
+ \fi %%*F
+ \halign to\dimen@\bgroup %%*F
+ \ifst@rred\nonumber\fi
+ \hfil
+ \strut@
+ \setboxz@h{\global\tag@false$\m@th\displaystyle{\@lign##}$}%
+ \global\lwidth@\wdz@\boxz@
+ \global\advance\and@\@ne
+ \tabskip\z@skip
+ &\setboxz@h{$\m@th\displaystyle{{}\@lign##}$}%
+ \global\rwidth@\wdz@
+ \boxz@
+ \hfill
+ \global\advance\and@\@ne
+ \tabskip\@centering
+ &\setboxz@h{\@lign\strut@{##}}%
+ \dimen@\displaywidth
+ \advance\dimen@-\totwidth@
+ \divide\dimen@\tw@
+ \advance\dimen@\maxrwidth@
+ \advance\dimen@-\rwidth@
+ \ifdim\dimen@<\tw@\wdz@
+ \llap{\vtop{\@movetag\normalbaselines\null\boxz@}}%%*T
+ \else
+ \llap{\boxz@}%
+ \fi
+ \tabskip\z@skip
+ \crcr#1%
+}
+\def\endalign{\math@cr@@@align
+ \black@\totwidth@
+ \egroup$$\global\@ignoretrue\setb@ck}
+
+\@namedef{endalign*}{\math@cr@@@align\black@\totwidth@
+ \egroup$$\global\@ignoretrue}
+\@namedef{align (in \string\gather)}{%
+ \ifst@rred\stepcounter{equation}\fi
+ \def\endalign{\@nameuse{endalign (in \string\gather)}\ifnum0=`{\fi}}%
+ \vcenter\bgroup\st@rredfalse
+ \collect@body\align@}
+\@namedef{endalign (in \string\gather)}{%
+ \math@cr@@@align\black@\totwidth@
+ \egroup\egroup
+ \ifst@rred\setb@ck\fi% this ifst@rred is set by the enclosing gather
+ \global\tag@false\global\@eqnswfalse}
+\@namedef{align* (in \string\gather)}{%
+ \@namedef{endalign*}{\@nameuse{endalign* (in \string\gather)}%
+ \ifnum0=`{\fi}}%
+ \vcenter\bgroup\st@rredtrue
+ \collect@body\align@}
+\@namedef{endalign* (in \string\gather)}{%
+ \math@cr@@@align\black@\totwidth@\egroup\egroup
+ \global\tag@false\global\@eqnswfalse}
+\newif\ifxat@
+\def\alignat#1{%
+ \ifmmode\nomath@env\DN@{\let\endalignat\relax\@gobble}\else$$%
+ \st@rredfalse\stepcounter{equation}\@seteqlabel\theequation
+ \DN@{\@nameuse{alignat }#1}\fi
+ \collect@body\next@}
+\@namedef{alignat*}#1{%
+ \ifmmode\nomath@env\DN@{\@namedef{endalignat*}{}\@gobble}\else$$%
+ \st@rredtrue
+ \DN@{\@nameuse{alignat }#1}\fi
+ \collect@body\next@}
+\newif\ifmeasuring@
+\newbox\savealignat@
+\def\math@cr@@@alignat{%
+ \if@eqnsw\global\tag@true\fi
+ \iftag@
+ \multiply\count@\tw@
+ \xdef\next@{}\loop\ifnum\count@>\and@\xdef\next@{&\next@}%
+ \advance\count@\m@ne\repeat\else
+ \let\next@\relax\fi
+ \next@
+ \relax
+ \if@eqnsw\tagform@\theequation\stepcounter{equation}\else
+ \iftag@\df@tag\fi\fi
+ \global\@eqnswtrue\cr}%
+\@namedef{alignat }#1#2{%
+ \inany@true
+ \xat@false
+ \let\tag\tag@in@align
+ \def\math@cr@@@{\count@#1\relax \math@cr@@@alignat}%
+ \displaybreak@
+ \intertext@
+ \displ@y@
+ \ifst@rred
+ \global\@eqnswfalse
+ \else
+ \global\@eqnswtrue
+ \fi
+ \measuring@true
+ \setbox\savealignat@\hbox{%
+ $\m@th\displaystyle\Let@
+ \attag@{#1}%
+ \vbox{\firstchoice@false\halign{\span\preamble@@\crcr#2\crcr}}$%
+ }%
+ \measuring@false
+ \Let@
+ \attag@{#1}%
+ \tabskip\@mathmargin %%*F
+ \halign to\displaywidth\bgroup
+ \span\preamble@@\crcr
+ #2%
+}
+\def\endalignat{\math@cr@@@\black@{\wd\savealignat@}%
+ \egroup\setb@ck$$\global\@ignoretrue}
+\@namedef{endalignat*}{\math@cr@@@\black@{\wd\savealignat@}\egroup
+ $$\global\@ignoretrue}
+\def\xalignat#1{%
+ \ifmmode\nomath@env\DN@{\let\endxalignat\relax\@gobble}\else$$%
+ \st@rredfalse\stepcounter{equation}\@seteqlabel\theequation
+ \DN@{\@nameuse{xalignat }#1}\fi
+ \collect@body\next@}
+\@namedef{xalignat*}#1{%
+ \ifmmode\nomath@env\DN@{\@namedef{endxalignat*}{}\@gobble}\else$$%
+ \st@rredtrue
+ \DN@{\@nameuse{xalignat }#1}\fi
+ \collect@body\next@}
+\let\endxalignat=\endalignat
+
+\expandafter\let\csname endxalignat*\expandafter
+ \endcsname\csname endalignat*\endcsname
+\@namedef{xalignat }#1#2{%
+ \inany@true
+ \xat@true
+ \let\tag\tag@in@align
+ \def\math@cr@@@{\count@#1\relax\math@cr@@@alignat}%
+ \displaybreak@
+ \intertext@
+ \displ@y@
+ \measuring@true
+ \setbox\savealignat@\hbox{%
+ $\m@th\displaystyle\Let@
+ \attag@{#1}%
+ \vbox{%
+ \firstchoice@false
+ \halign{\span\preamble@@\crcr#2\crcr}%
+ }%
+ $%
+ }%
+ \measuring@false
+ \Let@
+ \attag@{#1}%
+ \tabskip\@mathmargin %%*F
+ \halign to\displaywidth\bgroup
+ \span\preamble@@\crcr#2%
+}
+\def\attag@#1{%
+ \let\TAG@\Tag@\let\Tag@0%
+ \ifmeasuring@\def\llap@##1{\setboxz@h{##1}\hbox to\tw@\wdz@{}}%
+ \def\rlap@##1{\setboxz@h{##1}\hbox to\tw@\wdz@{}}\else
+ \let\llap@\llap\let\rlap@\rlap\fi
+ \toks@{\hfil\strut@$\m@th\displaystyle{\@lign\the\hashtoks@}$%
+ \tabskip\z@skip
+ \global\advance\and@\@ne
+ &$\m@th\displaystyle{{}\@lign\the\hashtoks@}$\hfil
+ \ifxat@\tabskip\@centering\fi\global\advance\and@\@ne}%
+ \iftagsleft@
+ \@temptokena{\tabskip\@centering&\Tag@\kern-\displaywidth
+ \rlap@{\@lign
+ \the\hashtoks@
+ }%
+ \global\advance\and@\@ne\tabskip\displaywidth}\else
+ \@temptokena{\tabskip\@centering&\Tag@\llap@{\@lign
+ \the\hashtoks@
+ }\global\advance\and@\@ne\tabskip\z@skip}\fi
+ \atcount@#1\relax\advance\atcount@\m@ne
+ \loop\ifnum\atcount@>\z@
+ \toks@\expandafter{\the\toks@&\hfil$\m@th\displaystyle{\@lign
+ \the\hashtoks@}$\global\advance\and@\@ne
+ \tabskip\z@skip
+ &$\m@th\displaystyle{{}\@lign\the\hashtoks@}$\hfil\ifxat@
+ \tabskip\@centering\fi\global\advance\and@\@ne}\advance\atcount@\m@ne
+ \repeat
+ \xdef\preamble@{\the\toks@\the\@temptokena}%
+ \xdef\preamble@@{\ifst@rred\noexpand\nonumber\fi\preamble@}%
+ \let\Tag@\TAG@}
+\def\xxalignat#1{%
+ \ifmmode\nomath@env\DN@{\let\endxxalignat\relax\@gobble}\else$$%
+ \DN@{\@nameuse{xxalignat }#1}\fi
+ \collect@body\next@}
+\@namedef{xxalignat }#1#2{\inany@true
+ \displaybreak@\intertext@
+ \displ@y\setbox\savealignat@\hbox{$\m@th\displaystyle\Let@
+ \xxattag@{#1}%
+ \vbox{\firstchoice@false\halign{\span\preamble@@\crcr#2\crcr}}$}%
+ \Let@\xxattag@{#1}\tabskip\z@skip\halign to\displaywidth\bgroup
+ \span\preamble@@\crcr#2}
+\expandafter\let\expandafter\endxxalignat\csname endxalignat*\endcsname
+\def\xxattag@#1{\toks@{\tabskip\z@skip\hfil\strut@
+ $\m@th\displaystyle{\the\hashtoks@}$&%
+ $\m@th\displaystyle{{}\the\hashtoks@}$\hfil\tabskip\@centering&}%
+ \atcount@#1\relax\advance\atcount@\m@ne\loop\ifnum\atcount@>\z@
+ \toks@
+ \expandafter
+ {\the\toks@&\hfil$\m@th\displaystyle{\the\hashtoks@}$%
+ \tabskip\z@skip&$\m@th\displaystyle{{}\the\hashtoks@}$\hfil
+ \tabskip\@centering}\advance\atcount@\m@ne\repeat
+ \xdef\preamble@{\the\toks@\tabskip\z@skip}\xdef\preamble@@{\preamble@}}
+\newdimen\gwidth@
+\newdimen\gmaxwidth@
+\def\gmeasure@#1{\gwidth@\z@\gmaxwidth@\z@\setbox\@ne\vbox{\Let@
+ \firstchoice@false\let\tag\gobble@tag
+ \halign{\setboxz@h{$\m@th\displaystyle{##}$}\global\gwidth@\wdz@
+ \ifdim\gwidth@>\gmaxwidth@\global\gmaxwidth@\gwidth@\fi
+ &\@gobble{##}\crcr#1\crcr}}}
+\def\math@cr@@@gather{%
+ \if@eqnsw\global\tag@true\fi
+ \iftag@
+ \DN@{&\relax \if@eqnsw
+ \tagform@\theequation \stepcounter{equation}%
+ \else\iftag@\df@tag\fi\fi}%
+ \else
+ \expandafter\@gobble\fi
+ \next@
+ \global\@eqnswtrue\cr}
+\def\gather{%
+ \ifmmode\nomath@env\DN@{\let\endgather\relax\@gobble}\else $$%
+ \ingather@true\inany@true
+ \stepcounter{equation}%
+ \let\tag\tag@in@align\st@rredfalse
+ \displaybreak@\intertext@
+ \displ@y
+ \Let@\@seteqlabel\theequation
+ \let\math@cr@@@\math@cr@@@gather
+ \iftagsleft@\DN@{\@nameuse{gather }}\else
+ \DN@{\@nameuse{gather \space}}\fi\fi
+ \collect@body\next@}
+\@namedef{gather*}{%
+ \ifmmode\nomath@env\DN@{\@namedef{endgather*}{}\@gobble}\else $$%
+ \ingather@true\inany@true
+ \let\tag\tag@in@align\st@rredtrue
+ \displaybreak@\intertext@
+ \displ@y\Let@
+ \let\math@cr@@@\math@cr@@@gather
+ \iftagsleft@\DN@{\@nameuse{gather }}\else
+ \DN@{\@nameuse{gather \space}}\fi\fi
+ \collect@body\next@}
+\newdimen\glineht@
+\@namedef{gather \space}#1{%
+ \gmeasure@{#1}%
+ \if@fleqn %%*F
+ \advance\gmaxwidth@\@mathmargin %%*F
+ \fi %%*F
+ \global\dt@ptrue
+ \tabskip\@mathmargin %%*F
+ \halign to\displaywidth\bgroup
+ \ifst@rred\nonumber\else\global\@eqnswtrue\fi
+ \if@fleqn\else\hfil\fi %%*F
+ \strut@
+ \setboxz@h{\global\tag@false$\m@th\displaystyle{##}$}%
+ \global\gwidth@\wdz@\boxz@
+ \hfil
+ \tabskip\@centering %%*F
+ &\setboxz@h{\strut@{##}}%
+ \dimen@\displaywidth
+ \advance\dimen@-\gwidth@
+ \if@fleqn %%*F
+ \advance\dimen@-\@mathmargin %%*F
+ \else %%*F
+ \divide\dimen@\tw@ %%*B
+ \fi %%*F
+ \ifdim\dimen@<\tw@\wdz@ %%*
+ \llap{\vtop{\@movetag\normalbaselines\null\boxz@}}%%*T %%*
+ \else
+ \llap{\boxz@}% %%*
+ \fi
+ \tabskip\z@skip
+ \crcr
+ #1%
+}
+\def\endgather{\math@cr
+ \black@\gmaxwidth@\egroup $$\setb@ck\global\@ignoretrue}
+
+\@namedef{endgather*}{\math@cr
+ \black@\gmaxwidth@\egroup $$\global\@ignoretrue}
+\@namedef{gather }#1{%
+ \gmeasure@{#1}%
+ \global\dt@ptrue
+ \if@fleqn %%*F
+ \advance\gmaxwidth@\@mathmargin %%*F
+ \fi %%*F
+ \ifdim\gmaxwidth@>\displaywidth
+ \let\gdisplaywidth@\gmaxwidth@
+ \else
+ \let\gdisplaywidth@\displaywidth
+ \fi
+ \tabskip\@mathmargin %%*F
+ \halign to\displaywidth\bgroup
+ \ifst@rred\nonumber\else\global\@eqnswtrue\fi
+ \if@fleqn\else\hfil\fi %%*F
+ \strut@
+ \setboxz@h{\global\tag@false$\m@th\displaystyle{##}$}%
+ \global\gwidth@\wdz@
+ \global\glineht@\ht\z@
+ \boxz@
+ \hfil
+ \tabskip\@centering %%*F
+ &\kern-\gdisplaywidth@
+ \setboxz@h{\strut@{##}}%
+ \if@fleqn %%*F
+ \dimen@\@mathmargin %%*F
+ \else %%*F
+ \dimen@\displaywidth
+ \advance\dimen@-\gwidth@
+ \divide\dimen@\tw@ %%*B
+ \fi %%*F
+ \ifdim\dimen@<\tw@\wdz@ %%*
+ \rlap{\vbox{\normalbaselines\boxz@\vbox to\glineht@{}}}% %%*
+ \else
+ \rlap{\boxz@}% %%*
+ \fi
+ \tabskip\gdisplaywidth@
+ \crcr
+ #1%
+}
+\def\split{%
+ \ifinany@\let\next@\insplit@\else
+ \DN@{\PackageError{amstex}{\string\begin{split} is not allowed
+ here. Try the `aligned' environment.}\@ehb}\fi
+ \next@}
+\def\insplit@{\global\setbox\z@\vbox\bgroup
+ \Let@ \restore@math@cr \default@tag % disallow use of \tag here
+ \ialign\bgroup \hfil\strut@
+ $\m@th\displaystyle{##}$&$\m@th\displaystyle{{}##}$\hfill\crcr}
+\def\endsplit{\crcr\egroup\egroup
+ \iftagsleft@\expandafter\lendsplit@\else
+ \expandafter\rendsplit@\fi}
+\def\rendsplit@{\global\setbox9 \vbox
+ {\unvcopy\z@\global\setbox8 \lastbox\unskip}%
+ \setbox\@ne\hbox{\unhcopy8 \unskip\global\setbox\tw@\lastbox
+ \unskip\global\setbox\thr@@\lastbox}%
+ \global\setbox7 \hbox{\unhbox\tw@\unskip}%
+ \ifinalign@\ifctagsplit@
+ \gdef\split@{\hbox to\wd\thr@@{}&
+ \vcenter{\vbox{\moveleft\wd\thr@@\boxz@}}}%
+ \else\gdef\split@{&\vbox{\moveleft\wd\thr@@\box9}\crcr
+ \box\thr@@&\box7}\fi
+ \else
+ \ifctagsplit@\gdef\split@{\vcenter{\boxz@}}\else
+ \gdef\split@{\box9\crcr\hbox{\box\thr@@\box7}}\fi
+ \fi
+ \aftergroup\split@}
+\def\lendsplit@{\global\setbox9\vtop{\unvcopy\z@}%
+ \setbox\@ne\vbox{\unvcopy\z@\global\setbox8\lastbox}%
+ \setbox\@ne\hbox{\unhcopy8\unskip\setbox\tw@\lastbox
+ \unskip\global\setbox\thr@@\lastbox}%
+ \ifinalign@\ifctagsplit@
+ \gdef\split@{\hbox to\wd\thr@@{}&
+ \vcenter{\vbox{\moveleft\wd\thr@@\box9}}}%
+ \else
+ \gdef\split@{\hbox to\wd\thr@@{}&\vbox{\moveleft\wd\thr@@\box9}}\fi
+ \else
+ \ifctagsplit@\gdef\split@{\vcenter{\box9}}\else
+ \gdef\split@{\box9}\fi
+ \fi\aftergroup\split@}
+\newdimen\multlinegap
+\multlinegap10pt
+\newdimen\multlinetaggap@
+\multlinetaggap@10pt
+\def\multline{%
+ \ifmmode\nomath@env\DN@{\let\endmultline\relax\@gobble}%
+ \else $$\DN@{\collect@body\multline@}\fi
+ \st@rredfalse\@eqnswtrue \@seteqlabel\theequation
+ \stepcounter{equation}\next@}
+\@namedef{multline*}{%
+ \ifmmode\nomath@env\DN@{\@namedef{endmultline*}{}\@gobble}%
+ \else $$\DN@{\collect@body\multline@}\fi
+ \st@rredtrue\@eqnswfalse \let\@currentlabel\@empty
+ \next@}
+\def\multline@{\inany@true\displaybreak@
+ \global\tag@false
+ \def\tag{\ifst@rred\else
+ \global\advance\c@equation\m@ne\fi\tag@in@align}%
+ \iftagsleft@
+ \expandafter\lmultline@@\else
+ \expandafter\rmultline@@\fi}
+\newdimen\mwidth@
+\def\rmmeasure@#1{%
+ \def\shoveleft##1{##1}\def\shoveright##1{##1}%
+ \setbox\@ne\vbox{\firstchoice@false\Let@\halign{\setboxz@h
+ {$\m@th\@lign\displaystyle{}##$}\global\mwidth@\wdz@
+ \crcr#1\crcr}}}
+\newdimen\mlineht@
+\newif\ifzerocr@
+\newif\ifonecr@
+\def\lmmeasure@#1{\global\zerocr@true\global\onecr@false
+ \everycr{\noalign{\ifonecr@\global\onecr@false\fi
+ \ifzerocr@\global\zerocr@false\global\onecr@true\fi}}%
+ \def\shoveleft##1{##1}\def\shoveright##1{##1}%
+ \setbox\@ne\vbox{\Let@\firstchoice@false\halign{\setboxz@h
+ {$\m@th\@lign\displaystyle{}##$}\ifonecr@\global\mwidth@\wdz@
+ \global\mlineht@\ht\z@\fi\crcr#1\crcr}}}
+\newbox\mtagbox@
+\newdimen\ltwidth@
+\newdimen\rtwidth@
+\def\lmultline@@#1{%
+ \lmmeasure@{#1}%
+ \setbox\mtagbox@\hbox{%
+ \iftag@
+ \df@tag
+ \else
+ \if@eqnsw
+ \global\tag@true
+ \tagform@\theequation
+ \fi
+ \fi
+ }%
+ \dimen@\mwidth@
+ \advance\dimen@\wd\mtagbox@
+ \advance\dimen@\multlinetaggap@
+ \if@fleqn %%*F
+ \advance\dimen@\@mathmargin %%*F
+ \fi %%*F
+ \ifdim\dimen@>\displaywidth
+ \ltwidth@\z@
+ \else
+ \ltwidth@\wd\mtagbox@
+ \fi
+ \lmultline@@@#1
+}
+\def\lmultline@@@{%
+ \displ@y
+ \def\shoveright##1{##1\hfilneg\hskip\multlinegap}%
+ \if@fleqn %%*F
+ \def\shoveleft##1{##1}% %%*F
+ \else %%*F
+ \def\shoveleft##1{%
+ \setboxz@h{$\m@th\displaystyle{}##1$}%
+ \setbox\@ne\hbox{$\m@th\displaystyle##1$}%
+ \hfilneg
+ \iftag@
+ \ifdim\ltwidth@>\z@
+ \hskip\ltwidth@
+ \hskip\multlinetaggap@
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ \hskip.5\wd\@ne
+ \hskip-.5\wdz@##1%
+ }%
+ \fi %%*F
+ \if@fleqn %%*F
+ \tabskip\@mathmargin %%*F
+ \else %%*F
+ \tabskip\z@skip %%*
+ \fi %%*F
+ \totwidth@\displaywidth %%*F
+ \if@fleqn %%*F
+ \advance\totwidth@-\@mathmargin %%*F
+ \fi %%*F
+ \halign\bgroup
+ \Let@
+ \let\tag\gobble@tag
+ \hbox to\totwidth@{% %%*F
+ \strut@$\m@th\displaystyle
+ \if@fleqn %%*F
+ \hskip 0pt plus 1000pt %%*F
+ \else %%*F
+ \hfil
+ \fi %%*F
+ {}##\hfil$%
+ }%
+ \crcr
+ \if@fleqn %%*F
+ \hskip-\@mathmargin %%*F
+ \else %%*F
+ \hfilneg
+ \fi %%*F
+ \iftag@
+ \ifdim\ltwidth@>\z@
+ \box\mtagbox@
+ \hskip\multlinetaggap@
+ \else
+ \rlap{%
+ \vbox{%
+ \normalbaselines
+ \hbox{\strut@\box\mtagbox@}%
+ \vbox to\mlineht@{}%
+ }%
+ }%
+ \hskip\multlinegap %%*
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+}
+\def\rmultline@@#1{%
+ \rmmeasure@{#1}%
+ \setbox\mtagbox@\hbox{%
+ \iftag@
+ \df@tag
+ \else
+ \if@eqnsw
+ \global\tag@true
+ \tagform@\theequation
+ \fi
+ \fi
+ }%
+ \dimen@\mwidth@
+ \advance\dimen@\wd\mtagbox@
+ \advance\dimen@\multlinetaggap@
+ \if@fleqn %%*F
+ \advance\dimen@\@mathmargin %%*F
+ \fi %%*F
+ \ifdim\dimen@>\displaywidth
+ \rtwidth@\z@
+ \else
+ \rtwidth@\wd\mtagbox@
+ \fi
+ \rmultline@@@#1
+}
+\def\rmultline@@@{%
+ \displ@y
+ \def\shoveright##1{%
+ ##1%
+ \hfilneg
+ \iftag@
+ \ifdim\rtwidth@>\z@
+ \hskip\rtwidth@
+ \hskip\multlinetaggap@
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ }%
+ \if@fleqn %%*F
+ \def\shoveleft##1{##1}% %%*F
+ \else %%*F
+ \def\shoveleft##1{%
+ \setboxz@h{$\m@th\displaystyle{}##1$}%
+ \setbox\@ne\hbox{$\m@th\displaystyle##1$}%
+ \hfilneg
+ \hskip\multlinegap
+ \hskip.5\wd\@ne
+ \hskip-.5\wdz@
+ ##1%
+ }%
+ \fi %%*F
+ \if@fleqn %%*F
+ \tabskip\@mathmargin %%*F
+ \else %%*F
+ \tabskip\z@skip %%*
+ \fi %%*F
+ \totwidth@\displaywidth %%*F
+ \if@fleqn %%*F
+ \advance\totwidth@-\@mathmargin %%*F
+ \fi %%*F
+ \halign\bgroup
+ \Let@
+ \let\tag\gobble@tag
+ \hbox to\totwidth@{%
+ \strut@$\m@th\displaystyle
+ \if@fleqn %%*F
+ \hskip 0pt plus 1000pt %%*F
+ \else %%*F
+ \hfil
+ \fi %%*F
+ {}##\hfil$%
+ }%
+ \crcr
+ \if@fleqn %%*F
+ \hskip-\@mathmargin %%*F
+ \else %%*F
+ \hfilneg
+ \fi %%*F
+ \hskip\multlinegap
+}
+\def\endmultline{\iftagsleft@\expandafter\lendmultline@\else
+ \expandafter\rendmultline@\fi\global\@ignoretrue}
+\expandafter\let\csname endmultline*\endcsname=\endmultline
+\def\lendmultline@{\hfilneg\hskip\multlinegap\crcr\egroup$$}
+\def\rendmultline@{%
+ \iftag@
+ \ifdim\rtwidth@>\z@
+ \hskip\multlinetaggap@
+ \box\mtagbox@
+ \else
+ \hskip\multlinegap %%*
+ \llap{%
+ \vtop{%
+ \@movetag %%*T
+ \normalbaselines\null\hbox{\strut@\box\mtagbox@}%
+ }%
+ }%
+ \fi
+ \else
+ \hskip\multlinegap
+ \fi
+ \hfilneg
+ \crcr
+ \egroup$$%
+}
+\expandafter\def
+ \expandafter\@arrayparboxrestore
+ \expandafter{\@arrayparboxrestore
+ \inany@false\ingather@false\inalign@false
+ \default@tag}
+\def\equation{\gather\def\\{\PackageError{amstex}{\Invalid@@\\}\@eha}}
+\def\endequation{\endgather}
+\newenvironment{equation*}{%
+ \equation
+}{%
+ \nonumber\endequation
+}
+\newcounter{parentequation}% Counter for ``parent equation''.
+\newenvironment{subequations}{%
+ \refstepcounter{equation}%
+ \begingroup % conservative approach
+ \let\protect\@nx
+ \edef\@tempa{\def\@nx\theparentequation{\theequation}}%
+ \@xp\endgroup\@tempa
+ \setcounter{parentequation}{\value{equation}}%
+ \setcounter{equation}{0}%
+ \def\theequation{\theparentequation\alph{equation}}%
+ \ignorespaces
+}{%
+ \setcounter{equation}{\value{parentequation}}%
+ \global\@ignoretrue
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\atdef@#1{\expandafter\def\csname\space @\string#1\endcsname}
+\begingroup \catcode`\@=\active
+\gdef @{\Iat}
+\endgroup
+\DeclareRobustCommand{\Iat}{\FN@\at@}
+\def\at@{\let\next@\at@@
+ \ifcat\noexpand\@let@token a\else
+ \ifcat\noexpand\@let@token0\else
+ \ifcat\noexpand\@let@token\relax\else
+ \let\@let@token@\at@@@\fi\fi\fi\next@}
+\def\at@@#1{\expandafter
+ \@ifundefined{ @\string#1}%
+ {\DN@{\at@@@#1}}%
+ {\DN@{\csname\space @\string#1\endcsname}}%
+ \next@}%
+\def\at@@@{\PackageError{amstex}{\Invalid@@ @}%
+ {\the\athelp@}% "I'll assume you wanted @@"
+ \char64\relax}
+\newhelp\athelp@
+{Only certain combinations beginning with @ make sense to me.^^J%
+I'll assume you wanted @@ for a printed @.}
+\atdef@ @{{\atchar}}% to define @@
+\chardef\atchar=64
+\def\makeatother{\catcode64=\active}
+\def\@tempa#1#2#3#4#5#6{%
+ {#1}{#2}\ifnum0#6=0{13}\@xp\@gobblefour
+ \else{#3}\fi\@tempa{#4}{#5}{#6}}%
+\xdef\@currnamestack{\@xp\@tempa\@currnamestack{}{}{0}}
+{\def\@makeother{\noexpand\@makeother\noexpand}
+\xdef\@sanitize{\@sanitize\@makeother\@}}
+{\def\do{\noexpand\do\noexpand}
+\xdef\dospecials{\dospecials\do\@}}
+\atdef@,{\ifmmode\mskip.1\thinmuskip\else \nonmatherr@{@,}\fi}
+\atdef@!{\RIfM@\mskip-.1\thinmuskip\else \nonmatherr@{@!}\fi}
+
+\@ifpackageloaded{amscd}{%
+}{%
+\atdef@>#1>#2>{%
+ \global\bigaw@\minaw@
+ \setboxz@h{$\m@th\scriptstyle\;{#1}\;\;$}%
+ \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi
+ \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;{#2}\;\;$}%
+ \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}%
+ \mathrel{\mathop{\hbox to\bigaw@{\rightarrowfill@\displaystyle}}%
+ \limits^{#1}\@ifnotempty{#2}{_{#2}}}%
+}% end of @>>>
+\atdef@<#1<#2<{%
+ \global\bigaw@\minaw@
+ \setboxz@h{$\m@th\scriptstyle\;\;{#1}\;$}%
+ \ifdim\wdz@>\bigaw@ \global\bigaw@\wdz@ \fi
+ \@ifnotempty{#2}{\setbox\@ne\hbox{$\m@th\scriptstyle\;\;{#2}\;$}%
+ \ifdim\wd\@ne>\bigaw@ \global\bigaw@\wd\@ne \fi}%
+ \mathrel{\mathop{\hbox to\bigaw@{\leftarrowfill@\displaystyle}}%
+ \limits^{#1}\@ifnotempty{#2}{_{#2}}}%
+}% end of @<<<
+}% end of @ifpackageloaded
+\@ifundefined{minaw@}{\newdimen\minaw@}{}
+\minaw@11.111pt
+\@ifundefined{bigaw@}{\newdimen\bigaw@}{}
+\atdef@-{\let\next-%%
+ \DN@{\ifx\next-%%
+ \def\next-{\setbox\z@\hbox{-}\unhbox\z@\FN@\next@}%%
+ \expandafter\next \else\nobreak\fi}%%
+ \next@-}%%
+\def\leftroot{\PackageError{amstex}{\Invalid@@\leftroot}\@eha}
+\def\uproot{\PackageError{amstex}{\Invalid@@\uproot}\@eha}
+\newcount\uproot@
+\newcount\leftroot@
+\def\root{\relaxnext@
+ \DN@{\ifx\@let@token\uproot\let\next@\nextii@\else
+ \ifx\@let@token\leftroot\let\next@\nextiii@\else
+ \let\next@\plainroot@\fi\fi\next@}%
+ \def\nextii@\uproot##1{\uproot@##1\relax\FN@\nextiv@}%
+ \def\nextiv@{\ifx\@let@token\@sptoken\DN@. {\FN@\nextv@}\else
+ \DN@.{\FN@\nextv@}\fi\next@.}%
+ \def\nextv@{\ifx\@let@token\leftroot\let\next@\nextvi@\else
+ \let\next@\plainroot@\fi\next@}%
+ \def\nextvi@\leftroot##1{\leftroot@##1\relax\plainroot@}%
+ \def\nextiii@\leftroot##1{\leftroot@##1\relax\FN@\nextvii@}%
+ \def\nextvii@{\ifx\@let@token\@sptoken
+ \DN@. {\FN@\nextviii@}\else
+ \DN@.{\FN@\nextviii@}\fi\next@.}%
+ \def\nextviii@{\ifx\@let@token\uproot\let\next@\nextix@\else
+ \let\next@\plainroot@\fi\next@}%
+ \def\nextix@\uproot##1{\uproot@##1\relax\plainroot@}%
+ \bgroup\uproot@\z@\leftroot@\z@\FN@\next@}
+\def\plainroot@#1\of#2{\setbox\rootbox\hbox{%
+ $\m@th\scriptscriptstyle{#1}$}%
+ \mathchoice{\r@@t\displaystyle{#2}}{\r@@t\textstyle{#2}}
+ {\r@@t\scriptstyle{#2}}{\r@@t\scriptscriptstyle{#2}}\egroup}
+\def\r@@t#1#2{\setboxz@h{$\m@th#1\@@sqrt{#2}$}%
+ \dimen@\ht\z@\advance\dimen@-\dp\z@
+ \setbox\@ne\hbox{$\m@th#1\mskip\uproot@ mu$}%
+ \advance\dimen@ by1.667\wd\@ne
+ \mkern-\leftroot@ mu\mkern5mu\raise.6\dimen@\copy\rootbox
+ \mkern-10mu\mkern\leftroot@ mu\boxz@}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%% Fragment from old amsfonts.sty to deal with msam, msbm, eufm fonts;
+%% omit if `noamsfonts' option was specified.
+\ifx F\@amsfonts \endinput \fi
+\DeclareSymbolFont{AMSa}{U}{msa}{m}{n}
+\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}
+\ifx P\@amsfonts
+ \DeclareFontFamily{U}{msa}{}%
+ \DeclareFontShape{U}{msa}{m}{n}{<-6>msam5<6-8>msam7<8->msam10}{}%
+ \DeclareFontFamily{U}{msb}{}%
+ \DeclareFontShape{U}{msb}{m}{n}{<-6>msbm5<6-8>msbm7<8->msbm10}{}%
+ \DeclareFontFamily{U}{euf}{}%
+ \DeclareFontShape{U}{euf}{m}{n}{<-6>eufm5<6-8>eufm7<8->eufm10}{}%
+ \DeclareFontShape{U}{euf}{b}{n}{<-6>eufb5<6-8>eufb7<8->eufb10}{}%
+\fi
+\@ifundefined{yen}{%
+ \edef\yen{\noexpand\mathhexbox{\hexnumber@\symAMSa}55}
+}{}
+\@ifundefined{checkmark}{%
+ \edef\checkmark{\noexpand\mathhexbox{\hexnumber@\symAMSa}58}
+}{}
+\@ifundefined{circledR}{%
+ \edef\circledR{\noexpand\mathhexbox{\hexnumber@\symAMSa}72}
+}{}
+\@ifundefined{maltese}{%
+ \edef\maltese{\noexpand\mathhexbox{\hexnumber@\symAMSa}7A}
+}{}
+\begingroup \catcode`\"=12
+\DeclareMathDelimiter\ulcorner{\mathopen} {AMSa}{"70}{AMSa}{"70}
+\DeclareMathDelimiter\urcorner{\mathclose}{AMSa}{"71}{AMSa}{"71}
+\DeclareMathDelimiter\llcorner{\mathopen} {AMSa}{"78}{AMSa}{"78}
+\DeclareMathDelimiter\lrcorner{\mathclose}{AMSa}{"79}{AMSa}{"79}
+\xdef\widehat#1{\noexpand\@mathmeasure\z@\textstyle{#1}%
+ \noexpand\ifdim\noexpand\wdz@>\tw@ em%
+ \mathaccent"0\hexnumber@\symAMSb 5B{#1}%
+ \noexpand\else\mathaccent"0362{#1}\noexpand\fi}
+\xdef\widetilde#1{\noexpand\@mathmeasure\z@\textstyle{#1}%
+ \noexpand\ifdim\noexpand\wdz@>\tw@ em%
+ \mathaccent"0\hexnumber@\symAMSb 5D{#1}%
+ \noexpand\else\mathaccent"0365{#1}\noexpand\fi}
+\DeclareMathSymbol\dabar@{\mathord}{AMSa}{"39}
+\xdef\dashrightarrow{\mathrel{\dabar@\dabar@
+ \mathchar"0\hexnumber@\symAMSa 4B}}%
+\xdef\dashleftarrow{\mathrel{\mathchar"0\hexnumber@\symAMSa 4C\dabar@
+ \dabar@}}%
+\global\let\dasharrow\dashrightarrow
+\global\let\rightleftharpoons\undefined
+\DeclareMathSymbol\rightleftharpoons{\mathrel}{AMSa}{"0A}
+\global\let\angle\undefined
+\DeclareMathSymbol\angle {\mathord}{AMSa}{"5C}
+\global\let\hbar\undefined
+\DeclareMathSymbol\hbar {\mathord}{AMSb}{"7E}
+\global\let\sqsubset\undefined
+\DeclareMathSymbol\sqsubset {\mathrel}{AMSa}{"40}
+\global\let\sqsupset\undefined
+\DeclareMathSymbol\sqsupset {\mathrel}{AMSa}{"41}
+\global\let\mho\undefined
+\DeclareMathSymbol\mho {\mathord}{AMSb}{"66}
+\DeclareMathSymbol\square {\mathord}{AMSa}{"03}
+\DeclareMathSymbol\lozenge {\mathord}{AMSa}{"06}
+\DeclareMathSymbol\vartriangleright {\mathrel}{AMSa}{"42}
+\DeclareMathSymbol\vartriangleleft {\mathrel}{AMSa}{"43}
+\DeclareMathSymbol\trianglerighteq {\mathrel}{AMSa}{"44}
+\DeclareMathSymbol\trianglelefteq {\mathrel}{AMSa}{"45}
+\DeclareMathSymbol\rightsquigarrow {\mathrel}{AMSa}{"20}
+\def\@tempa{\not@base\lhd}
+\ifx\lhd\@tempa
+ \global\let\lhd\vartriangleleft
+ \global\let\unlhd\trianglelefteq
+ \global\let\rhd\vartriangleright
+ \global\let\unrhd\trianglerighteq
+ \global\let\Box\square
+ \global\let\Diamond\lozenge
+ \global\let\leadsto\rightsquigarrow
+\xdef\Join{\mathrel{\mathchar"0\hexnumber@\symAMSb 6F\mkern-13.8mu%
+ \mathchar"0\hexnumber@\symAMSb 6E}}
+\fi
+\endgroup
+\DeclareMathAlphabet\mathfrak{U}{euf}{m}{n}
+\SetMathAlphabet\mathfrak{bold}{U}{euf}{b}{n}
+\DeclareSymbolFontAlphabet{\mathbb}{AMSb}
+\DeclareFontEncodingDefaults{\relax}{\def\accentclass@{7}}
+\def\frak{\mathfrak}
+\def\Bbb{\mathbb}
+\def\bold{\mathbf}
+\begingroup \catcode`\"=12 \relax
+\gdef\newsymbol#1#2#3#4#5{%
+ \@ifdefinable#1{%
+ \edef\next@
+ {\ifcase #2 \or
+ \hexnumber@\symAMSa\or
+ \hexnumber@\symAMSb\fi}%
+ \ifx\next@\@empty
+ \PackageError{amsfonts}{\Invalid@@\newsymbol}\@ehd%
+ \else
+ \global\mathchardef#1"#3\next@#4#5
+ \fi}}
+\endgroup
+%% Some odds and ends
+\def\sphat{^{\mathchoice{}{}%
+ {\,\,\smash[b]{\hbox{\lower4\ex@\hbox{$\m@th\widehat{\null}$}}}}%
+ {\,\smash[b]{\hbox{\lower3\ex@\hbox{$\m@th\hat{\null}$}}}}}}
+\def\spcheck{^\vee}
+\def\sptilde{^\sim}
+\def\spdot{^{\hbox{\raise\ex@\hbox{\normalfont .}}}}
+\def\spddot{^{\hbox{\raise\ex@\hbox{\normalfont ..}}}}
+\def\spdddot{^{\hbox{\raise\ex@\hbox{\normalfont...}}}}
+\def\spbreve{^{\!\smash[b]{\hbox{\lower4\ex@\hbox{\u{}}}}}}
+\def\fracwithdelims#1#2{\new@ifnextchar[{\fracwithdelims@#1#2}%
+ {\fracwithdelims@#1#2[\@empty]}}
+\def\fracwithdelims@#1#2[#3]#4#5{\relax
+ \ifx\@empty#3{#4\overwithdelims#1#2#5}\else
+ {#4\abovewithdelims#1#2#3\relax#5}\fi}
+\def\accentedsymbol#1#2{%
+ \expandafter\newbox
+ \csname\expandafter\@gobble\string#1@box\endcsname
+ \expandafter\setbox
+ \csname\expandafter\@gobble\string#1@box\endcsname
+ \hbox{$\m@th#2$}%
+ \newcommand{#1}{%
+ \expandafter\copy
+ \csname\expandafter\@gobble\string#1@box\endcsname{}}%
+}
+\def~{\nobreakspace}
+\DeclareRobustCommand{\nobreakspace}{\unskip\nobreak\ \ignorespaces}
+%%
+%% End of file `amstex.sty'.
diff --git a/macros/latex-dev/required/amsmath/amstext.dtx b/macros/latex-dev/required/amsmath/amstext.dtx
new file mode 100644
index 0000000000..a4c9aeb5d9
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amstext.dtx
@@ -0,0 +1,302 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\usepackage{amstext}
+\GetFileInfo{amstext.sty}
+\begin{document}
+\title{The \pkg{amstext} package}
+\author{Frank Mittelbach \and Rainer Sch\"opf}
+\date{Version \fileversion, \filedate}
+\DocInput{amstext.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+%
+% This style file implements the \AmSTeX{} macro \cn{text} for use
+% with the new font selection scheme. The \cn{text} macro is a
+% sophisticated command which allows the user to insert ``normal text''
+% into math formulas without worrying about correct sizes in sub- or
+% superscripts. It can also be used in ordinary text; there it
+% produces an unbreakable unit similar to \cn{mbox}.
+%
+% Here is an example demonstrating some of its features:
+% \[
+%^^A mathbin spacing is nonscript glue, disappears in superscript
+% x^{2\,\times\,\text{size of $y$}}
+% \leq
+% z_{i_{\text{upper bound of the array}}}
+% \]
+% This was produced by
+% \begin{verbatim}
+% \[
+% x^{2\,\times\,\text{size of $y$}}
+% \leq
+% z_{i_{\text{upper bound of the array}}}
+% \]
+% \end{verbatim}
+%
+% Additionally this style file redefines an internal \fn{plain.tex}
+% macro called \cs{mathhexbox} so that commands like \cn{dag}
+% or \cn{P} will change sizes if used in math subscripts.
+%
+% \StopEventually{}
+% Package information.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must be December 1994 or later
+\ProvidesPackage{amstext}[2000/06/29 v2.01 AMS text]
+% \end{macrocode}
+%
+% \section{The implementation}
+% We need a few tools from \fn{amsgen.sty}.
+% \begin{macrocode}
+\RequirePackage{amsgen}
+% \end{macrocode}
+%
+% \begin{macro}{\text}
+% Now we come to the \cn{text} macro which is used to place
+% ordinary text inside of math formulas. If it is used outside
+% math it will produce an unbreakable unit of text.
+% \begin{macrocode}
+\DeclareRobustCommand{\text}{%
+ \ifmmode\expandafter\text@\else\expandafter\mbox\fi}
+% \end{macrocode}
+% At the present time (late 1994) the \latex/ internal function
+% |\nfss@text| is used in |\ref|, in font commands like |\textbf|,
+% and in a few text symbol definitions like |\$| and |\pounds|. By
+% equating |\nfss@text| to |\text| we give it the ability of
+% |\text| to change sizes properly if used in a subscript.
+% \begin{macrocode}
+\let\nfss@text\text
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\text@}
+% If \cn{text} is encountered inside math mode the macro
+% \cs{text@} is called. It has one mandatory argument, the text
+% which should be produced. Since we do not know in which math
+% style we are currently in we call \cs{mathchoice} to tyeset
+% our text in all four possible styles.
+% \begin{macrocode}
+\def\text@#1{{\mathchoice
+% \end{macrocode}
+% To save token space we call a macro \cs{textdef@} which takes
+% three arguments: the current math style, the corresponding size
+% macro and the text to typeset possibly with some additional
+% information for typesetting.
+% \begin{macrocode}
+ {\textdef@\displaystyle\f@size{#1}}%
+% \end{macrocode}
+% The other three cases are similar except for the
+% \cs{iffirstchoice} switch which we set to false. This is
+% done to prevent \LaTeX{} macros like \cn{ref} or \cn{index}
+% from writing their arguments more than once.
+% \begin{macrocode}
+ {\textdef@\textstyle\f@size{\firstchoice@false #1}}%
+ {\textdef@\textstyle\sf@size{\firstchoice@false #1}}%
+ {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}%
+% \end{macrocode}
+% Here we need to check whether a math size-change occurred inside
+% the argument of \cn{text}. If so, restore
+% \begin{macrocode}
+ \check@mathfonts
+ }%
+}
+% \end{macrocode}
+% The macros \cs{f@size}, \cs{sf@size} and \cs{ssf@size} hold the
+% sizes which should be used when we are loading a new font for use
+% in \cs{textfont}, \cs{scriptfont} and \cs{scriptscriptfont}. There
+% is some question whether we should use use \cs{tf@size} or
+% \cs{f@size} for the main size, but since the primary purpose of the
+% \cn{text} macro is to switch back to text within a display, it
+% seems that \cs{f@size} is the better choice. (Indeed it could be
+% said that the \cn{text} actually provides two different functions:
+% one for escaping out of math mode in a display to print some words,
+% and the other for handling math objects that are named by a
+% fragment of text, when \cn{operatorname} isn't the right choice.
+% For the latter \cs{tf@size} might be more correct but for the
+% former \cs{f@size} is clearly better.)
+% \end{macro}
+%
+% \begin{macro}{\textdef@}
+% To typeset the argument of \cn{text} correctly we have to make
+% several actions. We start by placing everything inside an
+% \cs{hbox}. But this is not enough: we need one extra level of
+% grouping. These extra braces are necessary because of the new
+% font selection scheme which might produce an \cs{aftergroup}
+% to globally restore some font values after the current group. To
+% prevent any damage by this mechanism we add the braces thereby
+% bringing the token inserted by \cs{aftergroup} inside the
+% \cs{hbox}.\footnote{The mechanism will not produce a second
+% \cs{aftergroup}. For more details see the technical documentation
+% for NFSS2.}
+% \begin{macrocode}
+\def\textdef@#1#2#3{\hbox{{%
+% \end{macrocode}
+% Since text typeset inside an \cs{hbox} always stays in the size
+% of the text surrounding the formula we have to adjust this for
+% script and scriptscript sizes. For any math formula inside this
+% argument this will be achieved by setting \cs{everymath} to
+% the first argument of \cs{textdef@} since this argument
+% contains the math size in the current typeset case of
+% \cs{mathchoice}.
+% Since \latex/ also knows about \cn{parbox}es and the
+% \env{minipage} environment it might be neccessary to adjust
+% \cs{everydisplay} too but this has to be tested further.
+% \begin{macrocode}
+ \everymath{#1}%
+% \end{macrocode}
+% The next line of code changes locally (i.e.\ inside the current
+% \cs{hbox}) the value of \cs{f@size}. This macro holds the
+% size for typesetting ordinary text (e.g.\ loading or selecting a
+% new font via \cs{selectfont}). By changing it to a smaller
+% value a following \cs{selectfont} will switch to the wanted
+% size.
+% \begin{macrocode}
+ \let\f@size#2\selectfont
+% \end{macrocode}
+% Now we simply call the third argument and close all open groups.
+% \begin{macrocode}
+ #3}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\iffirstchoice@}
+% Here is the switch that we use to decide if \cn{ref} etc.\
+% should print its warnings. The default is true since
+% normally these warnings shouldn't be suppressed.
+% \begin{macrocode}
+\newif\iffirstchoice@
+\firstchoice@true
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Re-definition of \latex/ macros to work with \cn{text}}
+%
+% If a counter-changing command occurs inside the argument of
+% \cn{text}, we don't want the counter to be changed four times
+% because \cn{stepcounter} and \cn{addtocounter} have global effect.
+% So we add the \cs{iffirstchoice@} test to make the counter
+% operations execute only once.
+%
+% \begin{macro}{\stepcounter}
+% Use \cs{def} rather than \cn{renewcommand*} because the star-form
+% (for non-\cs{long} definitions) doesn't work with the June 1994
+% release of \latex/.
+% \begin{macrocode}
+\def\stepcounter#1{%
+ \iffirstchoice@
+ \addtocounter{#1}\@ne
+ \begingroup \let\@elt\@stpelt \csname cl@#1\endcsname \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addtocounter}
+% \begin{macrocode}
+\def\addtocounter#1#2{%
+ \iffirstchoice@
+ \@ifundefined {c@#1}{\@nocounterr {#1}}%
+ {\global \advance \csname c@#1\endcsname #2\relax}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% For \cn{ref}, \cn{pageref}, and indeed anything else that issues a
+% warning or error, \cn{text} will produce four copies of the
+% warning/error message. To suppress the last three copies, we change
+% \cs{GenericInfo}, \cs{GenericWarning}, \cs{GenericError}.
+% \begin{macrocode}
+\let\m@gobble\@empty
+\@xp\let\csname m@gobble4\endcsname\@gobblefour
+\long\@xp\def\csname m@gobble6\endcsname#1#2#3#4#5#6{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\toks@{%
+ \csname m@gobble\iffirstchoice@\else 4\fi\endcsname
+ \protect}
+\edef\GenericInfo{\the\toks@
+ \@xp\@nx\csname GenericInfo \endcsname}
+%
+\edef\GenericWarning{\the\toks@
+ \@xp\@nx\csname GenericWarning \endcsname}
+%
+\toks@{%
+ \csname m@gobble\iffirstchoice@\else 6\fi\endcsname
+ \protect}
+\edef\GenericError{\the\toks@
+ \@xp\@nx\csname GenericError \endcsname}
+% \end{macrocode}
+%
+% At one time \cn{label}, \cs{@wrindex} and \cs{@wrglossary} were
+% changed here too to use the \cs{iffirstchoice@} test but it seems
+% that was a mistake because those are non-immediate writes.
+% Something like
+% \begin{verbatim}
+% \text{something \index{foo}}
+% \end{verbatim}
+% within a math formula would therefore \emph{lose the index term} if
+% the surrounding context was not displaystyle. (Unlikely in
+% practice, but not impossible.) [mjd,1994/12/09]
+%
+%\subsection{Applications of \cn{text}}
+%
+% \begin{macro}{\mathhexbox}
+% We start with an re-definition of the \fn{plain.tex} macro
+% \cs{mathhexbox}. (Although M. Spivak in \amstex/ uses the name
+% \cs{mathhexbox@} for this purpose, I [FMi] don't see any reason
+% to use a new name since the new definition is superior, has the
+% same syntax and is used for the same purpose.)
+% \begin{macrocode}
+\begingroup \catcode`\"=12
+\gdef\mathhexbox#1#2#3{\text{$\m@th\mathchar"#1#2#3$}}
+\endgroup
+% \end{macrocode}
+% This redefinition means that now symbols like \S, \P, \dag, \ldots,
+% which are defined via \cs{mathhexbox} in \fn{plain.tex} or
+% elsewhere now correctly change sizes if they are used in math mode.
+% \end{macro}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \CheckSum{129}
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amstext.ins b/macros/latex-dev/required/amsmath/amstext.ins
new file mode 100644
index 0000000000..84fcb0cb95
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amstext.ins
@@ -0,0 +1,51 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amstext.sty}{\from{amstext.dtx}{}}
+}
+
+\endbatchfile
+
diff --git a/macros/latex-dev/required/amsmath/amstext.pdf b/macros/latex-dev/required/amsmath/amstext.pdf
new file mode 100644
index 0000000000..a5c78d6737
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amstext.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/amsxtra.dtx b/macros/latex-dev/required/amsmath/amsxtra.dtx
new file mode 100644
index 0000000000..2165dde41a
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsxtra.dtx
@@ -0,0 +1,127 @@
+%
+% \iffalse meta-comment
+%
+% Copyright (C) 1995, 1999 American Mathematical Society.
+% Copyright (C) 2016-2019 LaTeX3 Project and American Mathematical Society.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is the LaTeX3 Project.
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{amsdtx}
+\def\MaintainedByLaTeXTeam#1{%
+\begin{center}%
+\fbox{\fbox{\begin{tabular}{@{}l@{}}%
+This file is maintained by the \LaTeX{} Project team.\\%
+Bug reports can be opened (category \texttt{#1}) at\\%
+\url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}}
+\usepackage{amsxtra}
+\GetFileInfo{amsxtra.sty}
+\begin{document}
+\title{The \pkg{amsxtra} package}
+\author{American Mathematical Society\\Michael Downes}
+\date{Version \fileversion, \filedate}
+\DocInput{amsxtra.dtx}
+\end{document}
+%</driver>
+%\fi
+%
+% \maketitle
+% \MaintainedByLaTeXTeam{amslatex}
+%
+% \MakeShortVerb\|
+%
+% \section{Introduction}
+% The \pkg{amsxtra} package contains a few rarely used commands that
+% were present in version 1.1 of the \pkg{amstex} package:
+% \cn{fracwithdelims}, {accentedsymbol}, \cn{sphat}, \cn{spcheck},
+% \cn{sptilde}, \cn{spdot}, \cn{spddot}, \cn{spdddot}, \cn{spbreve}.
+% If any of these commands were used in existing documents, the
+% \pkg{amsxtra} package provides a way to get them. But for 99\% of
+% documents using the \pkg{amstex} package these commands are just
+% wasted overhead.
+%
+% \StopEventually{}
+%
+% \begin{macrocode}
+\ProvidesPackage{amsxtra}[1999/11/15 v1.2c AMS extra commands]
+% \end{macrocode}
+% We need to ensure that either the \pkg{amstex} package or the
+% \pkg{amsmath} package is loaded. This means we need something a
+% little more complicated than \cn{RequirePackage}.
+% \begin{macrocode}
+\@ifpackageloaded{amstex}{}{%
+ \RequirePackage{amsmath}[1996/10/01 v1.2]}
+% \end{macrocode}
+%
+% Superscripted accent characters.
+% \begin{macrocode}
+\def\sphat{^{\mathchoice{}{}%
+ {\,\,\smash[b]{\hbox{\lower4\ex@\hbox{$\m@th\widehat{\null}$}}}}%
+ {\,\smash[b]{\hbox{\lower3\ex@\hbox{$\m@th\hat{\null}$}}}}}}
+\def\spcheck{^\vee}
+\def\sptilde{^\sim}
+\def\spdot{^{\hbox{\raise\ex@\hbox{\normalfont .}}}}
+\def\spddot{^{\hbox{\raise\ex@\hbox{\normalfont ..}}}}
+\def\spdddot{^{\hbox{\raise\ex@\hbox{\normalfont...}}}}
+\def\spbreve{^{\!\smash[b]{\hbox{\lower4\ex@\hbox{\u{}}}}}}
+% \end{macrocode}
+%
+% The \cn{fracwithdelims} command is skipped if the base package is
+% \pkg{amsmath}; it is only needed if the base package is
+% \pkg{amstex}.
+% \begin{macrocode}
+\@ifpackageloaded{amstex}{%
+\def\fracwithdelims#1#2{\new@ifnextchar[{\fracwithdelims@#1#2}%
+ {\fracwithdelims@#1#2[\@empty]}}
+\def\fracwithdelims@#1#2[#3]#4#5{\relax
+ \ifx\@empty#3{#4\overwithdelims#1#2#5}\else
+ {#4\abovewithdelims#1#2#3\relax#5}\fi}
+}{}
+% \end{macrocode}
+%
+% Perhaps |\accentedsymbol| should use |\newsavebox|, but I don't
+% know of any compelling reason at the moment.[mjd,5-Sep-1994]
+% |\accentedsymbol| can only produce a single size of
+% the given symbol, so you'd need two different versions for main
+% size and subscript size.
+% \begin{macrocode}
+\def\accentedsymbol#1#2{%
+ \expandafter\newbox
+ \csname\expandafter\@gobble\string#1@box\endcsname
+ \expandafter\setbox
+ \csname\expandafter\@gobble\string#1@box\endcsname
+ \hbox{$\m@th#2$}%
+ \newcommand{#1}{%
+ \expandafter\copy
+ \csname\expandafter\@gobble\string#1@box\endcsname{}}%
+}
+% \end{macrocode}
+%
+% Change the definition of \qc{\~} to automatically remove a
+% preceding space as well as a following space, if present.
+% \begin{macrocode}
+\def~{\nobreakspace}
+\DeclareRobustCommand{\nobreakspace}{\unskip\nobreak\ \ignorespaces}
+% \end{macrocode}
+%
+% The usual \cs{endinput} to ensure that random garbage at the end of
+% the file doesn't get copied by \fn{docstrip}.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+% \CheckSum{113}
+% \Finale
diff --git a/macros/latex-dev/required/amsmath/amsxtra.ins b/macros/latex-dev/required/amsmath/amsxtra.ins
new file mode 100644
index 0000000000..9e739c3d4b
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsxtra.ins
@@ -0,0 +1,51 @@
+%%
+%% Copyright 2010 American Mathematical Society.
+%% Copyright 2016 LaTeX3 Project and American Mathematical Society.
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This work has the LPPL maintenance status `maintained'.
+%%
+%% The Current Maintainer of this work is the LaTeX3 Project.
+%%
+%% ====================================================================
+
+\input docstrip
+
+\askforoverwritefalse
+
+\keepsilent
+
+\preamble
+
+Copyright 1995, 1999 American Mathematical Society.
+Copyright 2016 LaTeX3 Project and American Mathematical Society.
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is the LaTeX3 project.
+
+\endpreamble
+
+\usedir{tex/latex/amsmath}
+
+\generate{
+ \file{amsxtra.sty}{\from{amsxtra.dtx}{}}
+}
+
+\endbatchfile
+
diff --git a/macros/latex-dev/required/amsmath/amsxtra.pdf b/macros/latex-dev/required/amsmath/amsxtra.pdf
new file mode 100644
index 0000000000..11cea1ef60
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/amsxtra.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/changes.txt b/macros/latex-dev/required/amsmath/changes.txt
new file mode 100644
index 0000000000..1b2d097dd5
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/changes.txt
@@ -0,0 +1,123 @@
+2019-02-06 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * amsmath.dtx (section{Mods, continued fractions, etc.}):
+ Command \overunderset added
+
+#########################
+# 2018-12-01 Release
+#########################
+
+2018-10-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * amsmath.dtx
+ Don't drop \frozen@everymath
+ Start LR-mode for \thinspace and friends if necessary (github/49)
+ Start LR-mode for \bigl and friends if necessary (github/49)
+ Start LR-mode for \smash if necessary (github/49)
+
+#########################
+# 2018-04-01 Release
+#########################
+
+2017-09-02 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: ensure that overfull alignments give warnings in more cases
+ https://tex.stackexchange.com/questions/141287/addmargin-enumerate-and-align-miss-an-overfull-hbox
+
+ * amsmath.dtx: move the nulldelimiterspace correction for closing
+ delimiters in \genfrac for extended TeXs to the line before
+ \nulldelimiterspace is locally set to 0pt.
+
+2017-04-14 David Carlisle <latex-bugs@latex-project.org>
+
+ * amscd.dtx: typo fix in ProvidesPackage line.
+
+2016-11-05 David Carlisle <latex-bugs@latex-project.org>
+
+ * alignedleftspace[yes|no|yesifneg] package options
+ * New genfrac implementation for XeTeX and LuaTeX
+ * Delete obsolete install.txt file.
+
+2016-06-28 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: Add space to prevent runaway argument error with \dots \left...
+
+2016-05-26 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: ignore spaces at start of \intertext
+
+2016-03-10 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: Preserve box0 in \resetMathstrut@
+
+2016-03-08 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsopn.dtx: In xetex, and luatex, add version of \newmcodes@
+ that works even if - has a \Umathcode definition.
+
+2016-03-03 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: missing %
+
+2016-02-20 David Carlisle <latex-bugs@latex-project.org>
+
+ * amsmath.dtx: update to support \Umathchardef and \long macros in \dots.
+
+2013-01-14 amsmath.dtx 2.14
+
+ * amsmath.sty 2.14
+ -- Minimal changes to make amsmath compatible with stix.sty.
+
+2000-07-18 amsmath.dtx 2.13
+ -- After the numbering patches in 2.11, \notag failed in certain
+ circumstances: introduce some more auxiliary functions to sort
+ things out, and redefine \nonumber.
+
+2000-06-29 amstext.dtx 2.01
+ -- Use \f@size instead of \tf@size because they are not
+ necessarily the same and the former is better for putting a few
+ words into a display.
+
+2000-06-06 amsmath.dtx 2.12
+ -- Fix transposed lines in 2.11 patch.
+
+2000-06-02 amsmath.dtx 2.11
+
+ * amsmath.sty 2.11
+ -- Prevent "Arithmetic overflow" error by guarding against
+ divide-by-zero in \x@calc@shift@lc (align environment).
+
+ * amsdtx.dtx
+ -- Moved to the amscls distribution.
+
+2000-05-25 amsmath.dtx 2.10
+ -- Clear up error message for \allowdisplaybreaks[0].
+ -- Make mathdisplay re-entrant by introducing mathdisplay@stack,
+ to clear up numbering problems in unusual circumstances such as
+ \[ \] nested inside minipage inside equation.
+
+2000-04-21 amsmath.dtx 2.09
+ -- Ensure good catcodes for " etc.
+
+2000-03-16 amsmath.dtx 2.08
+ -- Fixed erroneous tag placement on split with fleqn/tbtags options.
+
+2000-03-15 amsmath.dtx 2.07
+ -- Add \reset@strutbox@ to deal with the following bug: After
+ $...\mbox{\Huge $...$}...$, line spacing is wrong in a
+ following "gather" or other environment that uses \strut@.
+ -- Patch to fix bug with intlimits option: too much space in the
+ middle of \iint.
+ -- Overhaul math accents again to fix a couple of bugs reported by
+ Thimm.
+
+2000-03-10 amsmath.dtx 2.06
+ -- Change \MathAccent to \mathaccentV so \DeclareMathAccent won't
+ give an error when redefining an accent.
+
+2000-01-06 amsmath.dtx 2.05
+ -- Fixed incorrect placement of fleqn/reqno equation numbers
+ inside indented lists (displaywidth < columnwidth). Changed the
+ multline/fleqn/leqno indent to match mathmargin when possible
+ instead of always just using multlinetaggap.
+
diff --git a/macros/latex-dev/required/amsmath/diffs-m.txt b/macros/latex-dev/required/amsmath/diffs-m.txt
new file mode 100644
index 0000000000..af3a273f52
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/diffs-m.txt
@@ -0,0 +1,551 @@
+diffs-m.txt [1999/12/15] American Mathematical Society
+
+This is a synopsis of the principal differences between various versions
+of the amsmath package and its companion packages.
+
+A synopsis of changes in the "AMS-LaTeX" distribution is included at the
+end of this file. See also diffs-c.txt in the amslatex/classes area.
+
+Those upgrading from version 1.2 to version 2.0 will probably be
+interested in the question:
+
+ After I upgrade will anything fail in my pre-existing documents?
+
+Certain of the bug fixes have the potential to affect the output of
+existing documents in the following ways:
+
+---Vertical spacing for some displayed equations will change because
+"abovedisplayshortskip" is now applied when possible.
+
+---Incorrect horizontal spacing for certain math constructs will change,
+e.g., for \iint\nolimits or a subscript on a double-accented letter.
+
+---The default subscript placement in displayed formulas for \varinjlim,
+\varprojlim, \varliminf, \varlimsup is now below rather than to the
+side. To get the old behavior, add \nolimits---e.g.,
+\varliminf\nolimits_{...}.
+
+---Ellipsis dots in text (\ldots or \dots) will now behave the same as
+in standard LaTeX; the surrounding space may therefore change.
+
+During regression testing we found some errors cropping up in documents
+from incorrect usage that had not been caught with version 1.2. Although
+these errors are relatively rare, documents containing such usage will
+need to be corrected before they will run properly with version 2.0:
+
+---Use of two mutually exclusive display structures for the same
+display. In this example the outer \[ \] are redundant:
+
+ \[
+ \begin{align*}
+ ...
+ \end{align*}
+ \]
+
+---Inadequate argument markup for math accents:
+
+ \hat \mathcal{C}
+
+This should have been written with braces surrounding the argument of
+the \hat command: \hat{\mathcal{C}}.
+
+For documents where error messages crop up after the upgrade, there are
+various possible approaches, including:
+
+(a) Change instances of incorrect usage (if applicable).
+
+(b) Put a copy of amsmath.sty version 1.2 into the home directory of the
+document. Then it should continue to work the same as before.
+
+(c) Use the snapshot package in combination with a shell script to
+arrange that version 1.2 of amsmath is found instead of 2.0 when
+processing the document. See ftp://ftp.ams.org/pub/tex/snapshot.*. This
+approach requires a certain amount of technical knowledge.
+
+(d) Downgrade to version 1.2 again.
+
+========================================================================
+Changes in amsmath 2.0 [November 1999]
+
+---The AMS-LaTeX User's Guide (amsldoc.tex) has been turned into the
+ AMSmath User's Guide by moving the amsthm documentation into a
+ separate file (amsthdoc.tex) in the amslatex/classes area.
+
+---Restored normal use of "shortskip" spacing in single equations.
+
+[!! NOTE: This means that page breaks may change in existing documents.]
+
+---Restored normal use of available shrink around binary operators in
+ single equations.
+
+---Fixed poor subscript placement for double-accented letters. Math
+accent handling was reworked in the process in such a way that the
+capitalized forms of the math accent commands are no longer necessary.
+\hat{\hat{X}} will do proper alignment of the second accent. \Hat et
+cetera are retained for compabitility reasons. (Thanks to Javier Bezos
+for donating some code from his accents package.)
+
+[!! NOTE: Improper math accent use will now produce wrong output.]
+
+Suppose that we have \boldH defined in the preamble as
+\newcommand{\boldH}{\mathbf{H}}. Then the following examples illustrate
+recommended usage.
+
+ \hat{\mathbf{H}} OK
+ \hat{\boldH} OK
+ \hat\boldH Works OK, but deprecated by the LaTeX book
+ \hat\mathbf{H} Not OK! Output will be incorrect.
+
+Since the output will be wrong, amsmath gives an error message when the
+last variant is detected.
+
+---The following kinds of mixed structures worked by happenstance with
+ amsmath 1.2, although they should have produced an error message.
+ With amsmath 2.0 they will produce an error or warning message.
+
+ [!! NOTE: Potential error messages]
+
+ % Outer \[ \] is redundant
+
+ \[
+ \begin{align*}
+ ...
+ \end{align*}
+ \]
+
+ % Outer \begin{equation*} ... \end{equation*} is redundant
+
+ \begin{equation*}\begin{alignat*}{2}
+ ...
+ \end{alignat*}
+ \end{equation*}
+
+ % No printed material is allowed between \begin{equation} and
+ % \begin{split}:
+
+ \begin{equation*}\left \{
+ \begin{split}
+ ...
+ \end{split}\right .
+ \end{equation*}
+
+---diff12.tex is replaced by diffs-m.txt and diffs-c.txt, with the
+ latter moving to the amslatex/classes area.
+
+---Added an "?" option which gives some information about the available
+ documentation.
+
+---The amsmath definitions for matrix, pmatrix, and cases are
+ incompatible with the plain-TeX syntax for \pmatrix, \matrix, and
+ \cases, which are used occasionally by some authors in LaTeX
+ documents. In version 2.0 the error messages resulting from the
+ plain-TeX syntax have been made more intelligible.
+
+---If you need the boldsymbol facilities of the amsbsy package, use of
+ the "bm" (boldmath) package is recommended instead for new documents.
+ The amsbsy package is retained for compatibility with existing
+ documents. If you have a recent version of LaTeX (1998 or newer) you
+ already have the bm package; otherwise you may need to get it from
+ CTAN. (It is not an AMS package.)
+
+---\iint\nolimits: Fixed poor placement of subscript (also \iiint,
+\idotsint, etc).
+
+---\varinjlim, \varprojlim, \varliminf, \varlimsup: Default to
+\displaylimits instead of nolimits.
+
+---Fixed alignedat so that it doesn't take the first token of its
+ contents and try to interpret it as a number.
+
+---Leave text version of \dots and \ldots unchanged.
+
+---Changed \numberwithin so it no longer assumes previous definition of
+ \thesomething contained no prefixes.
+
+---\mathbf{\Gamma}: Leave cap Greek letters alone instead of converting
+ them from variable (fam 7) to fixed (fam 0). \mathbf{\gamma} still
+ fails---but that's a math font problem.
+
+---\mathindent is aliased to \@mathmargin so that when the fleqn option
+ is used, users can reset it as the LaTeX book advertises.
+
+---With the showkeys package: Corrected loss of marginal notes when
+labels occurred inside an align environment.
+
+---Carried over some tweaks (\bmod, \right/leftarrowfill) from the 1996
+ version of plain.tex.
+
+---Adjusted spacing of overarrow@ and underarrow@ to allow more room for
+ larger cmsy arrowheads.
+
+---Corrected spurious "overfull \hbox" warnings for \xrightarrow.
+
+---Corrected poor spacing for \xleftarrow.
+
+---Removed the \leavevmode in \smash which caused trouble for some
+ applications (e.g., the crop package) that expected the original
+ LaTeX definition.
+
+---Changed \def to \newcommand/\newenvironment where appropriate.
+
+---Use \sqrtsign instead of \@@sqrt (but include a backward
+ compatibility hack for the latter).
+
+---Left brace in \env{cases} environment would fail to work in
+ certain circumstances: Fix by using \lbrace instead of \{.
+
+---Use \ignorespacesafterend where applicable instead of
+ \global\@ignoretrue.
+
+---Protected commands in the definition of \theequation were
+ incorrectly expanded by the subequations environment when copying
+ the definition to \theparentequation: Fix by using \protected@edef.
+
+---Spurious extra space following punctuation at that end of a display:
+ In \math@cr, \math@cr@@, etc, use \iffalse{\fi instead of simply { to
+ keep an unwanted mathord atom from being added at the end of the
+ current math list; added \endmultline@math to work around a similar
+ sort of problem specific to the `multline' environment.
+
+---Various wrong results or no effect for \displaybreak inside "align",
+ "alignat", etc. Resetting \dspbrk@level in the \everycr of
+ \@display@init cleared most of these up.
+
+---Changed \displaybreak to issue an error message if enclosed in boxing
+ environment that will keep it from having any effect.
+
+---Turned off \displaybreak during the measuring phase of multline.
+
+---Fixed some numbering problems with multline and multline* and error
+ for use of \tag.
+
+---Use \@gtempa instead of \@tempa where assigned globally (standard
+ save stack precaution).
+
+---Save and restore \column@ to keep aligned from screwing up the column
+ counting of a parent align environment. Made \column@ assignments
+ uniformly global, except in a couple of places where the risk of side
+ effects seemed too great.
+
+---Error recovery for misspelled '\end{multline}' was not very helpful.
+ Improve \collect@body along lines suggested by Hellström.
+
+---Fixed up certain number placement problems with align
+
+---Add \alignsafe@testopt to work around a LaTeX bug: when a nested
+ alignment environment that takes an optional argument has an empty
+ first cell (i.e., begins with an &) LaTeX's optional argument
+ scanning screws up the alignment state.
+
+---Add `mathdisplay' environment (internal use) to correct several
+ problems of \[ \] and the `equation' environment arising from the
+ previous implementation as a degenerate case of `gather'.
+
+---It is possible now to use \eeq as an abbreviation for \end{equation}
+(one of the consequences of the preceding change). But still not \eal
+for \end{align} or certain other display structures.
+
+---Reorganize `split' internal calling sequence to go along with the use
+ of `mathdisplay' in \[ \] and `equation'.
+
+---Suppression of LaTeX error messages during measuring phase made
+ primitive TeX errors harder to understand; stop suppressing. (As a
+ result, users will sometimes get redundant error messages now.)
+ Remove obsolete Sb, Sp environments again.
+
+---The file amsintx.dtx was removed from the distribution pending
+ further development.
+
+---Remove the \ifinany@ switch, use \spread@equation instead to achieve
+ the same ends.
+
+---Remove unbracefonts@ function, no longer needed after changes in
+ math accent handling.
+
+---Got rid of the special trap for '^x that had been carried over from
+AMS-TeX.
+
+---Made \overline, \doteq, \longrightarrow, etc, robust.
+
+---Changed \relbar to use \std@minus---otherwise \underleftrightarrow
+works poorly in a \DeclareMathOperator definition.
+
+---Use \new@ifnextchar in matrix, pmatrix, cases so that \\<newline>[x]
+doesn't trigger an error.
+
+---Bug fix for nested use of \label inside minipage inside equation.
+
+---Add minalignsep after every second column in aligned, for consistency
+with align.
+
+========================================================================
+Changes in amsmath 1.2 [January 1995]
+
+---Name change; relation to the "amsfonts" package
+
+In version 1.1 of AMS-LaTeX, the name of this package was "amstex". The
+new name is "amsmath". The amstex package automatically invoked the
+amsfonts package as well; the amsmath package does not.
+
+---Adapted for LaTeX2e
+
+Old method of invocation:
+
+ \documentstyle[amstex]{article}% LaTeX 2.09
+
+New method of invocation:
+
+ \documentclass{article}
+ \usepackage{amsmath}
+
+---Handling of options intlim, nosumlim, nonamelm, righttag, ctagsplt
+
+Old usage:
+
+ \documentstyle[amstex,righttag,intlim]
+
+New usage:
+
+ \usepackage[reqno,intlimits]{amsmath}
+
+Several option names were changed (mainly, they are no longer restricted
+to eight characters):
+
+ intlim -> intlimits
+ nosumlim -> nosumlimits
+ nonamelm -> nonamelimits
+ righttag -> reqno [for consistency with "leqno"]
+ ctagsplt -> centertags
+
+---Character @ is no longer used as a special command prefix
+
+Certain commands in the amstex pkg started with "@" instead of "\". This
+special usage has been discontinued, except for the amscd package, and
+then only within the CD environment. Practically speaking, this means
+primarily that it is no longer necessary to use doubled @@ to get a
+single printed @ character (e.g., in e-mail addresses).
+
+---The @, and @! micro-spacing commands are no longer provided
+
+As a consequence of the @ character change, "@," and "@!" are no longer
+recognized spacing commands. An \mspace command is provided that can be
+used instead; see the AMSmath User's Guide.
+
+---Extensible arrow commands @>>> and @<<<
+
+The commands @>>> and @<<< are no longer available [except in the CD
+environment of the amscd package]; alternative commands \xleftarrow and
+\xrightarrow are provided by the amsmath package. The sub and
+superscripts are given through an optional resp. mandatory argument, for
+example
+
+ X\xleftarrow{b}Y % superscript "b" only
+ X\xrightarrow[\alpha]{\beta}Y % sub alpha, sup beta
+
+---The command \bold has been superseded by the command \mathbf, as the
+latter is now the standard name provided by LaTeX for this purpose.
+
+---The commands \newsymbol, \frak, \Bbb are no longer available because
+the amsfonts package is not loaded by amsmath. In any case those
+commands now have new names---\frak -> \mathfrak, \Bbb -> \mathbb, etc.
+See the amsfonts documentation for further details.
+
+---The amsmath package provides \lvert and \rvert to use for vert-bar
+symbols when they act as delimiters (compare \langle, \rangle for
+angle-bracket delimiters). Commands \lVert and \rVert are likewise
+provided instead of \| for paired-delimiter use of the double-vert
+symbol. Use of | and \| for paired delimiters can lead to incorrect
+spacing in rare cases. Further discussion is found in the AMS-LaTeX
+user's guide (amsldoc.tex).
+
+---The ~ command is now left unchanged by amsmath; the change
+that makes it remove a redundant preceding or following space character
+is now done only by AMS documentclasses (in version 1.1 this was done by
+the amstex package).
+
+---The following rarely used commands are removed to the amsxtra
+package: \accentedsymbol, \sphat, \spcheck, \sptilde, \spdot, \spddot,
+\spdddot, \spbreve, \@))), \@(((.
+
+---The six generalized fraction commands \over, \overwithdelims, \atop,
+\atopwithdelims, \above, \abovewithdelims are deprecated and produce
+warning messages. Their functionality can be obtained through \frac,
+\binom, and \genfrac instead. See amsldoc.tex and technote.tex for
+further details.
+
+---The \fracwithdelims command is gone, as \genfrac provides
+equivalent functionality (and a little more).
+
+---The optional argument of \frac that allowed changing the thickness of
+the fraction line is gone. That functionality is now provided only
+through \genfrac: the need to change the line thickness is so rare in
+practice that it seems better not to burden the ubiquitous \frac command
+with the somewhat time-consuming look-ahead process required for an
+optional argument. I.e., this change will contribute in a small way to
+making your documents run faster.
+
+---The commands \lcfrac and \rcfrac for left or right alignment of
+continued fraction numerators are gone; they are replaced by an optional
+argument of the \cfrac command.
+
+---A new command \DeclareMathOperator is provided for defining new
+operator names:
+
+\DeclareMathOperator{\Tr}{Tr}
+\DeclareMathOperator*{\xlim}{x-lim}
+
+The * form makes the operator name produce limit-style sub and
+superscripts, like \max or \lim. This is now the preferred method,
+instead of using the old command \operatorname (which is, however,
+retained for now). The command \operatornamewithlimits has been renamed
+\operatorname*. These commands now can also be obtained through a
+separate package amsopn, so it's not necessary to load the entire
+amsmath package just to get that feature.
+
+---Environments "Sb", "Sp" retired.
+
+The environments Sb and Sp for multiline subscripts have been replaced
+by a single command \substack, used as follows:
+
+\sum_{\substack{first line\\second line}}
+
+This command can be used equally well in a subscript or superscript, and
+provides better vertical positioning (as compared to Sb, Sp) if a
+multiline subscript is placed on the side, as perhaps for an integral.
+There is also a slightly generalized alternative, an environment
+subarray that allows you to specify either centering or left alignment
+for the contents:
+
+\sum_{\begin{subarray}{l}first line\\second line\end{subarray}}
+
+---New command \nobreakdash
+
+A command \nobreakdash is provided to suppress the possibility of a
+linebreak after the following hyphen or dash. For example, if you write
+"$p$\nobreakdash-adic" then a linebreak will never be taken between the
+hyphen and the "adic".
+
+---The placement of equation numbers has been substantially improved for
+align, gather, and split. Numbers will now never overlap on top of the
+equation body (as far as we can ascertain), and they are much less
+likely to be shifted up or down unnecessarily when there is actually
+adequate space to leave the number in the normal place. In a few
+remaining cases, an equation number will be shifted unnecessarily
+because technical complications make accurate measurement of the
+available room too difficult; for those cases a \raisetag command is
+provided that allows you to manually adjust the vertical position of the
+equation number.
+
+---The [xx]align[at] family of environments has been thoroughly revised:
+now the xalignat environment is gone, as its function has been merged
+into the align environment (it's no longer necessary to specify how many
+side-by-side structures, as was required for xalignat, because align
+automatically handles any number of them). Similarly, the xxalignat
+environment has been replaced by an environment flalign that doesn't
+require you to specify how many side-by-side structures will be needed.
+Certain numbering problems (presence of an equation number when it
+should be absent, or vice versa) have also been cleared up.
+
+(Thanks to David M. Jones for his substantial [volunteer] work behind
+this change and the preceding one.)
+
+---The alignedat environment was changed to take two arguments rather
+than one: a mandatory argument (as formerly) specifying the number of
+align structures, and a new optional one specifying the placement of the
+environment (parallel to the optional argument of aligned). However,
+aligned is simpler to use, allowing any number of aligned structures
+automatically, and therefore the use of alignedat is deprecated.
+
+---The seldom-used command \oldnos is gone; if you need it, you should
+consult the LaTeX documentation on using fonts (e.g., fntguide.tex) to
+find out how to construct an equivalent command.
+
+---A new subequations environment causes all numbered equation
+environments within its scope to be numbered (4.9a) (4.9b) (4.9c) etc.,
+if the preceding numbered equation was 4.8. A \label command immediately
+after \begin{subequations} will produce a \ref of the parent number
+`4.9', not `4.9a'. The counters used by the subequations environment are
+parentequation and equation and standard uses of \addtocounter,
+\setcounter, etc., are possible with those counter names.
+
+---The amsmath package (unlike amstex) respects the setting provided by
+the documentclass for putting equation numbers on the right or the left.
+[Technical note: a documentclass that has leqno as the default should
+explicitly pass that option to the amsmath package with
+\PassOptionsToPackage in order for it to be effective.]
+
+---The fleqn option for left-aligned instead of centered equations is
+now supported (thanks to David M. Jones).
+
+************************************************************************
+The remainder of this file discusses some changes that do not directly
+pertain to the amsmath package but to the parent distribution known as
+"AMS-LaTeX".
+
+========================================================================
+Changes in AMS-LaTeX 2.0
+
+---The AMS-LaTeX User's Guide (amsldoc.tex) is split up into amsldoc.tex
+and amsthdoc.tex, with the latter moving into the "classes" area.
+
+---The file amslatex.faq was split into amsmath.faq and amsclass.faq.
+
+---The file amslatex.bug was done away with; most of the information was
+merged into diffs-m.txt, diffs-c.txt, amsmath.faq, and amsclass.faq.
+
+========================================================================
+Changes in AMS-LaTeX 1.2
+
+---Adapted for LaTeX2e
+
+AMS-LaTeX 1.0 and 1.1 were designed to work with LaTeX 2.09, which
+became obsolete in 1994 with the appearance of "LaTeX2e". AMS-LaTeX 1.2
+has been extensively adapted to take advantage of various features of
+LaTeX2e. It is no longer a separate TeX format---i.e., it does not need
+to be invoked by a separate "amslatex" command.
+
+---LaTeX 2.09 font commands (\bf, \it, etc)
+
+Pre-existing documents will for the most part continue to work fine
+without requiring any changes. However, depending on the installation
+options used for your copy of AMS-LaTeX 1.1 you may need to update the
+options list of the \documentstyle command by adding newlfont, for
+example:
+
+ \documentstyle[newlfont]{amsart}
+
+---The packages amsfonts, amssymb were moved to the AMSFonts
+distribution. They used to be included in the AMS-LaTeX distribution for
+pragmatic reasons but their natural home is with the AMSFonts
+distribution.
+
+---Package amstex renamed to amsmath
+
+The amstex package has been renamed amsmath. The old name `amstex' came
+from the fact that version 1.0 was a more or less straight port into
+LaTeX of selected portions from the macro package AmS-TeX written by
+Michael Spivak, but the historical origins of the package are likely of
+less interest to the general usership---especially looking to the
+future---than a straightforward declaration in the name `amsmath' of the
+sort of features that are provided.
+
+Another important reason for the name change was to make possible some
+progress that would be out of the question (because of the impact on
+existing documents) if the name `amstex' were retained. For example,
+unlike amstex, amsmath doesn't automatically load the amsfonts package,
+as that package was moved out to the AMSFonts distribution as described
+above. If this change were not accompanied by a name change, many
+existing documents would have to be updated by hand (adding
+\usepackage{amsfonts}) in order to run without error. A frozen version
+of amstex.sty is provided for processing pre-existing documents; it
+won't have active maintainence henceforth except for bug fixes. For new
+documents, authors should use the amsmath package.
+
+Therefore, "\usepackage{amstex}" is incorrect usage---do not rely on the
+1994 edition of `The LaTeX Companion' in this respect (unless you obtain
+the errata for Chapter 8).
+
+---New documentclass amsproc
+
+A new documentclass amsproc was added for collections of articles, such as
+the proceedings of a conference.
diff --git a/macros/latex-dev/required/amsmath/manifest.txt b/macros/latex-dev/required/amsmath/manifest.txt
new file mode 100644
index 0000000000..ee6b8e3238
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/manifest.txt
@@ -0,0 +1,32 @@
+README.txt
+amsbsy.dtx
+amsbsy.ins
+amsbsy.pdf
+amscd.dtx
+amscd.ins
+amscd.pdf
+amsgen.dtx
+amsgen.ins
+amsgen.pdf
+amsldoc.pdf
+amsldoc.tex
+amsmath.dtx
+amsmath.ins
+amsmath.pdf
+amsopn.dtx
+amsopn.ins
+amsopn.pdf
+amstex.sty
+amstext.dtx
+amstext.ins
+amstext.pdf
+amsxtra.dtx
+amsxtra.ins
+amsxtra.pdf
+diffs-m.txt
+subeqn.pdf
+subeqn.tex
+technote.pdf
+technote.tex
+testmath.pdf
+testmath.tex
diff --git a/macros/latex-dev/required/amsmath/subeqn.pdf b/macros/latex-dev/required/amsmath/subeqn.pdf
new file mode 100644
index 0000000000..2e84ebe942
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/subeqn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/subeqn.tex b/macros/latex-dev/required/amsmath/subeqn.tex
new file mode 100644
index 0000000000..c34b3f6952
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/subeqn.tex
@@ -0,0 +1,202 @@
+%%% ====================================================================
+%%% @LaTeX-file{
+%%% filename = "subeqn.tex",
+%%% version = "1.2c",
+%%% date = "1999/11/29",
+%%% time = "14:49:29 EST",
+%%% checksum = "29866 202 668 6426",
+%%% author = "American Mathematical Society",
+%%% copyright = "Copyright 1999 American Mathematical Society,
+%%% all rights reserved. Copying of this file is
+%%% authorized only if either:
+%%% (1) you make absolutely no changes to your copy,
+%%% including name; OR
+%%% (2) if you do make changes, you first rename it
+%%% to some other name.",
+%%% address = "American Mathematical Society,
+%%% Technical Support,
+%%% Electronic Products and Services,
+%%% P. O. Box 6248,
+%%% Providence, RI 02940,
+%%% USA",
+%%% telephone = "401-455-4080 or (in the USA and Canada)
+%%% 800-321-4AMS (321-4267)",
+%%% FAX = "401-331-3842",
+%%% email = "tech-support@ams.org (Internet)",
+%%% supported = "yes",
+%%% keywords = "latex, amslatex, ams-latex, amstex",
+%%% abstract = "This is part of the AMS-\LaTeX{} distribution.
+%%% It is a sample document illustrating the use of
+%%% the subequations environment and the effect of
+%%% the fleqn option.",
+%%% docstring = "The checksum field above contains a CRC-16
+%%% checksum as the first value, followed by the
+%%% equivalent of the standard UNIX wc (word
+%%% count) utility output of lines, words, and
+%%% characters. This is produced by Robert
+%%% Solovay's checksum utility.",
+%%% }
+%%% ====================================================================
+\documentclass[fleqn]{article}
+
+\title{Test of subequations environment}
+\author{mjd}
+
+\usepackage{amsmath}
+\numberwithin{equation}{section}
+
+\newcommand{\env}[1]{{\normalfont\texttt{#1}}}
+
+\AtEndDocument{\multipasswarning}
+\newcommand{\multipasswarning}{%
+ \clearpage
+ \typeout{%
+ **********************************************************************}
+ \typeout{%
+ Note: This document needs to run through LaTeX three times, instead of}
+ \typeout{%
+ the usual two, to resolve indirect cross-references.}
+ \typeout{%
+ **********************************************************************}
+}
+
+\makeatletter
+% Omit the warning message if three passes have been completed (on
+% first pass \ref{check} is undefined and it is set to 0; on second
+% pass \ref{check} is 0 and set to 1; on third pass it is 1).
+\def\checkref{\begingroup
+ \@ifundefined{r@check}{\let\r@check\relax\def\@currentlabel{0}}{\def\@currentlabel{1}}%
+ \ifnum1=0\expandafter\@firstoftwo\r@check\relax
+ \global\let\multipasswarning\relax
+ \fi
+ \label{check}%
+ \endgroup}
+\makeatother
+
+\begin{document}
+\section{Prime equation numbers}
+
+First an equation.
+\begin{equation}\label{e:previous}
+A=B
+\end{equation}
+That was equation \eqref{e:previous}.
+
+Then the same, with a prime on the number.\checkref
+\begin{equation}
+\tag{\ref{e:previous}$'$}\label{e:prevprime}
+C=D
+\end{equation}
+And that was equation \eqref{e:prevprime}.
+
+Notice, by the way, that when a \verb"\ref" occurs inside a \verb"\tag",
+and that \verb"\tag" is then \verb"\label"'d, a \verb"\ref" for the the
+second \verb"\label" requires \emph{three} runs of \LaTeX{} in order to
+get the proper value. (If you run through the logic of \LaTeX{}'s
+cross-referencing mechanisms as they apply in this case, you will see
+that this is necessary.)
+
+\section{Subnumbered equations}
+
+Here is a,b,c sub-numbering.
+\begin{subequations}
+\begin{eqnarray}
+A&=&B\\
+D&=&C \label{e:middle}\\
+E&=&F
+\end{eqnarray}
+\end{subequations}
+That was produced with the \env{eqnarray} environment; the middle line
+was labeled as \eqref{e:middle}.
+
+An equation following the end of the \verb"subequations" environment
+should revert to normal numbering:
+\begin{equation}\label{e:check}
+H<K
+\end{equation}
+A check on the labeling: that was equation~\eqref{e:check}.
+
+The sub-numbered equations can be spread out through the text, like
+this:
+\begin{subequations}
+\begin{equation}
+A=B
+\end{equation}
+The \verb"subequations" environment can span arbitrary text between
+subsidiary equations. The only restriction is that if there are any
+numbered equations inside the \verb"subequations" environment that break
+out of the subequation numbering sequence, they would have to be handled
+specially.
+\begin{equation}
+D=C \label{e:newmiddle}
+\end{equation}
+More arbitrary text.
+\begin{equation}
+E=F
+\end{equation}
+\end{subequations}
+Label check: the middle one was \eqref{e:newmiddle}
+
+A final equation for a numbering check.
+\begin{equation}\label{e:final}
+G=H
+\end{equation}
+That equation was labeled as \eqref{e:final}.
+
+\section{Tests of \env{align}, \env{gather}, and other
+AMS-\protect\LaTeX{} environments}
+
+The \env{align} environment:
+\begin{subequations}
+\begin{align}
+\label{align:a}A+B&=B+A\\
+\label{align:b}C&=D+E\\
+\label{align:c}E&=F
+\end{align}
+\end{subequations}
+Label check: that was \eqref{align:a}, \eqref{align:b}, and
+\eqref{align:c}.
+
+The \env{align} environment again:
+\begin{subequations}
+\begin{align}
+\label{xalign:a}A+B&=B& B&=B+A\\
+\label{xalign:b}C&=D+E& C\oplus D&=E\\
+\label{xalign:c}E&=F& E'&=F'
+\end{align}
+\end{subequations}
+Label check: that was \eqref{xalign:a}, \eqref{xalign:b}, and
+\eqref{xalign:c}.
+
+The \env{gather} environment. For the third line we refer to one of the
+numbers in the first \env{align} structure.
+\begin{subequations}
+\begin{gather}
+\label{gather:a}A+B=B\\
+\label{gather:b}C=D+E\\
+\tag{\ref{align:c}$'$}\label{gather:c}E=F
+\end{gather}
+\end{subequations}
+Label check: that was \eqref{gather:a},
+\eqref{gather:b}, and
+\eqref{gather:c}.
+
+The next \env{subequations} environment encompasses two separate
+equations. A \env{split} environment:
+\begin{subequations}
+\begin{equation}
+\label{split:x}
+\begin{split}
+A&=B+C+F\\
+&=G
+\end{split}
+\end{equation}
+and a \env{multline} environment:
+\begin{multline}\label{multline:x}
+A[B]C[D]E[F]G[[H[I]J[K]L[M]N]]=\\
+H[I]J[K]L[M]N[O]P[Q]R[S]T[U]V[W]X[Y]Z
+\end{multline}
+\end{subequations}
+Label check: That was \eqref{split:x} and \eqref{multline:x}.
+
+\end{document}
diff --git a/macros/latex-dev/required/amsmath/technote.pdf b/macros/latex-dev/required/amsmath/technote.pdf
new file mode 100644
index 0000000000..7d7ab397c8
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/technote.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/technote.tex b/macros/latex-dev/required/amsmath/technote.tex
new file mode 100644
index 0000000000..aede450621
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/technote.tex
@@ -0,0 +1,233 @@
+%%% ====================================================================
+%%% @LaTeX-file{
+%%% filename = "technote.tex",
+%%% version = "2.0",
+%%% date = "1999/11/15",
+%%% time = "15:07:20 EST",
+%%% checksum = "58506 233 1647 12005",
+%%% author = "American Mathematical Society",
+%%% copyright = "Copyright 1995, 1999 American Mathematical Society,
+%%% all rights reserved. Copying of this file is
+%%% authorized only if either:
+%%% (1) you make absolutely no changes to your copy,
+%%% including name; OR
+%%% (2) if you do make changes, you first rename it
+%%% to some other name.",
+%%% address = "American Mathematical Society,
+%%% Technical Support,
+%%% Electronic Products and Services,
+%%% P. O. Box 6248,
+%%% Providence, RI 02940,
+%%% USA",
+%%% telephone = "401-455-4080 or (in the USA and Canada)
+%%% 800-321-4AMS (321-4267)",
+%%% FAX = "401-331-3842",
+%%% email = "tech-support@ams.org (Internet)",
+%%% supported = "yes",
+%%% keywords = "amsmath, latex",
+%%% abstract = "This is part of the AMS-\LaTeX{} distribution. It
+%%% is a document discussing some technical issues in the
+%%% contents and interface of AMS-\LaTeX{} packages."
+%%% docstring = "The checksum field above contains a CRC-16 checksum
+%%% as the first value, followed by the equivalent of
+%%% the standard UNIX wc (word count) utility output of
+%%% lines, words, and characters. This is produced by
+%%% Robert Solovay's checksum utility.",
+%%% }
+%%% ====================================================================
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\documentclass{amsdtx}
+
+\title{Technical notes on the \pkg{amsmath} package}
+\author{American Mathematical Society\\Michael Downes}
+\date{1999/10/29}
+
+\markboth
+ {Technical notes on the \pkg{amsmath} package}
+ {Technical notes on the \pkg{amsmath} package}
+\renewcommand{\sectionmark}[1]{}
+
+\providecommand{\etc}[1]{etc.}
+
+\providecommand{\begend}[1]{%
+ {\ntt \symbol{92}begin\symbol{123}#1\symbol{125}}
+ \ldots\ {\ntt\symbol{92}end\symbol{123}#1\symbol{125}}%
+}
+
+\MakeShortVerb{\|}
+
+\begin{document}
+\maketitle
+
+\section{Introduction}
+
+These notes are miscellaneous remarks on some technical questions
+applicable to version 2.0 of \amslatex/.
+
+\section{Deprecated and disallowed commands}
+
+Certain commands that were in the \pkg{amstex} package (the predecessor,
+in \amslatex/ 1.0 and 1.1, of the \pkg{amsmath} package) were moved into
+\pkg{amsxtra} because they seemed to be little-used relics:
+\cn{accentedsymbol}, \qq{sup accents} (\cn{sptilde}, \cn{sphat}, etc.).
+
+Certain other commands\mdash e.g., \cn{over}, \cn{pmatrix}, and
+\cn{cases}\mdash are changed by the \pkg{amsmath} package to produce
+warning messages or error messages, depending on their history; these
+are discussed in more detail in the following sections.
+
+\section{Why do \cn{matrix}, \cn{pmatrix}, and \cn{cases} stop working
+when I add the \pkg{amsmath} package?}
+
+If you used the \fn{plain.tex} versions of \cn{matrix}, \cn{pmatrix}, or
+\cn{cases} in a document and then later converted the document to use
+the \pkg{amsmath} package (or one of the AMS documentclasses, which
+automatically call the \pkg{amsmath} package internally), the instances
+of those commands will produce error messages. The problem is that when
+\latex/ was originally created, it adopted most of its mathematics
+features straight from \fn{plain.tex}. But in the case of \cn{matrix},
+\cn{pmatrix}, \cn{cases} this was a mistake\mdash the \fn{plain.tex}
+syntax for them is decidedly non-\latex/ in style, for example the fact
+that they use \cs{cr} instead of \cn{\\} to mark line breaks, and they
+don't use \cn{begin} and \cn{end}. In basic \latex/ this mistake will be
+perpetuated at least until \latex/3 appears, in order to avoid breaking
+existing documents. But no existing documents that were written with the
+\pkg{amsmath} package have that syntactic problem, as \pkg{amsmath}
+provides proper \latex/-syntax versions of \cn{matrix} and the others.
+The possibility of optionally allowing the \fn{plain.tex} variants to
+make document conversion easier seems ill-advised since those variants
+are so blatantly wrong in a \latex/ context. The \env{array} environment
+ought to have been used instead.
+
+\section{Why do \cn{over}, \cn{atop}, \cn{above} [\dots{\ntt withdelims}]
+ give a warning when I add the \pkg{amsmath} package?}
+
+Using the six generalized fraction commands \cn{over},
+\cn{overwithdelims}, \cn{atop}, \cn{atopwithdelims}, \cn{above},
+\cn{abovewithdelims} is not really a good idea in \latex/, for reasons
+explained below. I construe \latex/'s provision of \cs{frac}, and the
+lack of any mention in the \latex/ book of the primitive fraction
+commands, as an implicit injunction against their use, although I don't
+think Lamport actually spent a lot of time pondering the issue, and the
+basic \latex/ version of \cn{frac} provides access only to \cn{over},
+not to \cn{atop}, \cn{above}, or the \verb'withdelims' variants. The
+\pkg{amsmath} package, however, provides a \cn{genfrac} command that
+gives user-level access to all six of the generalized fraction
+primitives in a way that conforms to the syntactic conventions followed
+by all other \latex/ commands.
+
+Not only is the unusual syntax of the \tex/ primitives rather out of
+place in \latex/, but furthermore that syntax seems to be responsible
+for one of the most significant flaws in \tex/'s mathematical
+typesetting capabilities: the fact that the current mathstyle at any
+given point in a math formula cannot be determined until the end of the
+formula, because of the possibility that a following generalized
+fraction command will change the mathstyle of the \emph{preceding}
+material. To cite two of the worst side effects: \cn{mathchoice} must
+actually typeset all four of its arguments, instead of being able to
+immediately select only one; and, were it possible to always know the
+current math style at a given point, math font selection would be
+greatly simplified and the upper limit of 16 different math font
+\cn{fam}s would never be a problem as \cn{text,script[script]font}
+assignments for any \cn{fam} could take immediate effect and therefore
+could be changed arbitrarily often within a single formula. More
+concretely, math font selection difficulties are responsible for many of
+the more convoluted passages in the source code of \latex/'s NFSS (that
+does font loading on demand) and of the \pkg{amsmath} package, and by
+extension it has historically been responsible for significant delays in
+making new features available to end users and for making those features
+more prone to bugs.
+
+There are additional bad consequences following from the syntax of those
+generalized fraction commands that only become evident when you do some
+writing of nontrivial macros for math use. For example, as things
+currently stand you cannot measure the size of any object in math
+without going through \cn{mathchoice} and \emph{leaving and reentering
+math mode} via \verb'\hbox{$' (which then introduces complications
+regarding \cn{everymath} and \cn{mathsurround}). And it seems that
+uncertainty about the current mathstyle is the only barrier to allowing
+the use of mu units with \cn{vrule}, to make vertical struts in
+constructing compound symbols or notation. And so on and so forth.
+
+\section{The \opt{fleqn} option and \cn{mathindent}}
+
+Strictly speaking, the \pkg{amsmath} package doesn't use \cn{mathindent}
+to control the left indent of displayed equations when the \opt{fleqn}
+option is in effect: it uses an internal parameter \cs{@mathmargin}
+instead. However, for compatibility with existing \latex/ documentation,
+\pkg{amsmath} turns \cn{mathindent} into an alias for \cs{@mathmargin}.
+There is a small risk here: In the plain \latex/ implementation,
+\cn{mathindent} is a dimen register, but with \pkg{amsmath}
+\cs{@mathmargin} is a skip register and, by association, so is
+\cn{mathindent}. If any package or documentclass uses \cn{mathindent} in
+a way that depends on it being a dimen register, when used in
+conjunction with the \pkg{amsmath} package it may be vulnerable to a
+well-known pitfall having to do with the primitive \tex/ lookahead for a
+\texttt{plus} or \texttt{minus} key word. However if the standard
+\latex/ commands \cn{setlength} and \cn{addtolength} are used to modify
+\cn{mathindent} then this problem will not arise.
+
+\section{Why can't I use abbreviations for \protect\begend{align}?}
+
+Authors often like to use abbreviations such as |\beq| |\eeq| for
+|\begin{equation}| |\end{equation}|. For some environments defined by
+the \pkg{amsmath} package, such as \env{align}, \env{gather},
+\env{multline}, and others of the same general type, this does not work:
+An attempt to define |\bal| |\eal| as shorthand for |\begin{align}|
+|\end{align}| will fail with a puzzling error message. This has to do
+with unfortunately nontrivial technical complications: the given
+environments must read their contents as a delimited macro argument
+because they do multipass processing of the contents using algorithms
+inherited from Spivak's \fn{amstex.tex}. The obvious
+solution\mdash substitution of different algorithms that do box shuffling
+instead of token shuffling for the multipass calculations\mdash would
+require rewriting these display environments from the ground up; while
+that is a worthy goal, it was beyond the original scope of the
+\amslatex/ project. Work is under way on an auxiliary package called
+\pkg{breqn} that addresses not only this problem but a number of others;
+at the time of this writing, however [September 1999] it has only
+progressed as far as a beta release.
+
+Some workarounds:
+\begin{itemize}
+\item |\def\bal#1\eal{\begin{align}#1\end{align}}|
+\item Define |\newcommand{\env}[2]{\begin{#1}#2\end{#1}}| and then use
+ |\env{align}{...}|
+\end{itemize}
+
+\section{The \pkg{upref} package}
+
+The reason for splitting out the \pkg{upref} package instead of
+automatically incorporating it in the \cls{amsart} and \cls{amsbook}
+classes is this: It involves low-level surgery on an important \latex/
+command. This means that if ever this command changes in the future (as
+it did between versions 2.09 and 2e of \latex/) we have a maintenance
+problem. And the benefit that \pkg{upref} provides is something that
+most end users don't care much about.
+
+\section{The \pkg{amsintx} package}
+
+After a very preliminary trial release the \pkg{amsintx} package was
+withdrawn to await further development. It is still considered a worthy
+project but has simply not yet made it to the head of the priority queue
+in the AMS \latex/ development program, as it has had to contend with a
+number of other equally worthy projects for development time.
+
+\section{Hyphenation in the documentation}
+
+Hyphenation was allowed for certain long command names in
+\fn{amsldoc.tex}; this presented technical difficulties because \latex/
+normally deactivates hyphenation for tt fonts. The method chosen to
+reinstate hyphenation was to turn off the encoding-specific function
+\cs{OT1+cmtt} that disables the \cs{hyphenchar} for tt fonts; see the
+definition of \cn{allowtthyphens} in \fn{amsdtx.dtx}. Then a list of all
+tt words in the document was gathered (from the \fn{.idx} file, produced
+by the \cn{cn}, \cn{fn}, \cn{pkg}, etc. commands) and \cn{showhyphens}
+was applied to this list. The result was another list in the resulting
+\tex/ log, containing those words in a form suitable for the argument of
+\cn{hyphenation}. That list was then edited by hand to overrule
+undesirable hyphenations; words with acceptable hyphenations were
+dropped from the list, as they don't need to be repeated there.
+
+\end{document}
diff --git a/macros/latex-dev/required/amsmath/testmath.pdf b/macros/latex-dev/required/amsmath/testmath.pdf
new file mode 100644
index 0000000000..d97ff85f73
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/testmath.pdf
Binary files differ
diff --git a/macros/latex-dev/required/amsmath/testmath.tex b/macros/latex-dev/required/amsmath/testmath.tex
new file mode 100644
index 0000000000..069944ee9d
--- /dev/null
+++ b/macros/latex-dev/required/amsmath/testmath.tex
@@ -0,0 +1,2342 @@
+%%% ====================================================================
+%%% @LaTeX-file{
+%%% filename = "testmath.tex",
+%%% version = "2.0",
+%%% date = "1999/11/15",
+%%% time = "15:09:17 EST",
+%%% checksum = "07762 2342 7811 82371",
+%%% author = "American Mathematical Society",
+%%% copyright = "Copyright 1995, 1999 American Mathematical Society,
+%%% all rights reserved. Copying of this file is
+%%% authorized only if either:
+%%% (1) you make absolutely no changes to your copy,
+%%% including name; OR
+%%% (2) if you do make changes, you first rename it
+%%% to some other name.",
+%%% address = "American Mathematical Society,
+%%% Technical Support,
+%%% Electronic Products and Services,
+%%% P. O. Box 6248,
+%%% Providence, RI 02940,
+%%% USA",
+%%% telephone = "401-455-4080 or (in the USA and Canada)
+%%% 800-321-4AMS (321-4267)",
+%%% FAX = "401-331-3842",
+%%% email = "tech-support@ams.org (Internet)",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "latex, amsmath, examples, documentation",
+%%% supported = "yes",
+%%% abstract = "This is a test file containing extensive examples of
+%%% mathematical constructs supported by the amsmath
+%%% package.",
+%%% docstring = "The checksum field above contains a CRC-16
+%%% checksum as the first value, followed by the
+%%% equivalent of the standard UNIX wc (word
+%%% count) utility output of lines, words, and
+%%% characters. This is produced by Robert
+%%% Solovay's checksum utility.",
+%%% }
+%%% ====================================================================
+\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX)
+[1994/12/01]% LaTeX date must December 1994 or later
+\documentclass[draft]{article}
+\pagestyle{headings}
+
+\title{Sample Paper for the \pkg{amsmath} Package\\
+File name: \fn{testmath.tex}}
+\author{American Mathematical Society}
+\date{Version 2.0, 1999/11/15}
+
+\usepackage{amsmath,amsthm}
+
+% Some definitions useful in producing this sort of documentation:
+\chardef\bslash=`\\ % p. 424, TeXbook
+% Normalized (nonbold, nonitalic) tt font, to avoid font
+% substitution warning messages if tt is used inside section
+% headings and other places where odd font combinations might
+% result.
+\newcommand{\ntt}{\normalfont\ttfamily}
+% command name
+\newcommand{\cn}[1]{{\protect\ntt\bslash#1}}
+% LaTeX package name
+\newcommand{\pkg}[1]{{\protect\ntt#1}}
+% File name
+\newcommand{\fn}[1]{{\protect\ntt#1}}
+% environment name
+\newcommand{\env}[1]{{\protect\ntt#1}}
+\hfuzz1pc % Don't bother to report overfull boxes if overage is < 1pc
+
+% Theorem environments
+
+%% \theoremstyle{plain} %% This is the default
+\newtheorem{thm}{Theorem}[section]
+\newtheorem{cor}[thm]{Corollary}
+\newtheorem{lem}[thm]{Lemma}
+\newtheorem{prop}[thm]{Proposition}
+\newtheorem{ax}{Axiom}
+
+\theoremstyle{definition}
+\newtheorem{defn}{Definition}[section]
+
+\theoremstyle{remark}
+\newtheorem{rem}{Remark}[section]
+\newtheorem*{notation}{Notation}
+
+%\numberwithin{equation}{section}
+
+\newcommand{\thmref}[1]{Theorem~\ref{#1}}
+\newcommand{\secref}[1]{\S\ref{#1}}
+\newcommand{\lemref}[1]{Lemma~\ref{#1}}
+
+\newcommand{\bysame}{\mbox{\rule{3em}{.4pt}}\,}
+
+% Math definitions
+
+\newcommand{\A}{\mathcal{A}}
+\newcommand{\B}{\mathcal{B}}
+\newcommand{\st}{\sigma}
+\newcommand{\XcY}{{(X,Y)}}
+\newcommand{\SX}{{S_X}}
+\newcommand{\SY}{{S_Y}}
+\newcommand{\SXY}{{S_{X,Y}}}
+\newcommand{\SXgYy}{{S_{X|Y}(y)}}
+\newcommand{\Cw}[1]{{\hat C_#1(X|Y)}}
+\newcommand{\G}{{G(X|Y)}}
+\newcommand{\PY}{{P_{\mathcal{Y}}}}
+\newcommand{\X}{\mathcal{X}}
+\newcommand{\wt}{\widetilde}
+\newcommand{\wh}{\widehat}
+
+\DeclareMathOperator{\per}{per}
+\DeclareMathOperator{\cov}{cov}
+\DeclareMathOperator{\non}{non}
+\DeclareMathOperator{\cf}{cf}
+\DeclareMathOperator{\add}{add}
+\DeclareMathOperator{\Cham}{Cham}
+\DeclareMathOperator{\IM}{Im}
+\DeclareMathOperator{\esssup}{ess\,sup}
+\DeclareMathOperator{\meas}{meas}
+\DeclareMathOperator{\seg}{seg}
+
+% \interval is used to provide better spacing after a [ that
+% is used as a closing delimiter.
+\newcommand{\interval}[1]{\mathinner{#1}}
+
+% Notation for an expression evaluated at a particular condition. The
+% optional argument can be used to override automatic sizing of the
+% right vert bar, e.g. \eval[\biggr]{...}_{...}
+\newcommand{\eval}[2][\right]{\relax
+ \ifx#1\right\relax \left.\fi#2#1\rvert}
+
+% Enclose the argument in vert-bar delimiters:
+\newcommand{\envert}[1]{\left\lvert#1\right\rvert}
+\let\abs=\envert
+
+% Enclose the argument in double-vert-bar delimiters:
+\newcommand{\enVert}[1]{\left\lVert#1\right\rVert}
+\let\norm=\enVert
+
+\begin{document}
+\maketitle
+\markboth{Sample paper for the {\protect\ntt\lowercase{amsmath}} package}
+{Sample paper for the {\protect\ntt\lowercase{amsmath}} package}
+\renewcommand{\sectionmark}[1]{}
+
+\section{Introduction}
+
+This paper contains examples of various features from \AmS-\LaTeX{}.
+
+\section{Enumeration of Hamiltonian paths in a graph}
+
+Let $\mathbf{A}=(a_{ij})$ be the adjacency matrix of graph $G$. The
+corresponding Kirchhoff matrix $\mathbf{K}=(k_{ij})$ is obtained from
+$\mathbf{A}$ by replacing in $-\mathbf{A}$ each diagonal entry by the
+degree of its corresponding vertex; i.e., the $i$th diagonal entry is
+identified with the degree of the $i$th vertex. It is well known that
+\begin{equation}
+\det\mathbf{K}(i|i)=\text{ the number of spanning trees of $G$},
+\quad i=1,\dots,n
+\end{equation}
+where $\mathbf{K}(i|i)$ is the $i$th principal submatrix of
+$\mathbf{K}$.
+\begin{verbatim}
+\det\mathbf{K}(i|i)=\text{ the number of spanning trees of $G$},
+\end{verbatim}
+
+Let $C_{i(j)}$ be the set of graphs obtained from $G$ by attaching edge
+$(v_iv_j)$ to each spanning tree of $G$. Denote by $C_i=\bigcup_j
+C_{i(j)}$. It is obvious that the collection of Hamiltonian cycles is a
+subset of $C_i$. Note that the cardinality of $C_i$ is $k_{ii}\det
+\mathbf{K}(i|i)$. Let $\wh X=\{\hat x_1,\dots,\hat x_n\}$.
+\begin{verbatim}
+$\wh X=\{\hat x_1,\dots,\hat x_n\}$
+\end{verbatim}
+Define multiplication for the elements of $\wh X$ by
+\begin{equation}\label{multdef}
+\hat x_i\hat x_j=\hat x_j\hat x_i,\quad \hat x^2_i=0,\quad
+i,j=1,\dots,n.
+\end{equation}
+Let $\hat k_{ij}=k_{ij}\hat x_j$ and $\hat k_{ij}=-\sum_{j\not=i} \hat
+k_{ij}$. Then the number of Hamiltonian cycles $H_c$ is given by the
+relation \cite{liuchow:formalsum}
+\begin{equation}\label{H-cycles}
+\biggl(\prod^n_{\,j=1}\hat x_j\biggr)H_c=\frac{1}{2}\hat k_{ij}\det
+\wh{\mathbf{K}}(i|i),\qquad i=1,\dots,n.
+\end{equation}
+The task here is to express \eqref{H-cycles}
+in a form free of any $\hat x_i$,
+$i=1,\dots,n$. The result also leads to the resolution of enumeration of
+Hamiltonian paths in a graph.
+
+It is well known that the enumeration of Hamiltonian cycles and paths in
+a complete graph $K_n$ and in a complete bipartite graph $K_{n_1n_2}$
+can only be found from \textit{first combinatorial principles}
+\cite{hapa:graphenum}. One wonders if there exists a formula which can
+be used very efficiently to produce $K_n$ and $K_{n_1n_2}$. Recently,
+using Lagrangian methods, Goulden and Jackson have shown that $H_c$ can
+be expressed in terms of the determinant and permanent of the adjacency
+matrix \cite{gouja:lagrmeth}. However, the formula of Goulden and
+Jackson determines neither $K_n$ nor $K_{n_1n_2}$ effectively. In this
+paper, using an algebraic method, we parametrize the adjacency matrix.
+The resulting formula also involves the determinant and permanent, but
+it can easily be applied to $K_n$ and $K_{n_1n_2}$. In addition, we
+eliminate the permanent from $H_c$ and show that $H_c$ can be
+represented by a determinantal function of multivariables, each variable
+with domain $\{0,1\}$. Furthermore, we show that $H_c$ can be written by
+number of spanning trees of subgraphs. Finally, we apply the formulas to
+a complete multigraph $K_{n_1\dots n_p}$.
+
+The conditions $a_{ij}=a_{ji}$, $i,j=1,\dots,n$, are not required in
+this paper. All formulas can be extended to a digraph simply by
+multiplying $H_c$ by 2.
+
+\section{Main Theorem}
+\label{s:mt}
+
+\begin{notation} For $p,q\in P$ and $n\in\omega$ we write
+$(q,n)\le(p,n)$ if $q\le p$ and $A_{q,n}=A_{p,n}$.
+\begin{verbatim}
+\begin{notation} For $p,q\in P$ and $n\in\omega$
+...
+\end{notation}
+\end{verbatim}
+\end{notation}
+
+Let $\mathbf{B}=(b_{ij})$ be an $n\times n$ matrix. Let $\mathbf{n}=\{1,
+\dots,n\}$. Using the properties of \eqref{multdef}, it is readily seen
+that
+
+\begin{lem}\label{lem-per}
+\begin{equation}
+\prod_{i\in\mathbf{n}}
+\biggl(\sum_{\,j\in\mathbf{n}}b_{ij}\hat x_i\biggr)
+=\biggl(\prod_{\,i\in\mathbf{n}}\hat x_i\biggr)\per \mathbf{B}
+\end{equation}
+where $\per \mathbf{B}$ is the permanent of $\mathbf{B}$.
+\end{lem}
+
+Let $\wh Y=\{\hat y_1,\dots,\hat y_n\}$. Define multiplication
+for the elements of $\wh Y$ by
+\begin{equation}
+\hat y_i\hat y_j+\hat y_j\hat y_i=0,\quad i,j=1,\dots,n.
+\end{equation}
+Then, it follows that
+\begin{lem}\label{lem-det}
+\begin{equation}\label{detprod}
+\prod_{i\in\mathbf{n}}
+\biggl(\sum_{\,j\in\mathbf{n}}b_{ij}\hat y_j\biggr)
+=\biggl(\prod_{\,i\in\mathbf{n}}\hat y_i\biggr)\det\mathbf{B}.
+\end{equation}
+\end{lem}
+
+Note that all basic properties of determinants are direct consequences
+of Lemma ~\ref{lem-det}. Write
+\begin{equation}\label{sum-bij}
+\sum_{j\in\mathbf{n}}b_{ij}\hat y_j=\sum_{j\in\mathbf{n}}b^{(\lambda)}
+_{ij}\hat y_j+(b_{ii}-\lambda_i)\hat y_i\hat y
+\end{equation}
+where
+\begin{equation}
+b^{(\lambda)}_{ii}=\lambda_i,\quad b^{(\lambda)}_{ij}=b_{ij},
+\quad i\not=j.
+\end{equation}
+Let $\mathbf{B}^{(\lambda)}=(b^{(\lambda)}_{ij})$. By \eqref{detprod}
+and \eqref{sum-bij}, it is
+straightforward to show the following
+result:
+\begin{thm}\label{thm-main}
+\begin{equation}\label{detB}
+\det\mathbf{B}=
+\sum^n_{l =0}\sum_{I_l \subseteq n}
+\prod_{i\in I_l}(b_{ii}-\lambda_i)
+\det\mathbf{B}^{(\lambda)}(I_l |I_l ),
+\end{equation}
+where $I_l =\{i_1,\dots,i_l \}$ and $\mathbf{B}^{(\lambda)}(I_l |I_l )$
+is the principal submatrix obtained from $\mathbf{B}^{(\lambda)}$
+by deleting its $i_1,\dots,i_l $ rows and columns.
+\end{thm}
+
+\begin{rem}
+Let $\mathbf{M}$ be an $n\times n$ matrix. The convention
+$\mathbf{M}(\mathbf{n}|\mathbf{n})=1$ has been used in \eqref{detB} and
+hereafter.
+\end{rem}
+
+Before proceeding with our discussion, we pause to note that
+\thmref{thm-main} yields immediately a fundamental formula which can be
+used to compute the coefficients of a characteristic polynomial
+\cite{mami:matrixth}:
+\begin{cor}\label{BI}
+Write $\det(\mathbf{B}-x\mathbf{I})=\sum^n_{l =0}(-1)
+^l b_l x^l $. Then
+\begin{equation}\label{bl-sum}
+b_l =\sum_{I_l \subseteq\mathbf{n}}\det\mathbf{B}(I_l |I_l ).
+\end{equation}
+\end{cor}
+Let
+\begin{equation}
+\mathbf{K}(t,t_1,\dots,t_n)
+=\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\
+-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\
+\hdotsfor[2]{4}\\
+-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix},
+\end{equation}
+\begin{verbatim}
+\begin{pmatrix} D_1t&-a_{12}t_2&\dots&-a_{1n}t_n\\
+-a_{21}t_1&D_2t&\dots&-a_{2n}t_n\\
+\hdotsfor[2]{4}\\
+-a_{n1}t_1&-a_{n2}t_2&\dots&D_nt\end{pmatrix}
+\end{verbatim}
+where
+\begin{equation}
+D_i=\sum_{j\in\mathbf{n}}a_{ij}t_j,\quad i=1,\dots,n.
+\end{equation}
+
+Set
+\begin{equation*}
+D(t_1,\dots,t_n)=\frac{\delta}{\delta t}\eval{\det\mathbf{K}(t,t_1,\dots,t_n)
+}_{t=1}.
+\end{equation*}
+Then
+\begin{equation}\label{sum-Di}
+D(t_1,\dots,t_n)
+=\sum_{i\in\mathbf{n}}D_i\det\mathbf{K}(t=1,t_1,\dots,t_n; i|i),
+\end{equation}
+where $\mathbf{K}(t=1,t_1,\dots,t_n; i|i)$ is the $i$th principal
+submatrix of $\mathbf{K}(t=1,t_1,\dots,t_n)$.
+
+Theorem ~\ref{thm-main} leads to
+\begin{equation}\label{detK1}
+\det\mathbf{K}(t_1,t_1,\dots,t_n)
+=\sum_{I\in\mathbf{n}}(-1)^{\envert{I}}t^{n-\envert{I}}
+\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\mathbf{A}
+^{(\lambda t)}(\overline{I}|\overline I).
+\end{equation}
+Note that
+\begin{equation}\label{detK2}
+\det\mathbf{K}(t=1,t_1,\dots,t_n)=\sum_{I\in\mathbf{n}}(-1)^{\envert{I}}
+\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\mathbf{A}
+^{(\lambda)}(\overline{I}|\overline{I})=0.
+\end{equation}
+
+Let $t_i=\hat x_i,i=1,\dots,n$. Lemma ~\ref{lem-per} yields
+\begin{multline}
+\biggl(\sum_{\,i\in\mathbf{n}}a_{l _i}x_i\biggr)
+\det\mathbf{K}(t=1,x_1,\dots,x_n;l |l )\\
+=\biggl(\prod_{\,i\in\mathbf{n}}\hat x_i\biggr)
+\sum_{I\subseteq\mathbf{n}-\{l \}}
+(-1)^{\envert{I}}\per\mathbf{A}^{(\lambda)}(I|I)
+\det\mathbf{A}^{(\lambda)}
+(\overline I\cup\{l \}|\overline I\cup\{l \}).
+\label{sum-ali}
+\end{multline}
+\begin{verbatim}
+\begin{multline}
+\biggl(\sum_{\,i\in\mathbf{n}}a_{l _i}x_i\biggr)
+\det\mathbf{K}(t=1,x_1,\dots,x_n;l |l )\\
+=\biggl(\prod_{\,i\in\mathbf{n}}\hat x_i\biggr)
+\sum_{I\subseteq\mathbf{n}-\{l \}}
+(-1)^{\envert{I}}\per\mathbf{A}^{(\lambda)}(I|I)
+\det\mathbf{A}^{(\lambda)}
+(\overline I\cup\{l \}|\overline I\cup\{l \}).
+\label{sum-ali}
+\end{multline}
+\end{verbatim}
+
+By \eqref{H-cycles}, \eqref{detprod}, and \eqref{sum-bij}, we have
+\begin{prop}\label{prop:eg}
+\begin{equation}
+H_c=\frac1{2n}\sum^n_{l =0}(-1)^{l}
+D_{l},
+\end{equation}
+where
+\begin{equation}\label{delta-l}
+D_{l}=\eval[2]{\sum_{I_{l}\subseteq \mathbf{n}}
+D(t_1,\dots,t_n)}_{t_i=\left\{\begin{smallmatrix}
+0,& \text{if }i\in I_{l}\quad\\% \quad added for centering
+1,& \text{otherwise}\end{smallmatrix}\right.\;,\;\; i=1,\dots,n}.
+\end{equation}
+\end{prop}
+
+\section{Application}
+\label{lincomp}
+
+We consider here the applications of Theorems~\ref{th-info-ow-ow} and
+~\ref{th-weak-ske-owf} to a complete
+multipartite graph $K_{n_1\dots n_p}$. It can be shown that the
+number of spanning trees of $K_{n_1\dots n_p}$
+may be written
+\begin{equation}\label{e:st}
+T=n^{p-2}\prod^p_{i=1}
+(n-n_i)^{n_i-1}
+\end{equation}
+where
+\begin{equation}
+n=n_1+\dots+n_p.
+\end{equation}
+
+It follows from Theorems~\ref{th-info-ow-ow} and
+~\ref{th-weak-ske-owf} that
+\begin{equation}\label{e:barwq}
+\begin{split}
+H_c&=\frac1{2n}
+\sum^n_{{l}=0}(-1)^{l}(n-{l})^{p-2}
+\sum_{l _1+\dots+l _p=l}\prod^p_{i=1}
+\binom{n_i}{l _i}\\
+&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}\cdot
+\biggl[(n-l )^2-\sum^p_{j=1}(n_i-l _i)^2\biggr].\end{split}
+\end{equation}
+\begin{verbatim}
+... \binom{n_i}{l _i}\\
+\end{verbatim}
+and
+\begin{equation}\label{joe}
+\begin{split}
+H_c&=\frac12\sum^{n-1}_{l =0}
+(-1)^{l}(n-l )^{p-2}
+\sum_{l _1+\dots+l _p=l}
+\prod^p_{i=1}\binom{n_i}{l _i}\\
+&\quad\cdot[(n-l )-(n_i-l _i)]^{n_i-l _i}
+\left(1-\frac{l _p}{n_p}\right)
+[(n-l )-(n_p-l _p)].
+\end{split}
+\end{equation}
+
+The enumeration of $H_c$ in a $K_{n_1\dotsm n_p}$ graph can also be
+carried out by Theorem ~\ref{thm-H-param} or ~\ref{thm-asym}
+together with the algebraic method of \eqref{multdef}.
+Some elegant representations may be obtained. For example, $H_c$ in
+a $K_{n_1n_2n_3}$ graph may be written
+\begin{equation}\label{j:mark}
+\begin{split}
+H_c=&
+\frac{n_1!\,n_2!\,n_3!}
+{n_1+n_2+n_3}\sum_i\left[\binom{n_1}{i}
+\binom{n_2}{n_3-n_1+i}\binom{n_3}{n_3-n_2+i}\right.\\
+&+\left.\binom{n_1-1}{i}
+\binom{n_2-1}{n_3-n_1+i}
+\binom{n_3-1}{n_3-n_2+i}\right].\end{split}
+\end{equation}
+
+\section{Secret Key Exchanges}
+\label{SKE}
+
+Modern cryptography is fundamentally concerned with the problem of
+secure private communication. A Secret Key Exchange is a protocol
+where Alice and Bob, having no secret information in common to start,
+are able to agree on a common secret key, conversing over a public
+channel. The notion of a Secret Key Exchange protocol was first
+introduced in the seminal paper of Diffie and Hellman
+\cite{dihe:newdir}. \cite{dihe:newdir} presented a concrete
+implementation of a Secret Key Exchange protocol, dependent on a
+specific assumption (a variant on the discrete log), specially
+tailored to yield Secret Key Exchange. Secret Key Exchange is of
+course trivial if trapdoor permutations exist. However, there is no
+known implementation based on a weaker general assumption.
+
+The concept of an informationally one-way function was introduced
+in \cite{imlelu:oneway}. We give only an informal definition here:
+
+\begin{defn} A polynomial time
+computable function $f = \{f_k\}$ is informationally
+one-way if there is no probabilistic polynomial time algorithm which
+(with probability of the form $1 - k^{-e}$ for some $e > 0$)
+returns on input $y \in \{0,1\}^{k}$ a random element of $f^{-1}(y)$.
+\end{defn}
+In the non-uniform setting \cite{imlelu:oneway} show that these are not
+weaker than one-way functions:
+\begin{thm}[\cite{imlelu:oneway} (non-uniform)]
+\label{th-info-ow-ow}
+The existence of informationally one-way functions
+implies the existence of one-way functions.
+\end{thm}
+We will stick to the convention introduced above of saying
+``non-uniform'' before the theorem statement when the theorem
+makes use of non-uniformity. It should be understood that
+if nothing is said then the result holds for both the uniform and
+the non-uniform models.
+
+It now follows from \thmref{th-info-ow-ow} that
+
+\begin{thm}[non-uniform]\label{th-weak-ske-owf} Weak SKE
+implies the existence of a one-way function.
+\end{thm}
+
+More recently, the polynomial-time, interior point algorithms for linear
+programming have been extended to the case of convex quadratic programs
+\cite{moad:quadpro,ye:intalg}, certain linear complementarity problems
+\cite{komiyo:lincomp,miyoki:lincomp}, and the nonlinear complementarity
+problem \cite{komiyo:unipfunc}. The connection between these algorithms
+and the classical Newton method for nonlinear equations is well
+explained in \cite{komiyo:lincomp}.
+
+\section{Review}
+\label{computation}
+
+We begin our discussion with the following definition:
+
+\begin{defn}
+
+A function $H\colon \Re^n \to \Re^n$ is said to be
+\emph{B-differentiable} at the point $z$ if (i)~$H$ is Lipschitz
+continuous in a neighborhood of $z$, and (ii)~ there exists a positive
+homogeneous function $BH(z)\colon \Re^n \to \Re^n$, called the
+\emph{B-derivative} of $H$ at $z$, such that
+\[ \lim_{v \to 0} \frac{H(z+v) - H(z) - BH(z)v}{\enVert{v}} = 0. \]
+The function $H$ is \textit{B-differentiable in set $S$} if it is
+B-differentiable at every point in $S$. The B-derivative $BH(z)$ is said
+to be \textit{strong} if
+\[ \lim_{(v,v') \to (0,0)} \frac{H(z+v) - H(z+v') - BH(z)(v
+ -v')}{\enVert{v - v'}} = 0. \]
+\end{defn}
+
+
+\begin{lem}\label{limbog} There exists a smooth function $\psi_0(z)$
+defined for $\abs{z}>1-2a$ satisfying the following properties\textup{:}
+\begin{enumerate}
+\renewcommand{\labelenumi}{(\roman{enumi})}
+\item $\psi_0(z)$ is bounded above and below by positive constants
+$c_1\leq \psi_0(z)\leq c_2$.
+\item If $\abs{z}>1$, then $\psi_0(z)=1$.
+\item For all $z$ in the domain of $\psi_0$, $\Delta_0\ln \psi_0\geq 0$.
+\item If $1-2a<\abs{z}<1-a$, then $\Delta_0\ln \psi_0\geq
+c_3>0$.
+\end{enumerate}
+\end{lem}
+
+\begin{proof}
+We choose $\psi_0(z)$ to be a radial function depending only on $r=\abs{z}$.
+Let $h(r)\geq 0$ be a suitable smooth function satisfying $h(r)\geq c_3$
+for $1-2a<\abs{z}<1-a$, and $h(r)=0$ for $\abs{z}>1-\tfrac a2$. The radial
+Laplacian
+\[\Delta_0\ln\psi_0(r)=\left(\frac {d^2}{dr^2}+\frac
+1r\frac d{dr}\right)\ln\psi_0(r)\]
+has smooth coefficients for $r>1-2a$. Therefore, we may
+apply the existence and uniqueness theory for ordinary differential
+equations. Simply let $\ln \psi_0(r)$ be the solution of the differential
+equation
+\[\left(\frac{d^2}{dr^2}+\frac 1r\frac d{dr}\right)\ln \psi_0(r)=h(r)\]
+with initial conditions given by $\ln \psi_0(1)=0$ and
+$\ln\psi_0'(1)=0$.
+
+Next, let $D_\nu$ be a finite collection of pairwise disjoint disks,
+all of which are contained in the unit disk centered at the origin in
+$C$. We assume that $D_\nu=\{z\mid \abs{z-z_\nu}<\delta\}$. Suppose that
+$D_\nu(a)$ denotes the smaller concentric disk $D_\nu(a)=\{z\mid
+\abs{z-z_\nu}\leq (1-2a)\delta\}$. We define a smooth weight function
+$\Phi_0(z)$ for $z\in C-\bigcup_\nu D_\nu(a)$ by setting $\Phi_
+0(z)=1$ when $z\notin \bigcup_\nu D_\nu$ and $\Phi_
+0(z)=\psi_0((z-z_\nu)/\delta)$ when $z$ is an element of $D_\nu$. It
+follows from \lemref{limbog} that $\Phi_ 0$ satisfies the properties:
+\begin{enumerate}
+\renewcommand{\labelenumi}{(\roman{enumi})}
+\item \label{boundab}$\Phi_ 0(z)$ is bounded above and below by
+positive constants $c_1\leq \Phi_ 0(z)\leq c_2$.
+\item \label{d:over}$\Delta_0\ln\Phi_ 0\geq 0$ for all
+$z\in C-\bigcup_\nu D_\nu(a)$,
+the domain where the function $\Phi_ 0$ is defined.
+\item \label{d:ad}$\Delta_0\ln\Phi_ 0\geq c_3\delta^{-2}$
+when $(1-2a)\delta<\abs{z-z_\nu}<(1-a)\delta$.
+\end{enumerate}
+Let $A_\nu$ denote the annulus $A_\nu=\{(1-2a)\delta<\abs{z-z_\nu}<(1-a)
+\delta \}$, and set $A=\bigcup_\nu A_\nu$. The
+properties (\ref{d:over}) and (\ref{d:ad}) of $\Phi_ 0$
+may be summarized as $\Delta_0\ln \Phi_ 0\geq c_3\delta^{-2}\chi_A$,
+where $\chi _A$ is the characteristic function of $A$.
+\end{proof}
+
+Suppose that $\alpha$ is a nonnegative real constant. We apply
+Proposition~\ref{prop:eg} with $\Phi(z)=\Phi_ 0(z) e^{\alpha\abs{z}^2}$. If
+$u\in C^\infty_0(R^2-\bigcup_\nu D_\nu(a))$, assume that $\mathcal{D}$
+is a bounded domain containing the support of $u$ and $A\subset
+\mathcal{D}\subset R^2-\bigcup_\nu D_\nu(a)$. A calculation gives
+\[\int_{\mathcal{D}}\abs{\overline\partial u}^2\Phi_ 0(z) e^{\alpha\abs{z}^2}
+\geq c_4\alpha\int_{\mathcal{D}}\abs{u}^2\Phi_ 0e^{\alpha\abs{z}^2}
++c_5\delta^{-2}\int_ A\abs{u}^2\Phi_ 0e^{\alpha\abs{z}^2}.\]
+
+The boundedness, property (\ref{boundab}) of $\Phi_ 0$, then yields
+\[\int_{\mathcal{D}}\abs{\overline\partial u}^2e^{\alpha\abs{z}^2}\geq c_6\alpha
+\int_{\mathcal{D}}\abs{u}^2e^{\alpha\abs{z}^2}
++c_7\delta^{-2}\int_ A\abs{u}^2e^{\alpha\abs{z}^2}.\]
+
+Let $B(X)$ be the set of blocks of $\Lambda_{X}$
+and let $b(X) = \abs{B(X)}$. If $\phi \in Q_{X}$ then
+$\phi$ is constant on the blocks of $\Lambda_{X}$.
+\begin{equation}\label{far-d}
+ P_{X} = \{ \phi \in M \mid \Lambda_{\phi} = \Lambda_{X} \},
+\qquad
+Q_{X} = \{\phi \in M \mid \Lambda_{\phi} \geq \Lambda_{X} \}.
+\end{equation}
+If $\Lambda_{\phi} \geq \Lambda_{X}$ then
+$\Lambda_{\phi} = \Lambda_{Y}$ for some $Y \geq X$ so that
+\[ Q_{X} = \bigcup_{Y \geq X} P_{Y}. \]
+Thus by M\"obius inversion
+\[ \abs{P_{Y}}= \sum_{X\geq Y} \mu (Y,X)\abs{Q_{X}}.\]
+Thus there is a bijection from $Q_{X}$ to $W^{B(X)}$.
+In particular $\abs{Q_{X}} = w^{b(X)}$.
+
+Next note that $b(X)=\dim X$. We see this by choosing a
+basis for $X$ consisting of vectors $v^{k}$ defined by
+\[v^{k}_{i}=
+\begin{cases} 1 & \text{if $i \in \Lambda_{k}$},\\
+0 &\text{otherwise.} \end{cases}
+\]
+\begin{verbatim}
+\[v^{k}_{i}=
+\begin{cases} 1 & \text{if $i \in \Lambda_{k}$},\\
+0 &\text{otherwise.} \end{cases}
+\]
+\end{verbatim}
+
+\begin{lem}\label{p0201}
+Let $\A$ be an arrangement. Then
+\[ \chi (\A,t) = \sum_{\B \subseteq \A}
+(-1)^{\abs{\B}} t^{\dim T(\B)}. \]
+\end{lem}
+
+In order to compute $R''$ recall the definition
+of $S(X,Y)$ from \lemref{lem-per}. Since $H \in \B$,
+$\A_{H} \subseteq \B$. Thus if $T(\B) = Y$ then
+$\B \in S(H,Y)$. Let $L'' = L(\A'')$. Then
+\begin{equation}\label{E_SXgYy}
+\begin{split}
+R''&= \sum_{H\in \B \subseteq \A} (-1)^{\abs{\B}}
+t^{\dim T(\B)}\\
+&= \sum_{Y \in L''} \sum_{\B \in S(H,Y)}
+(-1)^{\abs{\B}}t^{\dim Y} \\
+&= -\sum_{Y \in L''} \sum_{\B \in S(H,Y)} (-1)^
+{\abs{\B - \A_{H}}} t^{\dim Y} \\
+&= -\sum_{Y \in L''} \mu (H,Y)t^{\dim Y} \\
+&= -\chi (\A '',t).
+\end{split}
+\end{equation}
+
+\begin{cor}\label{tripleA}
+Let $(\A,\A',\A'')$ be a triple of arrangements. Then
+\[ \pi (\A,t) = \pi (\A',t) + t \pi (\A'',t). \]
+\end{cor}
+
+\begin{defn}
+Let $(\A,\A',\A'')$ be a triple with respect to
+the hyperplane $H \in \A$. Call $H$ a \textit{separator}
+if $T(\A) \not\in L(\A')$.
+\end{defn}
+
+\begin{cor}\label{nsep}
+Let $(\A,\A',\A'')$ be a triple with respect to $H \in \A$.
+\begin{enumerate}
+\renewcommand{\labelenumi}{(\roman{enumi})}
+\item
+If $H$ is a separator then
+\[ \mu (\A) = - \mu (\A'') \]
+and hence
+\[ \abs{\mu (\A)} = \abs{ \mu (\A'')}. \]
+
+\item If $H$ is not a separator then
+\[\mu (\A) = \mu (\A') - \mu (\A'') \]
+and
+\[ \abs{\mu (\A)} = \abs{\mu (\A')} + \abs{\mu (\A'')}. \]
+\end{enumerate}
+\end{cor}
+
+\begin{proof}
+It follows from \thmref{th-info-ow-ow} that $\pi(\A,t)$
+has leading term
+\[(-1)^{r(\A)}\mu (\A)t^{r(\A)}.\]
+The conclusion
+follows by comparing coefficients of the leading
+terms on both sides of the equation in
+Corollary~\ref{tripleA}. If $H$ is a separator then
+$r(\A') < r(\A)$ and there is no contribution
+from $\pi (\A',t)$.
+\end{proof}
+
+The Poincar\'e polynomial of an arrangement
+will appear repeatedly
+in these notes. It will be shown to equal the
+Poincar\'e polynomial
+of the graded algebras which we are going to
+associate with $\A$. It is also the Poincar\'e
+polynomial of the complement $M(\A)$ for a
+complex arrangement. Here we prove
+that the Poincar\'e polynomial is the chamber
+counting function for a real arrangement. The
+complement $M(\A)$ is a disjoint union of chambers
+\[M(\A) = \bigcup_{C \in \Cham(\A)} C.\]
+The number
+of chambers is determined by the Poincar\'e
+polynomial as follows.
+
+\begin{thm}\label{th-realarr}
+Let $\A_{\mathbf{R}}$ be a real arrangement. Then
+\[ \abs{\Cham(\A_{\mathbf{R}})} = \pi (\A_{\mathbf{R}},1). \]
+\end{thm}
+
+\begin{proof}
+We check the properties required in Corollary~\ref{nsep}:
+(i) follows from $\pi (\Phi_{ l},t) = 1$, and (ii) is a
+consequence of Corollary~\ref{BI}.
+\end{proof}
+
+\begin{figure}
+\vspace{5cm}
+\caption[]{$Q(\A_{1}) = xyz(x-z)(x+z)(y-z)(y+z)$}
+\end{figure}
+
+\begin{figure}
+\vspace{5cm}
+\caption[]{$Q(\A_{2})= xyz(x+y+z)(x+y-z)(x-y+z)(x-y-z)$}
+\end{figure}
+
+
+\begin{thm}
+\label{T_first_the_int}
+Let $\phi$ be a protocol for a random pair $\XcY$.
+If one of $\st_\phi(x',y)$ and $\st_\phi(x,y')$ is a prefix of the other
+and $(x,y)\in\SXY$, then
+\[
+\langle \st_j(x',y)\rangle_{j=1}^\infty
+=\langle \st_j(x,y)\rangle_{j=1}^\infty
+=\langle \st_j(x,y')\rangle_{j=1}^\infty .
+\]
+\end{thm}
+\begin{proof}
+We show by induction on $i$ that
+\[
+\langle \st_j(x',y)\rangle_{j=1}^i
+=\langle \st_j(x,y)\rangle_{j=1}^i
+=\langle \st_j(x,y')\rangle_{j=1}^i.
+\]
+The induction hypothesis holds vacuously for $i=0$. Assume it holds for
+$i-1$, in particular
+$[\st_j(x',y)]_{j=1}^{i-1}=[\st_j(x,y')]_{j=1}^{i-1}$. Then one of
+$[\st_j(x',y)]_{j=i}^{\infty}$ and $[\st_j(x,y')]_{j=i}^{\infty}$ is a
+prefix of the other which implies that one of $\st_i(x',y)$ and
+$\st_i(x,y')$ is a prefix of the other. If the $i$th message is
+transmitted by $P_\X$ then, by the separate-transmissions property and
+the induction hypothesis, $\st_i(x,y)=\st_i(x,y')$, hence one of
+$\st_i(x,y)$ and $\st_i(x',y)$ is a prefix of the other. By the
+implicit-termination property, neither $\st_i(x,y)$ nor $\st_i(x',y)$
+can be a proper prefix of the other, hence they must be the same and
+$\st_i(x',y)=\st_i(x,y)=\st_i(x,y')$. If the $i$th message is
+transmitted by $\PY$ then, symmetrically, $\st_i(x,y)=\st_i(x',y)$ by
+the induction hypothesis and the separate-transmissions property, and,
+then, $\st_i(x,y)=\st_i(x,y')$ by the implicit-termination property,
+proving the induction step.
+\end{proof}
+
+If $\phi$ is a protocol for $(X,Y)$, and $(x,y)$, $(x',y)$ are distinct
+inputs in $\SXY$, then, by the correct-decision property,
+$\langle\st_j(x,y)\rangle_{j=1}^\infty\ne\langle
+\st_j(x',y)\rangle_{j=1}^\infty$.
+
+Equation~(\ref{E_SXgYy}) defined $\PY$'s ambiguity set $\SXgYy$
+to be the set of possible $X$ values when $Y=y$.
+The last corollary implies that for all $y\in\SY$,
+the multiset%
+\footnote{A multiset allows multiplicity of elements.
+Hence, $\{0,01,01\}$ is prefix free as a set, but not as a multiset.}
+of codewords $\{\st_\phi(x,y):x\in\SXgYy\}$ is prefix free.
+
+\section{One-Way Complexity}
+\label{S_Cp1}
+
+$\Cw1$, the one-way complexity of a random pair $\XcY$,
+is the number of bits $P_\X$ must transmit in the worst case
+when $\PY$ is not permitted to transmit any feedback messages.
+Starting with $\SXY$, the support set of $\XcY$, we define $\G$,
+the \textit{characteristic hypergraph} of $\XcY$, and show that
+\[
+\Cw1=\lceil\,\log\chi(\G)\rceil\ .
+\]
+
+Let $\XcY$ be a random pair. For each $y$ in $\SY$, the support set of
+$Y$, Equation~(\ref{E_SXgYy}) defined $\SXgYy$ to be the set of possible
+$x$ values when $Y=y$. The \textit{characteristic hypergraph} $\G$ of
+$\XcY$ has $\SX$ as its vertex set and the hyperedge $\SXgYy$ for each
+$y\in\SY$.
+
+
+We can now prove a continuity theorem.
+\begin{thm}\label{t:conl}
+Let $\Omega \subset\mathbf{R}^n$ be an open set, let
+$u\in BV(\Omega ;\mathbf{R}^m)$, and let
+\begin{equation}\label{quts}
+T^u_x=\left\{y\in\mathbf{R}^m:
+ y=\tilde u(x)+\left\langle \frac{Du}{\abs{Du}}(x),z
+\right\rangle \text{ for some }z\in\mathbf{R}^n\right\}
+\end{equation}
+for every $x\in\Omega \backslash S_u$. Let $f\colon \mathbf{R}^m\to
+\mathbf{R}^k$ be a Lipschitz continuous function such that $f(0)=0$, and
+let $v=f(u)\colon \Omega \to \mathbf{R}^k$. Then $v\in BV(\Omega
+;\mathbf{R}^k)$ and
+\begin{equation}
+Jv=\eval{(f(u^+)-f(u^-))\otimes \nu_u\cdot\,
+\mathcal{H}_{n-1}}_{S_u}.
+\end{equation}
+In addition, for $\abs{\wt{D}u}$-almost every $x\in\Omega $ the
+restriction of the function $f$ to $T^u_x$ is differentiable at $\tilde
+u(x)$ and
+\begin{equation}
+\wt{D}v=\nabla (\eval{f}_{T^u_x})(\tilde u)
+\frac{\wt{D}u}{\abs{\wt{D}u}}\cdot\abs{\wt{D}u}.\end{equation}
+\end{thm}
+
+Before proving the theorem, we state without proof three elementary
+remarks which will be useful in the sequel.
+\begin{rem}\label{r:omb}
+Let $\omega\colon \left]0,+\infty\right[\to \left]0,+\infty\right[$
+be a continuous function such that $\omega (t)\to 0$ as $t\to
+0$. Then
+\[\lim_{h\to 0^+}g(\omega(h))=L\Leftrightarrow\lim_{h\to
+0^+}g(h)=L\]
+for any function $g\colon \left]0,+\infty\right[\to \mathbf{R}$.
+\end{rem}
+\begin{rem}\label{r:dif}
+Let $g \colon \mathbf{R}^n\to \mathbf{R}$ be a Lipschitz
+continuous function and assume that
+\[L(z)=\lim_{h\to 0^+}\frac{g(hz)-g(0)}h\]
+exists for every $z\in\mathbf{Q}^n$ and that $L$ is a linear function of
+$z$. Then $g$ is differentiable at 0.
+\end{rem}
+\begin{rem}\label{r:dif0}
+Let $A \colon \mathbf{R}^n\to \mathbf{R}^m$ be a linear function, and
+let $f \colon \mathbf{R}^m\to \mathbf{R}$ be a function. Then the
+restriction of $f$ to the range of $A$ is differentiable at 0 if and
+only if $f(A)\colon \mathbf{R}^n\to \mathbf{R}$ is differentiable at 0
+and
+\[\nabla(\eval{f}_{\IM(A)})(0)A=\nabla (f(A))(0).\]
+\end{rem}
+
+\begin{proof}
+ We begin by showing that $v\in BV(\Omega;\mathbf{R}^k)$ and
+\begin{equation}\label{e:bomb}
+\abs{Dv}(B)\le K\abs{Du}(B)\qquad\forall B\in\mathbf{B}(\Omega ),
+\end{equation}
+where $K>0$ is the Lipschitz constant of $f$. By \eqref{sum-Di} and by
+the approximation result quoted in \secref{s:mt}, it is possible to find
+a sequence $(u_h)\subset C^1(\Omega ;\mathbf{R}^m)$ converging to $u$ in
+$L^1(\Omega ;\mathbf{R}^m)$ and such that
+\[\lim_{h\to +\infty}\int_\Omega \abs{\nabla u_h}\,dx=\abs{Du}(\Omega ).\]
+The functions $v_h=f(u_h)$ are locally Lipschitz continuous in $\Omega
+$, and the definition of differential implies that $\abs{\nabla v_h}\le
+K\abs{\nabla u_h}$ almost everywhere in $\Omega $. The lower semicontinuity
+of the total variation and \eqref{sum-Di} yield
+\begin{equation}
+\begin{split}
+\abs{Dv}(\Omega )\le\liminf_{h\to +\infty}\abs{Dv_h}(\Omega) &
+=\liminf_{h\to +\infty}\int_\Omega \abs{\nabla v_h}\,dx\\
+&\le K\liminf_{h\to +\infty}\int_\Omega
+\abs{\nabla u_h}\,dx=K\abs{Du}(\Omega).
+\end{split}\end{equation}
+Since $f(0)=0$, we have also
+\[\int_\Omega \abs{v}\,dx\le K\int_\Omega \abs{u}\,dx;\]
+therefore $u\in BV(\Omega ;\mathbf{R}^k)$. Repeating the same argument
+for every open set $A\subset\Omega $, we get \eqref{e:bomb} for every
+$B\in\mathbf{B}(\Omega)$, because $\abs{Dv}$, $\abs{Du}$ are Radon measures. To
+prove \lemref{limbog}, first we observe that
+\begin{equation}\label{e:SS}
+S_v\subset S_u,\qquad\tilde v(x)=f(\tilde u(x))\qquad \forall x\in\Omega
+\backslash S_u.\end{equation}
+In fact, for every $\varepsilon >0$ we have
+\[\{y\in B_\rho(x): \abs{v(y)-f(\tilde u(x))}>\varepsilon \}\subset \{y\in
+B_\rho(x): \abs{u(y)-\tilde u(x)}>\varepsilon /K\},\]
+hence
+\[\lim_{\rho\to 0^+}\frac{\abs{\{y\in B_\rho(x): \abs{v(y)-f(\tilde u(x))}>
+\varepsilon \}}}{\rho^n}=0\]
+whenever $x\in\Omega \backslash S_u$. By a similar argument, if $x\in
+S_u$ is a point such that there exists a triplet $(u^+,u^-,\nu_u)$
+satisfying \eqref{detK1}, \eqref{detK2}, then
+\[
+(v^+(x)-v^-(x))\otimes \nu_v=(f(u^+(x))-f(u^-(x)))\otimes\nu_u\quad
+\text{if }x\in S_v
+\]
+and $f(u^-(x))=f(u^+(x))$ if $x\in S_u\backslash S_v$. Hence, by (1.8)
+we get
+\begin{equation*}\begin{split}
+Jv(B)=\int_{B\cap S_v}(v^+-v^-)\otimes \nu_v\,d\mathcal{H}_{n-1}&=
+\int_{B\cap S_v}(f(u^+)-f(u^-))\otimes \nu_u\,d\mathcal{H}_{n-1}\\
+&=\int_{B\cap S_u}(f(u^+)-f(u^-))\otimes \nu_u\,d\mathcal{H}_{n-1}
+\end{split}\end{equation*}
+and \lemref{limbog} is proved.
+\end{proof}
+
+To prove \eqref{e:SS}, it is not restrictive to assume that $k=1$.
+Moreover, to simplify our notation, from now on we shall assume that
+$\Omega = \mathbf{R}^n$. The proof of \eqref{e:SS} is divided into two
+steps. In the first step we prove the statement in the one-dimensional
+case $(n=1)$, using \thmref{th-weak-ske-owf}. In the second step we
+achieve the general result using \thmref{t:conl}.
+
+\subsection*{Step 1}
+Assume that $n=1$. Since $S_u$ is at most countable, \eqref{sum-bij}
+yields that $\abs{\wt{D}v}(S_u\backslash S_v)=0$, so that
+\eqref{e:st} and \eqref{e:barwq} imply that $Dv=\wt{D}v+Jv$ is
+the Radon-Nikod\'ym decomposition of $Dv$ in absolutely continuous and
+singular part with respect to $\abs{\wt{D} u}$. By
+\thmref{th-weak-ske-owf}, we have
+\begin{equation*}
+\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{s\to t^+}
+\frac{Dv(\interval{\left[t,s\right[})}
+{\abs{\wt{D}u}(\interval{\left[t,s\right[})},\qquad
+\frac{\wt{D}u}{\abs{\wt{D}u}}(t)=\lim_{s\to t^+}
+\frac{Du(\interval{\left[t,s\right[})}
+{\abs{\wt{D}u}(\interval{\left[t,s\right[})}
+\end{equation*}
+$\abs{\wt{D}u}$-almost everywhere in $\mathbf{R}$. It is well known
+(see, for instance, \cite[2.5.16]{ste:sint}) that every one-dimensional
+function of bounded variation $w$ has a unique left continuous
+representative, i.e., a function $\hat w$ such that $\hat w=w$ almost
+everywhere and $\lim_{s\to t^-}\hat w(s)=\hat w(t)$ for every $t\in
+\mathbf{R}$. These conditions imply
+\begin{equation}
+\hat u(t)=Du(\interval{\left]-\infty,t\right[}),
+\qquad \hat v(t)=Dv(\interval{\left]-\infty,t\right[})\qquad
+\forall t\in\mathbf{R}
+\end{equation}
+and
+\begin{equation}\label{alimo}
+\hat v(t)=f(\hat u(t))\qquad\forall t\in\mathbf{R}.\end{equation}
+Let $t\in\mathbf{R}$ be such that
+$\abs{\wt{D}u}(\interval{\left[t,s\right[})>0$ for every $s>t$ and
+assume that the limits in \eqref{joe} exist. By \eqref{j:mark} and
+\eqref{far-d} we get
+\begin{equation*}\begin{split}
+\frac{\hat v(s)-\hat
+v(t)}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}&=\frac {f(\hat
+u(s))-f(\hat u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\\
+&=\frac{f(\hat u(s))-f(\hat
+u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t)\abs{\wt{D}u
+}(\interval{\left[t,s\right[}))}%
+{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\\
+&+\frac
+{f(\hat u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t)\abs{\wt{D}
+u}(\interval{\left[t,s\right[}))-f(\hat
+u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}
+\end{split}\end{equation*}
+for every $s>t$. Using the Lipschitz condition on $f$ we find
+{\setlength{\multlinegap}{0pt}
+\begin{multline*}
+\left\lvert\frac{\hat v(s)-\hat
+v(t)}{\abs{\wt{D}u}(\interval{\left[t,s\right[})} -\frac{f(\hat
+u(t)+\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t)
+\abs{\wt{D}u}(\interval{\left[t,s\right[}))-f(\hat
+u(t))}{\abs{\wt{D}u}(\interval{\left[t,s\right[})}\right\rvert\\
+\le K\left\lvert
+\frac{\hat u(s)-\hat u(t)}
+ {\abs{\wt{D}u}(\interval{\left[t,s\right[})}
+-\frac{\wt{D}u}{\abs{
+\wt{D}u}}(t)\right\rvert.\end{multline*}
+}% end of group with \multlinegap=0pt
+By \eqref{e:bomb}, the function $s\to
+\abs{\wt{D}u}(\interval{\left[t,s\right[})$ is continuous and
+converges to 0 as $s\downarrow t$. Therefore Remark~\ref{r:omb} and the
+previous inequality imply
+\[\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{h\to 0^+}
+\frac{f(\hat u(t)+h\dfrac{\wt{D}u}{\abs{\wt{D}u}}
+(t))-f(\hat u(t))}h\quad\abs{\wt{D}u}\text{-a.e. in }\mathbf{R}.\]
+By \eqref{joe}, $\hat u(x)=\tilde u(x)$ for every
+$x\in\mathbf{R}\backslash S_u$; moreover, applying the same argument to
+the functions $u'(t)=u(-t)$, $v'(t)=f(u'(t))=v(-t)$, we get
+\[\frac{\wt{D}v}{\abs{\wt{D}u}}(t)=\lim_{h\to 0}
+\frac{f(\tilde u(t)
++h\dfrac{\wt{D}u}{\abs{\wt{D}u}}(t))-f(\tilde u(t))}{h}
+\qquad\abs{\wt{D}u}\text{-a.e. in }\mathbf{R}\]
+and our statement is proved.
+
+\subsection*{Step 2}
+
+Let us consider now the general case $n>1$. Let $\nu\in \mathbf{R}^n$ be
+such that $\abs{\nu}=1$, and let $\pi_\nu=\{y\in\mathbf{R}^n: \langle
+y,\nu\rangle =0\}$. In the following, we shall identify $\mathbf{R}^n$
+with $\pi_\nu\times\mathbf{R}$, and we shall denote by $y$ the variable
+ranging in $\pi_\nu$ and by $t$ the variable ranging in $\mathbf{R}$. By
+the just proven one-dimensional result, and by \thmref{thm-main}, we get
+\[\lim_{h\to 0}\frac{f(\tilde u(y+t\nu)+h\dfrac{\wt{D}u_y}{\abs{
+\wt{D}u_y}}(t))-f(\tilde u(y+t\nu))}h=\frac{\wt{D}v_y}{\abs{
+\wt{D}u_y}}(t)\qquad\abs{\wt{D}u_y}\text{-a.e. in }\mathbf{R}\]
+for $\mathcal{H}_{n-1}$-almost every $y\in \pi_\nu$. We claim that
+\begin{equation}
+\frac{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle
+}}(y+t\nu)=\frac{\wt{D}u_y}
+{\abs{\wt{D}u_y}}(t)\qquad\abs{\wt{D}u_y}\text{-a.e. in }\mathbf{R}
+\end{equation}
+for $\mathcal{H}_{n-1}$-almost every $y\in\pi_\nu$. In fact, by
+\eqref{sum-ali} and \eqref{delta-l} we get
+\begin{multline*}
+\int_{\pi_\nu}\frac{\wt{D}u_y}{\abs{\wt{D}u_y}}\cdot\abs{\wt{D}u_y
+}\,d\mathcal{H}_{n-1}(y)=\int_{\pi_\nu}\wt{D}u_y\,d\mathcal{H}_{n-1}(y)\\
+=\langle \wt{D}u,\nu\rangle =\frac
+{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}}\cdot
+\abs{\langle \wt{D}u,\nu\rangle }=\int_{\pi_\nu}\frac{
+\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}
+(y+\cdot \nu)\cdot\abs{\wt{D}u_y}\,d\mathcal{H}_{n-1}(y)
+\end{multline*}
+and \eqref{far-d} follows from \eqref{sum-Di}. By the same argument it
+is possible to prove that
+\begin{equation}
+\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle
+}}(y+t\nu)=\frac{\wt{D}v_y}{\abs{\wt{D}u_y}}(t)\qquad\abs{
+\wt{D}u_y}\text{-a.e. in }\mathbf{R}\end{equation}
+for $\mathcal{H}_{n-1}$-almost every $y\in \pi_\nu$. By \eqref{far-d}
+and \eqref{E_SXgYy} we get
+\[
+\lim_{h\to 0}\frac{f(\tilde u(y+t\nu)+h\dfrac{\langle \wt{D}
+u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(y+t\nu))-f(\tilde
+u(y+t\nu))}{h}
+=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle
+\wt{D}u,\nu\rangle }}(y+t\nu)\]
+for $\mathcal{H}_{n-1}$-almost every $y\in\pi_\nu$, and using again
+\eqref{detK1}, \eqref{detK2} we get
+\[
+\lim_{h\to 0}\frac{f(\tilde u(x)+h\dfrac{\langle
+\wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(x))-f(\tilde
+u(x))}{h}=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu
+\rangle }}(x)
+\]
+$\abs{\langle \wt{D}u,\nu\rangle}$-a.e. in $\mathbf{R}^n$.
+
+Since the function $\abs{\langle \wt{D}u,\nu\rangle }/\abs{\wt{D}u}$
+is strictly positive $\abs{\langle \wt{D}u,\nu\rangle }$-almost everywhere,
+we obtain also
+\begin{multline*}
+\lim_{h\to 0}\frac{f(\tilde u(x)+h\dfrac{\abs{\langle
+\wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}(x)\dfrac{\langle \wt{D}
+u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle }}(x))-f(\tilde u(x))}{h}\\
+=\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}(x)\frac
+{\langle \wt{D}v,\nu\rangle }{\abs{\langle
+\wt{D}u,\nu\rangle }}(x)
+\end{multline*}
+$\abs{\langle \wt{D}u,\nu\rangle }$-almost everywhere in $\mathbf{R}^n$.
+
+Finally, since
+\begin{align*}
+&\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}
+\frac{\langle \wt{D}u,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}}
+=\frac{\langle \wt{D}u,\nu\rangle }{\abs{\wt{D}u}}
+=\left\langle \frac{\wt{D}u}{\abs{\wt{D}u}},\nu\right\rangle
+ \qquad\abs{\wt{D}u}\text{-a.e. in }\mathbf{R}^n\\
+&\frac{\abs{\langle \wt{D}u,\nu\rangle }}{\abs{\wt{D}u}}
+\frac{\langle \wt{D}v,\nu\rangle }{\abs{\langle \wt{D}u,\nu\rangle}}
+=\frac{\langle \wt{D}v,\nu\rangle }{\abs{\wt{D}u}}
+=\left\langle \frac{\wt{D}v}{\abs{\wt{D}u}},\nu\right\rangle
+ \qquad\abs{\wt{D}u}\text{-a.e. in }\mathbf{R}^n
+\end{align*}
+and since both sides of \eqref{alimo}
+are zero $\abs{\wt{D}u}$-almost everywhere
+on $\abs{\langle \wt{D}u,\nu\rangle }$-negligible sets, we conclude that
+\[
+\lim_{h\to 0}\frac{f\left(
+\tilde u(x)+h\left\langle \dfrac{\wt{D}
+u}{\abs{\wt{D}u}}(x),\nu\right\rangle \right)-f(\tilde u(x))}h
+=\left\langle \frac{\wt{D}v}{\abs{\wt{D}u}}(x),\nu\right\rangle,
+\]
+$\abs{\wt{D}u}$-a.e. in $\mathbf{R}^n$.
+Since $\nu$ is arbitrary, by Remarks \ref{r:dif} and~\ref{r:dif0}
+the restriction of $f$ to
+the affine space $T^u_x$ is differentiable at $\tilde u(x)$ for $\abs{\wt{D}
+u}$-almost every $x\in \mathbf{R}^n$ and \eqref{quts} holds.\qed
+
+It follows from \eqref{sum-Di}, \eqref{detK1}, and \eqref{detK2} that
+\begin{equation}\label{Dt}
+D(t_1,\dots,t_n)=\sum_{I\in\mathbf{n}}(-1)^{\abs{I}-1}\abs{I}
+\prod_{i\in I}t_i\prod_{j\in I}(D_j+\lambda_jt_j)\det\mathbf{A}^{(\lambda)}
+(\overline I|\overline I).
+\end{equation}
+Let $t_i=\hat x_i$, $i=1,\dots,n$. Lemma 1 leads to
+\begin{equation}\label{Dx}
+D(\hat x_1,\dots,\hat x_n)=\prod_{i\in\mathbf{n}}\hat x_i
+\sum_{I\in\mathbf{n}}(-1)^{\abs{I}-1}\abs{I}\per \mathbf{A}
+^{(\lambda)}(I|I)\det\mathbf{A}^{(\lambda)}(\overline I|\overline I).
+\end{equation}
+By \eqref{H-cycles}, \eqref{sum-Di}, and \eqref{Dx},
+we have the following result:
+\begin{thm}\label{thm-H-param}
+\begin{equation}\label{H-param}
+H_c=\frac{1}{2n}\sum^n_{l =1}l (-1)^{l -1}A_{l}
+^{(\lambda)},
+\end{equation}
+where
+\begin{equation}\label{A-l-lambda}
+A^{(\lambda)}_l =\sum_{I_l \subseteq\mathbf{n}}\per \mathbf{A}
+^{(\lambda)}(I_l |I_l )\det\mathbf{A}^{(\lambda)}
+(\overline I_{l}|\overline I_l ),\abs{I_{l}}=l .
+\end{equation}
+\end{thm}
+
+It is worth noting that $A_l ^{(\lambda)}$ of \eqref{A-l-lambda} is
+similar to the coefficients $b_l $ of the characteristic polynomial of
+\eqref{bl-sum}. It is well known in graph theory that the coefficients
+$b_l $ can be expressed as a sum over certain subgraphs. It is
+interesting to see whether $A_l $, $\lambda=0$, structural properties
+of a graph.
+
+We may call \eqref{H-param} a parametric representation of $H_c$. In
+computation, the parameter $\lambda_i$ plays very important roles. The
+choice of the parameter usually depends on the properties of the given
+graph. For a complete graph $K_n$, let $\lambda_i=1$, $i=1,\dots,n$.
+It follows from \eqref{A-l-lambda} that
+\begin{equation}\label{compl-gr}
+A^{(1)}_l =\begin{cases} n!,&\text{if }l =1\\
+0,&\text{otherwise}.\end{cases}
+\end{equation}
+By \eqref{H-param}
+\begin{equation}
+H_c=\frac 12(n-1)!.
+\end{equation}
+For a complete bipartite graph $K_{n_1n_2}$, let $\lambda_i=0$, $i=1,\dots,n$.
+By \eqref{A-l-lambda},
+\begin{equation}
+A_l =
+\begin{cases} -n_1!n_2!\delta_{n_1n_2},&\text{if }l =2\\
+0,&\text{otherwise }.\end{cases}
+\label{compl-bip-gr}
+\end{equation}
+Theorem ~\ref{thm-H-param}
+leads to
+\begin{equation}
+H_c=\frac1{n_1+n_2}n_1!n_2!\delta_{n_1n_2}.
+\end{equation}
+
+Now, we consider an asymmetrical approach. Theorem \ref{thm-main} leads to
+\begin{multline}
+\det\mathbf{K}(t=1,t_1,\dots,t_n;l |l )\\
+=\sum_{I\subseteq\mathbf{n}-\{l \}}
+(-1)^{\abs{I}}\prod_{i\in I}t_i\prod_{j\in I}
+(D_j+\lambda_jt_j)\det\mathbf{A}^{(\lambda)}
+(\overline I\cup\{l \}|\overline I\cup\{l \}).
+\end{multline}
+
+By \eqref{H-cycles} and \eqref{sum-ali} we have the following asymmetrical
+result:
+\begin{thm}\label{thm-asym}
+\begin{equation}
+H_c=\frac12\sum_{I\subseteq\mathbf{n}-\{l \}}
+(-1)^{\abs{I}}\per\mathbf{A}^{(\lambda)}(I|I)\det
+\mathbf{A}^{(\lambda)}
+(\overline I\cup\{l \}|\overline I\cup\{l \})
+\end{equation}
+which reduces to Goulden--Jackson's formula when $\lambda_i=0,i=1,\dots,n$
+\cite{mami:matrixth}.
+\end{thm}
+
+\section{Various font features of the \pkg{amsmath} package}
+\label{s:font}
+\subsection{Bold versions of special symbols}
+
+In the \pkg{amsmath} package \cn{boldsymbol} is used for getting
+individual bold math symbols and bold Greek letters---everything in
+math except for letters of the Latin alphabet,
+where you'd use \cn{mathbf}. For example,
+\begin{verbatim}
+A_\infty + \pi A_0 \sim
+\mathbf{A}_{\boldsymbol{\infty}} \boldsymbol{+}
+\boldsymbol{\pi} \mathbf{A}_{\boldsymbol{0}}
+\end{verbatim}
+looks like this:
+\[A_\infty + \pi A_0 \sim \mathbf{A}_{\boldsymbol{\infty}}
+\boldsymbol{+} \boldsymbol{\pi} \mathbf{A}_{\boldsymbol{0}}\]
+
+\subsection{``Poor man's bold''}
+If a bold version of a particular symbol doesn't exist in the
+available fonts,
+then \cn{boldsymbol} can't be used to make that symbol bold.
+At the present time, this means that
+\cn{boldsymbol} can't be used with symbols from
+the \fn{msam} and \fn{msbm} fonts, among others.
+In some cases, poor man's bold (\cn{pmb}) can be used instead
+of \cn{boldsymbol}:
+% Can't show example from msam or msbm because this document is
+% supposed to be TeXable even if the user doesn't have
+% AMSFonts. MJD 5-JUL-1990
+\[\frac{\partial x}{\partial y}
+\pmb{\bigg\vert}
+\frac{\partial y}{\partial z}\]
+\begin{verbatim}
+\[\frac{\partial x}{\partial y}
+\pmb{\bigg\vert}
+\frac{\partial y}{\partial z}\]
+\end{verbatim}
+So-called ``large operator'' symbols such as $\sum$ and $\prod$
+require an additional command, \cn{mathop},
+to produce proper spacing and limits when \cn{pmb} is used.
+For further details see \textit{The \TeX book}.
+\[\sum_{\substack{i<B\\\text{$i$ odd}}}
+\prod_\kappa \kappa F(r_i)\qquad
+\mathop{\pmb{\sum}}_{\substack{i<B\\\text{$i$ odd}}}
+\mathop{\pmb{\prod}}_\kappa \kappa(r_i)
+\]
+\begin{verbatim}
+\[\sum_{\substack{i<B\\\text{$i$ odd}}}
+\prod_\kappa \kappa F(r_i)\qquad
+\mathop{\pmb{\sum}}_{\substack{i<B\\\text{$i$ odd}}}
+\mathop{\pmb{\prod}}_\kappa \kappa(r_i)
+\]
+\end{verbatim}
+
+\section{Compound symbols and other features}
+\label{s:comp}
+\subsection{Multiple integral signs}
+
+\cn{iint}, \cn{iiint}, and \cn{iiiint} give multiple integral signs
+with the spacing between them nicely adjusted, in both text and
+display style. \cn{idotsint} gives two integral signs with dots
+between them.
+\begin{gather}
+\iint\limits_A f(x,y)\,dx\,dy\qquad\iiint\limits_A
+f(x,y,z)\,dx\,dy\,dz\\
+\iiiint\limits_A
+f(w,x,y,z)\,dw\,dx\,dy\,dz\qquad\idotsint\limits_A f(x_1,\dots,x_k)
+\end{gather}
+
+\subsection{Over and under arrows}
+
+Some extra over and under arrow operations are provided in
+the \pkg{amsmath} package. (Basic \LaTeX\ provides
+\cn{overrightarrow} and \cn{overleftarrow}).
+\begin{align*}
+\overrightarrow{\psi_\delta(t) E_t h}&
+=\underrightarrow{\psi_\delta(t) E_t h}\\
+\overleftarrow{\psi_\delta(t) E_t h}&
+=\underleftarrow{\psi_\delta(t) E_t h}\\
+\overleftrightarrow{\psi_\delta(t) E_t h}&
+=\underleftrightarrow{\psi_\delta(t) E_t h}
+\end{align*}
+\begin{verbatim}
+\begin{align*}
+\overrightarrow{\psi_\delta(t) E_t h}&
+=\underrightarrow{\psi_\delta(t) E_t h}\\
+\overleftarrow{\psi_\delta(t) E_t h}&
+=\underleftarrow{\psi_\delta(t) E_t h}\\
+\overleftrightarrow{\psi_\delta(t) E_t h}&
+=\underleftrightarrow{\psi_\delta(t) E_t h}
+\end{align*}
+\end{verbatim}
+These all scale properly in subscript sizes:
+\[\int_{\overrightarrow{AB}} ax\,dx\]
+\begin{verbatim}
+\[\int_{\overrightarrow{AB}} ax\,dx\]
+\end{verbatim}
+
+\subsection{Dots}
+
+Normally you need only type \cn{dots} for ellipsis dots in a
+math formula. The main exception is when the dots
+fall at the end of the formula; then you need to
+specify one of \cn{dotsc} (series dots, after a comma),
+\cn{dotsb} (binary dots, for binary relations or operators),
+\cn{dotsm} (multiplication dots), or \cn{dotsi} (dots after
+an integral). For example, the input
+\begin{verbatim}
+Then we have the series $A_1,A_2,\dotsc$,
+the regional sum $A_1+A_2+\dotsb$,
+the orthogonal product $A_1A_2\dotsm$,
+and the infinite integral
+\[\int_{A_1}\int_{A_2}\dotsi\].
+\end{verbatim}
+produces
+\begin{quotation}
+Then we have the series $A_1,A_2,\dotsc$,
+the regional sum $A_1+A_2+\dotsb$,
+the orthogonal product $A_1A_2\dotsm$,
+and the infinite integral
+\[\int_{A_1}\int_{A_2}\dotsi\]
+\end{quotation}
+
+\subsection{Accents in math}
+
+Double accents:
+\[\Hat{\Hat{H}}\quad\Check{\Check{C}}\quad
+\Tilde{\Tilde{T}}\quad\Acute{\Acute{A}}\quad
+\Grave{\Grave{G}}\quad\Dot{\Dot{D}}\quad
+\Ddot{\Ddot{D}}\quad\Breve{\Breve{B}}\quad
+\Bar{\Bar{B}}\quad\Vec{\Vec{V}}\]
+\begin{verbatim}
+\[\Hat{\Hat{H}}\quad\Check{\Check{C}}\quad
+\Tilde{\Tilde{T}}\quad\Acute{\Acute{A}}\quad
+\Grave{\Grave{G}}\quad\Dot{\Dot{D}}\quad
+\Ddot{\Ddot{D}}\quad\Breve{\Breve{B}}\quad
+\Bar{\Bar{B}}\quad\Vec{\Vec{V}}\]
+\end{verbatim}
+This double accent operation is complicated
+and tends to slow down the processing of a \LaTeX\ file.
+
+
+\subsection{Dot accents}
+\cn{dddot} and \cn{ddddot} are available to
+produce triple and quadruple dot accents
+in addition to the \cn{dot} and \cn{ddot} accents already available
+in \LaTeX:
+\[\dddot{Q}\qquad\ddddot{R}\]
+\begin{verbatim}
+\[\dddot{Q}\qquad\ddddot{R}\]
+\end{verbatim}
+
+\subsection{Roots}
+
+In the \pkg{amsmath} package \cn{leftroot} and \cn{uproot} allow you to adjust
+the position of the root index of a radical:
+\begin{verbatim}
+\sqrt[\leftroot{-2}\uproot{2}\beta]{k}
+\end{verbatim}
+gives good positioning of the $\beta$:
+\[\sqrt[\leftroot{-2}\uproot{2}\beta]{k}\]
+
+\subsection{Boxed formulas} The command \cn{boxed} puts a box around its
+argument, like \cn{fbox} except that the contents are in math mode:
+\begin{verbatim}
+\boxed{W_t-F\subseteq V(P_i)\subseteq W_t}
+\end{verbatim}
+\[\boxed{W_t-F\subseteq V(P_i)\subseteq W_t}.\]
+
+\subsection{Extensible arrows}
+\cn{xleftarrow} and \cn{xrightarrow} produce
+arrows that extend automatically to accommodate unusually wide
+subscripts or superscripts. The text of the subscript or superscript
+are given as an optional resp.\@ mandatory argument:
+Example:
+\[0 \xleftarrow[\zeta]{\alpha} F\times\triangle[n-1]
+ \xrightarrow{\partial_0\alpha(b)} E^{\partial_0b}\]
+\begin{verbatim}
+\[0 \xleftarrow[\zeta]{\alpha} F\times\triangle[n-1]
+ \xrightarrow{\partial_0\alpha(b)} E^{\partial_0b}\]
+\end{verbatim}
+
+\subsection{\cn{overset}, \cn{underset}, and \cn{sideset}}
+Examples:
+\[\overset{*}{X}\qquad\underset{*}{X}\qquad
+\overset{a}{\underset{b}{X}}\]
+\begin{verbatim}
+\[\overset{*}{X}\qquad\underset{*}{X}\qquad
+\overset{a}{\underset{b}{X}}\]
+\end{verbatim}
+
+The command \cn{sideset} is for a rather special
+purpose: putting symbols at the subscript and superscript
+corners of a large operator symbol such as $\sum$ or $\prod$,
+without affecting the placement of limits.
+Examples:
+\[\sideset{_*^*}{_*^*}\prod_k\qquad
+\sideset{}{'}\sum_{0\le i\le m} E_i\beta x
+\]
+\begin{verbatim}
+\[\sideset{_*^*}{_*^*}\prod_k\qquad
+\sideset{}{'}\sum_{0\le i\le m} E_i\beta x
+\]
+\end{verbatim}
+
+\subsection{The \cn{text} command}
+The main use of the command \cn{text} is for words or phrases in a
+display:
+\[\mathbf{y}=\mathbf{y}'\quad\text{if and only if}\quad
+y'_k=\delta_k y_{\tau(k)}\]
+\begin{verbatim}
+\[\mathbf{y}=\mathbf{y}'\quad\text{if and only if}\quad
+y'_k=\delta_k y_{\tau(k)}\]
+\end{verbatim}
+
+\subsection{Operator names}
+The more common math functions such as $\log$, $\sin$, and $\lim$
+have predefined control sequences: \verb=\log=, \verb=\sin=,
+\verb=\lim=.
+The \pkg{amsmath} package provides \cn{DeclareMathOperator} and
+\cn{DeclareMathOperator*}
+for producing new function names that will have the
+same typographical treatment.
+Examples:
+\[\norm{f}_\infty=
+\esssup_{x\in R^n}\abs{f(x)}\]
+\begin{verbatim}
+\[\norm{f}_\infty=
+\esssup_{x\in R^n}\abs{f(x)}\]
+\end{verbatim}
+\[\meas_1\{u\in R_+^1\colon f^*(u)>\alpha\}
+=\meas_n\{x\in R^n\colon \abs{f(x)}\geq\alpha\}
+\quad \forall\alpha>0.\]
+\begin{verbatim}
+\[\meas_1\{u\in R_+^1\colon f^*(u)>\alpha\}
+=\meas_n\{x\in R^n\colon \abs{f(x)}\geq\alpha\}
+\quad \forall\alpha>0.\]
+\end{verbatim}
+\cn{esssup} and \cn{meas} would be defined in the document preamble as
+\begin{verbatim}
+\DeclareMathOperator*{\esssup}{ess\,sup}
+\DeclareMathOperator{\meas}{meas}
+\end{verbatim}
+
+The following special operator names are predefined in the \pkg{amsmath}
+package: \cn{varlimsup}, \cn{varliminf}, \cn{varinjlim}, and
+\cn{varprojlim}. Here's what they look like in use:
+\begin{align}
+&\varlimsup_{n\rightarrow\infty}
+ \mathcal{Q}(u_n,u_n-u^{\#})\le0\\
+&\varliminf_{n\rightarrow\infty}
+ \left\lvert a_{n+1}\right\rvert/\left\lvert a_n\right\rvert=0\\
+&\varinjlim (m_i^\lambda\cdot)^*\le0\\
+&\varprojlim_{p\in S(A)}A_p\le0
+\end{align}
+\begin{verbatim}
+\begin{align}
+&\varlimsup_{n\rightarrow\infty}
+ \mathcal{Q}(u_n,u_n-u^{\#})\le0\\
+&\varliminf_{n\rightarrow\infty}
+ \left\lvert a_{n+1}\right\rvert/\left\lvert a_n\right\rvert=0\\
+&\varinjlim (m_i^\lambda\cdot)^*\le0\\
+&\varprojlim_{p\in S(A)}A_p\le0
+\end{align}
+\end{verbatim}
+
+\subsection{\cn{mod} and its relatives}
+The commands \cn{mod} and \cn{pod} are variants of
+\cn{pmod} preferred by some authors; \cn{mod} omits the parentheses,
+whereas \cn{pod} omits the `mod' and retains the parentheses.
+Examples:
+\begin{align}
+x&\equiv y+1\pmod{m^2}\\
+x&\equiv y+1\mod{m^2}\\
+x&\equiv y+1\pod{m^2}
+\end{align}
+\begin{verbatim}
+\begin{align}
+x&\equiv y+1\pmod{m^2}\\
+x&\equiv y+1\mod{m^2}\\
+x&\equiv y+1\pod{m^2}
+\end{align}
+\end{verbatim}
+
+\subsection{Fractions and related constructions}
+\label{fracs}
+
+The usual notation for binomials is similar to the fraction concept,
+so it has a similar command \cn{binom} with two arguments. Example:
+\begin{equation}
+\begin{split}
+\sum_{\gamma\in\Gamma_C} I_\gamma&
+=2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}\\
+&\quad+\dots+(-1)^l\binom{k}{l}2^{k-l}
++\dots+(-1)^k\\
+&=(2-1)^k=1
+\end{split}
+\end{equation}
+\begin{verbatim}
+\begin{equation}
+\begin{split}
+[\sum_{\gamma\in\Gamma_C} I_\gamma&
+=2^k-\binom{k}{1}2^{k-1}+\binom{k}{2}2^{k-2}\\
+&\quad+\dots+(-1)^l\binom{k}{l}2^{k-l}
++\dots+(-1)^k\\
+&=(2-1)^k=1
+\end{split}
+\end{equation}
+\end{verbatim}
+There are also abbreviations
+\begin{verbatim}
+\dfrac \dbinom
+\tfrac \tbinom
+\end{verbatim}
+for the commonly needed constructions
+\begin{verbatim}
+{\displaystyle\frac ... } {\displaystyle\binom ... }
+{\textstyle\frac ... } {\textstyle\binom ... }
+\end{verbatim}
+
+The generalized fraction command \cn{genfrac} provides full access to
+the six \TeX{} fraction primitives:
+\begin{align}
+\text{\cn{over}: }&\genfrac{}{}{}{}{n+1}{2}&
+\text{\cn{overwithdelims}: }&
+ \genfrac{\langle}{\rangle}{}{}{n+1}{2}\\
+\text{\cn{atop}: }&\genfrac{}{}{0pt}{}{n+1}{2}&
+\text{\cn{atopwithdelims}: }&
+ \genfrac{(}{)}{0pt}{}{n+1}{2}\\
+\text{\cn{above}: }&\genfrac{}{}{1pt}{}{n+1}{2}&
+\text{\cn{abovewithdelims}: }&
+ \genfrac{[}{]}{1pt}{}{n+1}{2}
+\end{align}
+\begin{verbatim}
+\text{\cn{over}: }&\genfrac{}{}{}{}{n+1}{2}&
+\text{\cn{overwithdelims}: }&
+ \genfrac{\langle}{\rangle}{}{}{n+1}{2}\\
+\text{\cn{atop}: }&\genfrac{}{}{0pt}{}{n+1}{2}&
+\text{\cn{atopwithdelims}: }&
+ \genfrac{(}{)}{0pt}{}{n+1}{2}\\
+\text{\cn{above}: }&\genfrac{}{}{1pt}{}{n+1}{2}&
+\text{\cn{abovewithdelims}: }&
+ \genfrac{[}{]}{1pt}{}{n+1}{2}
+\end{verbatim}
+
+\subsection{Continued fractions}
+The continued fraction
+\begin{equation}
+\cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+\dotsb
+}}}}}
+\end{equation}
+can be obtained by typing
+\begin{verbatim}
+\cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+
+ \cfrac{1}{\sqrt{2}+\dotsb
+}}}}}
+\end{verbatim}
+Left or right placement of any of the numerators is accomplished by using
+\cn{cfrac[l]} or \cn{cfrac[r]} instead of \cn{cfrac}.
+
+\subsection{Smash}
+
+In \pkg{amsmath} there are optional arguments \verb"t" and \verb"b" for
+the plain \TeX\ command \cn{smash}, because sometimes it is advantageous
+to be able to `smash' only the top or only the bottom of something while
+retaining the natural depth or height. In the formula
+$X_j=(1/\sqrt{\smash[b]{\lambda_j}})X_j'$ \cn{smash}\verb=[b]= has been
+used to limit the size of the radical symbol.
+\begin{verbatim}
+$X_j=(1/\sqrt{\smash[b]{\lambda_j}})X_j'$
+\end{verbatim}
+Without the use of \cn{smash}\verb=[b]= the formula would have appeared
+thus: $X_j=(1/\sqrt{\lambda_j})X_j'$, with the radical extending to
+encompass the depth of the subscript $j$.
+
+\subsection{The `cases' environment}
+`Cases' constructions like the following can be produced using
+the \env{cases} environment.
+\begin{equation}
+P_{r-j}=
+ \begin{cases}
+ 0& \text{if $r-j$ is odd},\\
+ r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}.
+ \end{cases}
+\end{equation}
+\begin{verbatim}
+\begin{equation} P_{r-j}=
+ \begin{cases}
+ 0& \text{if $r-j$ is odd},\\
+ r!\,(-1)^{(r-j)/2}& \text{if $r-j$ is even}.
+ \end{cases}
+\end{equation}
+\end{verbatim}
+Notice the use of \cn{text} and the embedded math.
+
+\subsection{Matrix}
+
+Here are samples of the matrix environments,
+\cn{matrix}, \cn{pmatrix}, \cn{bmatrix}, \cn{Bmatrix}, \cn{vmatrix}
+and \cn{Vmatrix}:
+\begin{equation}
+\begin{matrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{matrix}\quad
+\begin{pmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{pmatrix}\quad
+\begin{bmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{bmatrix}\quad
+\begin{Bmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{Bmatrix}\quad
+\begin{vmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{vmatrix}\quad
+\begin{Vmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{Vmatrix}
+\end{equation}
+%
+\begin{verbatim}
+\begin{matrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{matrix}\quad
+\begin{pmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{pmatrix}\quad
+\begin{bmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{bmatrix}\quad
+\begin{Bmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{Bmatrix}\quad
+\begin{vmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{vmatrix}\quad
+\begin{Vmatrix}
+\vartheta& \varrho\\\varphi& \varpi
+\end{Vmatrix}
+\end{verbatim}
+
+To produce a small matrix suitable for use in text, use the
+\env{smallmatrix} environment.
+\begin{verbatim}
+\begin{math}
+ \bigl( \begin{smallmatrix}
+ a&b\\ c&d
+ \end{smallmatrix} \bigr)
+\end{math}
+\end{verbatim}
+To show
+the effect of the matrix on the surrounding lines of
+a paragraph, we put it here: \begin{math}
+ \bigl( \begin{smallmatrix}
+ a&b\\ c&d
+ \end{smallmatrix} \bigr)
+\end{math}
+and follow it with enough text to ensure that there will
+be at least one full line below the matrix.
+
+\cn{hdotsfor}\verb"{"\textit{number}\verb"}" produces a row of dots in a matrix
+spanning the given number of columns:
+\[W(\Phi)= \begin{Vmatrix}
+\dfrac\varphi{(\varphi_1,\varepsilon_1)}&0&\dots&0\\
+\dfrac{\varphi k_{n2}}{(\varphi_2,\varepsilon_1)}&
+\dfrac\varphi{(\varphi_2,\varepsilon_2)}&\dots&0\\
+\hdotsfor{5}\\
+\dfrac{\varphi k_{n1}}{(\varphi_n,\varepsilon_1)}&
+\dfrac{\varphi k_{n2}}{(\varphi_n,\varepsilon_2)}&\dots&
+\dfrac{\varphi k_{n\,n-1}}{(\varphi_n,\varepsilon_{n-1})}&
+\dfrac{\varphi}{(\varphi_n,\varepsilon_n)}
+\end{Vmatrix}\]
+\begin{verbatim}
+\[W(\Phi)= \begin{Vmatrix}
+\dfrac\varphi{(\varphi_1,\varepsilon_1)}&0&\dots&0\\
+\dfrac{\varphi k_{n2}}{(\varphi_2,\varepsilon_1)}&
+\dfrac\varphi{(\varphi_2,\varepsilon_2)}&\dots&0\\
+\hdotsfor{5}\\
+\dfrac{\varphi k_{n1}}{(\varphi_n,\varepsilon_1)}&
+\dfrac{\varphi k_{n2}}{(\varphi_n,\varepsilon_2)}&\dots&
+\dfrac{\varphi k_{n\,n-1}}{(\varphi_n,\varepsilon_{n-1})}&
+\dfrac{\varphi}{(\varphi_n,\varepsilon_n)}
+\end{Vmatrix}\]
+\end{verbatim}
+The spacing of the dots can be varied through use of a square-bracket
+option, for example, \verb"\hdotsfor[1.5]{3}". The number in square brackets
+will be used as a multiplier; the normal value is 1.
+
+\subsection{The \cn{substack} command}
+
+The \cn{substack} command can be used to produce a multiline
+subscript or superscript:
+for example
+\begin{verbatim}
+\sum_{\substack{0\le i\le m\\ 0<j<n}} P(i,j)
+\end{verbatim}
+produces a two-line subscript underneath the sum:
+\begin{equation}
+\sum_{\substack{0\le i\le m\\ 0<j<n}} P(i,j)
+\end{equation}
+A slightly more generalized form is the \env{subarray} environment which
+allows you to specify that each line should be left-aligned instead of
+centered, as here:
+\begin{equation}
+\sum_{\begin{subarray}{l}
+ 0\le i\le m\\ 0<j<n
+ \end{subarray}}
+ P(i,j)
+\end{equation}
+\begin{verbatim}
+\sum_{\begin{subarray}{l}
+ 0\le i\le m\\ 0<j<n
+ \end{subarray}}
+ P(i,j)
+\end{verbatim}
+
+
+\subsection{Big-g-g delimiters}
+Here are some big delimiters, first in \cn{normalsize}:
+\[\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ \biggr)
+\]
+\begin{verbatim}
+\[\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ \biggr)
+\]
+\end{verbatim}
+and now in \cn{Large} size:
+{\Large
+\[\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ \biggr)
+\]}
+\begin{verbatim}
+{\Large
+\[\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ \biggr)
+\]}
+\end{verbatim}
+
+\newpage
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+
+%% This turns on vertical rules at the right and left margins, to
+%% better illustrate the spacing for certain multiple-line equation
+%% structures.
+\def\@makecol{\ifvoid\footins \setbox\@outputbox\box\@cclv
+ \else\setbox\@outputbox
+ \vbox{\boxmaxdepth \maxdepth
+ \unvbox\@cclv\vskip\skip\footins\footnoterule\unvbox\footins}\fi
+ \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats
+ \setbox\@outputbox\hbox{\vrule width\marginrulewidth
+ \vbox to\@colht{\boxmaxdepth\maxdepth
+ \@texttop\dimen128=\dp\@outputbox\unvbox\@outputbox
+ \vskip-\dimen128\@textbottom}%
+ \vrule width\marginrulewidth}%
+ \global\maxdepth\@maxdepth}
+\newdimen\marginrulewidth
+\setlength{\marginrulewidth}{.1pt}
+\makeatother
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\appendix
+\section{Examples of multiple-line equation structures}
+\label{s:eq}
+
+\textbf{\large Note: Starting on this page, vertical rules are
+added at the margins so that the positioning of various display elements
+with respect to the margins can be seen more clearly.}
+
+\subsection{Split}
+The \env{split} environment is not an independent environment
+but should be used inside something else such as \env{equation}
+or \env{align}.
+
+If there is not enough room for it, the equation number for a
+\env{split} will be shifted to the previous line, when equation numbers are
+on the left; the number shifts down to the next line when numbers are on
+the right.
+\begin{equation}
+\begin{split}
+f_{h,\varepsilon}(x,y)
+&=\varepsilon\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\
+&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\
+&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\
+&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon}
+ \biggl(\mathbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)}
+ \varphi(x)\,ds -\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+ L_{x,y_\varepsilon(\varepsilon s)}
+ \varphi(x)\,ds\biggr)\biggr]\\
+&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y),
+\end{split}
+\end{equation}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{equation}
+\begin{split}
+f_{h,\varepsilon}(x,y)
+&=\varepsilon\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\
+&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\
+&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\
+&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon}
+ \biggl(\mathbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)}
+ \varphi(x)\,ds -\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+ L_{x,y_\varepsilon(\varepsilon s)}
+ \varphi(x)\,ds\biggr)\biggr]\\
+&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y),
+\end{split}
+\end{equation}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+Unnumbered version:
+\begin{equation*}
+\begin{split}
+f_{h,\varepsilon}(x,y)
+&=\varepsilon\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\
+&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\
+&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\
+&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon}
+ \biggl(\mathbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)}
+ \varphi(x)\,ds -\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+ L_{x,y_\varepsilon(\varepsilon s)}
+ \varphi(x)\,ds\biggr)\biggr]\\
+&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y),
+\end{split}
+\end{equation*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{equation*}
+\begin{split}
+f_{h,\varepsilon}(x,y)
+&=\varepsilon\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+L_{x,y_\varepsilon(\varepsilon u)}\varphi(x)\,du\\
+&= h\int L_{x,z}\varphi(x)\rho_x(dz)\\
+&\quad+h\biggl[\frac{1}{t_\varepsilon}\biggl(\mathbf{E}_{y}
+ \int_0^{t_\varepsilon}L_{x,y^x(s)}\varphi(x)\,ds
+ -t_\varepsilon\int L_{x,z}\varphi(x)\rho_x(dz)\biggr)\\
+&\phantom{{=}+h\biggl[}+\frac{1}{t_\varepsilon}
+ \biggl(\mathbf{E}_{y}\int_0^{t_\varepsilon}L_{x,y^x(s)}
+ \varphi(x)\,ds -\mathbf{E}_{x,y}\int_0^{t_\varepsilon}
+ L_{x,y_\varepsilon(\varepsilon s)}
+ \varphi(x)\,ds\biggr)\biggr]\\
+&=h\wh{L}_x\varphi(x)+h\theta_\varepsilon(x,y),
+\end{split}
+\end{equation*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+If the option \env{centertags} is included in the options
+list of the \pkg{amsmath} package,
+the equation numbers for \env{split} environments will be
+centered vertically on the height
+of the \env{split}:
+{\makeatletter\ctagsplit@true
+\begin{equation}
+\begin{split}
+ \abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)-\int_{\gamma(t)}^a
+ \frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\
+&\le C_6\left\lvert \left\lvert f\int_\Omega\left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}
+\end{equation}}%
+Some text after to test the below-display spacing.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+Use of \env{split} within \env{align}:
+{\delimiterfactor750
+\begin{align}
+\begin{split}\abs{I_1}
+ &=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\
+&\le C_3\left[\int_\Omega\left(\int_{a}^x
+ g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\
+&\quad\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k}
+ \left(\int_{a}^x cu_t\,d\xi\right)^2\right\}
+ c\Omega\right]^{1/2}\\
+&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\label{eq:A}\\
+\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)
+ -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\
+&\le C_6\left\lvert \left\lvert f\int_\Omega
+ \left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}
+\end{align}}%
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{align}
+\begin{split}\abs{I_1}
+ &=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\
+&\le C_3\left[\int_\Omega\left(\int_{a}^x
+ g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\
+&\quad\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k}
+ \left(\int_{a}^x cu_t\,d\xi\right)^2\right\}
+ c\Omega\right]^{1/2}\\
+&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\label{eq:A}\\
+\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)
+ -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\
+&\le C_6\left\lvert \left\lvert f\int_\Omega
+ \left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}
+\end{align}
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%
+
+\newpage
+Unnumbered \env{align}, with a number on the second \env{split}:
+\begin{align*}
+\begin{split}\abs{I_1}&=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\
+ &\le C_3\left[\int_\Omega\left(\int_{a}^x
+ g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\
+&\phantom{=}\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k}
+ \left(\int_{a}^x cu_t\,d\xi\right)^2\right\}
+ c\Omega\right]^{1/2}\\
+&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\\
+\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)
+ -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\
+&\le C_6\left\lvert \left\lvert f\int_\Omega
+ \left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\tag{\theequation$'$}
+\end{align*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{align*}
+\begin{split}\abs{I_1}&=\left\lvert \int_\Omega gRu\,d\Omega\right\rvert\\
+ &\le C_3\left[\int_\Omega\left(\int_{a}^x
+ g(\xi,t)\,d\xi\right)^2d\Omega\right]^{1/2}\\
+&\phantom{=}\times \left[\int_\Omega\left\{u^2_x+\frac{1}{k}
+ \left(\int_{a}^x cu_t\,d\xi\right)^2\right\}
+ c\Omega\right]^{1/2}\\
+&\le C_4\left\lvert \left\lvert f\left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\\
+\begin{split}\abs{I_2}&=\left\lvert \int_{0}^T \psi(t)\left\{u(a,t)
+ -\int_{\gamma(t)}^a\frac{d\theta}{k(\theta,t)}
+ \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi\right\}dt\right\rvert\\
+&\le C_6\left\lvert \left\lvert f\int_\Omega
+ \left\lvert \wt{S}^{-1,0}_{a,-}
+ W_2(\Omega,\Gamma_l)\right\rvert\right\rvert
+ \left\lvert \abs{u}\overset{\circ}\to W_2^{\wt{A}}
+ (\Omega;\Gamma_r,T)\right\rvert\right\rvert.
+\end{split}\tag{\theequation$'$}
+\end{align*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\subsection{Multline}
+Numbered version:
+\begin{multline}\label{eq:E}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline}
+To test the use of \verb=\label= and
+\verb=\ref=, we refer to the number of this
+equation here: (\ref{eq:E}).
+
+\begin{verbatim}
+\begin{multline}\label{eq:E}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Unnumbered version:
+\begin{multline*}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{multline*}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\iffalse % bugfix needed, error message "Multiple \tag"
+ % [mjd,24-Jan-1995]
+\newpage
+And now an ``unnumbered'' version numbered with a literal tag:
+\begin{multline*}\tag*{[a]}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{multline*}\tag*{[a]}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The same display with \verb=\multlinegap= set to zero.
+Notice that the space on the left in
+the first line does not change, because of the equation number, while
+the second line is pushed over to the right margin.
+{\setlength{\multlinegap}{0pt}
+\begin{multline*}\tag*{[a]}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}}%
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+{\setlength{\multlinegap}{0pt}
+\begin{multline*}\tag*{[a]}
+\int_a^b\biggl\{\int_a^b[f(x)^2g(y)^2+f(y)^2g(x)^2]
+ -2f(x)g(x)f(y)g(y)\,dx\biggr\}\,dy \\
+ =\int_a^b\biggl\{g(y)^2\int_a^bf^2+f(y)^2
+ \int_a^b g^2-2f(y)g(y)\int_a^b fg\biggr\}\,dy
+\end{multline*}}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\fi % matches \iffalse above [mjd,24-Jan-1995]
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\subsection{Gather}
+Numbered version with \verb;\notag; on the second line:
+\begin{gather}
+D(a,r)\equiv\{z\in\mathbf{C}\colon \abs{z-a}<r\},\\
+\seg(a,r)\equiv\{z\in\mathbf{C}\colon
+\Im z= \Im a,\ \abs{z-a}<r\},\notag\\
+c(e,\theta,r)\equiv\{(x,y)\in\mathbf{C}
+\colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\
+C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r).
+\end{gather}
+\begin{verbatim}
+\begin{gather}
+D(a,r)\equiv\{z\in\mathbf{C}\colon \abs{z-a}<r\},\\
+\seg(a,r)\equiv\{z\in\mathbf{C}\colon
+\Im z= \Im a,\ \abs{z-a}<r\},\notag\\
+c(e,\theta,r)\equiv\{(x,y)\in\mathbf{C}
+\colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\
+C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r).
+\end{gather}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Unnumbered version.
+\begin{gather*}
+D(a,r)\equiv\{z\in\mathbf{C}\colon \abs{z-a}<r\},\\
+\seg (a,r)\equiv\{z\in\mathbf{C}\colon
+\Im z= \Im a,\ \abs{z-a}<r\},\\
+c(e,\theta,r)\equiv\{(x,y)\in\mathbf{C}
+ \colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\
+C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r).
+\end{gather*}
+Some text after to test the below-display spacing.
+\begin{verbatim}
+\begin{gather*}
+D(a,r)\equiv\{z\in\mathbf{C}\colon \abs{z-a}<r\},\\
+\seg (a,r)\equiv\{z\in\mathbf{C}\colon
+\Im z= \Im a,\ \abs{z-a}<r\},\\
+c(e,\theta,r)\equiv\{(x,y)\in\mathbf{C}
+ \colon \abs{x-e}<y\tan\theta,\ 0<y<r\},\\
+C(E,\theta,r)\equiv\bigcup_{e\in E}c(e,\theta,r).
+\end{gather*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\subsection{Align}
+Numbered version:
+\begin{align}
+\gamma_x(t)&=(\cos tu+\sin tx,v),\\
+\gamma_y(t)&=(u,\cos tv+\sin ty),\\
+\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv,
+ -\frac\beta\alpha\sin tu+\cos tv\right).
+\end{align}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{align}
+\gamma_x(t)&=(\cos tu+\sin tx,v),\\
+\gamma_y(t)&=(u,\cos tv+\sin ty),\\
+\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv,
+ -\frac\beta\alpha\sin tu+\cos tv\right).
+\end{align}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Unnumbered version:
+\begin{align*}
+\gamma_x(t)&=(\cos tu+\sin tx,v),\\
+\gamma_y(t)&=(u,\cos tv+\sin ty),\\
+\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv,
+ -\frac\beta\alpha\sin tu+\cos tv\right).
+\end{align*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{align*}
+\gamma_x(t)&=(\cos tu+\sin tx,v),\\
+\gamma_y(t)&=(u,\cos tv+\sin ty),\\
+\gamma_z(t)&=\left(\cos tu+\frac\alpha\beta\sin tv,
+ -\frac\beta\alpha\sin tu+\cos tv\right).
+\end{align*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+A variation:
+\begin{align}
+x& =y && \text {by (\ref{eq:C})}\\
+x'& = y' && \text {by (\ref{eq:D})}\\
+x+x' & = y+y' && \text {by Axiom 1.}
+\end{align}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{align}
+x& =y && \text {by (\ref{eq:C})}\\
+x'& = y' && \text {by (\ref{eq:D})}\\
+x+x' & = y+y' && \text {by Axiom 1.}
+\end{align}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\subsection{Align and split within gather}
+When using the \env{align} environment within the \env{gather}
+environment, one or the other, or both, should be unnumbered (using the
+\verb"*" form); numbering both the outer and inner environment would
+cause a conflict.
+
+Automatically numbered \env{gather} with \env{split} and \env{align*}:
+\begin{gather}
+\begin{split} \varphi(x,z)
+&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\
+&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n
+\end{split}\\[6pt]
+\begin{align*}
+\zeta^0 &=(\xi^0)^2,\\
+\zeta^1 &=\xi^0\xi^1,\\
+\zeta^2 &=(\xi^1)^2,
+\end{align*}
+\end{gather}
+Here the \env{split} environment gets a number from the outer
+\env{gather} environment; numbers for individual lines of the
+\env{align*} are suppressed because of the star.
+
+\begin{verbatim}
+\begin{gather}
+\begin{split} \varphi(x,z)
+&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\
+&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n
+\end{split}\\[6pt]
+\begin{align*}
+\zeta^0 &=(\xi^0)^2,\\
+\zeta^1 &=\xi^0\xi^1,\\
+\zeta^2 &=(\xi^1)^2,
+\end{align*}
+\end{gather}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \verb"*"-ed form of \env{gather} with the non-\verb"*"-ed form of
+\env{align}.
+\begin{gather*}
+\begin{split} \varphi(x,z)
+&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\
+&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n
+\end{split}\\[6pt]
+\begin{align} \zeta^0&=(\xi^0)^2,\\
+\zeta^1 &=\xi^0\xi^1,\\
+\zeta^2 &=(\xi^1)^2,
+\end{align}
+\end{gather*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{gather*}
+\begin{split} \varphi(x,z)
+&=z-\gamma_{10}x-\gamma_{mn}x^mz^n\\
+&=z-Mr^{-1}x-Mr^{-(m+n)}x^mz^n
+\end{split}\\[6pt]
+\begin{align} \zeta^0&=(\xi^0)^2,\\
+\zeta^1 &=\xi^0\xi^1,\\
+\zeta^2 &=(\xi^1)^2,
+\end{align}
+\end{gather*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\subsection{Alignat}
+Numbered version:
+\begin{alignat}{3}
+V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j,
+ & \qquad U_i & = u_i,
+ \qquad \text{for $i\ne j$;}\label{eq:B}\\
+V_j & = v_j, & \qquad X_j & = x_j,
+ & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i.
+\end{alignat}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{alignat}{3}
+V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j,
+ & \qquad U_i & = u_i,
+ \qquad \text{for $i\ne j$;}\label{eq:B}\\
+V_j & = v_j, & \qquad X_j & = x_j,
+ & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i.
+\end{alignat}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Unnumbered version:
+\begin{alignat*}3
+V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j,
+ & \qquad U_i & = u_i,
+ \qquad \text{for $i\ne j$;} \\
+V_j & = v_j, & \qquad X_j & = x_j,
+ & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i.
+\end{alignat*}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{alignat*}3
+V_i & =v_i - q_i v_j, & \qquad X_i & = x_i - q_i x_j,
+ & \qquad U_i & = u_i,
+ \qquad \text{for $i\ne j$;} \\
+V_j & = v_j, & \qquad X_j & = x_j,
+ & \qquad U_j & u_j + \sum_{i\ne j} q_i u_i.
+\end{alignat*}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+The most common use for \env{alignat} is for things like
+\begin{alignat}{2}
+x& =y && \qquad \text {by (\ref{eq:A})}\label{eq:C}\\
+x'& = y' && \qquad \text {by (\ref{eq:B})}\label{eq:D}\\
+x+x' & = y+y' && \qquad \text {by Axiom 1.}
+\end{alignat}
+Some text after to test the below-display spacing.
+
+\begin{verbatim}
+\begin{alignat}{2}
+x& =y && \qquad \text {by (\ref{eq:A})}\label{eq:C}\\
+x'& = y' && \qquad \text {by (\ref{eq:B})}\label{eq:D}\\
+x+x' & = y+y' && \qquad \text {by Axiom 1.}
+\end{alignat}
+\end{verbatim}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\newpage
+\setlength{\marginrulewidth}{0pt}
+
+\begin{thebibliography}{10}
+
+\bibitem{dihe:newdir}
+W.~Diffie and E.~Hellman, \emph{New directions in cryptography}, IEEE
+Transactions on Information Theory \textbf{22} (1976), no.~5, 644--654.
+
+\bibitem{fre:cichon}
+D.~H. Fremlin, \emph{Cichon's diagram}, 1983/1984, presented at the
+S{\'e}minaire Initiation {\`a} l'Analyse, G. Choquet, M. Rogalski, J.
+Saint Raymond, at the Universit{\'e} Pierre et Marie Curie, Paris, 23e
+ann{\'e}e.
+
+\bibitem{gouja:lagrmeth}
+I.~P. Goulden and D.~M. Jackson, \emph{The enumeration of directed
+closed {E}uler trails and directed {H}amiltonian circuits by
+{L}angrangian methods}, European J. Combin. \textbf{2} (1981), 131--212.
+
+\bibitem{hapa:graphenum}
+F.~Harary and E.~M. Palmer, \emph{Graphical enumeration}, Academic
+Press, 1973.
+
+\bibitem{imlelu:oneway}
+R.~Impagliazzo, L.~Levin, and M.~Luby, \emph{Pseudo-random generation
+from one-way functions}, Proc. 21st STOC (1989), ACM, New York,
+pp.~12--24.
+
+\bibitem{komiyo:unipfunc}
+M.~Kojima, S.~Mizuno, and A.~Yoshise, \emph{A new continuation method
+for complementarity problems with uniform p-functions}, Tech. Report
+B-194, Tokyo Inst. of Technology, Tokyo, 1987, Dept. of Information
+Sciences.
+
+\bibitem{komiyo:lincomp}
+\bysame, \emph{A polynomial-time algorithm for a class of linear
+complementarity problems}, Tech. Report B-193, Tokyo Inst. of
+Technology, Tokyo, 1987, Dept. of Information Sciences.
+
+\bibitem{liuchow:formalsum}
+C.~J. Liu and Yutze Chow, \emph{On operator and formal sum methods for
+graph enumeration problems}, SIAM J. Algorithms Discrete Methods
+\textbf{5} (1984), 384--438.
+
+\bibitem{mami:matrixth}
+M.~Marcus and H.~Minc, \emph{A survey of matrix theory and matrix
+inequalities}, Complementary Series in Math. \textbf{14} (1964), 21--48.
+
+\bibitem{miyoki:lincomp}
+S.~Mizuno, A.~Yoshise, and T.~Kikuchi, \emph{Practical polynomial time
+algorithms for linear complementarity problems}, Tech. Report~13, Tokyo
+Inst. of Technology, Tokyo, April 1988, Dept. of Industrial Engineering
+and Management.
+
+\bibitem{moad:quadpro}
+R.~D. Monteiro and I.~Adler, \emph{Interior path following primal-dual
+algorithms, part {II}: Quadratic programming}, August 1987, Working
+paper, Dept. of Industrial Engineering and Operations Research.
+
+\bibitem{ste:sint}
+E.~M. Stein, \emph{Singular integrals and differentiability properties
+of functions}, Princeton Univ. Press, Princeton, N.J., 1970.
+
+\bibitem{ye:intalg}
+Y.~Ye, \emph{Interior algorithms for linear, quadratic and linearly
+constrained convex programming}, Ph.D. thesis, Stanford Univ., Palo
+Alto, Calif., July 1987, Dept. of Engineering--Economic Systems,
+unpublished.
+
+\end{thebibliography}
+
+\end{document}
+\endinput
diff --git a/macros/latex-dev/required/graphics/README.md b/macros/latex-dev/required/graphics/README.md
index 81f39d1d7b..009e20da95 100644
--- a/macros/latex-dev/required/graphics/README.md
+++ b/macros/latex-dev/required/graphics/README.md
@@ -1,7 +1,7 @@
The LaTeX `graphics` bundle
===========================
-Release 2019-10-01 pre-release 2
+Release 2019-10-01 pre-release 3
Overview
--------
diff --git a/macros/latex-dev/required/graphics/color.dtx b/macros/latex-dev/required/graphics/color.dtx
index d85b78349d..8de7d013a3 100644
--- a/macros/latex-dev/required/graphics/color.dtx
+++ b/macros/latex-dev/required/graphics/color.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% color.dtx Copyright (C) 1994--1999 David Carlisle
-%% Copyright (C) 2005--2016 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2005-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/color.pdf b/macros/latex-dev/required/graphics/color.pdf
index efdebda318..77198b2e49 100644
--- a/macros/latex-dev/required/graphics/color.pdf
+++ b/macros/latex-dev/required/graphics/color.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/drivers.dtx b/macros/latex-dev/required/graphics/drivers.dtx
index 07c201cf87..d693ebd27b 100644
--- a/macros/latex-dev/required/graphics/drivers.dtx
+++ b/macros/latex-dev/required/graphics/drivers.dtx
@@ -3,7 +3,7 @@
%
%% drivers.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
%% Copyright (C) 1995 1996 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000--2016 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2000-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/drivers.pdf b/macros/latex-dev/required/graphics/drivers.pdf
index ef6a372bf5..4a25175e87 100644
--- a/macros/latex-dev/required/graphics/drivers.pdf
+++ b/macros/latex-dev/required/graphics/drivers.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/epsfig.dtx b/macros/latex-dev/required/graphics/epsfig.dtx
index ba37d771cc..f9197c7b1c 100644
--- a/macros/latex-dev/required/graphics/epsfig.dtx
+++ b/macros/latex-dev/required/graphics/epsfig.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% epsfig.dtx Copyright (C) 1994-1996 1999 Sebastian Rahtz
-%% Copyright (C) 2000--2015,2017 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2000-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/epsfig.pdf b/macros/latex-dev/required/graphics/epsfig.pdf
index 3aa7fcff62..4347ed4a77 100644
--- a/macros/latex-dev/required/graphics/epsfig.pdf
+++ b/macros/latex-dev/required/graphics/epsfig.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/graphics.pdf b/macros/latex-dev/required/graphics/graphics.pdf
index 63a2ed999c..17afa48d1f 100644
--- a/macros/latex-dev/required/graphics/graphics.pdf
+++ b/macros/latex-dev/required/graphics/graphics.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/graphicx.dtx b/macros/latex-dev/required/graphics/graphicx.dtx
index aad8460ac5..4134c4eed1 100644
--- a/macros/latex-dev/required/graphics/graphicx.dtx
+++ b/macros/latex-dev/required/graphics/graphicx.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% graphicx.dtx Copyright (C) 1994 David Carlisle Sebastian Rahtz
-%% Copyright (C) 1995--2015,2017 David Carlisle, LaTeX3 Project
+%% Copyright (C) 1995-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/graphicx.pdf b/macros/latex-dev/required/graphics/graphicx.pdf
index 6137b786f8..73b8ad6c50 100644
--- a/macros/latex-dev/required/graphics/graphicx.pdf
+++ b/macros/latex-dev/required/graphics/graphicx.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/grfguide.pdf b/macros/latex-dev/required/graphics/grfguide.pdf
index cd6d72046e..42955a440c 100644
--- a/macros/latex-dev/required/graphics/grfguide.pdf
+++ b/macros/latex-dev/required/graphics/grfguide.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/grfguide.tex b/macros/latex-dev/required/graphics/grfguide.tex
index b00a86d307..19888db741 100644
--- a/macros/latex-dev/required/graphics/grfguide.tex
+++ b/macros/latex-dev/required/graphics/grfguide.tex
@@ -1,5 +1,5 @@
%% grfguide.tex Copyright (C) 1994 1995 1996 1998 1999 David Carlisle
-%% Copyright (C) 2005 2014 2016 2017 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2005-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/keyval.dtx b/macros/latex-dev/required/graphics/keyval.dtx
index f656961d0b..1e1581eee3 100644
--- a/macros/latex-dev/required/graphics/keyval.dtx
+++ b/macros/latex-dev/required/graphics/keyval.dtx
@@ -1,7 +1,7 @@
%
% \iffalse
%% keyval.dtx Copyright (C) 1993 1994 1995 1997 1998 1999 David Carlisle
-%% Copyright (C) 2000--2015 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2000-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/keyval.pdf b/macros/latex-dev/required/graphics/keyval.pdf
index 8790611726..fd6f74aba0 100644
--- a/macros/latex-dev/required/graphics/keyval.pdf
+++ b/macros/latex-dev/required/graphics/keyval.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/lscape.dtx b/macros/latex-dev/required/graphics/lscape.dtx
index 733e183ee6..a5a3dc3220 100644
--- a/macros/latex-dev/required/graphics/lscape.dtx
+++ b/macros/latex-dev/required/graphics/lscape.dtx
@@ -2,7 +2,7 @@
% \iffalse
%
%% lscape.dtx Copyright (C) 1994 1999-2000 David Carlisle
-%% Copyright (C) 2000--2015 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2000-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/lscape.pdf b/macros/latex-dev/required/graphics/lscape.pdf
index bf3d93a04c..edb151476c 100644
--- a/macros/latex-dev/required/graphics/lscape.pdf
+++ b/macros/latex-dev/required/graphics/lscape.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/rotating.dtx b/macros/latex-dev/required/graphics/rotating.dtx
index 41bd399d4e..149c19d049 100644
--- a/macros/latex-dev/required/graphics/rotating.dtx
+++ b/macros/latex-dev/required/graphics/rotating.dtx
@@ -3,9 +3,9 @@
%
%
% File: rotating.dtx
-%% Copyright 1995--1999 Sebastian Rahtz and Leonor Barroca
-%% Copyright 2001--2003,2007--2009 Robin Fairbairns
-%% Copyright 2016 LaTeX3 Project
+%% Copyright (C) 1995--1999 Sebastian Rahtz and Leonor Barroca
+%% Copyright (C) 2001--2003,2007--2009 Robin Fairbairns
+%% Copyright (C) 2016-2019 LaTeX3 Project
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
diff --git a/macros/latex-dev/required/graphics/rotating.pdf b/macros/latex-dev/required/graphics/rotating.pdf
index bfaa34d0ab..97b252ecd5 100644
--- a/macros/latex-dev/required/graphics/rotating.pdf
+++ b/macros/latex-dev/required/graphics/rotating.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/rotex.pdf b/macros/latex-dev/required/graphics/rotex.pdf
index 1564784475..d064b44420 100644
--- a/macros/latex-dev/required/graphics/rotex.pdf
+++ b/macros/latex-dev/required/graphics/rotex.pdf
Binary files differ
diff --git a/macros/latex-dev/required/graphics/trig.dtx b/macros/latex-dev/required/graphics/trig.dtx
index 712db13ba2..2b152578ad 100644
--- a/macros/latex-dev/required/graphics/trig.dtx
+++ b/macros/latex-dev/required/graphics/trig.dtx
@@ -1,6 +1,6 @@
% \iffalse
%% File: trig.dtx Copyright (C) 1993 1994 1995 1996 1997 1999 David Carlisle
-%% Copyright (C) 2000--2015 David Carlisle, LaTeX3 Project
+%% Copyright (C) 2000-2019 David Carlisle, LaTeX3 Project
%%
%% This file is part of the Standard LaTeX `Graphics Bundle'.
%% It may be distributed under the terms of the LaTeX Project Public
diff --git a/macros/latex-dev/required/graphics/trig.pdf b/macros/latex-dev/required/graphics/trig.pdf
index 2ad8cb7b53..25f75bf255 100644
--- a/macros/latex-dev/required/graphics/trig.pdf
+++ b/macros/latex-dev/required/graphics/trig.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/README.md b/macros/latex-dev/required/tools/README.md
new file mode 100644
index 0000000000..aa0e7c9f46
--- /dev/null
+++ b/macros/latex-dev/required/tools/README.md
@@ -0,0 +1,54 @@
+The LaTeX `tools` bundle
+========================
+
+Release 2019-10-01 pre-release 3
+
+Overview
+--------
+
+This bundle consists of packages providing a range of basic tools for
+LaTeX users. It is a required part of a LaTeX installation.
+
+Installation
+------------
+
+We no longer distribute installation instructions for the various TeX
+implementations. All modern TeX systems include `tools` as-standard, and end
+users should in general use the release versions supplied in this way.
+
+Release distribution is carried out only through the CTAN archives.
+
+Reporting Bugs
+--------------
+
+If you wish to report a problem or bug in the `tools` bundle
+please use the [Issue Tracker for LaTeX2e on
+GitHub](https://github.com/latex3/latex2e/issues)
+and follow the guidelines that pop up if you press the "New issue" button.
+
+In particular, to check that you are really seeing a bug, please write
+a short, self-contained document that shows the problem. This should
+include the `latexbug` package, which will warn if your test file is
+not suitable for one or the other reason. See the [CONTRIBUTING
+guide](https://github.com/latex3/latex2e/blob/master/CONTRIBUTING.md)
+for further details, or if you need to obtain the `latexbug` package.
+
+If the bug turns out to be with third-party software then please
+contact the developer, and not us!
+
+License
+-------
+
+The contents of this bundle are distributed under the [LaTeX Project
+Public License](https://www.latex-project.org/lppl/lppl-1-3c/),
+version 1.3c or later.
+
+Copyright
+---------
+
+Copyright is maintained on each of these packages by the author(s)
+of the package.
+
+-----
+
+<p>Copyright (C) 1993-2019 The LaTeX Project <br />
diff --git a/macros/latex-dev/required/tools/afterpage.dtx b/macros/latex-dev/required/tools/afterpage.dtx
new file mode 100644
index 0000000000..3fa341aa53
--- /dev/null
+++ b/macros/latex-dev/required/tools/afterpage.dtx
@@ -0,0 +1,385 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: afterpage.dtx Copyright (C) 1994 1994 1995 David Carlisle
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{afterpage}
+%<package> [2014/10/28 v1.08 After-Page Package (DPC)]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{afterpage}
+\GetFileInfo{afterpage.sty}
+\begin{document}
+\title{The \textsf{afterpage} package\thanks{This file
+ has version number \fileversion, last
+ revised \filedate.}}
+\author{David Carlisle}
+\date{\filedate}
+\MaintainedByLaTeXTeam{tools}
+\maketitle
+\DocInput{afterpage.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \changes{v1.00}{1993/01/25}{Initial version}
+% \changes{v1.05}{1993/07/14}{First public version}
+% \changes{v1.06}{1994/02/01}{Update for LaTeX2e}
+% \changes{v1.07}{1994/05/23}{Documentation Changes}
+% \changes{v1.08}{1995/10/27}
+% {Use \cs{par} not \cs{endgraf}, for tools/1579}
+% \changes{v1.08}{1995/10/27}
+% {Try and do something sensible with nested \cs{clearpage},
+% for tools/1880}
+% \changes{v1.08}{1995/10/27}
+% {Try and do something sensible with footnotes, for tools/1884}
+%
+%
+% This package implements a command, |\afterpage|, that causes the
+% commands specified in its argument to be expanded after the current
+% page is output.\footnote{This is really a pre-release, to see whether
+% people like the idea of a command like this. This implementation is
+% \emph{not} particularly robust. This implementation does not work in
+% two column mode, and can get `confused' by \LaTeX's floating
+% environments.}
+%
+% \begin{enumerate}
+% \item Sometimes \LaTeX's float positioning mechanism gets overloaded,
+% and all floating |figure|s and |table|s drift to the end of the
+% document. One may flush out all the unprocessed floats by issuing a
+% |\clearpage| command, but this has the effect of making the current
+% page end prematurely. Now you can issue |\afterpage{\clearpage}| and
+% the current page will be filled up with text as usual, but then a
+% |\clearpage| command will flush out all the floats before the next
+% text page begins.
+% \item An earlier mechanism to help with float placement was the
+% optional argument |[H]| (meaning {\bf HERE!}) which was originally
+% added to the standard floating environments by |here.sty|, and is now
+% provided by |float.sty|. However some |[H]| users have commented that
+% they did not really mean `Here!' They actually wanted `Somewhere
+% close'. This can now be achieved by\\
+% |\afterpage{\clearpage\begin{figure}[H] |\ldots
+% |\end{figure}}|\\
+% This ensures that the figure is at the top of the next page. (The
+% |\clearpage| stops any other figures drifting past the |[H]| figure.)
+% \item Floating longtables. |longtable.sty| provides the |longtable|
+% environment, a multi-page version of |tabular|. Many |longtable| users
+% have told me that it is difficult to set the text surrounding the long
+% table, and that they wanted a `floating' version. As, presumably,
+% |longtable|s are long, they are probably too large to hold in memory,
+% and float in the way that the |table| environment is floated, however
+% if the table is in a separate file, say |ltfile.tex|, you can now
+% use one of:\\
+% |\afterpage{\clearpage\input{ltfile}}|\\
+% |\afterpage{\clearpage\input{ltfile}\clearpage}|.\\
+% The first form lets text appear on the same page as the end of the
+% longtable, the second ensures that the surrounding text starts again
+% on a new page.
+% \end{enumerate}
+%
+% \StopEventually{}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macro}{\afterpage}
+% The token register used to save the old output routine.
+% \begin{macrocode}
+\newtoks\AP@output
+\global\AP@output\expandafter{\the\output}
+% \end{macrocode}
+%
+% A box register used to save any part of the next page which has
+% already been processed.
+% \begin{macrocode}
+\newbox\AP@partial
+% \end{macrocode}
+%
+% A box register used to save any footnote texts that are `tied' to
+% the text that gets saved in |\AP@partial|.
+% \begin{macrocode}
+\newbox\AP@footins
+% \end{macrocode}
+%
+% The following macro attempts to get safely into vertical mode, and
+% then invokes a special output routine to grab the current page into
+% |\AP@partial|.
+% \begin{macrocode}
+\def\AP@savetop{%
+% \end{macrocode}
+% Now begins a test to see what state we are in. |\AP@noindent| will
+% be defined so as to return to this state (well, almost!) after
+% afterpage has finished.
+% \begin{macrocode}
+ \ifvmode
+% \end{macrocode}
+% Vertical mode. This is the simplest case, do nothing.
+% \begin{macrocode}
+ \let\AP@noindent\empty
+ \else\ifhmode
+% \end{macrocode}
+% Horizontal mode.
+% `Back out' into vertical mode, removing the indentation box as we go.
+% If in fact there was no indentation box, the output routine was
+% invoked by |\noindent| (what bad luck!) so we have to remember to
+% re-insert the |\noindent| before the paragraph is seen again.
+% |\everypar| tokens have already been inserted, so don't insert them
+% again.
+% \begin{macrocode}
+ \setbox\z@\lastbox
+ \edef\AP@noindent
+ {{\everypar{}\ifvoid\z@\noindent\else\indent\fi}}%
+ \par
+ \else
+% \end{macrocode}
+% The remaining (even worse) possibility that the output routine
+% was triggered by the start of displaymath within a paragraph.
+%
+% Come out of displaymath with |$$|, then adjust the spacing (getting
+% into vmode at the same time). |\AP@noindent| will restart display math
+% later. |\everydisplay| tokens have already been inserted (they apply
+% to the math list that will be started by |\AP@noindent|, even though
+% they were triggered by the display math that was closed by the lines
+% below!). Save the values |\prevgraf| and |\predisplaysize| for use in
+% the re-started math list.
+% \begin{macrocode}
+ \abovedisplayshortskip\z@\abovedisplayskip\z@
+ \belowdisplayshortskip\z@\belowdisplayskip\z@
+ \xdef\AP@disp{%
+ \predisplaysize\the\predisplaysize
+ \prevgraf\the\prevgraf\relax}%
+ $$\vskip-\baselineskip\vskip-\parskip
+ \edef\AP@noindent{%
+% \end{macrocode}
+% Do not insert |\everydisplay| tokens again.
+% \begin{macrocode}
+ \toks@{\the\everydisplay}\everydisplay{}%
+% \end{macrocode}
+% Start displaymath mode with no spurious paragraph line above it.
+% Restore |\prevgraf| and |\predisplaysize|. Use |\aftergroup| to
+% restore the correct setting for |\everydisplay| after this display
+% has finished.
+% \begin{macrocode}
+ {\everypar{}\noindent}$$\AP@disp\aftergroup\noexpand\AP@ed}%
+ \fi\fi
+% \end{macrocode}
+% Now switch the output routine and remove everything from the current
+% page into the box |\AP@partial|.
+% \begin{macrocode}
+ \begingroup
+ \nointerlineskip\null
+ \output{%
+ \global\setbox\AP@partial\vbox{%
+ \unvbox\@cclv
+ \global\setbox\@ne\lastbox}%
+% \end{macrocode}
+% If the text that is saved in |\AP@partial| had footnotes, we'd
+% better grab them as well otherwise they may come out on a page
+% with the `afterpage' text, before the page that has the
+% footnote mark! (Added at v1.08.)
+% \begin{macrocode}
+ \global\setbox\AP@footins\box\footins}%
+% \end{macrocode}
+% Having defined the output routine, trigger it\ldots
+% \begin{macrocode}
+ \eject
+ \endgroup}
+% \end{macrocode}
+%
+% |\AP@| stores all the commands that must be executed after the page
+% break.
+% \begin{macrocode}
+\let\AP@\relax
+% \end{macrocode}
+%
+% Restore the |\everydisplay| register. |\ignorespaces| prevents a space
+% or newline after |$$| creating rogue a indentation or paragraph.
+% \begin{macrocode}
+\def\AP@ed{\everydisplay\expandafter{\the\toks@}\ignorespaces}
+% \end{macrocode}
+%
+% Remove the current vertical list, insert the commands |\AP@|
+% at the top of the page, and then re-insert the saved text.
+% \begin{macrocode}
+\def\AP@@{%
+ \AP@savetop
+ \global\expandafter\let\expandafter\AP@\expandafter\relax\AP@
+ \par
+% \end{macrocode}
+% The text originally at the top of this page is now stored in the box
+% |\AP@partial|, including |\topskip| glue. Now we want to unbox
+% |\AP@partial|, placing the baseline of the first row |\baselineskip|
+% below the baseline of the last line coming from the afterpage text.
+% If we assumed nothing has too much height or depth (and |\topskip| is
+% rigid), it would be fairly trivial to position the contents of
+% |\AP@partial| so that the baseline of the first row was
+% |\baselineskip| below the last row just added.
+%
+% In this version, I thought it might be fun to try to exactly achieve
+% the |\baselineskip|--or--|\lineskip| calculation that \TeX\ normally
+% does internally. The call to |\addboxcontents| does the right thing
+% (I hope).
+% \begin{macrocode}
+ \addboxcontents\AP@partial
+% \end{macrocode}
+% Now re-insert any footnote text. This may not be quite the right
+% place, as the text that has just been unboxed may break over a page
+% in its new position. Also it may not be the right number if the text
+% from |\afterpage| itself contains footnotes. Too bad!
+% \begin{macrocode}
+ \ifvoid\AP@footins\else
+ \insert\footins{\unvbox\AP@footins}\fi
+% \end{macrocode}
+% Now repair things if we started off in horizontal mode.
+% \begin{macrocode}
+ \AP@noindent}
+% \end{macrocode}
+%
+% If |\AP@| is not |\relax| then the current page already has some
+% `afterpage' commands, so just add the new commands to the end of the
+% list. Otherwise save the commands in |\AP@|. (within a local group),
+% and switch the output routine. (The new output routine just calls the
+% old one if it is invoked by a \LaTeX{} float.
+% \begin{macrocode}
+\long\def\afterpage#1{%
+ \ifx\AP@\relax
+ \gdef\AP@{{#1\par}}%
+ \global\output{%
+ \the\AP@output
+ \ifnum\outputpenalty>-\@Mi
+ \global\output\expandafter{\the\AP@output}%
+ \aftergroup\AP@@
+ \fi}%
+ \else
+ \expandafter\gdef\expandafter\AP@\expandafter{\AP@{#1\par}}%
+ \fi}
+% \end{macrocode}
+%
+% If we have got to the end of the document or clearpage
+% just put the stuff out without any trickery.
+% \begin{macrocode}
+\let\AP@clearpage\clearpage
+\def\clearpage{%
+ \ifx\AP@\relax
+ \AP@clearpage
+ \else
+ \global\output\expandafter{\the\AP@output}%
+ \AP@clearpage
+% \end{macrocode}
+% At this point (since v1.08) Need to clear |\AP@| \emph{before}
+% using its expansion, as otherwise hit an infinite loop. Sigh.
+% \begin{macrocode}
+ \global\expandafter\let\expandafter\AP@\expandafter\relax
+ \expandafter\expandafter\AP@
+ \fi}
+\let\AP@enddocument\enddocument
+\def\enddocument{%
+ \ifx\AP@\relax\else
+ \global\output\expandafter{\the\AP@output}%
+ \AP@clearpage
+ \global\expandafter\let\expandafter\AP@\expandafter\relax
+ \expandafter\expandafter\AP@
+ \fi
+ \AP@enddocument}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\addboxcontents}
+% Given a vbox |#1|, add to the current vertical list such that the end
+% result is equivalent to the list that \TeX\ would have built had the
+% contents of |#1| (apart from any initial glue) been added individually
+% to the current list.
+
+% So essentially, the problem is that of unboxing |#1|, but replacing
+% the glue at the top of |#1| with (something equivalent to) the
+% |\baselineskip| or |\lineskip| glue that \TeX\ would normally have
+% placed before the first box in |#1|. Also |\prevdepth| must be set at
+% the end.
+% \begin{macrocode}
+\def\addboxcontents#1{{%
+% \end{macrocode}
+% Perhaps I shouldn't use grouping here, as I probably don't really want
+% to save |#1|. If it is removed, |\splittopskip| and |\splitmaxdepth|
+% would need to be restored by hand.
+%
+% First replace any glue at the top by |\vskip 0pt|.
+% \begin{macrocode}
+ \splittopskip\z@
+ \splitmaxdepth\maxdimen
+ \setbox#1\vbox{\break\unvbox#1}%
+ \setbox\z@\vsplit#1to\z@
+% \end{macrocode}
+% Put the breakpoint back.
+% \begin{macrocode}
+ \setbox#1\vbox{\break\unvbox#1}%
+% \end{macrocode}
+% Set |\skip@| to be height of |#1| (without top glue)
+% \begin{macrocode}
+ \skip@\ht#1%
+% \end{macrocode}
+% Now make the first baseline of the first row be |\vsize| from the top.
+% (This assumes that the first row has height less than |\vsize|.)
+% \begin{macrocode}
+ \splittopskip\vsize
+ \setbox\z@\vsplit#1to\z@
+% \end{macrocode}
+% Subtract the new height of |#1| from |\skip@|, and add back on
+% |\splittopskip|, so |\skip@| is now the height of the first row of
+% |#1| This may still be 0pt if (eg) a mark or whatsit is between the
+% top glue and the first box. Save (this height${}-{}$|\splittopskip|)
+% in |\skip\tw@|.
+% \begin{macrocode}
+ \advance\skip@-\ht#1%
+ \skip\tw@\skip@
+ \advance\skip@\splittopskip
+% \end{macrocode}
+% Now fake \TeX's |\baselineskip| calculation.
+% \begin{macrocode}
+ \advance\skip@\prevdepth
+ \advance\skip@-\baselineskip
+ \advance\skip\tw@\ifdim-\skip@<\lineskiplimit\lineskip\else-\skip@\fi
+% \end{macrocode}
+% Finally add the glue.
+% \begin{macrocode}
+ \vskip\skip\tw@
+% \end{macrocode}
+% Now unbox the box, setting |\prevdepth| by hand, as |\unvbox| (unlike
+% |\box|) does not automatically set it.
+% \begin{macrocode}
+ \global\dimen@i\dp#1%
+ \unvbox#1}%
+ \prevdepth\dimen@i}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/required/tools/afterpage.ins b/macros/latex-dev/required/tools/afterpage.ins
new file mode 100644
index 0000000000..9764bdac6d
--- /dev/null
+++ b/macros/latex-dev/required/tools/afterpage.ins
@@ -0,0 +1,75 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+
+\generate{\file{afterpage.sty}{\from{afterpage.dtx}{package}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/afterpage.pdf b/macros/latex-dev/required/tools/afterpage.pdf
new file mode 100644
index 0000000000..3cd429ce02
--- /dev/null
+++ b/macros/latex-dev/required/tools/afterpage.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/array-2016-10-06.sty b/macros/latex-dev/required/tools/array-2016-10-06.sty
new file mode 100644
index 0000000000..0b619362d4
--- /dev/null
+++ b/macros/latex-dev/required/tools/array-2016-10-06.sty
@@ -0,0 +1,341 @@
+%%
+%% This is an old release of `array.sty',
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%%
+%% Package `array' to use with LaTeX 2e
+%% Copyright (C) 1989-1998 Frank Mittelbach, all rights reserved.
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{array}
+ [2016/10/06 v2.4d Tabular extension package (FMi)]
+%%
+
+\def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
+\def\@testpach{\@chclass
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+ \ifnum \@lastchclass=7 5 \else
+ \ifnum \@lastchclass=8 \tw@ \else
+ \ifnum \@lastchclass=9 \thr@@
+ \else \z@
+ \ifnum \@lastchclass = 10 \else
+ \edef\@nextchar{\expandafter\string\@nextchar}%
+ \@chnum
+ \if \@nextchar c\z@ \else
+ \if \@nextchar l\@ne \else
+ \if \@nextchar r\tw@ \else
+ \z@ \@chclass
+ \if\@nextchar |\@ne \else
+ \if \@nextchar !6 \else
+ \if \@nextchar @7 \else
+ \if \@nextchar <8 \else
+ \if \@nextchar >9 \else
+ 10
+ \@chnum
+ \if \@nextchar m\thr@@\else
+ \if \@nextchar p4 \else
+ \if \@nextchar b5 \else
+ \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
+ \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+\def\@xexpast#1*#2#3#4\@@{%
+ \@tempcnta #2
+ \toks@={#1}\@temptokena={#3}%
+ \let\the@toksz\relax \let\the@toks\relax
+ \def\@tempa{\the@toksz}%
+ \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+ \let \@tempb \@xexpast \else
+ \let \@tempb \@xexnoop \fi
+ \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ \edef\@tempa{\@tempa}%
+ \expandafter \@tempb \@tempa #4\@@}
+\def\prepnext@tok{\advance \count@ \@ne
+ \toks\count@{}}
+\def\save@decl{\toks\count@ \expandafter{\@nextchar}}
+\def\insert@column{%
+ \the@toks \the \@tempcnta
+ \ignorespaces \@sharp \unskip
+ \the@toks \the \count@ \relax}
+\newdimen\col@sep
+\def\@acol{\@addtopreamble{\hskip\col@sep}}
+\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+ \@xexpast #1*0x\@@
+ \count@\m@ne
+ \let\the@toks\relax
+ \prepnext@tok
+ \expandafter \@tfor \expandafter \@nextchar
+ \expandafter :\expandafter =\@tempa \do
+ {\@testpach
+ \ifcase \@chclass \@classz \or \@classi \or \@classii
+ \or \save@decl \or \or \@classv \or \@classvi
+ \or \@classvii \or \@classviii \or \@classix
+ \or \@classx \fi
+ \@lastchclass\@chclass}%
+ \ifcase\@lastchclass
+ \@acol \or
+ \or
+ \@acol \or
+ \@preamerr \thr@@ \or
+ \@preamerr \tw@ \@addtopreamble\@sharp \or
+ \or
+ \else \@preamerr \@ne \fi
+ \def\the@toks{\the\toks}}
+\def\@classx{%
+ \ifcase \@lastchclass
+ \@acolampacol \or
+ \@addamp \@acol \or
+ \@acolampacol \or
+ \or
+ \@acol \@firstampfalse \or
+ \@addamp
+ \fi}
+\def\@classz{\@classx
+ \@tempcnta \count@
+ \prepnext@tok
+ \@addtopreamble{\ifcase \@chnum
+ \hfil
+ \d@llarbegin
+ \insert@column
+ \d@llarend \hfil \or
+ \hskip1sp\d@llarbegin \insert@column \d@llarend \hfil \or
+ \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \or
+ $\vcenter
+ \@startpbox{\@nextchar}\insert@column \@endpbox $\or
+ \vtop \@startpbox{\@nextchar}\insert@column \@endpbox \or
+ \vbox \@startpbox{\@nextchar}\insert@column \@endpbox
+ \fi}\prepnext@tok}
+\def\@classix{\ifnum \@lastchclass = \thr@@
+ \@preamerr \thr@@ \fi
+ \@classx}
+\def\@classviii{\ifnum \@lastchclass >\z@
+ \@preamerr 4\@chclass 6 \@classvi \fi}
+\def\@arrayrule{\@addtopreamble \vline}
+\def\@classvii{\ifnum \@lastchclass = \thr@@
+ \@preamerr \thr@@ \fi}
+\def\@classvi{\ifcase \@lastchclass
+ \@acol \or
+ \@addtopreamble{\hskip \doublerulesep}\or
+ \@acol \or
+ \@classvii
+ \fi}
+\def\@classii{\advance \count@ \m@ne
+ \save@decl\prepnext@tok}
+\def\@classv{\save@decl
+ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ \prepnext@tok}
+\def\@classi{\@classvi
+ \ifcase \@chnum \@arrayrule \or
+ \@classv \fi}
+\def\@startpbox#1{\bgroup
+ \setlength\hsize{#1}\@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+ }
+\def\@endpbox{\@finalstrut\@arstrutbox \egroup\hfil}
+\def\@array[#1]#2{%
+ \@tempdima \ht \strutbox
+ \advance \@tempdima by\extrarowheight
+ \setbox \@arstrutbox \hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\@preamble{\noexpand \ialign \@halignto
+ \bgroup \@arstrut \@preamble
+ \tabskip \z@ \cr}%
+ \endgroup
+ \@arrayleft
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+ \bgroup
+ \let \@sharp ##\let \protect \relax
+ \lineskip \z@
+ \baselineskip \z@
+ \m@th
+ \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+\def\arraybackslash{\let\\\tabularnewline}
+\newdimen \extrarowheight
+\extrarowheight=0pt
+\def\@arstrut{\unhcopy\@arstrutbox}
+\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+ \@ifstar \@xarraycr \@xarraycr}
+\def\@xarraycr{\@ifnextchar [%
+ \@argarraycr {\ifnum 0=`{}\fi\cr}}
+\def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+ \expandafter\@xargarraycr\else
+ \expandafter\@yargarraycr\fi{#1}}
+\def\@xargarraycr#1{\unskip
+ \@tempdima #1\advance\@tempdima \dp\@arstrutbox
+ \vrule \@depth\@tempdima \@width\z@ \cr}
+\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+\long\def\multicolumn#1#2#3{%
+ \multispan{#1}\begingroup
+ \def\@addamp{\if@firstamp \@firstampfalse \else
+ \@preamerr 5\fi}%
+ \@mkpream{#2}\@addtopreamble\@empty
+ \endgroup
+ \def\@sharp{#3}%
+ \@arstrut \@preamble
+ \null
+ \ignorespaces}
+\let\d@llarbegin\begingroup
+\let\d@llarend\endgroup
+\def\array{\col@sep\arraycolsep
+ \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%
+ \@tabarray}
+\def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
+\def\tabular{\def\@halignto{}\@tabular}
+\expandafter\def\csname tabular*\endcsname#1{%
+ \setlength\dimen@{#1}%
+ \edef\@halignto{to\the\dimen@}\@tabular}
+\def\@tabular{%
+ \leavevmode
+ \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup
+ \let\d@llarend\endgroup
+ \@tabarray}
+\def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
+\def\endtabular{\endarray $\egroup}
+\expandafter\let\csname endtabular*\endcsname=\endtabular
+\let\@ampacol=\relax \let\@expast=\relax
+\let\@arrayclassiv=\relax \let\@arrayclassz=\relax
+\let\@tabclassiv=\relax \let\@tabclassz=\relax
+\let\@arrayacol=\relax \let\@tabacol=\relax
+\let\@tabularcr=\relax \let\@@endpbox=\relax
+\let\@argtabularcr=\relax \let\@xtabularcr=\relax
+\def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
+ \PackageError{array}{%
+ \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
+ Missing arg: token ignored\or %1
+ Empty preamble: `l' used\or %2
+ >\@tempd token ignored\or %3
+ <\@tempd changed to !{..}\or %4
+ Only one column-spec. allowed.\fi}\@ehc} %5
+\def\newcolumntype#1{%
+ \edef\NC@char{\string#1}%
+ \@ifundefined{NC@find@\NC@char}%
+ {\@tfor\next:=<>clrmbp@!|\do{\if\noexpand\next\NC@char
+ \PackageWarning{array}%
+ {Redefining primitive column \NC@char}\fi}%
+ \NC@list\expandafter{\the\NC@list\NC@do#1}}%
+ {\PackageWarning{array}{Column \NC@char\space is already defined}}%
+ \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
+ \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+\def\newcol@#1[#2]#3{\expandafter\@reargdef
+ \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
+\def\NC@#1{%
+ \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
+\def\NC@ifend{%
+ \ifx\next\relax
+ \else\@tempswatrue\expandafter\NC@rewrite\fi}
+\def\NC@do#1{%
+ \expandafter\let\expandafter\NC@rewrite
+ \csname NC@rewrite@\string#1\endcsname
+ \expandafter\let\expandafter\NC@find
+ \csname NC@find@\string#1\endcsname
+ \expandafter\@temptokena\expandafter{\expandafter}%
+ \expandafter\NC@find\the\@temptokena#1\relax}
+\def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
+\def\NC@show#1{%
+ \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
+ \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+\newtoks\NC@list
+\newcolumntype{*}[2]{}
+\long\@namedef{NC@rewrite@*}#1#2{%
+ \count@#1\relax
+ \loop
+ \ifnum\count@>\z@
+ \advance\count@\m@ne
+ \@temptokena\expandafter{\the\@temptokena#2}%
+ \repeat
+ \NC@find}
+\let\@xexpast\relax
+\let\@xexnoop\relax
+\def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
+ {\expandafter\@nextchar\the\toks\count@}}
+\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ \let\@sharp\relax \let\@startpbox\relax \let\@endpbox\relax
+ \@temptokena{#1}\@tempswatrue
+ \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+ \count@\m@ne
+ \let\the@toks\relax
+ \prepnext@tok
+ \expandafter \@tfor \expandafter \@nextchar
+ \expandafter :\expandafter =\the\@temptokena \do
+ {\@testpach
+ \ifcase \@chclass \@classz \or \@classi \or \@classii
+ \or \save@decl \or \or \@classv \or \@classvi
+ \or \@classvii \or \@classviii
+ \or \@classx
+ \or \@classx \fi
+ \@lastchclass\@chclass}%
+ \ifcase\@lastchclass
+ \@acol \or
+ \or
+ \@acol \or
+ \@preamerr \thr@@ \or
+ \@preamerr \tw@ \@addtopreamble\@sharp \or
+ \or
+ \else \@preamerr \@ne \fi
+ \def\the@toks{\the\toks}}
+\let\@classix\relax
+\def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
+ \@preamerr 4\@chclass 6 \@classvi \fi\fi}
+\def\@classv{\save@decl
+ \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ \prepnext@tok}
+\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+ \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
+\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+\let\@@array\@array
+\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
+\let\@arrayleft\@empty
+\let\@arrayright\@empty
+\newlength{\extratabsurround}
+\setlength{\extratabsurround}{2pt}
+\newlength{\backup@length}
+\newcommand{\firsthline}{%
+ \multicolumn1c{%
+ \global\backup@length\ht\@arstrutbox
+ \global\advance\backup@length\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+ \raise\extratabsurround\copy\@arstrutbox
+ }\\[-\backup@length]\hline
+}
+\newcommand{\lasthline}{\hline\multicolumn1c{%
+ \global\backup@length2\ht\@arstrutbox
+ \global\advance\backup@length2\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+ }\\[-\backup@length]%
+ \multicolumn1c{%
+ \lower\extratabsurround\copy\@arstrutbox
+ }%
+}
+\CheckCommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \vskip-\arrayrulewidth
+ \fi
+ \ifnum0=`{\fi}}
+\renewcommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \fi
+ \ifnum0=`{\fi}}
+\endinput
+%%
+%% End of file `array.sty'.
diff --git a/macros/latex-dev/required/tools/array.dtx b/macros/latex-dev/required/tools/array.dtx
new file mode 100644
index 0000000000..5590b0a136
--- /dev/null
+++ b/macros/latex-dev/required/tools/array.dtx
@@ -0,0 +1,3092 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%\iffalse % this is a METACOMMENT !
+%
+%% Package `array' to use with LaTeX 2e
+%% Copyright (C) 1989-1998 Frank Mittelbach, all rights reserved.
+%<+package>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<+package>\providecommand\DeclareRelease[3]{}
+%<+package>\providecommand\DeclareCurrentRelease[2]{}
+%<+package>
+%<+package>\DeclareRelease{}{2016-10-06}{array-2016-10-06.sty}
+%<+package>\DeclareCurrentRelease{}{2019-10-01}
+%<+package>
+%<+package>\ProvidesPackage{array}
+%<+package> [2019/08/31 v2.4l Tabular extension package (FMi)]
+%
+% \fi
+%
+%%
+%
+%
+% \changes{v2.4g}{2018/04/07}{Renamed internal \cs{mcell@box} to
+% \cs{ar@mcellbox} and \cs{align@mcell} to \cs{ar@align@mcell}
+% to avoid conflict with makecell package}
+%
+% \changes{v2.4c}{2008/09/09}{(WR) Typo fix in documentation}
+%
+% \changes{v2.3c}{1995/11/02}{(DPC) minor doc changes}
+%
+% \changes{v2.3a}{1994/10/16}{Added code for \cs{firsthline} and
+% friends}
+%
+% \changes{v2.2c}{1994/03/14}{removed check for \cs{@tfor} bug}
+%
+% \changes{v1.0b}{1987/06/04}{`@classi (faster),
+% `@classvi (new) A in preamble means
+% \&\& in `halign.}
+%
+% \changes{v1.1a}{1987/07/05}{New concept:
+% preamblechar: c,l,r,C,L,R,A,p,t,{\tt !|},@,!!}
+% \changes{v1.1b}{1987/09/21}{Again p like original \LaTeX{} and z for
+% centered `parbox.}
+%
+% \changes{v1.2a}{1987/09/27}{Completely new implementation.}
+% \changes{v1.2b}{1987/10/06}{{\tt !|} does no longer generate space at
+% start or end of the preamble. Otherwise `hline
+% is too long.}
+% \changes{v1.2b}{1987/10/06}{Enlarged `@arstrutbox by 1pt (Test-Impl)
+% with dimen `@strutheight.}
+% \changes{v1.2c}{1987/10/22}{New dimen parameter `extrarowheight
+% (default: 0pt).}
+% \changes{v1.2c}{1987/10/22}{Enlarged `@arstrutbox by `extrarowheight.
+% Thus you may avoid large characters to
+% overprint a `hline.}
+% \changes{v1.2c}{1987/10/22}{Introduced `m@th in `@array to allow
+% non-zero values of `mathsurround.}
+% \changes{v1.2d}{1987/11/02}{Completed the documentation.}
+% \changes{v1.2e}{1987/11/03}{Bug fixed: A at start of preamble resulted
+% in an error since `@mkpream generated
+% `@arstrut \& ... as a preamble.}
+% \changes{v1.2f}{1987/11/09}{`@testpach documented.}
+%
+% \changes{v1.3a}{1987/11/11}{Again a new implementation, with a new
+% concept (cf. the documentation).}
+% \changes{v1.3b}{1988/03/17}{`@decl expands now into `@empty, i.e., it
+% disappears when the preamble is generated,
+% except when the user specifies A\{\} or
+% B\{\}.}
+%
+% \changes{v1.4a}{1988/03/18}{Test implementation of use of token
+% registers in order to do without `protect.}
+% \changes{v1.4b}{1988/03/19}{Changed erroneous class numbers:
+% 5 -!> 6
+% 6 -!> 7
+% 7 -!> 5
+% Corresponding changes in the macros.}
+% \changes{v1.4c}{1988/03/19}{Everything except p,z now works with token
+% registers.}
+%
+% \changes{v1.9a}{1988/03/20}{Last (so I hope) major change: 1) Options
+% B,A now called !>,<. These options now point
+% to the column they modify.}
+% \changes{v1.9a}{1988/03/20}{2) `protect is no longer necessary. But
+% still the macro `@expast needs top be
+% modified. `multicolumn still does not work.}
+% \changes{v1.9b}{1988/04/29}{inserted missing `fi in `@testpach.
+% Corrected \LaTeX bug in `@tfor.}
+% \changes{v1.9c}{1988/05/07}{Re-introduced `@endpbox.
+% `multicolumn now works!! Version number still
+% 1.9 since the documentation is still not
+% finished.}
+% \changes{v1.9c}{1988/05/07}{1) `def `the@toks \{`the ...\} remaining
+% only in `@mkpream. 2) Removed `@classiii and
+% replaced by `save@decl.}
+% \changes{v1.9c}{1988/05/07}{3) `insert@column contains only `@tempcnta
+% and `count@ counters. 4) `@@startpbox and
+% `@@endpbox now totally obsolete.}
+% \changes{v1.9d}{1988/05/10}{Replaced `number by `the where the `toks
+% registers' contents are used.}
+% \changes{v1.9e}{1988/05/11}{Re-introduced `@xargarraycr and
+% `@yargarraycr, since `endtemplate seems to
+% be `outer.}
+% \changes{v1.9f}{1988/05/20}{Small changes finally carried out:
+% 1) `par!=`@empty.
+% 2) \{..ifnum0!=!`\}... $\to$ `bgroup and
+% analogously `egroup.}
+% \changes{v1.9g}{1988/02/24}{Inserted again \{..ifnum0!=!`\}..,
+% c.f. Appendix D of the \protect\TeX{}book.}
+% \changes{v1.9h}{1988/06/28}{No longer necessary to read in the file
+% twice.}
+% \changes{v1.9i}{1988/06/28}{Corrected typo in german version.}
+% \changes{v1.9j}{1988/11/23}{In a `r' column an extra `kern`z@ is
+% needed.}
+% \changes{v1.9j}{1988/11/23}{Otherwise the `hfil on the left side
+% will be removed by the `unskip in
+% `insert@column if the entry is empty.}
+% \changes{v1.9k}{1988/06/28}{Corrected typo in german version.}
+% \changes{v1.9k}{1989/01/16}{`begin{Macro} changed to `begin{macro} in
+% documentation.}
+%
+% \changes{v2.0a}{1989/05/12}{{\tt\textbackslash @thetoks} changed to
+% {\tt\textbackslash the@toks}.}
+% \changes{v2.0a}{1989/05/12}{source changed to reflect new doc.sty
+% conventions.}
+% \changes{v2.0a}{1989/05/12}{t option renamed to p to be compatible to
+% the original.}
+% \changes{v2.0a}{1989/05/12}{File renamed from arraye.sty to
+% array.sty.}
+% \changes{v2.0b}{1989/05/17}{Three forgotten end macro added.}
+% \changes{v2.0b}{1989/05/17}{All lines shortened to 72 or less.}
+% \changes{v2.2a}{1994/02/03}{Upgrade to \LaTeXe}
+%
+% \DoNotIndex{\@depth,\@ehc,\@fortmp,\@height,\@ifnextchar,\@ifstar}
+% \DoNotIndex{\@ifundefined,\@ne,\@nil,\@tempa,\@tempb}
+% \DoNotIndex{\@tempcnta,\@tempd,\@tempdima,\@whilenum,\@width,\\}
+% \DoNotIndex{\@tforloop}
+% \DoNotIndex{\advance}
+% \DoNotIndex{\baselineskip,\begingroup,\bgroup}
+% \DoNotIndex{\cr,\crcr,\csname}
+% \DoNotIndex{\def,\do,\docdate,\dp}
+% \DoNotIndex{\edef,\egroup,\else,\endcsname,\endinput,\expandafter}
+% \DoNotIndex{\fi,\filedate,\fileversion}
+% \DoNotIndex{\gdef}
+% \DoNotIndex{\hbox,\hfil,\hsize,\hskip,\ht}
+% \DoNotIndex{\if,\ifcase,\ifdim,\ifnum,\ifx,\ignorespaces}
+% \DoNotIndex{\kern}
+% \DoNotIndex{\leavevmode,\let,\lineskip}
+% \DoNotIndex{\m@ne,\multispan}
+% \DoNotIndex{\newcount,\newdimen,\noalign}
+% \DoNotIndex{\or}
+% \DoNotIndex{\relax}
+% \DoNotIndex{\setbox,\space,\strutbox}
+% \DoNotIndex{\tabskip,\thr@@,\the,\toks,\toks@,\tw@,\typeout}
+% \DoNotIndex{\unhcopy,\unskip}
+% \DoNotIndex{\vbox,\vcenter,\vline,\vrule,\vtop,\vskip}
+% \DoNotIndex{\xdef}
+% \DoNotIndex{\z@}
+%
+% \GetFileInfo{array.sty}
+%
+% \title{A new implementation of \LaTeX's \textsf{tabular}
+% and \textsf{array} environment\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{Frank Mittelbach
+% \and
+% David Carlisle\thanks{David kindly agreed on the inclusion
+% of the \texttt{\textbackslash{}newcolumntype} implementation,
+% formerly in
+% \texttt{newarray.sty} into this package }}
+%
+% \date{Printed \today}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \MakeShortVerb{\=}
+%
+% \begin{abstract}
+% This article describes an extended implementation of the \LaTeX\
+% \textsf{array}-- and \textsf{tabular}--environments. The special
+% merits of this implementation are further options to format columns
+% and the fact that fragile \LaTeX--commands don't have to be
+% =\protect='ed any more within those environments.
+%
+% The major part of the code for this package dates back to 1988---so
+% does some of its documentation.
+% \end{abstract}
+%
+%
+%
+% \section{Introduction}
+%
+% This new implementation of the \textsf{array}-- and
+% \textsf{tabular}--environments is part of a larger project in which
+% we are trying to improve the \LaTeX\--code in some aspects and to
+% make \LaTeX\ even easier to handle.
+%
+% The reader should be familiar with the general structure of the
+% environments
+% mentioned above. Further information can be found in
+% \cite{bk:lamport} and \cite{bk:GMS94}.
+% The additional options which can be used in the
+% preamble as well as those which now have a slightly different meaning
+% are described in table~\ref{tab:opt}.
+%
+% \DescribeMacro\extrarowheight
+% Additionally we introduce a new
+% parameter called =\extrarowheight=. If it takes a positive
+% length, the value of the parameter is added to the normal height of
+% every row of the table, while
+% the depth will remain the same. This is important for tables
+% with horizontal lines because those lines normally touch the
+% capital letters.
+% For example, we used =\setlength{\extrarowheight}{1pt}=
+% in table~\ref{tab:opt}.
+%
+% \begin{table}[!t]
+% \begin{center}
+% \setlength{\extrarowheight}{1pt}
+% \begin{tabular}{|>{\tt}c|m{9cm}|}
+% \hline
+% \multicolumn{2}{|c|}{Unchanged options}\\
+% \hline
+% l & Left adjusted column. \\
+% c & Centered adjusted column. \\
+% r & Right adjusted column. \\
+% p\{width\} & Equivalent to =\parbox[t]{width}=. \\
+% @\{decl.\} & Suppresses inter-column space and inserts
+% \texttt{decl.}\ instead. \\
+% \hline
+% \multicolumn{2}{|c|}{New options}\\
+% \hline
+% m\{width\} & Defines a column of width \texttt{width}.
+% Every entry will be centered in proportion to
+% the rest of the line. It is somewhat like
+% =\parbox{width}=. \\
+% \hline
+% b\{width\} & Coincides with =\parbox[b]{width}=. \\
+% \hline
+% >\{decl.\} & Can be used before an \texttt{l}, \texttt{r},
+% \texttt{c}, \texttt{p}, \texttt{m} or a
+% \texttt{b} option. It inserts \texttt{decl.}\
+% directly in front of the entry of the column.
+% \\
+% \hline
+% <\{decl.\} & Can be used after an \texttt{l}, \texttt{r},
+% \texttt{c}, =p{..}=, =m{..}= or a =b{..}=
+% option. It inserts \texttt{decl.}\ right
+% after the entry of the column. \\
+% \hline
+% | & Inserts a vertical line. The distance between
+% two columns will be enlarged by the width of
+% the line
+% in contrast to the original definition of
+% \LaTeX. \\
+% \hline
+% !\{decl.\} & Can be used anywhere and corresponds with the
+% \texttt{|} option. The difference is that
+% \texttt{decl.} is inserted instead of a
+% vertical line, so this option doesn't
+% suppress the normally inserted space between
+% columns in contrast to =@{...}=.\\
+% \hline\hline
+% w\{align\}\{width\} & Sets the cell content in a box of the
+% specified \texttt{width} aligned according to
+% the \texttt{align} parameter which could be
+% either \texttt{l}, \texttt{c} or
+% \texttt{r}. Works essentially like
+% =\makebox[=width=][=align=]{=cell=}= so
+% silently overprints if the cell content is
+% wider than the specified width. If that is
+% not desired use \texttt{W} instead.\\
+% \hline
+% W\{align\}\{width\} & Like \texttt{w} but spits out an overfull
+% box warning (and an overfullrule marker in
+% draft mode) when the cell content is too wide
+% to fit. This also means that the alignment is
+% different if there is too much material,
+% because it then always protrudes to the right!\\
+% \hline
+% \end{tabular}
+% \end{center}
+% \caption{The preamble options.} \label{tab:opt}
+% \end{table}
+%
+%
+% We will discuss a few examples using the new preamble options before
+% dealing with the implementation.
+% \begin{itemize}
+% \item
+% If you want to use a special font (for example =\bfseries=) in a
+% flushed left column, this can be done with =>{\bfseries}l=. You
+% do not have to begin every entry of the column with =\bfseries=
+% any more.
+% \item
+% In columns which have been generated with \texttt{p}, \texttt{m}
+% or \texttt{b}, the default value of =\parindent= is
+% \textsf{0pt}.
+% This can be changed with \\
+% =>{\setlength{\parindent}{1cm}}p=.
+% \item
+% The \texttt{>}-- and \texttt{<}--options were originally
+% developed for the following application:
+% =>{$}c<{$}= generates a column in math
+% mode in a \textsf{tabular}--environment. If you use this type
+% of a preamble in an \textsf{array}--environment, you get a
+% column in LR mode because the additional \$'s cancel the
+% existing \$'s.
+% \item
+% One can also think of more complex applications. A problem
+% which has
+% been mentioned several times in \TeX{}hax can be solved with
+% =>{\centerdots}c=\linebreak[0]=<{\endcenterdots}=.
+% To center decimals at their
+% decimal points you (only?) have to define the following macros:
+% \begin{verbatim}
+%{\catcode`\.\active\gdef.{\egroup\setbox2\hbox\bgroup}}
+%\def\centerdots{\catcode`\.\active\setbox0\hbox\bgroup}
+%\def\endcenterdots{\egroup\ifvoid2 \setbox2\hbox{0}\fi
+% \ifdim \wd0>\wd2 \setbox2\hbox to\wd0{\unhbox2\hfill}\else
+% \setbox0\hbox to\wd2{\hfill\unhbox0}\fi
+% \catcode`\.12 \box0.\box2}
+%\end{verbatim}
+% Warning: The code is bad, it doesn't work with more than one
+% dot in a cell and doesn't work when the tabular is used in the
+% argument of some other command. A much better version is
+% provided in the \texttt{dcolumn.sty} by David Carlisle.
+% \item
+% Using =c!{\hspace{1cm}}c= you get space between two
+% columns which is enlarged by one centimeter, while
+% =c@{\hspace{1cm}}c= gives you exactly one centimeter
+% space between two columns.
+%
+% \item
+% A declaration like =w{l}{3cm}= (or even shorter =wl{3cm}=)
+% works like an =l= column except that the width will always be
+% =3cm= regardless of the cell content. Same with =w{c}= or
+% =w{r}=. This means that it is easy to set up tables in which all
+% columns have predefined widths.
+% \end{itemize}
+%
+% \subsection{Defining new column specifiers}
+%
+% \DeleteShortVerb{\=}
+% \MakeShortVerb{\"}
+% \DescribeMacro{\newcolumntype}
+% Whilst it is handy to be able to type
+% \begin{quote}
+% ">{"\meta{some declarations}"}{c}<{"\meta{some more
+% declarations}"}"
+% \end{quote}
+% if you have a one-off column in a table, it is rather inconvenient
+% if you often use columns of this form. The new version allows you
+% to define a new column specifier, say \texttt{x}, which will expand to
+% the primitives column specifiers.\footnote{This command was named
+% \texttt{\textbackslash{}newcolumn} in the \texttt{newarray.sty}.
+% At the moment \texttt{\textbackslash{}newcolumn} is still supported
+% (but gives a warning). In later releases it will vanish.} Thus we
+% may define
+% \begin{quote}
+% "\newcolumntype{x}{>{"\meta{some declarations}"}{c}<{"\meta{some
+% more declarations}"}}"\hspace*{-3cm} ^^A no overfull from this line
+% \end{quote}
+% One can then use the \texttt{x} column specifier in the preamble
+% arguments of all \texttt{array} or \texttt{tabular} environments in
+% which you want columns of this form.
+%
+% It is common to need math-mode and LR-mode columns in the same
+% alignment. If we define:
+% \begin{quote}
+% "\newcolumntype{C}{>{$}c<{$}}" \\
+% "\newcolumntype{L}{>{$}l<{$}}" \\
+% "\newcolumntype{R}{>{$}r<{$}}"
+% \end{quote}
+% Then we can use \texttt{C} to get centred LR-mode in an
+% \texttt{array}, or centred math-mode in a \texttt{tabular}.
+%
+% The example given above for `centred decimal points' could be
+% assigned to a \texttt{d} specifier with the following command.
+% \begin{quote}
+% "\newcolumntype{d}{>{\centerdots}c<{\endcenterdots}}"
+% \end{quote}
+%
+% The above solution always centres the dot in the
+% column. This does not look too good if the column consists of large
+% numbers, but to only a few decimal places. An alternative definition
+% of a \texttt{d} column is
+% \begin{quote}
+% "\newcolumntype{d}[1]{>{\rightdots{#1}}r<{\endrightdots}}"
+% \end{quote}
+% where the appropriate macros in this case are:\footnote{The package
+% \texttt{dcolumn.sty} contains more robust macros based on these
+% ideas.}
+% \begin{verbatim}
+% \def\coldot{.}% Or if you prefer, \def\coldot{\cdot}
+% {\catcode`\.=\active
+% \gdef.{$\egroup\setbox2=\hbox to \dimen0 \bgroup$\coldot}}
+% \def\rightdots#1{%
+% \setbox0=\hbox{$1$}\dimen0=#1\wd0
+% \setbox0=\hbox{$\coldot$}\advance\dimen0 \wd0
+% \setbox2=\hbox to \dimen0 {}%
+% \setbox0=\hbox\bgroup\mathcode`\.="8000 $}
+% \def\endrightdots{$\hfil\egroup\box0\box2}
+%\end{verbatim}
+% Note that "\newcolumntype" takes the same optional argument as
+% "\newcommand" which declares the number of arguments of the column
+% specifier being defined. Now we can specify "d{2}" in our preamble
+% for a column of figures to at most two decimal places.
+%
+% A rather different use of the "\newcolumntype" system takes
+% advantage of the fact that the replacement text in the
+% "\newcolumntype" command may refer to more than one column. Suppose
+% that a document contains a lot of \texttt{tabular} environments that
+% require the same preamble, but you wish to experiment with different
+% preambles. Lamport's original definition allowed you to do the
+% following (although it was probably a mis-use of the system).
+% \begin{quote}
+% "\newcommand{\X}{clr}"\\
+% "\begin{tabular}{\X}" \ldots
+% \end{quote}
+% \texttt{array.sty} takes great care \textbf{not} to expand the
+% preamble, and so the above does not work with the new scheme. With
+% the new version this functionality is returned:
+% \begin{quote}
+% "\newcolumntype{X}{clr}"\\
+% "\begin{tabular}{X}" \ldots
+% \end{quote}
+%
+% The replacement text in a "\newcolumntype" command may refer to any of
+% the primitives of \texttt{array.sty} see table \ref{tab:opt} on page
+% \pageref{tab:opt}, or to any new letters defined in other
+% "\newcolumntype" commands.
+%
+%
+% \DescribeMacro{\showcols}A list of all the currently active
+% "\newcolumntype" definitions is sent to the terminal and log file if
+% the "\showcols" command is given.
+%
+%
+% \subsection{Special variations of \texttt{\textbackslash hline}}
+%
+% The family of \texttt{tabular} environments allows
+% vertical positioning with respect to the baseline of
+% the text in which the environment appears. By default the
+% environment appears centered, but this can be changed to
+% align with the first or last line in the environment by
+% supplying a \texttt{t} or \texttt{b} value to the
+% optional position argument. However, this does not work
+% when the first or last element in the environment is a
+% "\hline" command---in that case the environment is
+% aligned at the horizontal rule.
+%
+% \pagebreak[3]
+%
+% Here is an example:
+% \begin{center}
+% \begin{minipage}[t]{.4\linewidth}
+% Tables
+% \begin{tabular}[t]{l}
+% with no\\ hline \\ commands \\ used
+% \end{tabular} versus \\ tables
+% \begin{tabular}[t]{|l|}
+% \hline
+% with some \\ hline \\ commands \\
+% \hline
+% \end{tabular} used.
+% \end{minipage}
+% \begin{minipage}[t]{.5\linewidth}
+% \begin{verbatim}
+% Tables
+% \begin{tabular}[t]{l}
+% with no\\ hline \\ commands \\ used
+% \end{tabular} versus tables
+% \begin{tabular}[t]{|l|}
+% \hline
+% with some \\ hline \\ commands \\
+% \hline
+% \end{tabular} used.
+% \end{verbatim}
+% \end{minipage}
+% \end{center}
+%
+% \DescribeMacro\firsthline
+% \DescribeMacro\lasthline
+% Using "\firsthline" and "\lasthline" will
+% cure the problem, and the tables will align properly as long
+% as their first or last line does not contain extremely large
+% objects.
+% \begin{center}
+% \begin{minipage}[t]{.4\linewidth}
+% Tables
+% \begin{tabular}[t]{l}
+% with no\\ line \\ commands \\ used
+% \end{tabular} versus \\ tables
+% \begin{tabular}[t]{|l|}
+% \firsthline
+% with some \\ line \\ commands \\
+% \lasthline
+% \end{tabular} used.
+% \end{minipage}
+% \begin{minipage}[t]{.5\linewidth}
+% \begin{verbatim}
+% Tables
+% \begin{tabular}[t]{l}
+% with no\\ line \\ commands \\ used
+% \end{tabular} versus tables
+% \begin{tabular}[t]{|l|}
+% \firsthline
+% with some \\ line \\ commands \\
+% \lasthline
+% \end{tabular} used.
+% \end{verbatim}
+% \end{minipage}
+% \end{center}
+% \DescribeMacro\extratabsurround
+% The implementation of these two commands contains an extra
+% dimension, which is called "\extratabsurround", to add some
+% additional space at the top and the bottom of such an environment.
+% This is useful if such tables are nested.
+%
+% \section{Final Comments}
+%
+% \subsection{Handling of rules}
+%
+% There are two possible approaches to the handling of horizontal and
+% vertical rules in tables:
+% \begin{enumerate}
+% \item rules can be placed into the available space without
+% enlarging the table, or
+% \item rules can be placed between columns or rows thereby enlarging
+% the table.
+% \end{enumerate}
+% \texttt{array.sty} implements the second possibility while the
+% default implementation in the \LaTeX{} kernel implements the first
+% concept. Both concepts have their merits but one has to be aware of
+% the individual implications.
+% \begin{itemize}
+% \item
+% With standard \LaTeX{} adding rules to a table will not affect the
+% width or height of the table (unless double rules are used), e.g.,
+% changing a preamble from \verb=lll= to \verb=l|l|l= does not
+% affect the document other than adding rules to the table. In
+% contrast, with \texttt{array.sty} a table that just fit the
+% \verb=\textwidth= might now produce an overfull box.
+% \item
+% With standard \LaTeX{} modifying the width of rules could result
+% in ugly looking tables because without adjusting the
+% \verb=\tabcolsep=, etc.\ the space between rule and column could
+% get too small (or too large). In fact even overprinting of text is
+% possible. In contrast, with \texttt{array.sty} modifying any such
+% length usually works well as the actual visual white space (from
+% \verb=\tabcolsep=, etc.) does not depend on the width of the
+% rules.
+% \item
+% With standard \LaTeX{} boxed tabulars actually have strange
+% corners because the horizontal rules end in the middle of the
+% vertical ones. This looks very unpleasant when a large
+% \verb=\arrayrulewidth= is chosen. In that case a simple table like
+%\begin{verbatim}
+%\setlength{\arrayrulewidth}{5pt}
+%\begin{tabular}{|l|}
+% \hline A \\ \hline
+%\end{tabular}
+%\end{verbatim}
+% will produce something like
+% \begin{center}
+%\setlength{\arrayrulewidth}{5pt}
+%\begin{tabular}{@{}l@{}}
+% \hline \null\hskip-.5\arrayrulewidth\vline
+% \hskip\tabcolsep
+% A\hskip\tabcolsep
+% \vline\hskip-.5\arrayrulewidth\null \\ \hline
+%\end{tabular}
+% \quad
+% instead of
+% \quad
+%\begin{tabular}{|l|}
+% \hline A \\ \hline
+%\end{tabular}
+% \end{center}
+% \end{itemize}
+%
+% \subsection{Comparisons with older versions of \texttt{array.sty}}
+%
+% There are some differences in the way version 2.1 treats incorrect
+% input, even if the source file does not appear to use any of the
+% extra features of the new version.
+% \begin{itemize}
+% \item A preamble of the form "{wx*{0}{abc}yz}" was treated by
+% versions prior to 2.1 as "{wx}". Version 2.1 treats it as "{wxyz}"
+% \item An incorrect positional argument such as \texttt{[Q]} was
+% treated as \texttt{[c]} by \texttt{array.sty}, but is now treated as
+% \texttt{[t]}.
+% \item A preamble such as "{cc*{2}}" with an error in
+% a $*$-form will generate different errors in the new version. In
+% both cases the error message is not particularly helpful to the
+% casual user.
+% \item Repeated \texttt{<} or \texttt{>} constructions
+% generated an error in earlier versions, but are now allowed in
+% this package. ">{"\meta{decs1}"}>{"\meta{decs2}"}" is treated the
+% same as ">{"\meta{decs2}\meta{decs1}"}".
+% \item The "\extracolsep"
+% command does not work with the old versions of \texttt{array.sty},
+% see the comments in \texttt{array.bug}. With version 2.1
+% "\extracolsep" may again be used in \texttt{@}-expressions as in
+% standard \LaTeX, and also in \texttt{!}-expressions (but see the
+% note below).
+% \end{itemize}
+%
+% Prior to version 2.4f the space added by the optional argument to "\\"
+% was added inside an m-cell if the last column was of type
+% \texttt{m}. As a result that cell was vertically centered with that
+% space inside, resulting in a strange offset. Since 2.4f, this space
+% is now added after centering the cell.
+%
+% A similar problem happened when "\extrarowheight" was used. For that
+% reason m-cells now manually position the cell content which
+% allows to ignore this extra space request during the vertical aligment.
+%
+%
+% \subsection{Bugs and Features}
+%
+% \begin{itemize}
+% \item Error messages generated when parsing the column specification
+% refer to the preamble argument \textbf{after} it has been re-written
+% by the "\newcolumntype" system, not to the preamble entered by the
+% user. This seems inevitable with any system based on
+% pre-processing and so is classed as a \textbf{feature}.
+%
+% \item The treatment of multiple \texttt{<} or \texttt{>}
+% declarations may seem strange at first. Earlier implementations
+% treated ">{"\meta{decs1}"}>{"\meta{decs2}"}" the same as
+% ">{"\meta{decs1}\meta{decs2}"}". However this did not give the
+% user the opportunity of overriding the settings of a
+% "\newcolumntype" defined using these declarations. For example,
+% suppose in an \texttt{array} environment we use a \texttt{C}
+% column defined as above. The \texttt{C} specifies a centred text
+% column, however ">{\bfseries}C", which re-writes to
+% ">{\bfseries}>{$}c<{$}" would not specify a bold column as might
+% be expected, as the preamble would essentially expand to
+% "\hfil$\bfseries$#$ $\hfil" and so the column entry would not be in the
+% scope of the "\bfseries"\,! The present version switches the order
+% of repeated declarations, and so the above example now produces a
+% preamble of the form "\hfil$" "$\bfseries#$" "$\hfil", and the
+% dollars cancel each other out without limiting the scope of the
+% "\bfseries".
+%
+% \item The use of "\extracolsep" has been subject to the following
+% two restrictions. There must be at most one "\extracolsep"
+% command per "@", or "!" expression and the command must be
+% directly entered into the "@" expression, not as part of a macro
+% definition. Thus "\newcommand{\ef}{\extracolsep{\fill}}" \ldots
+% "@{\ef}" does not work with this package. However you can use
+% something like
+% "\newcolumntype{e}{@{\extracolsep{\fill}}" instead.
+%
+% \item As noted by the \LaTeX{} book, for the purpose of
+% "\multicolumn" each column with the exception of the first one
+% consists of the entry and the \emph{following} inter-column
+% material. This means that in a tabular with the preamble
+% "|l|l|l|l|" input such as "\multicolumn{2}{|c|}" in
+% anything other than the first column is incorrect.
+
+% In the standard array/tabular implementation this error is not so
+% noticeable as that version contains negative spacing so that each
+% "|" takes up no horizontal space. But since in this package the
+% vertical lines take up their natural width one sees two lines if
+% two are specified.
+%
+% \end{itemize}
+%
+%
+%
+% \changes{v2.2b}{1994/02/04}{Removed interactive prompt}
+%
+% \StopEventually{
+%
+%
+% \begin{thebibliography}{1}
+% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
+% and \textsc{A.~Samarin}.
+% \newblock The \LaTeX{} Companion.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1994.
+% \bibitem{bk:knuth} \textsc{D. E. Knuth}.
+% \newblock The \TeX{}book (Computers \& Typesetting Volume A).
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1986.
+% \bibitem{bk:lamport} \textsc{L. Lamport}.
+% \newblock
+% \LaTeX\ --- A Document Preparation System.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1986.
+% \end{thebibliography}
+%
+% } ^^A end of \StopEventually
+%
+%
+%
+%
+% \section{The documentation driver file}
+%
+% The first bit of code contains the documentation driver file for
+% \TeX{}, i.e., the file that will produce the documentation you are
+% currently reading. It will be extracted from this file by the
+% \texttt{docstrip} program.
+% \begin{macrocode}
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+\documentclass{ltxdoc}
+
+\AtBeginDocument{\DeleteShortVerb{\|}} % undo the default is not used
+
+ \usepackage{array}
+
+ % Allow large table at bottom
+ \renewcommand{\bottomfraction}{0.7}
+
+\EnableCrossrefs
+ %\DisableCrossrefs % Say \DisableCrossrefs if index is ready
+
+\RecordChanges % Gather update information
+
+\CodelineIndex % Index code by line number
+
+ %\OnlyDescription % comment out for implementation details
+ %\OldMakeindex % use if your MakeIndex is pre-v2.9
+\begin{document}
+ \DocInput{array.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+%
+% \section{The construction of the preamble}
+%
+% \DeleteShortVerb{\"}
+% \MakeShortVerb{\=}
+%
+% It is obvious that those environments will consist mainly of an
+% =\halign=, because \TeX\ typesets tables using this primitive.
+% That is why we will now take a look at the algorithm which determines
+% a preamble for a =\halign= starting with a given user preamble
+% using the options mentioned above.
+%
+%
+% The current version is defined at the top of the file looking
+% something like this
+% \begin{macrocode}
+%<*package>
+%\NeedsTeXFormat{LaTeX2e}[1994/05/13]
+%\ProvidesPackage{array}[\filedate\space version\fileversion]
+% \end{macrocode}
+%
+% The most interesting macros of this implementation are without doubt
+% those which are responsible for the construction of the preamble for
+% the =\halign=. The underlying algorithm was developed by
+% \textsc{Lamport} (resp.\ \textsc{Knuth}, see texhax V87\#??), and it
+% has been extended and improved.
+%
+% The user preamble will be read \textsf{token} by \textsf{token}. A
+% \textsf{token} is a single character like \texttt{c} or a block
+% enclosed in ={...}=. For example the preamble of
+% =\begin{tabular}=\linebreak[0]={lc||c@{\hspace{1cm}}}= consists of
+% the \textsf{token} \texttt{l}, \texttt{c}, \texttt{|}, \texttt{|},
+% \texttt{@} and =\hspace{1cm}=.
+%
+% The currently used \textsf{token} and the one, used before, are needed
+% to decide on how the construction of the preamble has to be
+% continued.
+% In the example mentioned above the \texttt{l} causes the preamble
+% to begin with =\hskip\tabcolsep=. Furthermore
+% =# \hfil= would be appended to define a flush left column.
+% The next \textsf{token} is a \texttt{c}. Because it was preceded by an
+% \texttt{l} it generates a new column. This is done with
+% =\hskip \tabcolsep & \hskip \tabcolsep=. The column which is to
+% be centered will be appended with =\hfil # \hfil=.
+% The \textsf{token} \texttt{|} would then add a space of
+% =\hskip \tabcolsep=
+% and a vertical line because the last
+% \textsf{tokens} was a \texttt{c}.
+% The following \textsf{token} \texttt{|} would only add a space
+% =\hskip \doublerulesep= because it was preceded by the
+% \textsf{token} \texttt{|}. We will not discuss our example further but
+% rather take a look at the general case of constructing preambles.
+%
+% The example shows that the desired preamble for the
+% =\halign= can be constructed as soon as the action of all
+% combinations
+% of the preamble \textsf{tokens} are specified. There are 18 such
+% \textsf{tokens}
+% so we have $19 \cdot 18 \string= 342$ combinations if we count the
+% beginning of
+% the preamble as a special \textsf{token}. Fortunately, there are many
+% combinations which generate the same spaces, so we can define
+% \textsf{token} classes. We will identify a
+% \textsf{token} within a class with a number, so we can insert the
+% formatting (for example of a column).
+% Table~\ref{tab:Klassen} lists all \textsf{token} classes and
+% their corresponding numbers.
+% \begin{table}[ht]
+% \begin{center}
+% \begin{tabular}[t]{>{\ttfamily}ccc}
+% \textsf{token} & =\@chclass= & =\@chnum= \\[2mm]
+% c & 0 & 0 \\
+% l & 0 & 1 \\
+% r & 0 & 2 \\
+% p-arg & 0 & 3 \\
+% t-arg & 0 & 4 \\
+% b-arg & 0 & 5 \\
+% | & 1 & 0 \\
+% !-arg & 1 & 1 \\
+% <-arg & 2 & --- \\
+% >-arg & 3 & ---
+% \end{tabular}
+% \kern3mm \vrule \kern3mm%
+% \begin{tabular}[t]{>{\ttfamily}ccc}
+% \textsf{token} & =\@chclass= & =\@chnum= \\[2mm]
+% Start & 4 & --- \\
+% @-arg & 5 & --- \\
+% ! & 6 & --- \\
+% @ & 7 & --- \\
+% < & 8 & --- \\
+% > & 9 & --- \\
+% p & 10 & 3 \\
+% t & 10 & 4 \\
+% b & 10 & 5
+% \end{tabular}
+% \end{center}
+% \caption{Classes of preamble \textsf{tokens}}
+% \label{tab:Klassen}
+% \end{table}
+%
+%
+% \begin{macro}{\@chclass}
+% \begin{macro}{\@chnum}
+% \begin{macro}{\@lastchclass}
+% The class and the number of the current \textsf{token} are saved in
+% the
+% \textsf{count} registers =\@chclass=
+% and =\@chnum=, while the class of the previous
+% \textsf{token} is stored in the
+% \textsf{count} register =\@lastchclass=.
+% All of the mentioned registers are already allocated in
+% \texttt{latex.tex},
+% which is the reason why the following three lines of code are
+% commented out.
+% Later throughout the text I will not mention it again explicitly
+% whenever I use a =%= sign. These parts are already defined in
+% \texttt{latex.tex}.
+% \begin{macrocode}
+% \newcount \@chclass
+% \newcount \@chnum
+% \newcount \@lastchclass
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@addtopreamble}
+% We will save the already constructed preamble for
+% the =\halign=
+% in the global macro =\@preamble=. This will then be
+% enlarged with
+% the command =\@addtopreamble=.
+% \begin{macrocode}
+\def\@addtopreamble#1{\xdef\@preamble{\@preamble #1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \subsection{The character class of a \textsf{token}}
+%
+% \begin{macro}{\@testpach}
+% \changes{v2.0a}{1989/05/12}{p option renamed to m (middle).}
+% \changes{v2.0a}{1989/05/12}{t option renamed to p to be compatible to
+% the original.}
+% With the help of =\@lastchclass= we can now define a macro
+% which determines the class and the number of a given preamble
+% \textsf{token}
+% and assigns them to the registers
+% =\@chclass= and =\@chnum=.
+% \changes{v2.0f}{1992/02/29}{Argument removed since implicitly known}
+% \begin{macrocode}
+\def\@testpach{\@chclass
+% \end{macrocode}
+% First we deal with the cases in which the \textsf{token}
+% (=#1=) is the argument of \texttt{!}, \texttt{@}, \texttt{<} or
+% \texttt{>}. We can see this from the value of =\@lastchclass=:
+% \begin{macrocode}
+ \ifnum \@lastchclass=6 \@ne \@chnum \@ne \else
+ \ifnum \@lastchclass=7 5 \else
+ \ifnum \@lastchclass=8 \tw@ \else
+ \ifnum \@lastchclass=9 \thr@@
+% \end{macrocode}
+% Otherwise we will assume that the \textsf{token} belongs to the
+% class $0$
+% and assign the corresponding number to =\@chnum= if our
+% assumption is correct.
+% \begin{macrocode}
+ \else \z@
+% \end{macrocode}
+% If the last \textsf{token} was a \texttt{p}, \texttt{m} or a
+% \texttt{b}, =\@chnum= already has the right value. This is the
+% reason for the somewhat curious choice of the \textsf{token}
+% numbers in class $10$.
+% \begin{macrocode}
+ \ifnum \@lastchclass = 10 \else
+% \end{macrocode}
+% Otherwise we will check if =\@nextchar= is either a \texttt{c},
+% \texttt{l} or an \texttt{r}. Some applications change the
+% catcodes of certain characters like ``\texttt{@}'' in
+% \texttt{amstex.sty}. As a result the tests below would fail since
+% they assume non-active character tokens. Therefore we evaluate
+% =\@nextchar= once thereby turning the first token of its
+% replacement text into a char. At this point here this should have
+% been the only char present in =\@nextchar= which put into via a
+% =\def=.
+% \changes{v2.0f}{1992/02/29}{Ensure to test a char which is not active}
+% \begin{macrocode}
+ \edef\@nextchar{\expandafter\string\@nextchar}%
+ \@chnum
+ \if \@nextchar c\z@ \else
+ \if \@nextchar l\@ne \else
+ \if \@nextchar r\tw@ \else
+% \end{macrocode}
+% If it is a different \textsf{token}, we know that the class was
+% not $0$. We assign the value $0$ to =\@chnum= because this value
+% is needed for the \texttt{|}--\textsf{token}. Now we must check
+% the remaining classes. Note that the value of =\@chnum= is
+% insignificant here for most classes.
+% \begin{macrocode}
+ \z@ \@chclass
+ \if\@nextchar |\@ne \else
+ \if \@nextchar !6 \else
+ \if \@nextchar @7 \else
+ \if \@nextchar <8 \else
+ \if \@nextchar >9 \else
+% \end{macrocode}
+% The remaining permitted \textsf{tokens} are \texttt{p},
+% \texttt{m} and \texttt{b} (class $10$).
+% \begin{macrocode}
+ 10
+ \@chnum
+ \if \@nextchar m\thr@@\else
+ \if \@nextchar p4 \else
+ \if \@nextchar b5 \else
+% \end{macrocode}
+% Now the only remaining possibility is a forbidden \textsf{token},
+% so we choose class $0$ and number $0$ and give an error message.
+% Then we finish the macro by closing all =\if='s.
+% \begin{macrocode}
+ \z@ \@chclass \z@ \@preamerr \z@ \fi \fi \fi \fi
+ \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%
+% \subsection{Multiple columns ($*$--form)}
+%
+% \begin{macro}{\@xexpast}
+% \begin{macro}{\the@toks}
+% \begin{macro}{\the@toksz}
+% \label{@xexpast} Now we discuss the macro that deletes all forms
+% of type =*{=\textit{N\/}=}{=\textit{String\/}=}= from a user
+% preamble and replaces them with \textit{N} copies of
+% \textit{String}. Nested $*$--expressions are dealt with
+% correctly, that means $*$--expressions are not substituted if
+% they are in explicit braces, as in =@{*}=.
+%
+% This macro is called via
+% =\@xexpast=\meta{preamble}=*0x\@@=.
+% The $*$--expression =*0x= is being used to terminate the
+% recursion,
+% as we shall see later, and =\@@= serves as an argument
+% delimiter. =\@xexpast= has four arguments. The first
+% one is the part of the
+% user preamble before the first $*$--expression while the second
+% and third ones are the arguments of the first $*$--expression
+% (that is \textit{N} and \textit{String} in the notation mentioned
+% above).
+% The fourth argument is the rest of the preamble.
+% \begin{macrocode}
+\def\@xexpast#1*#2#3#4\@@{%
+% \end{macrocode}
+% The number of copies of \textit{String} (=#2=) that are to be
+% produced will be saved in a \textsf{count} register.
+% \begin{macrocode}
+ \@tempcnta #2
+% \end{macrocode}
+% We save the part of the preamble which does not
+% contain a $*$--form (=#1=)
+% in a \PlainTeX\ \textsf{token} register.
+% We also save \textit{String} (=#3=) using a \LaTeX\
+% \textsf{token} register.
+% \begin{macrocode}
+ \toks@={#1}\@temptokena={#3}%
+% \end{macrocode}
+% Now we have to use a little trick to produce \textit{N} copies of
+% \textit{String}.
+% We could try =\def\@tempa{#1}= and then
+% \textit{N} times =\edef\@tempa{\@tempa#3}=. This would have the
+% undesired effect that all macros within =#1= and =#3=
+% would be expanded, although, for example, constructions like
+% =@{..}= are not supposed to be changed.
+% That is why we =\let= two control sequences to
+% be equivalent to =\relax=.
+% \begin{macrocode}
+ \let\the@toksz\relax \let\the@toks\relax
+% \end{macrocode}
+% Then we ensure that =\@tempa= contains
+% ={\the@toksz\the@toks...\the@toks}= (the macro
+% =\the@toks= exactly \textit{N\/} times) as substitution text.
+% \begin{macrocode}
+ \def\@tempa{\the@toksz}%
+ \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+% \end{macrocode}
+% If \textit{N\/} was greater than zero we prepare for another call
+% of =\@xexpast=. Otherwise we assume we have reached the end of
+% the user preamble, because we had appended =*0x\@@= when we first
+% called =\@xexpast=. In other words: if the user inserts
+% =*{0}{..}= in his preamble, \LaTeX\ ignores the rest of it.
+% \begin{macrocode}
+ \let \@tempb \@xexpast \else
+ \let \@tempb \@xexnoop \fi
+% \end{macrocode}
+% Now we will make sure that the part of the user preamble, which
+% was already dealt with, will be saved again in =\@tempa=.
+% \begin{macrocode}
+ \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ \edef\@tempa{\@tempa}%
+% \end{macrocode}
+% We have now evaluated the first $*$--expression, and the user
+% preamble up to this point
+% is saved in =\@tempa=. We will put the contents of
+% =\@tempa= and the rest of the user preamble together and work
+% on the result with =\@tempb=. This macro either corresponds
+% to =\@xexpast=, so that the next
+% $*$--expression is handled, or to the macro =\@xexnoop=,
+% which only ends the recursion by deleting its argument.
+% \begin{macrocode}
+ \expandafter \@tempb \@tempa #4\@@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@xexnoop}
+% So the first big problem is solved. Now it is easy to
+% specify =\@xexnoop=.
+% Its argument is delimited by =\@@= and it simply expands to
+% nothing.
+% \begin{macrocode}
+% \def\@xexnoop#1\@@{}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \section{The insertion of declarations
+% (\texttt{>}, \texttt{<}, \texttt{!}, \texttt{@})}
+%
+%
+% The preamble will be enlarged with the help of =\xdef=, but the
+% arguments of \texttt{>}, \texttt{<},~\texttt{!}\ and \texttt{@} are
+% not supposed to be expanded during the construction (we want an
+% implementation that doesn't need a =\protect=). So we have to find a
+% way to inhibit the expansion of those arguments.
+%
+% We will solve this problem with \textsf{token} registers. We need
+% one register for every \texttt{!}\ and \texttt{@}, while we need two
+% for every \texttt{c}, \texttt{l}, \texttt{r}, \texttt{m}, \texttt{p}
+% or \texttt{b}. This limits the number of columns of a table because
+% there are only 256 \textsf{token} registers. But then, who needs
+% tables with more than 100 columns?
+%
+% One could also find a solution which only needs two or three
+% \textsf{token} registers by proceeding similarly as in the macro
+% =\@xexpast= (see page \pageref{@xexpast}). The advantage of our
+% approach is the fact that we avoid some of the problems that arise
+% with the other method\footnote{Maybe there are also historical
+% reasons.}.
+%
+% So how do we proceed? Let us assume that we had =!{foo}= in the
+% user preamble and say we saved \texttt{foo} in
+% \textsf{token} register $5$. Then we call
+% =\@addtopreamble{\the@toks5}= where
+% =\the@toks= is defined in a way that it does not expand
+% (for example it could be equivalent to =\relax=). Every
+% following call
+% of =\@addtopreamble= leaves =\the@toks5= unchanged in
+% =\@preamble=. If the construction of the preamble is completed
+% we change the definition of =\the@toks= to
+% =\the\toks= and expand =\@preamble= for the last time.
+% During this process all parts of the form
+% =\the@toks=\meta{Number}
+% will be substituted by the contents of the respective \textsf{token}
+% registers.
+%
+% As we can see from this informal discussion the construction of the
+% preamble has to take place within a group, so that the
+% \textsf{token} registers we use will be freed later on. For that
+% reason we keep all assignments to =\@preamble= global; therefore the
+% replacement text of this macro will remain the same after we leave
+% the group.
+%
+% \begin{macro}{\count@}
+% We further need a \textsf{count} register to remember which
+% \textsf{token} register is to be used next. This will be
+% initialized with $-1$ if we want to begin with the \textsf{token}
+% register $0$. We use the \PlainTeX\ scratch register =\count@=
+% because everything takes place locally. All we have to do is
+% insert =\the@toks= =\the= =\count@= into the preamble.
+% =\the@toks= will remain unchanged and =\the\count@= expands into
+% the saved number.
+% \end{macro}
+%
+% \begin{macro}{\prepnext@tok}
+% The macro =\prepnext@tok= is in charge of preparing the next
+% \textsf{token} register. For that purpose we increase
+% =\count@= by $1$:
+% \begin{macrocode}
+\def\prepnext@tok{\advance \count@ \@ne
+% \end{macrocode}
+% Then we locally delete any contents the
+% \textsf{token} register might have.
+% \begin{macrocode}
+ \toks\count@{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\save@decl}
+% During the construction of the preamble the current
+% \textsf{token} is always saved in the macro =\@nextchar= (see the
+% definition of =\@mkpream= on page \pageref{@mkpream}). The macro
+% =\save@decl= saves it into the next free \textsf{token} register,
+% i.e.\ in =\toks\count@=.
+% \changes{v2.0c}{1990/08/14}{\cs{relax} removed and added elsewhere.}
+% \begin{macrocode}
+\def\save@decl{\toks\count@ \expandafter{\@nextchar}}
+% \end{macrocode}
+% The reason for the use of =\relax= is the following
+% hypothetical situation in the preamble:
+% \quad =..\the\toks1\the\toks2..= \quad \TeX\ expands
+% =\the\toks2= first in order to find out if the digit =1=
+% is followed by other digits. E.g.\ a =5= saved in the
+% \textsf{token} register $2$ would lead \TeX\ to insert the contents
+% of \textsf{token} register $15$ instead of $1$ later on.
+%
+% The example above referred to an older version of =\save@decl= which
+% inserted a =\relex= inside the token register. This is now moved to
+% the places where the actual token registers are inserted (look for
+% =\the@toks=) because the old version would still make =@=
+% expressions to moving arguments since after expanding the second
+% register while looking for the end of the number the contents of the
+% token register is added so that later on the whole register will be
+% expanded. This serious bug was found after nearly two years
+% international use of this package by Johannes Braams.
+% \end{macro}
+%
+%
+%
+% How does the situation look like, if we want to add another column
+% to the preamble, i.e.\ if we have found a \texttt{c}, \texttt{l},
+% \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in the user
+% preamble? In this case we have the problem of the \textsf{token}
+% register from =>{..}= and =<{..}= having to be inserted at this
+% moment because formatting instructions like =\hfil= have to be set
+% around them. On the other hand it is not known yet, if any =<{..}=
+% instruction will appear in the user preamble at all.
+%
+% We solve this problem by adding two \textsf{token} registers at a
+% time. This explains, why we have freed the \textsf{token} registers
+% in =\prepnext@tok=.
+%
+% \begin{macro}{\insert@column}
+% \begin{macro}{\@sharp}
+% We now define the macro =\insert@column= which will do
+% this work for us.
+% \begin{macrocode}
+\def\insert@column{%
+% \end{macrocode}
+% Here, we assume that the \textsf{count} register
+% =\@tempcnta= has saved the value $=\count@= - 1$.
+% \begin{macrocode}
+ \the@toks \the \@tempcnta
+% \end{macrocode}
+% Next follows the =#= sign which specifies the place
+% where the text of the column shall be inserted. To avoid
+% errors during the expansions in
+% =\@addtopreamble= we hide this sign in the command
+% =\@sharp= which is temporarily occupied with
+% =\relax= during the build-up of the preamble.
+% To remove unwanted spaces before and after the column text, we set
+% an =\ignorespaces= in front and a =\unskip= afterwards.
+% \changes{v2.0e}{1991/02/07}{Added \{\} around \cs{@sharp} for new ftsel}
+% \changes{v2.0h}{1992/06/22}{Removed \{\} again in favour of
+% \cs{d@llarbegin}}
+% \begin{macrocode}
+ \ignorespaces \@sharp \unskip
+% \end{macrocode}
+% Then the second \textsf{token} register follows whose number should
+% be saved in =\count@=.
+% We make sure that there will be no further expansion after reading
+% the number, by finishing with =\relax=. The case above is not
+% critical since it is ended by =\ignorespaces=.
+% \changes{v2.0c}{1990/08/14}{\cs{relax} added to avoid problem
+% \cs{the}\cs{toks0}\cs{the}\cs{toks1}.}
+% \begin{macrocode}
+ \the@toks \the \count@ \relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{The separation of columns}
+%
+% \begin{macro}{\@addamp}
+% In the preamble a =&= has to be inserted between any two columns;
+% before the first column there should not be a =&=. As the user
+% preamble may start with a \texttt{|} we have to remember somehow
+% if we have already inserted a =#= (i.e.\ a column). This is done
+% with the boolean variable =\if@firstamp= that we test in
+% =\@addamp=, the macro that inserts the =&=.
+% \begin{macrocode}
+% \newif \@iffirstamp
+% \def\@addamp{\if@firstamp \@firstampfalse
+% \else \@addtopreamble &\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@acol}
+% \begin{macro}{\@acolampacol}
+% \begin{macro}{\col@sep}
+% We will now define some abbreviations for the extensions,
+% appearing most often in the preamble build-up.
+% Here =\col@sep= is a \textsf{dimen} register which is set
+% equivalent to =\arraycolsep= in an \textsf{array}--environment,
+% otherwise it is set equivalent to =\tabcolsep=.
+% \begin{macrocode}
+\newdimen\col@sep
+\def\@acol{\@addtopreamble{\hskip\col@sep}}
+% \def\@acolampacol{\@acol\@addamp\@acol}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{The macro \texttt{\textbackslash @mkpream}}
+%
+% \begin{macro}{\@mkpream}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+% \begin{macro}{\the@toks}
+% \label{@mkpream}
+% Now we can define the macro which builds up the preamble for the
+% =\halign=.
+% First we initialize =\@preamble=, =\@lastchclass=
+% and the boolean variable =\if@firstamp=.
+% \begin{macrocode}
+%\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+% \end{macrocode}
+% During the build-up of the preamble we cannot directly use the
+% =#= sign; this would lead to an error message in the next
+% =\@addtopreamble= call.
+% Instead, we use the command =\@sharp= at places where later
+% a =#= will be.
+% This command is at first given the meaning =\relax=;
+% therefore it will not be expanded when the preamble
+% is extended.
+% In the macro =\@array=, shortly before the =\halign=
+% is carried out, =\@sharp= is given its final meaning.
+%
+% In a similar way,
+% we deal with the commands =\@startpbox= and
+% =\@endpbox=, although the reason is different here: these
+% macros expand in many \textsf{tokens} which would delay the
+% build-up of the preamble.
+% \begin{macrocode}
+% \let\@sharp\relax\let\@startpbox\relax\let\@endpbox\relax
+% \end{macrocode}
+% Two more are needed to deal with the code that handles struts
+% for extra space after a row from =\\[<space>]=
+% (=\do@row@strut=) and code that manages m-cells depending on
+% their heights (=\ar@align@mcell=).
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+% \let\do@row@strut\relax
+% \let\ar@align@mcell\relax
+% \end{macrocode}
+% Now we remove possible $*$-forms in the user preamble with the
+% command =\@xexpast=. As we already know, this command saves
+% its result in the macro =\@tempa=.
+% \begin{macrocode}
+% \@xexpast #1*0x\@@
+% \end{macrocode}
+% Afterwards we initialize all registers and macros, that we need
+% for the build-up of the preamble.
+% Since we want to start with the \textsf{token} register $0$,
+% =\count@= has to contain the value $-1$.
+% \begin{macrocode}
+% \count@\m@ne
+% \let\the@toks\relax
+% \end{macrocode}
+% Then we call up =\prepnext@tok= in order to prepare the
+% \textsf{token} register $0$ for use.
+% \begin{macrocode}
+% \prepnext@tok
+% \end{macrocode}
+% To evaluate the user preamble (without stars) saved in
+% =\@tempa= we use the \LaTeX--macro =\@tfor=.
+% The strange appearing construction with =\expandafter= is
+% based on the fact that we have to put the replacement text of
+% =\@tempa= and not the macro =\@tempa= to this
+% \LaTeX--macro.
+% \begin{macrocode}
+% \expandafter \@tfor \expandafter \@nextchar
+% \expandafter :\expandafter =\@tempa \do
+% \end{macrocode}
+% The body of this loop (the group after the =\do=)
+% is executed for one \textsf{token} at a time, whereas
+% the current \textsf{token} is saved in =\@nextchar=.
+% At first we evaluate the current \textsf{token} with the already
+% defined macro =\@testpach=, i.e.\ we assign to
+% =\@chclass= the character class and to =\@chnum=
+% the character number of this \textsf{token}.
+% \changes{v2.0f}{1992/02/29}{\cs{@testpach} now without arg}
+% \begin{macrocode}
+% {\@testpach
+% \end{macrocode}
+% Then we branch out depending on the value of =\@chclass= into
+% different macros that extend the preamble respectively.
+% \begin{macrocode}
+% \ifcase \@chclass \@classz \or \@classi \or \@classii
+% \or \save@decl \or \or \@classv \or \@classvi
+% \or \@classvii \or \@classviii \or \@classix
+% \or \@classx \fi
+% \end{macrocode}
+% Two cases deserve our special attention: Since the current
+% \textsf{token} cannot have the character class $4$ (start) we
+% have skipped this possibility. If the character class is $3$,
+% only the content of =\@nextchar= has to be saved into the current
+% \textsf{token} register; therefore we call up =\save@decl=
+% directly and save a macro name. After the preamble has been
+% extended we assign the value of =\@chclass= to the counter
+% =\@lastchclass= to assure that this information will be available
+% during the next run of the loop.
+% \begin{macrocode}
+% \@lastchclass\@chclass}%
+% \end{macrocode}
+% After the loop has been finished space must still be added to
+% the created preamble, depending on the last \textsf{token}.
+% Depending on the value of =\@lastchclass= we perform
+% the necessary operations.
+% \begin{macrocode}
+% \ifcase\@lastchclass
+% \end{macrocode}
+% If the last class equals $0$ we add a
+% =\hskip \col@sep=.
+% \begin{macrocode}
+% \@acol \or
+% \end{macrocode}
+% If it equals $1$ we do not add any additional space so that the
+% horizontal lines do not exceed the vertical ones.
+% \begin{macrocode}
+% \or
+% \end{macrocode}
+% Class $2$ is treated like class $0$ because a =<{...}= can
+% only directly follow after class $0$.
+% \begin{macrocode}
+% \@acol \or
+% \end{macrocode}
+% Most of the other possibilities can only appear if the user
+% preamble was defective. Class $3$ is not allowed since after a
+% =>{..}= there must always follow a \texttt{c}, \texttt{l},
+% \texttt{r}, \texttt{p},\texttt{m} or \texttt{b}. We report an
+% error and ignore the declaration given by ={..}=.
+% \begin{macrocode}
+% \@preamerr \thr@@ \or
+% \end{macrocode}
+% If =\@lastchclass= is $4$ the user preamble has been empty.
+% To continue, we insert a =#= in the preamble.
+% \begin{macrocode}
+% \@preamerr \tw@ \@addtopreamble\@sharp \or
+% \end{macrocode}
+% Class $5$ is allowed again. In this case
+% (the user preamble ends with =@{..}=) we need not
+% do anything.
+% \begin{macrocode}
+% \or
+% \end{macrocode}
+% Any other case means that the arguments to =@=, \texttt{!},
+% \texttt{<}, \texttt{>}, \texttt{p}, \texttt{m} or \texttt{b} have
+% been forgotten. So we report an error and ignore the last
+% \textsf{token}.
+% \begin{macrocode}
+% \else \@preamerr \@ne \fi
+% \end{macrocode}
+% Now that the build-up of the preamble is almost finished we can
+% insert the \textsf{token} registers and therefore redefine
+% =\the@toks=. The actual insertion, though, is performed
+% later.
+% \begin{macrocode}
+% \def\the@toks{\the\toks}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \section{The macros \texttt{\textbackslash @classz}
+% to \texttt{\textbackslash @classx}}
+%
+% The preamble is extended by the macros =\@classz= to
+% =\@classx= which are called by =\@mkpream=
+% depending on =\@lastchclass=
+% (i.e. the character class of the last \textsf{token}).
+% \begin{macro}{\@classx}
+% First we define =\@classx= because of its important r\^ole.
+% When it is called we find that the current
+% \textsf{token} is \texttt{p}, \texttt{m} or \texttt{b}.
+% That means that a new column has to start.
+% \begin{macrocode}
+\def\@classx{%
+% \end{macrocode}
+% Depending on the value of =\@lastchclass= different actions
+% must take place:
+% \begin{macrocode}
+ \ifcase \@lastchclass
+% \end{macrocode}
+% If the last character class was $0$ we separate the columns by
+% =\hskip\col@sep= followed by =&= and another
+% =\hskip\col@sep=.
+% \begin{macrocode}
+ \@acolampacol \or
+% \end{macrocode}
+% If the last class was class $1$ --- that means that a vertical
+% line was
+% drawn, --- before this line a =\hskip\col@sep= was inserted.
+% Therefore there has to be only a =&= followed by
+% =\hskip\col@sep=. But this =&= may be inserted only
+% if this is not the first column. This process is controlled
+% by =\if@firstamp= in the macro =\addamp=.
+% \begin{macrocode}
+ \@addamp \@acol \or
+% \end{macrocode}
+% Class $2$ is treated like class $0$ because =<{...}= can only
+% follow after class $0$.
+% \begin{macrocode}
+ \@acolampacol \or
+% \end{macrocode}
+% Class $3$ requires no actions because all things necessary have
+% been done by the preamble \textsf{token} \texttt{>}.
+% \begin{macrocode}
+ \or
+% \end{macrocode}
+% Class $4$ means that we are at the beginning of the preamble.
+% Therefore we start the preamble with =\hskip\col@sep= and
+% then call =\@firstampfalse=. This makes sure that a later
+% =\@addamp= inserts the character
+% =&= into the preamble.
+% \begin{macrocode}
+ \@acol \@firstampfalse \or
+% \end{macrocode}
+% For class $5$ \textsf{tokens} only the character =&= is inserted
+% as a column separator. Therefore we call =\@addamp=.
+% \begin{macrocode}
+ \@addamp
+% \end{macrocode}
+% Other cases are impossible. For an example
+% $=\@lastchclass= \string= 6$---as it might appear in a
+% preamble of the form =...!p...=---\texttt{p} would have
+% been taken as an argument of \texttt{!}\ by =\@testpach=.
+% \begin{macrocode}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@classz}
+% If the character class of the last \textsf{token} is $0$ we have
+% \texttt{c}, \texttt{l}, \texttt{r} or an argument of \texttt{m},
+% \texttt{b} or\ \texttt{p}. In the first three cases the preamble
+% must be extended the same way as if we had class $10$. The
+% remaining two cases do not require any action because the space
+% needed was generated by the last \textsf{token} (i.e.\
+% \texttt{m}, \texttt{b} or \texttt{p}). Since =\@lastchclass= has
+% the value $10$ at this point nothing happens when =\@classx= is
+% called. So the macro =\@chlassz= may start like this:
+% \begin{macrocode}
+\def\@classz{\@classx
+% \end{macrocode}
+% According to the definition of =\insert@column= we must store
+% the number of the \textsf{token} register in which a preceding
+% =>{..}= might have stored its argument into
+% =\@tempcnta=.
+% \begin{macrocode}
+ \@tempcnta \count@
+% \end{macrocode}
+% To have $=\count@= \string= =\@tmpcnta= + 1$ we prepare
+% the next \textsf{token} register.
+% \begin{macrocode}
+ \prepnext@tok
+% \end{macrocode}
+% Now the preamble must be extended with the column whose format
+% can be determined by =\@chnum=.
+% \begin{macrocode}
+ \@addtopreamble{\ifcase \@chnum
+% \end{macrocode}
+% If =\@chnum= has the value $0$ a centered column has to be
+% generated.
+% So we begin with stretchable space.
+% \begin{macrocode}
+ \hfil
+% \end{macrocode}
+% We also add a space of 1sp just in case the first thing in the
+% cell is a command doing an =\unskip=.
+% \changes{v2.4k}{2018/12/30}{Add extra \cs{hskip} to guard against an
+% \cs{unskip} at the start of a c-column cell (gh/102)}
+% \begin{macrocode}
+ \hskip1sp%
+% \end{macrocode}
+% The command =\d@llarbegin= follows expanding into =\begingroup=
+% (in the \textsf{tabular}--environment) or into =$=. Doing this
+% (provided an appropriate setting of =\d@llarbegin=) we achieve
+% that the contents of the columns of an \textsf{array}--environment
+% are set in math mode while those of a \textsf{tabular}--environment
+% are set in LR mode.
+% \begin{macrocode}
+ \d@llarbegin
+% \end{macrocode}
+% Now we insert the contents of the two \textsf{token} registers
+% and the symbol
+% for the column entry (i.e.\ =#= or
+% more precise =\@sharp=) using =\insert@column=.
+% \begin{macrocode}
+ \insert@column
+% \end{macrocode}
+% We end this case with =\d@llarend= and =\hfil= where =\d@llarend=
+% again is either =$= or =\endgroup=.
+% The strut to enforce a regular row height is placed between the two.
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \begin{macrocode}
+ \d@llarend \do@row@strut \hfil \or
+% \end{macrocode}
+% The templates for \texttt{l} and \texttt{r} (i.e.\ =\@chnum= $1$
+% or $2$) are generated the same way. Since one =\hfil= is
+% missing the text is moved to the relevant side.
+% The =\kern\z@= is needed in case of an empty column
+% entry. Otherwise
+% the =\unskip= in =\insert@column= removes the
+% =\hfil=. Changed to =\hskip1sp= so that it interacts better with
+% =\@bsphack=.
+% \changes{v2.3f}{1996/04/22}
+% {(DPC) Extra \cs{kern} keeps tabcolsep in empty l columns
+% internal/2122}
+% \changes{v2.3i}{1996/06/14}
+% {Change both \cs{kern}\cs{z@} to \cs{hskip}1sp for latex/2160}
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \begin{macrocode}
+ \hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \hfil \or
+ \hfil\hskip1sp\d@llarbegin \insert@column \d@llarend \do@row@strut \or
+% \end{macrocode}
+% The templates for \texttt{p}, \texttt{m} and \texttt{b} mainly
+% consist of a \textsf{box}. In case of \texttt{m} it is generated
+% by =\vcenter=. This command is allowed only in math
+% mode. Therefore we start with a~=$=.
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+ \setbox\ar@mcellbox\vbox
+% \end{macrocode}
+% The part of the templates which is the same in all three cases
+% (\texttt{p}, \texttt{m} and \texttt{b})
+% is built by the macros =\@startpbox= and
+% =\@endpbox=. =\@startpbox= has an argument:
+% the width of the column which is stored in the current
+% \textsf{token} (i.e.\ =\@nextchar=).
+% Between these two macros we find the well known
+% =\insert@column=.
+% The strut is places after the box
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+ \@startpbox{\@nextchar}\insert@column \@endpbox
+ \ar@align@mcell
+ \do@row@strut \or
+% \end{macrocode}
+% The templates for \texttt{p} and \texttt{b} are generated in the
+% same way though we do not need the =$= characters because we use
+% =\vtop= or =\vbox=.
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \begin{macrocode}
+ \vtop \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut \or
+ \vbox \@startpbox{\@nextchar}\insert@column \@endpbox\do@row@strut
+% \end{macrocode}
+% Other values for =\@chnum= are impossible. Therefore we
+% end the arguments to =\@addtopreamble= and =\ifcase=.
+% Before we come to the end of =\@classz= we have to
+% prepare the next \textsf{token} register.
+% \begin{macrocode}
+ \fi}\prepnext@tok}
+% \end{macrocode}
+% \end{macro}
+%
+
+%
+% \begin{macro}{\ar@mcellbox}
+% When dealing with m-cells we need a box to measure the cell
+% height.
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+\newbox\ar@mcellbox
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\ar@align@mcell}
+% M-cells are supposed to be vertically centered within the table
+% row. In the original implementation that was done using
+% =\vcenter= but the issue with that approach is that it centers
+% the material based on the math-axis. In most situations that
+% comes out quit right, but if, for example, an m-cell has only a
+% single line worth of material inside it will be positioned
+% differently to a =l=, =c= or =r= cell or to a =p= or =b= cell
+% with the same content.
+%
+% For that reason the new implementation does the centering
+% manually: First we check the height of the cell and if that is
+% less or equal to =\ht\@arstrutbox= we assume that this is a
+% single line cell. In that case we don't do any vertical maneuvre
+% and simply output the box, i.e., make it behave like a single
+% line p-cell.
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+\def\ar@align@mcell{%
+ \ifdim \ht\ar@mcellbox > \ht\@arstrutbox
+% \end{macrocode}
+% Otherwise we realign vertically by lowering the box. The question
+% is how much do we need to move down? If there is any
+% =\arraystretch= in place then the first line will have some
+% unusual height and we don't want to consider that when finding
+% the middle point. So we substract from the cell height the height
+% of that strut. But of course we want to include the normal height
+% of the first line (which would be something like =\ht\strutbox=)
+% so we need to add that. On the other hand, when centering around
+% the mid-point of the cell, we also need to account for the depth
+% of the last line (which is nominally something like
+% =\dp\strutbox=). Both together equals =\baselineskip= so that is
+% what we add and then lower the cell by half of the resulting value.
+% \begin{macrocode}
+ \begingroup
+ \dimen@\ht\ar@mcellbox
+ \advance\dimen@-\ht\@arstrutbox
+ \advance\dimen@\baselineskip
+ \lower.5\dimen@\box\ar@mcellbox
+ \endgroup
+ \else % assume one line and align at baseline
+ \box\ar@mcellbox
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+
+%
+% \begin{macro}{\@classix}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+%
+% In case of class $9$ (\texttt{>}--\textsf{token}) we first check
+% if the character class of the last
+% \textsf{token} was $3$. In this case we have a
+% user preamble of the form =..>{...}>{...}..= which
+% is not allowed. We only give an error message and continue.
+% So the declarations defined by the first =>{...}=
+% are ignored.
+% \begin{macrocode}
+%\def\@classix{\ifnum \@lastchclass = \thr@@
+% \@preamerr \thr@@ \fi
+% \end{macrocode}
+% Furthermore, we call up =\@class10= because afterwards always a
+% new column is started by \texttt{c}, \texttt{l}, \texttt{r},
+% \texttt{p}, \texttt{m} or \texttt{b}.
+% \begin{macrocode}
+% \@classx}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@classviii}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+%
+% If the current \textsf{token} is a \texttt{<} the last character
+% class must be $0$. In this case it is not necessary to extend the
+% preamble. Otherwise we output an error message, set =\@chclass=
+% to $6$ and call =\@classvi=. By doing this we achieve that
+% \texttt{<} is treated like \texttt{!}.
+% \begin{macrocode}
+%\def\@classviii{\ifnum \@lastchclass >\z@
+% \@preamerr 4\@chclass 6 \@classvi \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@arrayrule}
+% There is only one incompatibility with the original definition:
+% the definition of =\@arrayrule=. In the original a line without
+% width\footnote{So the space between \texttt{cc} and \texttt{c|c}
+% is equal.} is created by multiple insertions of
+% =\hskip .5\arrayrulewidth=.
+% We only insert a vertical line into the
+% preamble. This is done to prevent problems with \TeX's main
+% memory when generating tables with many vertical lines in them
+% (especially in the case of \textsf{floats}).
+% \begin{macrocode}
+\def\@arrayrule{\@addtopreamble \vline}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classvii}
+% As a consequence it follows that in case of class $7$
+% (=@= \textsf{token}) the preamble need not to be extended.
+% In the original definition $=\@lastchclass= \string= 1$
+% is treated by inserting =\hskip .5\arrayrulewidth=.
+% We only check if the last \textsf{token} was of class $3$ which is
+% forbidden.
+% \begin{macrocode}
+\def\@classvii{\ifnum \@lastchclass = \thr@@
+% \end{macrocode}
+% If this is true we output an error message and
+% ignore the declarations stored
+% by the last =>{...}=, because these are overwritten
+% by the argument of \texttt{@}.
+% \begin{macrocode}
+ \@preamerr \thr@@ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@classvi}
+% If the current \textsf{token} is a regular \texttt{!}\ and the
+% last class was $0$ or $2$ we extend the preamble with
+% =\hskip\col@sep=. If the last \textsf{token} was of class $1$
+% (for instance \texttt{|}) we extend with =\hskip \doublerulesep=
+% because the construction =!{...}= has to be treated like
+% \texttt{|}.
+% \begin{macrocode}
+\def\@classvi{\ifcase \@lastchclass
+ \@acol \or
+ \@addtopreamble{\hskip \doublerulesep}\or
+ \@acol \or
+% \end{macrocode}
+% Now =\@preamerr...= should follow because a
+% user preamble of the form =..>{..}!.= is not allowed.
+% To save memory we call =\@classvii= instead which also
+% does what we want.
+% \begin{macrocode}
+ \@classvii
+% \end{macrocode}
+% If =\@lastchclass= is $4$ or $5$ nothing has to be done.
+% Class $6$ to $10$ are not possible.
+% So we finish the macro.
+% \begin{macrocode}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classii}
+% \begin{macro}{\@classiii}
+% In the case of character classes $2$ and $3$ (i.e.\ the argument
+% of \texttt{<} or \texttt{>}) we only have to store the current
+% \textsf{token} (=\@nextchar=) into the corresponding
+% \textsf{token} register since the preparation and
+% insertion of these registers
+% are done by the macro =\@classz=.
+% This is equivalent to calling =\save@decl= in the case of
+% class $3$. To save command identifiers we do this call up
+% in the macro =\@mkpream=.
+%
+% Class $2$ exhibits a more complicated situation: the
+% \textsf{token} registers have already been inserted by
+% =\@classz=. So the value of =\count@= is too high
+% by one. Therefore we decrease =\count@= by $1$.
+% \begin{macrocode}
+\def\@classii{\advance \count@ \m@ne
+% \end{macrocode}
+% Next we store the current \textsf{token} into the correct
+% \textsf{token} register by calling =\save@decl= and then
+% increase the value of =\count@= again. At this point we
+% can save memory once more (at the cost of time) if we use the
+% macro =\prepnext@tok=.
+% \begin{macrocode}
+ \save@decl\prepnext@tok}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@classv}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+%
+% If the current \textsf{token} is of class $5$ then it is an
+% argument of a \texttt{@} \textsf{token}. It must be stored into a
+% \textsf{token} register.
+% \begin{macrocode}
+%\def\@classv{\save@decl
+% \end{macrocode}
+% We extend the preamble with a command which inserts this
+% \textsf{token} register into the preamble when its construction
+% is finished. The user expects that this argument is worked out in
+% math mode if it was used in an
+% \textsf{array}--environment. Therefore we surround it with
+% =\d@llar...='s.
+% \changes{v2.0c}{1990/08/14}{\cs{relax} added to avoid problem
+% `the`toks0`the`toks1.}
+% \begin{macrocode}
+% \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+% \end{macrocode}
+% Finally we must prepare the next \textsf{token} register.
+% \begin{macrocode}
+% \prepnext@tok}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classi}
+% In the case of class $0$ we were able to generate the necessary
+% space between columns by using the macro =\@classx=.
+% Analogously the macro =\@classvi= can be used for class $1$.
+% \begin{macrocode}
+\def\@classi{\@classvi
+% \end{macrocode}
+% Depending on =\@chnum= a vertical line
+% \begin{macrocode}
+ \ifcase \@chnum \@arrayrule \or
+% \end{macrocode}
+% or (in case of =!{...}=) the current \textsf{token} --- stored
+% in =\@nextchar= --- has to be inserted into the preamble.
+% This corresponds to calling =\@classv=.
+% \begin{macrocode}
+ \@classv \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@startpbox}
+% In =\@classz= the macro =\@startpbox= is used.
+% The width of the \textsf{parbox} is passed as an argument.
+% =\vcenter=, =\vtop= or =\vbox= are already in the
+% preamble. So we start with the braces for the wanted box.
+% \changes{v2.4i}{2018/09/13}{Add group to prevent color leak (gh/72)}
+% \begin{macrocode}
+\def\@startpbox#1{\bgroup
+ \color@begingroup
+% \end{macrocode}
+% The argument is the width of the box. This information has to be
+% assigned to =\hsize=.
+% Then we assign default values to several parameters used in a
+% \textsf{parbox}.
+% \changes{v2.3k}{1998/05/12}{Use \cs{setlength} to set \cs{hsize},
+% so that the calc package can be applied here (pr/2793)}
+% \begin{macrocode}
+ \setlength\hsize{#1}\@arrayparboxrestore
+% \end{macrocode}
+% Our main problem is to obtain the same distance between succeeding
+% lines of the \textsf{parbox}.
+% We have to remember that the distance between two \textsf{parboxes}
+% should be defined by =\@arstrut=. That means that it can be
+% greater than the distance in a \textsf{parbox}.
+% Therefore it is not enough to set a =\@arstrut= at the
+% beginning and at the end of the \textsf{parbox}. This would
+% dimension the distance
+% between first and second line and the distance between the two
+% last lines of the \textsf{parbox} wrongly.
+% To prevent this we set an invisible rule of height
+% =\@arstrutbox=
+% at the beginning of the \textsf{parbox}. This has no effect on the
+% depth of the first line. At the end of the \textsf{parbox} we set
+% analogously another invisible rule which only affects the depth
+% of the last line. It is necessary to wait inserting this strut
+% until the paragraph actually starts to allow for things like
+% =\parindent= changes via =>{...}=.
+% \changes{v2.1c}{1992/12/14}{Use `everypar to insert strut}
+% \begin{macrocode}
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@endpbox}
+% If there are any declarations defined by =>{...}=
+% and =<{...}=
+% they now follow in the macro =\@classz= --- the contents
+% of the column in between.
+% So the macro =\@endpbox= must insert the \textsf{specialstrut}
+% mentioned earlier and then close the group opened by
+% =\@startpbox=.
+% \changes{v2.2d}{1994/05/16}{Use \LaTeXe \cs{@finalstrut}}
+% \changes{v2.3g}{1996/05/07}{Add \cs{hfil} for tools/2120}
+% \changes{v2.4i}{2018/09/13}{Add group to prevent color leak (gh/72)}
+% \begin{macrocode}
+\def\@endpbox{\@finalstrut\@arstrutbox \color@endgroup \egroup\hfil}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Building and calling \texttt{\textbackslash halign}}
+%
+% \begin{macro}{\@array}
+% After we have discussed the macros needed for the evaluation
+% of the user preamble we can define the macro =\@array=
+% which uses these macros to create a =\halign=.
+% It has two arguments. The first one is a position argument
+% which can be \texttt{t}, \texttt{b} or \texttt{c}; the
+% second one describes the wanted preamble,
+% e.g.\ it has the form =|c|c|c|=.
+% \begin{macrocode}
+\def\@array[#1]#2{%
+% \end{macrocode}
+% First we define a \textsf{strut} whose size basically corresponds
+% to a normal \textsf{strut} multiplied by the factor
+% =\arraystretch=.
+% This \textsf{strut} is then inserted into every row and enforces
+% a minimal distance between two rows.
+% Nevertheless, when using horizontal lines, large letters
+% (like accented capital letters) still collide with such lines.
+% Therefore at first we add to the height of a normal \textsf{strut}
+% the value of the parameter =\extrarowheight=.
+% \begin{macrocode}
+ \@tempdima \ht \strutbox
+ \advance \@tempdima by\extrarowheight
+ \setbox \@arstrutbox \hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+% \end{macrocode}
+% Then we open a group, in which the user preamble is evaluated by
+% the macro =\@mkpream=. As we know this must happen locally.
+% This macro creates a preamble for a =\halign= and saves
+% its result globally in the control sequence =\@preamble=.
+% \begin{macrocode}
+ \begingroup
+ \@mkpream{#2}%
+% \end{macrocode}
+% We again redefine =\@preamble= so that a call up of =\@preamble=
+% now starts the =\halign=. Thus also the arguments of \texttt{>},
+% \texttt{<}, \texttt{@} and \texttt{!}, saved in the
+% \textsf{token} registers are inserted into the preamble. The
+% =\tabskip= at the beginning and end of the preamble is set to
+% \textsf{0pt} (in the beginning by the use of =\ialign=). Also the
+% command =\@arstrut= is build in, which inserts the
+% =\@arstrutbox=, defined above. Of course, the opening brace after
+% =\ialign= has to be implicit as it will be closed in =\endarray=
+% or another macro.
+% \changes{v2.3m}{1998/12/31}{Added \cs{noexpand} in front of \cs{ialign}
+% to guard against interesting :-) changes to \cs{halign} done to support
+% text glyphs in math}
+%
+% The =\noexpand= in front of =\ialign= does no harm in standard \LaTeX{}
+% and was added since some experimental support for using text glyphs in math
+% redefines =\halign= with the result that is becomes expandable with
+% disastrous results in cases like this.
+% In the kernel definition for this macro the problem does
+% not surface because there =\protect= is set (which is not necessary in this
+% implementation as there is no arbitrary user input that can get expanded) and
+% the experimental code made the redefinition robust. Whether this is the right
+% approach is open to question; consider the =\noexpand= a courtesy to allow an
+% unsupported redefinition of a \TeX{} primitive for the moment (as people rely
+% on that experimental code).
+% \begin{macrocode}
+ \xdef\@preamble{\noexpand \ialign \@halignto
+ \bgroup \@arstrut \@preamble
+ \tabskip \z@ \cr}%
+% \end{macrocode}
+% What we have not explained yet is the macro =\@halignto=
+% that was just used. Depending on its replacement text the
+% =\halign= becomes a =\halign= \texttt{to} \meta{dimen}.
+% Now we close the group again. Thus
+% =\@startpbox= and =\@endpbox= as well as all
+% \textsf{token} registers get their former meaning back.
+% \begin{macrocode}
+ \endgroup
+% \end{macrocode}
+% To support the \texttt{delarray.sty} package we include a hook
+% into this part of the code which is a no-op in the main package.
+% \changes{v2.1a}{1992/07/03}{Hook for delarray added}
+% \begin{macrocode}
+ \@arrayleft
+% \end{macrocode}
+% Now we decide depending on the position argument in which
+% \textsf{box} the =\halign= is to be put. (=\vcenter= may be used
+% because we are in math mode.)
+% \changes{v2.1a}{1992/07/03}{Wrong spec is now equiv to [t]}
+% \begin{macrocode}
+ \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi \fi
+% \end{macrocode}
+% Now another implicit opening brace appears; then definitions
+% which shall stay local follow. While constructing the
+% =\@preamble= in =\@mkpream= the =#= sign must be
+% hidden in the macro =\@sharp= which is =\let= to
+% =\relax= at that moment (see definition of =\@mkpream=
+% on page~\pageref{@mkpream}).
+% All these now get their actual meaning.
+% \begin{macrocode}
+ \bgroup
+ \let \@sharp ##\let \protect \relax
+% \end{macrocode}
+% With the above defined \textsf{struts} we fix down the distance
+% between rows by setting =\lineskip= and =\baselineskip=
+% to \textsf{0pt}. Since there have to be set =$='s
+% around every column in the \textsf{array}--environment
+% the parameter =\mathsurround= should
+% also be set to \textsf{0pt}. This prevents additional space between
+% the rows. The
+% \PlainTeX--macro =\m@th= does this.
+% \begin{macrocode}
+ \lineskip \z@
+ \baselineskip \z@
+ \m@th
+% \end{macrocode}
+% Beside, we have to assign a special meaning (which we still have
+% to specify) to the line separator =\\=. We also have to
+% redefine the command =\par= in such a way that empty lines in
+% =\halign= cannot do any damage. We succeed in doing so
+% by choosing something that will disappear when expanding.
+% After that we only have to call up =\@preamble= to
+% start the wanted =\halign=.
+% \changes{1994/12/08}{v2.3b}{add \cs{tabularnewline}}
+% \begin{macrocode}
+ \let\\\@arraycr \let\tabularnewline\\\let\par\@empty \@preamble}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\arraybackslash}
+% \changes{v2.4a}{2003/12/17}{(DPC) Macro added (from tabularx)}
+% Restore =\\= for use in array and tabular environment (after
+% =\raggedright= etc.).
+% \begin{macrocode}
+\def\arraybackslash{\let\\\tabularnewline}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\extrarowheight}
+% The \textsf{dimen} parameter used above also needs to be
+% allocated. As a default value we use \textsf{0pt}, to ensure
+% compatibility with standard \LaTeX.
+% \begin{macrocode}
+\newdimen \extrarowheight
+\extrarowheight=0pt
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@arstrut}
+% Now the insertion of =\@arstrutbox= through =\@arstut=
+% is easy since we know exactly in which mode \TeX\ is while working
+% on the =\halign= preamble.
+% \begin{macrocode}
+\def\@arstrut{\unhcopy\@arstrutbox}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{The line separator \texttt{\textbackslash\textbackslash}}
+%
+% \begin{macro}{\@arraycr}
+% In the macro =\@array= the line separator =\\= is
+% =\let= to the command =\@arraycr=.
+% Its definition starts with a special brace which I have directly
+% copied from the original definition. It is
+% necessary, because the =\futurlet= in =\@ifnextchar=
+% might
+% expand a following =&= \textsf{token} in a construction like
+% =\\ &=. This would otherwise end the alignment template at a
+% wrong time. On the other hand we have to be careful to avoid
+% producing a real group, i.e.\ ={}=, because the command will also
+% be used for the array environment, i.e.\ in math mode. In that
+% case an extra ={}= would produce an ord atom which could mess up
+% the spacing. For this reason we use a combination that does not
+% really produce a group at all but modifies the master counter so
+% that a =&= will not be considered belonging to the current
+% =\halign= while we are looking for a =*= or =[=.
+% For further information see
+% \cite[Appendix D]{bk:knuth}.
+% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math}
+% \begin{macrocode}
+\def\@arraycr{\relax\iffalse{\fi\ifnum 0=`}\fi
+% \end{macrocode}
+% Then we test whether the user is using the star form and ignore
+% a possible star (I also disagree with this procedure, because a
+% star does not make any sense here).
+% \begin{macrocode}
+ \@ifstar \@xarraycr \@xarraycr}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xarraycr}
+% In the command =\@xarraycr= we test if an optional argument
+% exists.
+% \begin{macrocode}
+\def\@xarraycr{\@ifnextchar [%
+% \end{macrocode}
+% If it does, we branch out into the macro =\@argarraycr= if
+% not we close the special brace (mentioned above) and end the row
+% of the =\halign= with a =\cr=.
+% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math}
+% \begin{macrocode}
+ \@argarraycr {\ifnum 0=`{}\fi\cr}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@argarraycr}
+% If additional space is requested by the user this case is treated
+% in the macro =\@argarraycr=. First we close the special brace
+% and then we test if the additional space is positive.
+% \changes{v2.3c}{1995/04/23}{Avoid adding an ord atom in math}
+% \begin{macrocode}
+\def\@argarraycr[#1]{\ifnum0=`{}\fi\ifdim #1>\z@
+% \end{macrocode}
+% If this is the case we create an invisible vertical rule with
+% depth =\dp\@arstutbox=${}+{}$\meta{wanted\ space}.
+% Thus we achieve that all vertical lines specified
+% in the user preamble by a \texttt{|} are now
+% generally drawn.
+% Then the row ends with a =\cr=.
+%
+% If the space is negative we end the row at once with a =\cr=
+% and move back up with a =\vskip=.
+%
+% While testing these macros I found out that the
+% =\endtemplate=
+% created by =\cr= and =&= is something like an
+% =\outer= primitive and therefore it should not appear in
+% incomplete =\if= statements. Thus the following solution was
+% chosen which hides the =\cr= in other macros when \TeX\
+% is skipping conditional text.
+% \changes{v2.3c}{1995/04/23}{Use \cs{expandafter}'s in conditional}
+% \begin{macrocode}
+ \expandafter\@xargarraycr\else
+ \expandafter\@yargarraycr\fi{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xargarraycr}
+% \begin{macro}{\@yargarraycr}
+% The following macros were already explained above.
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \begin{macrocode}
+\def\@xargarraycr#1{\unskip\gdef\do@row@strut
+ {\@tempdima #1\advance\@tempdima \dp\@arstrutbox
+ \vrule \@depth\@tempdima \@width\z@\global\let\do@row@strut\relax}%
+% \end{macrocode}
+% If the last column is a =\multicolumn= cell then we need to
+% insert the row strut now as it isn't inside the template (as that
+% got =\omit=ted).
+% \changes{v2.4h}{2018/04/30}{Fixing issue 42}
+ % \begin{macrocode}
+ \ifnum\@multicnt >\z@ \do@row@strut \fi
+ \cr}
+\let\do@row@strut\relax
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@yargarraycr#1{\cr\noalign{\vskip #1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \section{Spanning several columns}
+%
+% \begin{macro}{\multicolumn}
+% If several columns should be held together with a special format
+% the command =\multicolumn= must be used. It has three
+% arguments: the number of columns to be covered; the format for
+% the result column and the actual column entry.
+% \changes{v2.3j}{1998/01/29}{Command made \cs{long} to match
+% kernel change for pr/2180}
+% \begin{macrocode}
+\long\def\multicolumn#1#2#3{%
+% \end{macrocode}
+% First we combine the given number of columns into a single one;
+% then we start a new block so that the following definition is kept
+% local.
+% \begin{macrocode}
+ \multispan{#1}\begingroup
+% \end{macrocode}
+% Since a =\multicolumn= should only describe the format of a
+% result column, we redefine =\@addamp= in such a way that one gets
+% an error message if one uses more than one \texttt{c},
+% \texttt{l}, \texttt{r}, \texttt{p}, \texttt{m} or \texttt{b} in
+% the second argument. One should consider that this definition is
+% local to the build-up of the preamble; an \textsf{array}-- or
+% \textsf{tabular}--environment in the third argument of the
+% =\multicolumn= is therefore worked through correctly as well.
+% \begin{macrocode}
+ \def\@addamp{\if@firstamp \@firstampfalse \else
+ \@preamerr 5\fi}%
+% \end{macrocode}
+% Then we evaluate the second argument with the help of
+% =\@mkpream=.
+% Now we still have to insert the contents of the \textsf{token}
+% register into the =\@preamble=, i.e.\ we have to say
+% =\xdef\@preamble{\@preamble}=. This is achieved shorter by
+% writing:
+% \begin{macrocode}
+ \@mkpream{#2}\@addtopreamble\@empty
+% \end{macrocode}
+% After the =\@preamble= is created we forget all local
+% definitions and occupations of the \textsf{token} registers.
+% \begin{macrocode}
+ \endgroup
+% \end{macrocode}
+% In the special situation of =\multicolumn= =\@preamble=
+% is not needed as preamble for a =\halign= but it is directly
+% inserted into our table. Thus instead of =\sharp=
+% there has to be the column entry (=#3=) wanted by the user.
+% \begin{macrocode}
+ \def\@sharp{#3}%
+% \end{macrocode}
+% Now we can pass the =\@preamble= to \TeX\ . For safety
+% we start with an =\@arstrut=. This should usually be in the
+% template for the first column however we do not know if this
+% template was overwritten by our =\multicolumn=.
+% We also add a =\null= at the right end to prevent any following
+% =\unskip= (for example from =\\[..]=) to remove the =\tabcolsep=.
+% \changes{v2.2e}{1994/06/01}{Added \cs{null}}
+% \begin{macrocode}
+ \@arstrut \@preamble
+ \null
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \section{The Environment Definitions}
+%
+% After these preparations we are able to define the environments. They
+% only differ in the initialisations of =\d@llar...=, =\col@sep=
+% and =\@halignto=.
+%
+% \begin{macro}{\@halignto}
+% \begin{macro}{\d@llarbegin}
+% \begin{macro}{\d@llarend}
+% =\d@llar= has to be
+% locally asigned since otherwise nested \textsf{tabular} and \textsf{array}
+% environments (via =\multicolumn=) are impossible.
+% For 25 years or so =\@halignto= was set globally (to save space on the
+% save stack, but that was a mistake: if there is a tabular in the
+% output routine (e.g., in the running header) then that tabular is
+% able overwrite the =\@halignto=
+% setting of a tabular in the main text resulting in a very weird error.
+% \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)}
+% \changes{v2.0g}{1992/06/18}{`d@llarbegin defined on toplevel.}
+% When the new font selection scheme is in force we have to
+% we surround all =\halign= entries
+% with braces. See remarks in TUGboat 10\#2. Actually we are going
+% to use =\begingroup= and =\endgroup=. However, this is only
+% necessary when we are in text mode. In math the surrounding
+% dollar signs will already serve as the necessary extra grouping
+% level. Therefore we switch the settings of =\d@llarbegin= and
+% =\d@llarend= between groups and dollar signs.
+% \begin{macrocode}
+\let\d@llarbegin\begingroup
+\let\d@llarend\endgroup
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\array}
+% Our new definition of =\array= then reads:
+% \changes{v2.0d}{1990/08/20}{`d@llar local to preamble.}
+% \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)}
+% \begin{macrocode}
+\def\array{\col@sep\arraycolsep
+ \def\d@llarbegin{$}\let\d@llarend\d@llarbegin\def\@halignto{}%
+% \end{macrocode}
+% Since there might be an optional argument we call another
+% macro which is also used by the other environments.
+% \begin{macrocode}
+ \@tabarray}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@tabarray}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+%
+% This macro tests for a optional bracket and then calls up
+% =\@array= or =\@array[c]= (as default).
+% \begin{macrocode}
+%\def\@tabarray{\@ifnextchar[{\@array}{\@array[c]}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\tabular}
+% \begin{macro}{\tabular*}
+% The environments \textsf{tabular} and \textsf{tabular$*$} differ
+% only in the initialisation of the command =\@halignto=. Therefore
+% we define
+% \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)}
+% \begin{macrocode}
+\def\tabular{\def\@halignto{}\@tabular}
+% \end{macrocode}
+% and analogously for the star form. We evaluate the argument first
+% using =\setlength= so that users of the \texttt{calc} package can
+% write code like\\ =\begin{tabular*}{(\columnwidth-1cm)/2}...=
+% \changes{v2.3l}{1998/05/13}{Use \cs{setlength} evaluate arg
+% so that the calc package can be applied here (pr/2793)}
+% \changes{v2.4d}{2016/10/06}{\cs{@halignto} set locally (pr/4488)}
+% \begin{macrocode}
+\expandafter\def\csname tabular*\endcsname#1{%
+ \setlength\dimen@{#1}%
+ \edef\@halignto{to\the\dimen@}\@tabular}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@tabular}
+% The rest of the job is carried out by the =\@tabular= macro:
+% \begin{macrocode}
+\def\@tabular{%
+% \end{macrocode}
+% First of all we have to make sure that we start out in
+% \textsf{hmode}. Otherwise we might find our table dangling by
+% itself on a line.
+% \begin{macrocode}
+ \leavevmode
+% \end{macrocode}
+% It should be taken into consideration that the macro =\@array=
+% must be called in math mode. Therefore we open a \textsf{box},
+% insert a =$= and then assign the correct values to =\col@sep= and
+% =\d@llar...=.
+% \changes{v2.0d}{1990/08/20}{`d@llar local to preamble.}
+% \begin{macrocode}
+ \hbox \bgroup $\col@sep\tabcolsep \let\d@llarbegin\begingroup
+ \let\d@llarend\endgroup
+% \end{macrocode}
+% Now everything \textsf{tabular} specific is done and we are able to
+% call the =\@tabarray= macro.
+% \begin{macrocode}
+ \@tabarray}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endarray}
+% \emph{The code below has been replaced long time ago by an
+% extended version further down but the code and its documentation
+% was left here for reference. It is now commented out to avoid
+% confusion.}
+%
+% When the processing of \textsf{array} is finished we have to
+% close the =\halign=
+% and afterwards the surrounding \textsf{box} selected by
+% =\@array=. To save \textsf{token} space we then redefine
+% =\@preamble=
+% because its replacement text isn't longer needed.
+% \begin{macrocode}
+%\def\endarray{\crcr \egroup \egroup \gdef\@preamble{}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endtabular}
+% \begin{macro}{\endtabular*}
+% To end a \textsf{tabular} or \textsf{tabular$*$} environment we
+% call up =\endarray=, close the math mode and then the surrounding
+% =\hbox=.
+% \begin{macrocode}
+\def\endtabular{\endarray $\egroup}
+\expandafter\let\csname endtabular*\endcsname=\endtabular
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \section{Last minute definitions}
+%
+%
+% If this file is used as a package file we should =\let= all macros
+% to =\relax= that were used in the original but are no longer
+% necessary.
+% \begin{macrocode}
+\let\@ampacol=\relax \let\@expast=\relax
+\let\@arrayclassiv=\relax \let\@arrayclassz=\relax
+\let\@tabclassiv=\relax \let\@tabclassz=\relax
+\let\@arrayacol=\relax \let\@tabacol=\relax
+\let\@tabularcr=\relax \let\@@endpbox=\relax
+\let\@argtabularcr=\relax \let\@xtabularcr=\relax
+% \end{macrocode}
+%
+% \begin{macro}{\@preamerr}
+% We also have to redefine the error routine =\@preamerr= since
+% new kind of errors are possible.
+% The code for this macro is not perfect yet;
+% it still needs too much memory.
+% \begin{macrocode}
+\def\@preamerr#1{\def\@tempd{{..} at wrong position: }%
+ \PackageError{array}{%
+ \ifcase #1 Illegal pream-token (\@nextchar): `c' used\or %0
+ Missing arg: token ignored\or %1
+ Empty preamble: `l' used\or %2
+ >\@tempd token ignored\or %3
+ <\@tempd changed to !{..}\or %4
+ Only one column-spec. allowed.\fi}\@ehc} %5
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \section
+% [Defining your own column specifiers]
+% {Defining your own column specifiers\footnotemark}
+%
+% \footnotetext{The code and the documentation in this section was
+% written by David. So far only the code from newarray was plugged
+% into array so that some parts of the documentation still claim
+% that this is newarray and even worse, some parts of the code are
+% unnecessarily doubled. This will go away in a future release. For
+% the moment we thought it would be more important to bring both
+% packages together.}
+% \changes{v2.1a}{1992/07/03}{Newcolumn stuff added}
+%
+% \DeleteShortVerb{\=}
+% \MakeShortVerb{\"}
+%
+% \begin{macro}{\newcolumn}
+% In \texttt{newarray.sty} the macro for specifying new columns was
+% named "\newcolumn". When the functionality was added to
+% \texttt{array.sty} the command was renamed "\newcolumntype".
+% Initially both names were supported, but now (In versions of this
+% package distributed for \LaTeXe) the old name is not defined.
+% \changes{v2.2a}{1994/02/03}{Now made `newcolumn an error}
+% \changes{v2.2a}{1994/02/04}{Removed `newcolumn}
+% \begin{macrocode}
+%<*ncols>
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\newcolumntype}
+% \changes{v2.1b}{1992/06/07}{Macro renamed from `newcolumn} As
+% described above, the "\newcolumntype" macro gives users the chance
+% to define letters, to be used in the same way as the primitive
+% column specifiers, `c' `p' etc.
+% \begin{macrocode}
+\def\newcolumntype#1{%
+% \end{macrocode}
+% "\NC@char" was added in V2.01 so that active characters, like "@" in
+% AMS\LaTeX\ may be used. This trick was stolen from \texttt{array.sty}
+% 2.0h. Note that we need to use the possibly active token,
+% "#1", in several places, as that is the token that actually
+% appears in the preamble argument.
+% \begin{macrocode}
+ \edef\NC@char{\string#1}%
+% \end{macrocode}
+% First we check whether there is already a definition for this column.
+% Unlike "\newcommand" we give a warning rather than an error if it is
+% defined. If it is a new column, add "\NC@do" \meta{column} to
+% the list "\NC@list".
+% \begin{macrocode}
+ \@ifundefined{NC@find@\NC@char}%
+ {\@tfor\next:=<>clrmbp@!|\do
+ {%
+% \end{macrocode}
+% We use \cs{noexpand} on the tokens from the list in case one or
+% the other (typically \texttt{@}, \texttt{!} or \texttt{|}) has
+% been made active.
+% \changes{v2.4l}{2019/08/31}{Add a necessary \cs{expandafter} (github/148)}
+% \begin{macrocode}
+ \if\expandafter\noexpand\next\NC@char
+ \PackageWarning{array}%
+ {Redefining primitive column \NC@char}\fi}%
+ \NC@list\expandafter{\the\NC@list\NC@do#1}}%
+ {\PackageWarning{array}{Column \NC@char\space is already defined}}%
+% \end{macrocode}
+% Now we define a macro with an argument delimited by the new column
+% specifier, this is used to find occurrences of this specifier in the
+% user preamble.
+% \begin{macrocode}
+ \@namedef{NC@find@\NC@char}##1#1{\NC@{##1}}%
+% \end{macrocode}
+% If an optional argument was not given, give a default argument of 0.
+% \begin{macrocode}
+ \@ifnextchar[{\newcol@{\NC@char}}{\newcol@{\NC@char}[0]}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\newcol@}
+% We can now define the macro which does the rewriting,
+% "\@reargdef" takes the same arguments as "\newcommand", but
+% does not check that the command is new. For a column, say `D' with
+% one argument, define a command "\NC@rewrite@D" with one
+% argument, which recursively calls "\NC@find" on the user preamble
+% after replacing the first token or group with the replacement text
+% specified in the "\newcolumntype" command. "\NC@find" will find the
+% next occurrence of `D' as it will be "\let" equal to
+% "\NC@find@D" by "\NC@do".
+% \begin{macrocode}
+\def\newcol@#1[#2]#3{\expandafter\@reargdef
+ \csname NC@rewrite@#1\endcsname[#2]{\NC@find#3}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@}
+% Having found an occurrence of the new column, save the preamble
+% before the column in "\@temptokena", then check to see if we
+% are at the end of the preamble. (A dummy occurrence of the column
+% specifier will be placed at the end of the preamble by "\NC@do".
+% \begin{macrocode}
+\def\NC@#1{%
+ \@temptokena\expandafter{\the\@temptokena#1}\futurelet\next\NC@ifend}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@ifend}
+% We can tell that we are at the end as "\NC@do" will place a "\relax"
+% after the dummy column.
+% \begin{macrocode}
+\def\NC@ifend{%
+% \end{macrocode}
+% If we are at the end, do nothing. (The whole preamble will now be in
+% "\@temptokena".)
+% \begin{macrocode}
+ \ifx\next\relax
+% \end{macrocode}
+% Otherwise set the flag "\if@tempswa", and rewrite the column.
+% "\expandafter" introduced 1n V2.01
+% \begin{macrocode}
+ \else\@tempswatrue\expandafter\NC@rewrite\fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@do}
+% If the user has specified `C' and `L' as new columns, the list of
+% rewrites (in the token register "\NC@list") will look like
+% "\NC@do *" "\NC@do C" "\NC@do L".
+% So we need to define "\NC@do" as a one argument macro which
+% initialises the rewriting of the specified column. Let us assume that
+% `C' is the argument.
+% \begin{macrocode}
+\def\NC@do#1{%
+% \end{macrocode}
+% First we let "\NC@rewrite" and "\NC@find" be
+% "\NC@rewrite@C" and "\NC@find@C" respectively.
+% \begin{macrocode}
+ \expandafter\let\expandafter\NC@rewrite
+ \csname NC@rewrite@\string#1\endcsname
+ \expandafter\let\expandafter\NC@find
+ \csname NC@find@\string#1\endcsname
+% \end{macrocode}
+% Clear the token register "\@temptokena" after putting the present
+% contents of the register in front of the token "\NC@find". At the
+% end we place the tokens `"C\relax"' which "\NC@ifend" will use
+% to detect the end of the user preamble.
+% \begin{macrocode}
+ \expandafter\@temptokena\expandafter{\expandafter}%
+ \expandafter\NC@find\the\@temptokena#1\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\showcols}
+% This macro is useful for debugging "\newcolumntype" specifications,
+% it is the equivalent of the primitive "\show" command for macro
+% definitions. All we need to do is locally redefine "\NC@do" to take
+% its argument (say `C') and then "\show" the (slightly modified)
+% definition of "\NC@rewrite@C". Actually as the the list always
+% starts off with "\NC@do *" and we do not want to print the
+% definition of the $*$-form, define "\NC@do" to throw away the first
+% item in the list, and then redefine itself to print the rest of the
+% definitions.
+% \begin{macrocode}
+\def\showcols{{\def\NC@do##1{\let\NC@do\NC@show}\the\NC@list}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@show}
+% If the column `C' is defined as above, then
+% "\show\NC@rewrite@C" would output\\
+% "\long macro: ->\NC@find >{$}c<{$}".
+% We want to strip the "long macro: ->" and the "\NC@find". So first we
+% use "\meaning" and then apply the macro "\NC@strip" to the tokens so
+% produced and then "\typeout" the required string.
+% \begin{macrocode}
+\def\NC@show#1{%
+ \typeout{Column #1\expandafter\expandafter\expandafter\NC@strip
+ \expandafter\meaning\csname NC@rewrite@#1\endcsname\@@}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@strip}
+% Delimit the arguments to "\NC@strip" with `\texttt{:}', `\texttt{->}',
+% a space, and "\@@" to pull out the required parts of the output from
+% "\meaning".
+% \begin{macrocode}
+\def\NC@strip#1:#2->#3 #4\@@{#2 -> #4}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\NC@list}
+% Allocate the token register used for the rewrite list.
+% \begin{macrocode}
+\newtoks\NC@list
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The $*$--form}
+% We view the $*$-form as a slight generalisation of the system
+% described in the previous subsection. The idea is to define a $*$
+% column by a command of the form:
+% \begin{verbatim}
+% \newcolumntype{*}[2]{%
+% \count@=#1\ifnum\count@>0
+% \advance\count@ by -1 #2*{\count@}{#2}\fi}
+% \end{verbatim}
+% \begin{macro}{\NC@rewrite@*}\label{NC@rewrite@*}
+% \changes{v2.4b}{2005/08/23}{Fix occasional spurious space (PR/3755)}
+% This does not work however as "\newcolumntype" takes great care not
+% to expand anything in the preamble, and so the "\if" is never
+% expanded. "\newcolumntype" sets up various other parts of the
+% rewrite correctly though so we can define:
+% \begin{macrocode}
+\newcolumntype{*}[2]{}
+% \end{macrocode}
+% Now we must correct the definition of "\NC@rewrite@*". The
+% following is probably more efficient than a direct translation of
+% the idea sketched above, we do not need to put a $*$ in the preamble
+% and call the rewrite recursively, we can just put "#1" copies of
+% "#2" into "\@temptokena". (Nested $*$ forms will be expanded
+% when the whole rewrite list is expanded again, see "\@mkpream")
+% \begin{macrocode}
+\long\@namedef{NC@rewrite@*}#1#2{%
+% \end{macrocode}
+% Store the number.
+% \begin{macrocode}
+ \count@#1\relax
+% \end{macrocode}
+% Put "#1" copies of "#2" in the token register.
+% \begin{macrocode}
+ \loop
+ \ifnum\count@>\z@
+ \advance\count@\m@ne
+ \@temptokena\expandafter{\the\@temptokena#2}%
+ \repeat
+% \end{macrocode}
+% "\NC@do" will ensure that "\NC@find" is "\let" equal
+% to "\NC@find@*".
+% \begin{macrocode}
+ \NC@find}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Modifications to internal macros of \texttt{array.sty}}
+%
+% \begin{macro}{\@xexpast}
+% \begin{macro}{\@xexnoop}
+% These macros are used to expand $*$-forms in
+% \texttt{array.sty}. "\let" them to "\relax" to save space.
+% \begin{macrocode}
+\let\@xexpast\relax
+\let\@xexnoop\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\save@decl}
+% We do not assume that the token register is free, we add the new
+% declarations to the front of the register. This is to allow user
+% preambles of the form, ">{foo}>{bar}..". Users are not encouraged to
+% enter such expressions directly, but they may result from the
+% rewriting of "\newcolumntype"'s.
+% \begin{macrocode}
+\def\save@decl{\toks \count@ = \expandafter\expandafter\expandafter
+ {\expandafter\@nextchar\the\toks\count@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@mkpream}
+% The main modification to "\@mkpream" is to replace the call to
+% "\@xexpast" (which expanded $*$-forms) by a loop which expands
+% all "\newcolumntype" specifiers.
+% \changes{v2.4e}{2016/10/07}{Fixing SX68732}
+% \changes{v2.4f}{2017/11/04}{Managing m-cells without \cs{vcenter}}
+% \begin{macrocode}
+\def\@mkpream#1{\gdef\@preamble{}\@lastchclass 4 \@firstamptrue
+ \let\@sharp\relax
+% \end{macrocode}
+%
+% \changes{v2.4j}{2018/11/13}{Do not expand argument of
+% \cs{@startpbox} while building the tabular preamble (sx/459285)}
+% The "\@startpbox" (which is called for "p", "m" or "b" columns)
+% receives a user supplied argument: the width of the
+% paragraph-column. Normally that is something harmless like a length or a
+% simple length expression, but with the calc package involved it
+% could break under an "\edef" operation, which is how the preamble
+% is constructed. We now make use of "\unexpanded" here to prevent that. The
+% "\expandafter" gymnastics is necessary to expand the "#1" at least
+% once (since it will get "\@nextchar" as its value and need its
+% content!
+% \begin{macrocode}
+ \def\@startpbox##1{\unexpanded\expandafter{\expandafter
+ \@startpbox\expandafter{##1}}}\let\@endpbox\relax
+ \let\do@row@strut\relax
+ \let\ar@align@mcell\relax
+% \end{macrocode}
+% Now we remove possible $*$-forms and user-defined column
+% specifiers in the user preamble by repeatedly executing the list
+% "\NC@list" until the re-writes have no more effect. The
+% expanded preamble will then be in the token register
+% "\@temptokena". Actually we need to know at this point that
+% this is not "\toks0".
+% \begin{macrocode}
+ \@temptokena{#1}\@tempswatrue
+ \@whilesw\if@tempswa\fi{\@tempswafalse\the\NC@list}%
+% \end{macrocode}
+% Afterwards we initialize all registers and macros, that we need
+% for the build-up of the preamble.
+% \begin{macrocode}
+ \count@\m@ne
+ \let\the@toks\relax
+ \prepnext@tok
+% \end{macrocode}
+% Having expanded all tokens defined using "\newcolumntype" (including
+% "*"), we evaluate the remaining tokens, which are saved in
+% "\@temptokena". We use the \LaTeX--macro "\@tfor" to inspect each
+% token in turn.
+% \begin{macrocode}
+ \expandafter \@tfor \expandafter \@nextchar
+ \expandafter :\expandafter =\the\@temptokena \do
+% \end{macrocode}
+% "\@testpatch" does not take an argument since \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+ {\@testpach
+ \ifcase \@chclass \@classz \or \@classi \or \@classii
+ \or \save@decl \or \or \@classv \or \@classvi
+ \or \@classvii \or \@classviii
+% \end{macrocode}
+% In \texttt{newarray.sty} class 9 is equivalent to class 10.
+% \begin{macrocode}
+ \or \@classx
+ \or \@classx \fi
+ \@lastchclass\@chclass}%
+ \ifcase\@lastchclass
+ \@acol \or
+ \or
+ \@acol \or
+ \@preamerr \thr@@ \or
+ \@preamerr \tw@ \@addtopreamble\@sharp \or
+ \or
+ \else \@preamerr \@ne \fi
+ \def\the@toks{\the\toks}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classix}
+% \texttt{array.sty} does not allow repeated \texttt{>}
+% declarations for the same column. This is allowed in
+% \texttt{newarray.sty} as documented in the introduction. Removing
+% the test for this case makes class 9 equivalent to class 10, and
+% so this macro is redundant. It is "\let" to "\relax" to save
+% space.
+% \begin{macrocode}
+\let\@classix\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classviii}
+% In \texttt{newarray.sty} explicitly allow class 2, as repeated
+% \texttt{<} expressions are accepted by this package.
+% \begin{macrocode}
+\def\@classviii{\ifnum \@lastchclass >\z@\ifnum\@lastchclass=\tw@\else
+ \@preamerr 4\@chclass 6 \@classvi \fi\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@classv}
+% Class 5 is \texttt{@}-expressions (and is also called by class 1)
+% This macro was incorrect in Version~1. Now we do not expand the
+% "@"-expression, but instead explicitly replace an
+% "\extracolsep" command by an assignment to "\tabskip" by a
+% method similar to the "\newcolumntype" system described above.
+% "\d@llarbegin" "\d@llarend" were introduced in V2.01 to match
+% \texttt{array.sty} 2.0h.
+% \begin{macrocode}
+\def\@classv{\save@decl
+ \expandafter\NC@ecs\@nextchar\extracolsep{}\extracolsep\@@@
+ \@addtopreamble{\d@llarbegin\the@toks\the\count@\relax\d@llarend}%
+ \prepnext@tok}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NC@ecs}
+% Rewrite the first occurrence of "\extracolsep{1in}" to
+% "\tabskip1in\relax". As a side effect discard any tokens after a
+% second "\extracolsep", there is no point in the user entering two of
+% these commands anyway, so this is not really a restriction.
+% \begin{macrocode}
+\def\NC@ecs#1\extracolsep#2#3\extracolsep#4\@@@{\def\@tempa{#2}%
+ \ifx\@tempa\@empty\else\toks\count@={#1\tabskip#2\relax#3}\fi}
+%</ncols>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Support for the \texttt{delarray.sty}}
+%
+% The \texttt{delarray.sty} package extends the array syntax by
+% supporting the notation of delimiters. To this end we extend the
+% array parsing mechanism to include a hook which can be used by this
+% (or another) package to do some additional parsing.
+%
+% \begin{macro}{\@tabarray}
+% This macro tests for an optional bracket and then calls up
+% "\@@array" or "\@@array[c]" (as default).
+% \begin{macrocode}
+%<*package>
+\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@array}
+% This macro tests could then test an optional delimiter before the
+% left brace of the main preamble argument. Here in the main package
+% it simply is let to be "\@array".
+% \begin{macrocode}
+\let\@@array\@array
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endarray}
+% \begin{macro}{\@arrayright}
+% We have to declare the hook we put into "\@array" above.
+% A similar hook `"\@arrayright"' will be inserted into the
+% "\endarray" to gain control. Both defaults to empty.
+% \begin{macrocode}
+\def\endarray{\crcr \egroup \egroup \@arrayright \gdef\@preamble{}}
+\let\@arrayleft\@empty
+\let\@arrayright\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Support for \texttt{\textbackslash firsthline} and
+% \texttt{\textbackslash lasthline}}
+%
+% The Companion~\cite[p.137]{bk:GMS94} suggests two additional
+% commands to control the alignments in case of tabulars with
+% horizontal lines. They are now added to this package.
+%
+% \begin{macro}{\extratabsurround}
+% The extra space around a table when "\firsthline" or "\lasthline"
+% are used.
+% \begin{macrocode}
+\newlength{\extratabsurround}
+\setlength{\extratabsurround}{2pt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\backup@length}
+% This register will be used internally by "\firsthline" and
+% "\lasthline".
+% \begin{macrocode}
+\newlength{\backup@length}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\firsthline}
+% \changes{v2.3h}{1996/05/25}{Complete reimplementation}
+% This code can probably be improved but for the moment it should
+% serve.
+%
+% We start by producing a single tabular row without any visible
+% content that will produce the external reference point in case
+% "[t]" is used.
+% \begin{macrocode}
+\newcommand{\firsthline}{%
+ \multicolumn1c{%
+% \end{macrocode}
+% Within this row we calculate "\backup@length" to be the height
+% plus depth of a standard line. In addition we have to add the
+% width of the "\hline", something that was forgotten in the
+% original definition.
+% \begin{macrocode}
+ \global\backup@length\ht\@arstrutbox
+ \global\advance\backup@length\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+% \end{macrocode}
+% Finally we do want to make the height of this first line be a bit
+% larger than usual, for this we place the standard array strut
+% into it but raised by "\extratabsurround"
+% \begin{macrocode}
+ \raise\extratabsurround\copy\@arstrutbox
+% \end{macrocode}
+% Having done all this we end the line and back up by the value of
+% "\backup@length" and then finally place our "\hline". This should
+% place the line exactly at the right place but keep the reference
+% point of the whole tabular at the baseline of the first row.
+% \begin{macrocode}
+ }\\[-\backup@length]\hline
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\lasthline}
+% \changes{v2.3h}{1996/05/25}{Complete reimplementation}
+% For "\lasthline" the situation is even worse and I got it
+% completely wrong initially.
+%
+% The problem in this case is that if the optional argument "[b]"
+% is used we do want the reference point of the tabular be at the
+% baseline of the last row but at the same time do want the the
+% depth of this last line increased by "\extratabsurround" without
+% changing the placement "\hline".
+%
+% We start by placing the rule followed by an invisible row.
+% \begin{macrocode}
+\newcommand{\lasthline}{\hline\multicolumn1c{%
+% \end{macrocode}
+% We now calculate "\backup@length" to be the height and depth of
+% two lines plus the width of the rule.
+% \begin{macrocode}
+ \global\backup@length2\ht\@arstrutbox
+ \global\advance\backup@length2\dp\@arstrutbox
+ \global\advance\backup@length\arrayrulewidth
+% \end{macrocode}
+% This will bring us back to the baseline of the second last row:
+% \begin{macrocode}
+ }\\[-\backup@length]%
+% \end{macrocode}
+% Thus if we now add another invisible row the reference point of
+% that row will be at the baseline of the last row (and will be the
+% reference for the whole tabular). Since this row is invisible we
+% can enlarge its depth by the desired amount.
+% \begin{macrocode}
+ \multicolumn1c{%
+ \lower\extratabsurround\copy\@arstrutbox
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Getting the spacing around rules right}
+%
+% Beside a larger functionality \texttt{array.sty} has one
+% important difference to the standard \texttt{tabular} and
+% \texttt{array} environments: horizontal and vertical rules make a
+% table larger or wider, e.g., \verb=\doublerulesep= really denotes
+% the space between two rules and isn't measured from the middle of
+% the rules.
+%
+% \begin{macro}{\@xhline}
+% For vertical rules this is implemented by the definitions above,
+% for horizontal rules we have to take out the backspace.
+% \changes{v2.3d}{1995/11/19}{fix space between double rules pr/1945}
+% \begin{macrocode}
+\CheckCommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \vskip-\arrayrulewidth
+ \fi
+ \ifnum0=`{\fi}}
+\renewcommand*\@xhline{\ifx\reserved@a\hline
+ \vskip\doublerulesep
+ \fi
+ \ifnum0=`{\fi}}
+%</package>
+% \end{macrocode}
+% \end{macro}
+
+% \subsection{Implementing column types \texttt{w} and \texttt{W}}
+%
+% In TugBoat 38/2 an extension was presented that implemented two
+% aditional column types \texttt{w} and \texttt{W}. These have now
+% been added to the package itself.
+%
+%
+% \begin{macro}{\ar@cellbox}
+% For \texttt{w} and \texttt{W} column types we need a box to
+% temporarily hold the cell content.
+% \changes{v2.4f}{2017/11/07}{Macro added}
+% \begin{macrocode}
+\newsavebox\ar@cellbox
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\newcolumntype w}
+% The \texttt{w} column type has two arguments: the first holds the
+% alignment which is either "l", "c", or "r" and the second is the
+% nominal width of the column.
+% \changes{v2.4f}{2017/11/07}{Column type added}
+% \begin{macrocode}
+\newcolumntype{w}[2]{%
+% \end{macrocode}
+% Before the cell content we start an "lrbox"-environment to
+% collect the cell material into the previously allocated box
+% "\ar@cellbox".
+% \begin{macrocode}
+ >{\begin{lrbox}\ar@cellbox}%
+% \end{macrocode}
+% Then comes a specifier for the cell content. We use "c", but
+% that doesn't matter as in the end we will always put a box of a
+% specific width ("#2") into the cells of that column, so "l" or
+% "r" would give the same result. There is only a difference if
+% there are also very wide "\multicolumn" rows overwriting the
+% setting in which case "c" seems to be slightly better.
+% \begin{macrocode}
+ c%
+% \end{macrocode}
+% At the end of the cell we end the "lrbox" environment so that all
+% of the cell content is now in box "\ar@cellbox". As a final step we
+% put that box into a "\makebox" using the optional arguments of
+% that command to achieve the correct width and the desired
+% alignment within that width.
+% \begin{macrocode}
+ <{\end{lrbox}%
+ \makebox[#2][#1]{\usebox\ar@cellbox}}}
+% \end{macrocode}
+% \end{macro}
+
+%
+%
+% \begin{macro}{\newcolumntype W}
+% The \texttt{W} is similar but in this case we want a warning if
+% the cell content is too wide.
+% \changes{v2.4f}{2017/11/07}{Column type added}
+% \begin{macrocode}
+\newcolumntype{W}[2]
+ {>{\begin{lrbox}\ar@cellbox}%
+ c%
+ <{\end{lrbox}%
+ \let\hss\hfil
+ \makebox[#2][#1]{\unhbox\ar@cellbox}}}
+% \end{macrocode}
+% This is a bit sneaky, as it temporarily disables "\hss", but
+% given that we know what goes into that box it should be
+% sufficient.
+% \end{macro}
+%
+%
+% \PrintIndex
+% \PrintChanges
+%
+% \Finale
+%
+\endinput
+
diff --git a/macros/latex-dev/required/tools/array.pdf b/macros/latex-dev/required/tools/array.pdf
new file mode 100644
index 0000000000..dfb2f3cc61
--- /dev/null
+++ b/macros/latex-dev/required/tools/array.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/bm.dtx b/macros/latex-dev/required/tools/bm.dtx
new file mode 100644
index 0000000000..2216dcea07
--- /dev/null
+++ b/macros/latex-dev/required/tools/bm.dtx
@@ -0,0 +1,1705 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%
+% \iffalse
+%% Copyright 1996 1997 1998 1999 2002 2003 2004 2016 2017 2019
+%% David Carlisle Frank Mittelbach
+%%
+%% Development of this package was commissioned by Y&Y Inc.
+%
+%
+%<*dtx>
+ \ProvidesFile{bm.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{bm}
+%<driver>\ProvidesFile{bm.drv}
+% \fi
+% \ProvidesFile{bm.dtx}
+ [2019/07/24 v1.2d Bold Symbol Support (DPC/FMi)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{bm}
+\begin{document}
+\DocInput{bm.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \GetFileInfo{bm.dtx}
+%
+% \title{The \textsf{bm} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}\ \thanks{Development of this package
+% was commissioned by Y\&Y.}}
+%
+% \date{\filedate}
+% \author{David Carlisle with support by Frank Mittelbach}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \section{Introduction}
+%
+% This package defines commands to access bold math
+% symbols. The basic command is |\bm| which may be used to make the
+% math expression in its argument be typeset using bold fonts.
+%
+% The syntax of |\bm| is:\\
+% |\bm|\marg{math expression}\\
+% So |$\alpha \not= \bm{\alpha}$| produces $\alpha \not= \bm{\alpha}$.
+%
+% |\bm| goes to some trouble to preserve the spacing, so that for
+% instance |\bm<| is a bold $\bm<$ but with the correct |\mathrel|
+% spacing that \TeX\ gives to $<$. The calculations that \TeX\ needs to
+% do for |\bm| can be quite involved and so a definition form is
+% provided.
+%
+% |\DeclareBoldMathCommand|%^^A
+% \oarg{math version}\marg{cmd}\marg{math expression}
+%
+% Defines |\cmd| to be the bold form of the math expression.
+% The \meta{math version} defaults to `bold' (i.e., |\boldmath|).
+%
+% For relatively simple expressions, the resulting definitions are very
+% efficient, for instance after:\\
+% |\DeclareBoldMathCommand\balpha{\alpha}|\\
+% |\balpha| is a single `mathchardef' token producing a bold alpha,
+% and so is just as fast to execute as |\alpha|.
+%
+% The above command is mainly intended for use in packages.
+% For occasional use in \LaTeX\ documents, and for compatibility
+% with the plain \TeX\ support for the mathtime fonts, a `user-level'
+% version, |\bmdefine| is provided that is equivalent to:\\
+% |\DeclareBoldMathCommand[bold]|.
+%
+% If there is a `heavy' math version defined (usually accessed by a
+% user-command |\heavymath|) then a similar command |\hm|
+% is defined which access these `ultra bold' fonts. Currently this is
+% probably only useful with the `mathtime plus' font collection.
+% Definitions of commands that use these fonts may be made by
+% specifying the optional argument `heavy' to |\DeclareBoldMathCommand|.
+% Again an abbreviation, |\hmdefine|, is provided, equivalent to:\\
+% |\DeclareBoldMathCommand[heavy]|.
+%
+% The command names (but not the implementation) are taken from Michael
+% Spivak's macros to support the mathtime fonts for plain \TeX. In those
+% original macros, the syntax for |\bmdefine| was
+% |\bmdefine\balpha{\bm\alpha}| (with a nested |\bm|). This syntax also
+% works with this package.
+%
+% \section{Font allocation}
+% In order to access bold fonts in the simplest and quickest possible
+% manner, the package normally allocates symbol fonts for bold
+% (and possibly heavy) fonts into the `normal' math version.
+% By default it allocates at most four fonts for |\bm| and at most
+% three fonts for |\hm|. This means that if the mathtime plus font set
+% is being used, seven additional symbol fonts will be used, in addition
+% to the basic four that \LaTeX\ already declares. The mathtime
+% package also declares an extra symbol font, bringing the total to
+% twelve. The maximum number of symbol \emph{and} math alphabet fonts
+% that can be used in a math version is sixteen. So the above allocation
+% scheme does not leave room for many extra math symbols (such as the
+% AMS symbols) or math alphabets (such as |\mathit|).
+%
+% Before loading the \textsf{bm} package you may define |\bmmax|
+% and |\hmmax| to be suitable values, for instance you may want
+% to set |\newcommand\hmmax{0}| if you will not be using |\hm|
+% much, but you do have a heavy math version defined.
+%
+% Even if |\bmmax| is set to zero, |\bm| will still access the correct
+% bold fonts (by accessing the fonts via |\boldmath|) but this method
+% is slower, and does not work with delimiters. Delimiters can only be
+% made bold if the bold font has been allocated.
+%
+% Conversely if you have a non standard font set that makes available
+% extra math delimiters and accents in bold and medium weights you may
+% want to \emph{increase} |\bmmax| so that fonts are allocated for
+% your font set.
+%
+% \section{Features}
+% In most cases this package should work in a fairly self explanatory
+% way, but there are some things that might not be obvious.
+%
+% \subsection{Interaction with Math Alphabet Commands}
+%
+% As mentioned above, |\bm| goes to some trouble to try to make a
+% command that is just like its argument, but using a bold font.
+% This does not always produce the effect that you might expect.
+%\begin{verbatim}
+% $1 g \bm{g}$
+% $2 \mathrm{g \bm{g}}$
+% $3 {g} \bm{{g}}$
+% $4 \mathrm{{g} \bm{{g}}}$
+% $5 \mathrm{g} \bm{\mathrm{g}}$
+%\end{verbatim}
+% produces the following:
+% \begin{flushleft}
+% $1 g \bm{g}$
+% $2 \mathrm{g \bm{g}}$
+% $3 {g} \bm{{g}}$
+% $4 \mathrm{{g} \bm{{g}}}$
+% $5 \mathrm{g} \bm{\mathrm{g}}$
+% \end{flushleft}
+% In math mode `g' is effectively a command that produces the letter `g'
+% from the `letters' alphabet, unless a Math Alphabet command is in
+% effect, in which case the `g' comes from the specified alphabet.
+% |\bm{g}| makes an equivalent command, but which defaults to a bold
+% letter alphabet. So in the first example |\bm{g}| is bold math italic,
+% but in the second example the |\mathrm| applies to both |g| and
+% |\bm{g}| in the same way, and so they are both roman.
+%
+% |\bm| only inspects the `top level' definition of a command, for more
+% complicated expressions, and anything inside a |{ }| group, |\bm|
+% forces bold fonts by essentially the same (slow) technique used by the
+% AMS |\boldsymbol| command (but |\bm| still takes more care of the
+% spacing). So the third example produces identical output to the first
+% (but \TeX\ takes more time producing it).
+%
+% In the fourth example the |\mathrm{\bm{g}}| is essentially
+% equivalent to |\mathrm{\mbox{\boldmath$g$}}|. Currently math alphabet
+% settings are not passed down to `nested' math lists, and so in this
+% example, the |\mathrm| has no effect, and a bold math italic $\bm g$
+% is obtained.
+%
+% Similarly the last example is equivalent to
+% |$\mbox{\boldmath$\mathrm{g}$}}| and so in this case, one obtains a
+% bold roman \textbf{g}.
+%
+% \subsection{Delimiters}
+% \TeX\ can treat character tokens in two\footnote
+% {Well more than two really.}
+% ways. If there is a preceding
+% |\left| or |\right| it can treat them as a delimiter, otherwise it can
+% treat them as a standard character. For example |\left<\right>|
+% produces $\left<\right>$, which is totally different from |<>|, which
+% produces $<>$.
+%
+% \TeX\ can only do this for character tokens. Commands such as
+% |\langle| do not act in this way. This means that |\bm| has to decide
+% whether to treat a character as a delimiter or not. The rule it uses
+% is, it makes a delimiter command for a character if the previous
+% token in the argument was |\left| or |\right|. So |\left\bm{<}| does
+% not work, but |\bm{\left<}| does.
+%
+% \subsection{Command Arguments}
+%
+% Normally if a command takes arguments the full command, including
+% any arguments, should be included in |\bm|.
+%
+% So |\bm{\overbrace{abc}}| (producing \smash{$\bm{\overbrace{abc}}$})
+% not
+% |\bm{\overbrace}{abc}|. If you do not include all the arguments you
+% will typically get the error message:\\
+% |Runaway argument?|\\
+% |! Forbidden control sequence found while scanning use of|
+% \texttt{\ldots}
+%
+% However commands defined in terms of the \TeX\ accent and
+% radical primitives \emph{may} be used without their arguments.
+% So |\bm{\hat}{a}| produces $\bm{\hat}{a}$, a bold accent over a
+% non-bold $a$ (compare $\hat{a}$)
+% whereas |\bm{\hat{a}}| makes both the $a$ and the accent bold,
+% $\bm{\hat{a}}$.
+% Similarly, although the \LaTeX\ command |\sqrt| must be used with its
+% arguments, |\sqrtsign| may be used as in |\bm\sqrtsign{abc}| to
+% produce $\bm\sqrtsign{abc}$ rather than $\sqrtsign{abc}$ or
+% $\bm{\sqrtsign{abc}}$
+%
+% If you really need to make a command with arguments use bold fonts
+% without making all of the arguments bold, you can explicitly
+% reset the math version in the argument, eg:\\
+% $\begin{array}{ccc}
+% |\sqrt{xyz}|&|\bm{\sqrt{xyz}}|&|\bm{\sqrt{\mbox{\unboldmath$xyz$}}}|\\
+% \sqrt{xyz}& \bm{\sqrt{xyz}}& \bm{\sqrt{\mbox{\unboldmath$xyz$}}}
+% \end{array}$
+%
+% \subsection{Bold fonts}
+% This package interrogates the font allocations of the bold and heavy
+% math versions, to determine which bold fonts are available.
+% This means that it is best to load the package \emph{after}
+% any packages that define new symbol fonts, or (like the
+% \textsf{mathtime} package) completely change the symbol font
+% allocations.
+%
+% If no bold font appears to be available for a particular symbol,
+% |\bm| will use `poor man's bold' that is, overprinting the same
+% character in slightly offset
+% positions to give an appearance of boldness.
+%
+% In the standard Computer Modern font set, there is no bold
+% `large symbols' font. In the `mathptm' and (standard) mathtime
+% font sets there are no bold math fonts. In the `mathtime plus'
+% font set there are suitable fonts for bold and heavy math setting,
+% and so |\bm| and |\hm| work well. Similarly in the basic Lucida
+% New Math font set there are no bold math fonts, so |\bm| will
+% use `poor man's bold. However if the Lucida Expert set is used,
+% Then |\bm| will detect, and use the bold math fonts that are
+% available.
+%
+% As discussed above, one may set |\bmmax| higher or lower than its
+% default value of four to control the font allocation system. Finer
+% control may be gained by explicitly declaring bold symbol fonts.
+% Suppose you have a symbol font `xyz' that is available in medium and
+% bold weights, then you would declare this to \LaTeX\ via:\\
+% |\DeclareSymbolFont{extras} {OMS}{xyz}{m}{n}|\\
+% |\SetSymbolFont{extras}{bold}{OMS}{xyz}{bx}{n}|\\
+% At this point the symbols will be available in the normal math
+% version, and their bold variants in |\boldmath|. If you also
+% declare:\\
+% |\DeclareSymbolFont{boldextras}{OMS}{xyz}{bx}{n}|\\
+% That is, declare a symbol font whose name is formed by prefixing
+% `bold' (or `heavy') to an existing symbol font, then |\bm| (or
+% |\hm|) will use this font directly, rather then accessing the
+% `extras' symbol font via |\boldmath|.
+%
+% \subsection{Strange failures}
+% In order to get the correct spacing, |\bm| has to `investigate' the
+% definition of the commands in its argument. It is possible that
+% some strange constructions could `confuse' this investigation.
+% If this happens then \LaTeX\ will almost certainly stop with a strange
+% error. This should not happen with any of the math symbols
+% defined in the base \LaTeX\ or AMS distributions, or any commands
+% defined in terms of those symbols using normal \LaTeX\ math
+% constructs. However if some command does fail to work inside |\bm|
+% you should always be able to surround it with an extra set of braces
+% |\bm{{\cmd}}| rather than |\bm{\cmd}|. |\bm| will not then attempt
+% to set the correct spacing, so you may need to set it explicitly,
+% for instance, for a relation, |\bm{\mathrel{\cmd}}|.
+%
+% \subsection{AMS package \textsf{amsbsy}}
+% The |\bm| command shares some functionality with the |\boldsymbol|
+% command from the AMS \LaTeX\ collection. To aid in moving documents
+% between these two packages, this package defines |\boldsymbol| and
+% |\heavysymbol| as alternative names for |\bm| and |\hm|.
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \changes{v0.01}{1996/12/01}
+% {Initial DPC attempt,
+% remove all assumptions about mathtime encoding}
+% \changes{v0.02}{1996/12/02}
+% {Add \cs{mathchoice} stuff}
+% \changes{v0.03}{1996/12/12}
+% {Completely reimplement (again). Add \cs{bmdefine}.}
+% \changes{v0.04}{1996/12/12}
+% {Add \cs{hm} and support for special active mathcode.}
+% \changes{v0.05}{1996/12/12}
+% {Assorted fixes}
+% \changes{v0.99}{1997/01/16}
+% {First public version}
+% \changes{v1.0a}{1997/02/14}
+% {First ctan version (same as 0.99b)}
+% \changes{v1.0b}{1997/04/14}
+% {Add to tools bundle.}
+% \changes{v1.0g}{1999/07/05}
+% {minor doc changes latex/3058}
+%
+%
+%
+% The commands |\bm| and |\hm| work by defining a number of additional
+% symbol fonts corresponding to the standard ones
+% `operators', `letters', `symbols', and `largesymbols'.
+% The names for these symbols fonts are produced by prefixing the usual
+% name with `bold' or `heavy'.
+%
+% For maximum flexibility we get the font definitions by looking in the
+% corresponding math versions, i.e., into |\mv@bold| and if defined into
+% |\mv@heavy|.
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \changes{v0.09}{1996/12/19}
+% {Always define \cs{bm} even if no bold math}
+%
+% \begin{macro}{\bm@table}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% \changes{v0.12}{1997/01/10}
+% {Ensure do not allocate too many math group slots.}
+% \changes{v0.99a}{1997/01/17}
+% {Let \cs{hm} use font allocated for \cs{bm}}
+% \changes{v0.99b}{1997/01/19}
+% {Restore NFSS internals}
+% \begin{macro}{\bm@boldtable}
+% \begin{macro}{\bm@heavytable}
+% The table, |\bm@table|, (which is locally |\let| to either the bold
+% or heavy version) defines, for each \meta{math group} (\meta{fam}),
+% the `offset' to the bold version of the specified symbol font.
+% If there is no bold symbol font defined, the offset will be
+% set to zero if there is a bold font assigned to this slot in the
+% bold math version, or $-1$ if the font in the bold math version
+% is the same as the one in the normal math version. In this case
+% a `poor man's bold' system of overprinting is used to achieve
+% boldness where this is possible.
+%
+% The settings are made at the time this package is read, and so
+% it is best to load this package late, after any font loading packages
+% have been loaded. Symbol fonts loaded after this package will get the
+% offset of zero, so they will still be made bold by |\bm| as long as an
+% appropriate font is declared for the bold math version.
+%
+% |\bm@boldtable| and |\bm@heavytable| are set up using very similar
+% code, which is temporarily defined to |\bm|, to save wasting a csname.
+% Similarly |\bm@pmb|\ldots\ (which will be defined later) are used
+% as scratch macros.
+%
+% The general plan. Run through the fonts allocated to the normal math
+% version. Ignore \meta{math alphabet} allocations\footnote{For now?}
+% but for each math symbol font, look in the math version specified by
+% |#1| (bold or heavy). If the font there is different, then allocate
+% a new symbol font in the normal math version to access that bold font
+% and place the numerical difference between the allocations of the bold
+% and normal font into the table being built (|\bm@boldtable|, if |#1|
+% is bold). If the symbol allocation is already greater than |\bmmax|
+% do not allocate a new symbol font, but rather set the offset in the
+% table to zero. |\bm| will detect this, and use |\boldmath| on its
+% argument in this case, so the bold font will be accessed but more
+% slowly than using a direct access to a bold font allocated into the
+% normal math version. If the font allocated in the bold math version is
+% the same as the font in the normal math version, set the offset to
+% $-1$, which is a flag value that causes |\bm| to use `poor man's bold'
+% overprinting three copies of the symbol, offset slightly to give an
+% appearance of boldness.
+%
+% Fonts containing delimiters and math accents \emph{must} be allocated
+% into the normal math version if they are to be used with |\bm|. (In
+% these cases |\bm| will produce the normal weight symbol, rather than
+% using |\boldmath| or poor man's bold.)
+%
+% \begin{macrocode}
+\def\bm#1#2{%
+% \end{macrocode}
+% This code can not work inside a group, as that would affect any symbol
+% font allocations, so instead use some scratch macros to save and
+% restore the definitions of commands we need to change locally.
+% \begin{macrocode}
+ \let\bm@pmb\install@mathalphabet
+ \let\bm@pmb@\getanddefine@fonts
+ \let\bm@pmb@@\or
+ \edef\bm@general{\f@encoding/\f@family/\f@series/\f@shape/\f@size}%
+% \end{macrocode}
+%
+% |#2| specifies the maximum number of fonts to allocate
+% (either |\bmmax| or |\hmmax|). First check against |\count18|
+% that there are that many slots left, and if not reduce accordingly.
+% Put the resulting value in |\@tempcnta|.
+% \begin{macrocode}
+ \@tempcnta#2%
+ \count@-\count18%
+ \advance\count@-\@tempcnta
+ \advance\count@15\relax
+ \ifnum\count@<\z@
+ \advance\@tempcnta\count@
+ \fi
+% \end{macrocode}
+% Make |\or| non-expandable, so we can build an |\ifcase| bit-by-bit
+% in a sequence of |\edef|s.
+% \begin{macrocode}
+ \let\or\relax
+% \end{macrocode}
+%
+% Initialise the table (to |\@gobble| to remove the first |\or|).
+% \begin{macrocode}
+ \expandafter\let\csname bm@#1table\endcsname\@gobble
+% \end{macrocode}
+%
+% Helper macro that adds the next entry to the table being built.
+% \begin{macrocode}
+ \def\bm@define##1{%
+ \expandafter\xdef\csname bm@#1table\endcsname{%
+ \csname bm@#1table\endcsname\or##1}}%
+% \end{macrocode}
+%
+% Each symbol font is recorded in the math version list by a sequence
+% such as:\\
+% | \getanddefine@fonts \symsymbols \OMS/cmsy/m/n|\\
+% Where the first argument is a chardef token carrying the number
+% allocated (to symbols, in this example), and the second argument is a
+% csname whose \emph{name} denotes the font used.
+% So locally redefine |\getanddefine@fonts| to compare |#2| with
+% the name in the appropriate slot in the bold math version.
+% \begin{macrocode}
+ \def\getanddefine@fonts##1##2{%
+ \def\@tempa{##2}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\@tempb####1##1####2####3\@nil{\def\@tempb{####2}}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter
+ \@tempb\csname mv@#1\endcsname\@nil
+% \end{macrocode}
+%
+% Now |\@tempa| and |\@tempb| contain the names of the fonts allocated
+% to this slot in the two math versions.
+% \begin{macrocode}
+ \ifx\@tempa\@tempb
+% \end{macrocode}
+% If they are the same, set this offset to $-1$, as a flag to use
+% poor man's bold.
+% \begin{macrocode}
+ \bm@define\m@ne
+ \else
+% \end{macrocode}
+% Else make a new name by adjoining |#1| to the name of the symbol font
+% eg, |\symboldsymbols| to match |\symsymbols|. If that font has already
+% been allocated, or if |\@tempcnta| is positive so we can allocate a
+% new slot for this font, then the table will be
+% set with the offset between the two fonts. otherwise set the offset to
+% zero (so |\boldmath| will be used to access the font).
+% \begin{macrocode}
+ \edef\@tempa{sym#1\expandafter\@gobblefour\string##1}%
+ \ifnum\@tempcnta<%
+ \expandafter\ifx\csname\@tempa\endcsname\relax
+ \@ne
+ \else
+ \m@ne
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \bm@define\z@
+ \else
+% \end{macrocode}
+%
+% If the font is not yet allocated, allocate it now, using
+% an internal hack into |\DeclareMathSymbolFont|.
+%
+% However before allocating it look in the bold math version
+% to see if it is the same, and if so use that. For example
+% with Mathtime the `operators' font in the `heavy' math version
+% is different from that in `normal', but it is the same as
+% the font in `bold' (Times bold). So rather than allocate
+% |\symheavyoperators| just set it equal to |\symboldoperators|.
+% \begin{macrocode}
+ \expandafter\ifx\csname\@tempa\endcsname\relax
+ \begingroup
+ \escapechar\m@ne
+ \edef\@tempb{\endgroup
+ \noexpand\split@name
+ \expandafter\string\@tempb}%
+ \@tempb/\@nil
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \expandafter\ifx
+ \csname symbold\expandafter\@gobblefour\string##1\endcsname
+ \relax
+% \end{macrocode}
+% If no font has been allocated for |\bm| yet, then allocate it now.
+% \begin{macrocode}
+ \expandafter\new@mathgroup\csname\@tempa\endcsname
+ \expandafter\new@symbolfont\csname\@tempa\endcsname
+ \f@encoding\f@family\f@series\f@shape
+% \end{macrocode}
+% Reduce by one the number of fonts we can still allocate.
+% \begin{macrocode}
+ \advance\@tempcnta\m@ne
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% Else do a similar look into the bold mathgroup.
+% Use |\bm@expand| as a scratch macro to save on string space.
+% \begin{macrocode}
+ \def\bm@expand####1##1####2####3\@nil{\def\bm@expand{####2}}%
+ \expandafter\expandafter\expandafter
+ \bm@expand\csname mv@bold\endcsname\@nil
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifx\bm@expand\@tempb
+% \end{macrocode}
+% If the font just found (in heavy) is the same as the font in bold
+% use the slot (in normal) previously allocated for the bold font.
+% (That clear?)
+% \begin{macrocode}
+ \expandafter\let\csname\@tempa\expandafter\endcsname
+ \csname symbold\expandafter
+ \@gobblefour\string##1\endcsname
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% Otherwise allocate a new slot for it.
+% \begin{macrocode}
+ \expandafter\new@mathgroup\csname\@tempa\endcsname
+ \expandafter\new@symbolfont\csname\@tempa\endcsname
+ \f@encoding\f@family\f@series\f@shape
+ \advance\@tempcnta\m@ne
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% If the font has been allocated already, use the existing allocation.
+% \begin{macrocode}
+ \PackageInfo{bm}%
+ {Symbol font \@tempa\space already defined.\MessageBreak
+ Not overwriting it}%
+ \fi
+% \end{macrocode}
+% Whether the font has just been allocated, or whether it was previously
+% allocated, compute the offset and add it to the table.
+% \begin{macrocode}
+ \count@\csname\@tempa\endcsname
+ \advance\count@-##1%
+ \bm@define{\the\count@\relax}%
+ \fi
+ \fi}%
+% \end{macrocode}
+%
+% The math version list also contains information about math alphabet
+% commands, but we want to ignore those here, so \ldots
+% \begin{macrocode}
+ \let\install@mathalphabet\@gobbletwo
+% \end{macrocode}
+%
+% Having set up the local definitions, execute the list for the normal
+% math version.
+% \begin{macrocode}
+ \mv@normal
+% \end{macrocode}
+%
+% So now the offsets are all entered into the table, separated by
+% |\or|.
+% Finish off the definition by making this an |\ifcase|. Add a default
+% value of zero, so that any symbol fonts declared later will also
+% work, as long as a bold version is assigned to the bold math version.
+% \begin{macrocode}
+ \expandafter\xdef\csname bm@#1table\endcsname{%
+ \noexpand\ifcase\@tempcnta
+ \csname bm@#1table\endcsname
+ \noexpand\else
+ \z@
+ \noexpand\fi}%
+% \end{macrocode}
+%
+% Put things back as they were.
+% \begin{macrocode}
+ \expandafter\split@name\bm@general\@nil
+ \let\install@mathalphabet\bm@pmb
+ \let\getanddefine@fonts\bm@pmb@
+ \let\or\bm@pmb@@}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bmmax}
+% To save declaring too many symbol fonts, do not auto-declare
+% any more than |\bmmax| bold symbol fonts into the normal math
+% version. Any bold fonts not so allocated will be accessed via
+% |\boldmath| which is slower and doesn't work for delimiters
+% and accents. It may be set in the preamble with |\newcommand|
+% but use |\chardef| here for a slight efficiency gain.
+%
+% If this is set to a higher value before this
+% package is loaded, keep that value.
+% \begin{macrocode}
+\ifx\bmmax\@undefined
+ \chardef\bmmax=4
+\fi
+% \end{macrocode}
+%
+% If there is no bold math version, It is very easy to set up
+% the table, no need to use all the tricky code above.
+% Also, at the end of the package redefine the internal macro
+% that |\bm| uses to call |\boldmath|, to use poor man's bold
+% instead.
+% \begin{macrocode}
+\ifx\mv@bold\@undefined
+ \def\bm@boldtable{\m@ne}
+ \AtEndOfPackage{%
+ \def\bm@gr@up#1#2{%
+ \bm@pmb{#2}}}
+\else
+% \end{macrocode}
+% Otherwise use the definition of |\bm| above to set up |\bm@boldtable|
+% by comparing the fonts available in the normal and bold math versions.
+% \begin{macrocode}
+ \bm{bold}\bmmax
+% \end{macrocode}
+%
+% \begin{macro}{\mathbf}
+% As the bold font has been defined as a symbol font, make |\mathbf|
+% access that rather than have it allocate a new math group for the
+% same font. (Just in case there were no free slots wrap this
+% in an extra test.)
+% \begin{macrocode}
+ \@ifundefined{symboldoperators}
+ {}
+ {\DeclareSymbolFontAlphabet\mathbf{boldoperators}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hmmax}
+%
+% Same for heavy (but default to three this time (enough for mathtime
+% plus, as no heavy operators font).
+% \begin{macrocode}
+\ifx\hmmax\@undefined
+ \chardef\hmmax=3
+\fi
+% \end{macrocode}
+%
+% Similarly if there is a heavy math version, set up |\bm@heavytable|.
+% (If there is no heavy math version, do nothing here, as |\hm| will be
+% set to |\bm| later, once that is defined.)
+% \begin{macrocode}
+\ifx\mv@heavy\@undefined
+\else
+ \bm{heavy}\hmmax
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\bm@general}
+% \changes{v1.0d}{1997/11/15}
+% {extra code to support prime lookahead and breqn}
+% \changes{v1.0h}{2002/11/22}{Pass math version as third (new) argument}
+% \changes{v1.2d}{2019/07/24}
+% {guard against active underscore}
+%
+% |\bm| is pretty much |\bmdefine\bm@command| followed by executing
+% |\bm@command|. It would in principle be possible to execute the
+% emboldened tokens directly, rather than building up a macro first,
+% but (as I learned the hard way) it's difficult to do this in the midst
+% of all these nested |\if| constructs.
+% First extract the central bit of code for |\hm| |\bm| |\hmdefine| and
+% |\bmdefine|. Note that in the case of the inline versions they take
+% an argument and brace it, rather than relying on |\bm@general| to pick
+% up the argument. This makes the code robust with respect to premature
+% expansion.
+% \begin{macrocode}
+\begingroup
+\catcode`\'=\active
+\catcode`\_=\active
+\@firstofone{\endgroup
+\def\bm@general#1#2#3#4#5{%
+ \begingroup
+% \end{macrocode}
+% \changes{v1.0d}{1997/11/15}
+% {make nested \cs{bm} vanish completely, not leave a brace group}
+% First locally disable |\bm| and |\hm|, as they would mess things
+% up terribly, and the original Spivak versions used the syntax
+% |\bmdefine\balpha{\bm\alpha}|.
+% \begin{macrocode}
+ \let\bm\@firstofone
+ \let\hm\@firstofone
+% \end{macrocode}
+% Now initialise the commands used to save the tokens constructed.
+% \begin{macrocode}
+ \global\let\bm@command\@empty
+ \let\@let@token\@empty
+% \end{macrocode}
+% As we want to expand the macros to look at their definition
+% turn off protection. Otherwise the |\protect| will be carried over
+% and apply to the wrong token, eg |{|.
+% \begin{macrocode}
+ \let\protect\@empty
+ \let\@typeset@protect\@empty
+% \end{macrocode}
+% Set up either bold or heavy
+% \begin{macrocode}
+ \def\bm@mathchoice{\bm@m@thchoice#1}%
+ \def\bm@group{\bm@gr@up#1}%
+ \let\bm@table#2%
+% \end{macrocode}
+% Make sure |\left| and |\right| are really non expandable,
+% and not |\ifx| equal to anything else.
+% \changes{v1.0d}{1997/11/15}
+% {make sure \cs{left} is primitive}
+% \begin{macrocode}
+ \let\left\holdinginserts
+% \end{macrocode}
+% These three save on the number of |\ifx| tests below.
+% \changes{v1.1a}{2003/09/01}{Forgotten to check for \cs{hskip} (pr/3572)}
+% \begin{macrocode}
+ \let\right\left
+ \let\mskip\mkern
+ \let\hskip\kern
+% \end{macrocode}
+% Definition of |'| locally modified so as not to use |\futurelet|
+% in the look ahead, but to make the |\prime| available at the top level
+% to be made bold, or heavy or whatever.
+% |'| is locally active for this definition.
+% \changes{v1.0d}{1997/11/15}
+% {prime code added}
+% \changes{v1.0d}{1997/11/15}
+% {prime code added}
+% \changes{v1.2d}{2019/07/24}
+% {guard against active underscore}
+% \begin{macrocode}
+ \let\bm@prime\copy
+ \let_\relax
+ \def'{\bm@prime\prime\relax}%
+% \end{macrocode}
+% For optional argument commands. This expandable version of
+% |\@ifnextchar| is not 100\% safe, but works for |\sqrt| unless
+% you put something really strange in the arguments.
+% \changes{v0.11}{1997/01/06}
+% {\cs{@ifnextchar} made safe.}
+% \begin{macrocode}
+ \def\@ifnextchar##1##2##3##4{%
+ \if##1##4%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {##2##4}{##3{##4}}}%
+% \end{macrocode}
+% For Vladimir Volovich\ldots
+% \changes{v1.0f}{1998/12/10}
+% {Errors and warnings made safe. tools/2917}
+% \begin{macrocode}
+ \def\GenericWarning##1##2{%
+ \unvcopy{\GenericWarning{##1}{##2}}}%
+ \def\GenericError##1##2##3##4{%
+ \unvcopy{\GenericError{##1}{##2}{##3}{##4}}}%
+% \end{macrocode}
+% For AMS definitions.
+% \begin{macrocode}
+ \let\DN@\copy
+ \let\FN@\copy
+ \let\next@\copy
+ \global\let\bm@first\@empty
+% \end{macrocode}
+% For AMS version of |\sqrt|: don't expand just wrap in brace group
+% so that it can be made bold in a safe but slow way. Do the same for
+% internal accent command
+% \changes{v1.1b}{2003/10/05}{AMS \cs{sqrt} not working}
+%
+% \changes{v1.1c}{2004/02/26}{\cs{accentV} made safe (pr/3625)}
+% Code for AMS accent allows bm to be used (just) with accent
+% but stops the nested accents stacking correctly, this can be
+% corrected by using an extra brace group as usual.
+% |\bm{{\hat{\hat{F}}}}|
+% \begin{macrocode}
+ \ifx\uproot@\undefined\else
+ \def\root##1\of##2{{\root##1\of{##2}}}%
+ \fi
+ \def\mathaccentV##1{\mathaccent"\accentclass@}%
+% \end{macrocode}
+% For breqn definitions.
+% \begin{macrocode}
+ \let\@ifnext\@ifnextchar
+ \let\measure@lhs\copy
+ \let \rel@break\copy
+ \let \bin@break\copy
+ \let \after@open\copy
+ \let \after@close\copy
+% \end{macrocode}
+% Make sure things like |\pounds| take the `math branch' even
+% in |\bmdefine| (which is not executed in math mode).
+% \begin{macrocode}
+ \let\ifmmode\iftrue
+% \end{macrocode}
+% We have to ensure that the math alphabets have definitions that
+% correspond the the ``bold'' math version we are going to switch
+% to. As these definitions are globally assigned when a math
+% version is changed it is likely that right now we have those of
+% the normal math version active. Argument |#3| holds either
+% |\mv@bold| or |\mv@heavy| and we execute that after redefining
+% |\install@mathalphabet| and |\getanddefine@fonts| suitably.
+% The definitions are reverted back to their original the moment
+% the scanning is done
+% \changes{v1.0h}{2002/11/22}{Get math alphabets right (pr/3476)}
+% \begin{macrocode}
+ \let\install@mathalphabet\def
+ \let\getanddefine@fonts\@gobbletwo
+ #3%
+% \end{macrocode}
+% The last redefinition just makes |\mathit| type commands re-insert
+% themselves (more or less) as if they are allowed to expand
+% they die horribly if the expansions are put into |\mathchoice|
+% and so executed more than once.
+% \begin{macrocode}
+ \def\select@group##1##2##3##4{{%
+ \protect##1{##4}}}%
+ \def\use@mathgroup##1##2##3{{%
+ \protect\use@mathgroup##1{##2}{##3}}}%
+% \end{macrocode}
+%
+% So now start looking at the argument.
+% \changes{v0.10}{1997/01/04}
+% {Use \cs{bm@end}}
+% \begin{macrocode}
+ \bm@expand#5\bm@end
+ \endgroup
+% \end{macrocode}
+%
+% Finally outside the group either execute |\bm@command| (for |\bm|)
+% or save its definition (for |\bmdefine|).
+% \begin{macrocode}
+ #4}
+% \end{macrocode}
+% End of the |\@firstofone| above, and the scope of the active |'|.
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm}
+% \changes{v1.0d}{1997/11/15}
+% {Make \cs{bm} grab its argument even when protected}
+% Set up the bold (rather than heavy) version, and run |\bm@command|
+% right at the end, to execute the emboldened argument.
+% The argument is grabbed by the top level function, and explicitly
+% braced, so that |\bm| works even if the braces are omitted round
+% its argument in a `moving argument'.
+% \changes{v1.0h}{2002/11/22}{Pass math version as third (new) argument}
+% \begin{macrocode}
+\DeclareRobustCommand\bm{%
+ \bm@general\boldmath\bm@boldtable\mv@bold\bm@command}
+\protected@edef\bm#1{\bm{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DeclareBoldMathCommand}
+% \changes{v0.07}{1996/12/14}
+% {Macro added}
+% \begin{macro}{\bm@declare}
+% \changes{v0.07}{1996/12/14}
+% {Macro added}
+% |DeclareBoldMathCommand|%^^A
+% \oarg{mathversion}\marg{command}\marg{math expression}\\
+% looks like |\bm| except at the end the specified command is
+% globally defined to be |\bm@command|.
+% The \meta{mathversion} defaults to `bold'.
+% \begin{macrocode}
+\def\DeclareBoldMathCommand{\@testopt\bm@declare{bold}}
+% \end{macrocode}
+%
+% \changes{v1.0h}{2002/11/22}{Pass math version as third (new) argument}
+% \begin{macrocode}
+\def\bm@declare[#1]#2{%
+ \expandafter\bm@general
+ \csname #1math\expandafter\endcsname
+ \csname bm@#1table\expandafter\endcsname
+ \csname mv@#1\endcsname
+ {\bm@define#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bmdefine}
+% |\bmdefine| Shorthand for |\DeclareBoldMathCommand[bold]|.
+%
+% |\bm| is empty within the definition, so that either\\
+% |\bmdefine\balpha{\bm\alpha}| or |\bmdefine\balpha{\alpha}| \\
+% may be used. (The former just for compatibility with the original
+% version for plain \TeX).
+% \begin{macrocode}
+\def\bmdefine{\DeclareBoldMathCommand[bold]}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\hm}
+% \changes{v1.0d}{1997/11/15}
+% {Make \cs{hm} grab its argument even when protected}
+% \begin{macro}{\hmdefine}
+% Same again for |\hm|.
+% \begin{macrocode}
+\ifx\mv@heavy\@undefined
+% \end{macrocode}
+%
+% If there is no heavy math version defined, let |\hm| be defined
+% as |\bm|. Currently there is no warning given, perhaps there should
+% be, or even an error?
+% \begin{macrocode}
+ \let\hm\bm
+ \let\heavymath\boldmath
+ \let\bm@heavytable\bm@boldtable
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+%
+% Otherwise define |\hm| and |\hmdefine| in direct analogy with the
+% above.
+% \changes{v1.0h}{2002/11/22}{Pass math version as third (new) argument}
+% \begin{macrocode}
+ \DeclareRobustCommand\hm{%
+ \bm@general\heavymath\bm@heavytable\mv@heavy\bm@command}
+ \protected@edef\hm#1{\hm{#1}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \def\hmdefine{\DeclareBoldMathCommand[heavy]}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bm@end}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% Normally speaking |\outer| declarations should be avoided at all
+% costs. (\LaTeX\ redefines all of plain \TeX's allocation macros
+% to be non-outer.) However this is one place where it seems like a
+% good idea. If a command taking an argument is put in |\bm| without
+% its argument, then the |\@@end| terminating token would be taken as
+% the argument, and so the rest of the paragraph would be gobbled up
+% and the \LaTeX\ would die horribly. So make the internal terminating
+% token |\outer|. (The actual test for termination is made against
+% |\@@end| not |\bm@end| as this macro will be expanded by the look-ahead
+% system.)
+% \begin{macrocode}
+\outer\def\bm@end{\@@end}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@expand}
+% \changes{v0.11}{1997/01/06}
+% {Double up.}
+% \begin{macro}{\bm@exp@nd}
+% \changes{v0.11}{1997/01/06}
+% {Macro added}
+% |\afterassignment| trick to fully expand the following tokens until
+% the first non-expandable token is revealed. This may discard a space
+% token (which is what \TeX\ is looking for) but that doesn't matter in
+% math mode. The expansion lookahead is done twice in case any stray
+% space tokens have crept in.\footnote{The need for this was noticed
+% while testing \cs{sqrt}. The definition of \cs{root} inherited from
+% plain \TeX\ has an anomalous space token, that is normally harmless
+% (just wastes memory), but which killed earlier versions of this
+% package.}
+% \begin{macrocode}
+\def\bm@expand{\afterassignment\bm@exp@nd\count@`\a}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\bm@exp@nd{\afterassignment\bm@test\count@`\a}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\bm@test}
+% Normally we will grab the non-expandable token as a macro argument
+% but better check it is not |{| first. Save the previous token
+% so we can check later if it was |\left|, in which case use the delcode
+% rather than the mathcode if the current token is a character.
+% \begin{macrocode}
+\def\bm@test{%
+ \let\bm@previous\@let@token
+ \futurelet\@let@token\bm@test@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@test@}
+% If looking at a single token, switch to |\bm@test@token|, else if
+% looking at a |{ }| group, grab the whole group with |\bm@group|.
+% A |\bgroup| token will take the wrong branch here (currently not
+% trapped).
+% \begin{macrocode}
+\def\bm@test@{%
+ \ifx\@let@token\bgroup
+ \expandafter\bm@group
+ \else
+ \expandafter\bm@test@token
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@gr@up}
+% \changes{v1.0c}{1997/10/09}
+% {Extra brace around argument for \cs{over}}
+% If faced with a group,
+% If we are in math mode, stick it in a |\boldsymbol| like construct
+% and then recurse on |\bm@expand|.
+% Otherwise just use |\bfseries\boldmath|.
+% The actual test is deferred till `run time'.
+% Here and elsewhere could deal with the inner list with an inner call
+% to |\bm|, but that doesn't seem to gain very much, and complicates the
+% code quite a bit.
+%
+% |#1| is either |\boldmath| or |\heavymath|.
+% Need to add an extra set of explicit braces around |#2| as otherwise
+% the math style commands applied in |\mathchoice| might only apply
+% to the first half of an |\over| construction.
+% \begin{macrocode}
+\def\bm@gr@up#1#2{%
+ \bm@add{{\bm@gr@@p#1{{#2}}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@gr@@p}
+% |#1| is either |\boldmath| or |\heavymath|.
+% \begin{macrocode}
+\def\bm@gr@@p#1#2{%
+ \ifmmode
+ \bm@mchoice#1{#2}{#2}{#2}{#2}%
+ \else
+ \bfseries#1#2%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@test@token}
+% If not facing a |{ }| group then test to see what we have.
+% Basic idea: Trap |\mathchardef| tokens, character tokens, and calls to
+% |\mathchar|, |\mathaccent|, etc, and change the \emph{math-group}
+% (fam) to point at the bold version.
+% Other things just copy straight over to the command being built.
+% (Anything inside a |\mathop| or similar will end up being made bold
+% as the |\mathop| will be copied over, but its argument will be made
+% bold by the group code above.
+% \begin{macrocode}
+\def\bm@test@token#1{%
+ \let\bm@next\@empty
+% \end{macrocode}
+%
+% Stop here. Note that it is vital that the terminating token
+% is non-expandable and defined, rather than the usual \LaTeX\
+% terminators |\@nil| or |\@@|. (Worse still would be a `quark'
+% like |docstrip|'s |\qStop|.)
+% \begin{macrocode}
+ \ifx#1\@@end
+% \end{macrocode}
+%
+% |\bm@mathchoice| uses macro arguments, so need to make the tail
+% recursion explicit here. All the other cases recurse by way of
+% |\afterassignment| which means all the trailing |\fi| are eaten
+% while making the assignment.
+% \begin{macrocode}
+ \else\ifx#1\mathchoice
+ \let\bm@next\bm@mathchoice
+% \end{macrocode}
+%
+% The main point: Find these expressions, and change the mathgroup.
+% \begin{macrocode}
+ \else\ifx#1\mathchar
+ \afterassignment\bm@mathchar\count@
+ \else\ifx#1\mathaccent
+ \afterassignment\bm@mathaccent\count@
+ \else\ifx#1\delimiter
+ \afterassignment\bm@delimiter\count@
+ \else\ifx#1\radical
+ \afterassignment\bm@radical\count@
+% \end{macrocode}
+%
+% Need to trap spaces otherwise digits will get turned to bold
+% mathchars.
+% \changes{v1.1a}{2003/09/01}{Forgotten to check for \cs{hskip} (pr/3572)}
+% \begin{macrocode}
+ \else\ifx#1\mkern
+ \bm@register#1{\muskip\z@}%
+ \else\ifx#1\kern
+ \bm@register#1\skip@
+ \else\ifx#1\penalty
+ \bm@register#1\count@
+% \end{macrocode}
+%
+% \changes{v1.0f}{1998/12/10}
+% {Add possibility to copy brace group unmodified. tools/2917}
+% |\vcopy| is a flag to copy the next group unchanged to the
+% result command.
+% \begin{macrocode}
+ \else\ifx#1\unvcopy
+ \let\bm@next\bm@add
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else\ifcat\noexpand#1\relax
+% \end{macrocode}
+% Other command, look if it's a mathchardef token (otherwise just add
+% it).
+% \changes{v1.2a}{2016/02/27}
+% {Additional quotes for testing \cs{Umathchar}}
+% \begin{macrocode}
+ \xdef\meaning@{\meaning#1}%
+ \expandafter\bm@mchar@test\meaning@""""\@nil#1%
+% \end{macrocode}
+% \changes{v1.0d}{1997/11/15}
+% {New active \cs{mathcode} code.}
+% Character token.
+% If it is of catcode 11 or 12, get its mathcode.
+% If that is |"8000| replace the token by its active version, and then
+% let bm expansion look again at the character. Being really active
+% this time, it will expand away (probably).
+%
+% If the previous token was |\left| or |\right|, get the delcode
+% instead of the mathcode.
+% \begin{macrocode}
+ \else\ifcat.\ifcat a#1.\else#1\fi
+ \count@\mathcode`#1\relax
+ \ifnum\count@=\mathcode`\'%
+ \begingroup\uccode`\~`#1\uppercase{\endgroup
+ \def\bm@next{\bm@expand~}}%
+ \else
+ \ifx\bm@previous\left
+ \count@\delcode`#1\relax
+ \bm@delimiter
+ \else
+% \end{macrocode}
+% \changes{v1.2b}{2016/07/07}
+% {Check for mathchar values being reported as if via \cs{Umathchar}}
+% Here we need to check for LuaTeX merging mathchar values with Umathchar.
+% \begin{macrocode}
+ \ifnum\count@>"8000
+ \Umathcharnumdef\@tempa\count@
+ \xdef\meaning@{\meaning\@tempa}%
+ \expandafter\bm@mchar@test\meaning@""""\@nil\@tempa
+ \else
+ \bm@mathchar
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% And final possibility:
+% a character token of catcode other than 11 or 12.
+% \begin{macrocode}
+ \bm@add{#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \bm@next}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\bm@define}
+% \changes{v0.08}{1996/12/18}
+% {Defined commands now always robust}
+% End code for |\bmdefine|. Define the given command name to the
+% robust form of the accumulated code.
+%
+% If |\bm@command| is equal to |\@gtempa| then it is a macro whose
+% expansion is a single call to |\mathchar|, so that can be optimised
+% with a |\mathchardef|.
+% \begin{macrocode}
+\def\bm@define#1{%
+ \begingroup
+ \ifx\bm@command\@gtempa
+ \def\mathchar{\global\mathchardef#1}%
+ \bm@command
+ \else
+% \end{macrocode}
+% Rather than simply |\let#1\bm@command|, make the defined command
+% robust. |\bm@first| is normally empty, but might be something like
+% |\DOTSI| which needs to be lifted to the top level, in front
+% of any |\protect| because of the lookahead mechanism used
+% in the \textsf{amsmath} package.
+% \begin{macrocode}
+ \toks@\expandafter{\bm@command}%
+ \xdef#1{\bm@first\noexpand\bm@protect\noexpand#1{\the\toks@}}%
+ \fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\bm@protect}
+% \changes{v0.08}{1996/12/18}
+% {macro added}
+% Commands defined by |\bmdefine| re-insert themselves
+% if protection is enabled.
+% \begin{macrocode}
+\def\bm@protect#1{%
+ \ifx\protect\@typeset@protect
+ \expandafter\@firstofone
+ \else
+ \protect#1\expandafter\@gobble
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@mchoice}
+% |\boldsymbol|, more or less.
+% |#1| is either |\boldmath| or |\heavymath|.
+% \begin{macrocode}
+\def\bm@mchoice#1#2#3#4#5{%
+ \mathchoice{\hbox{#1$\displaystyle\m@th#2$}}%
+ {\hbox{#1$\textstyle\m@th#3$}}%
+ {\hbox{#1$\scriptstyle\m@th#4$}}%
+ {\hbox{#1$\scriptscriptstyle\m@th#5$}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@m@thchoice}
+% Action if you find a |\mathchoice|. Add the bold version to
+% |\bm@command| then recurse.
+%
+% |#1| is either |\boldmath| or |\heavymath|.
+% \begin{macrocode}
+\def\bm@m@thchoice#1#2#3#4#5{%
+ \bm@add{\bm@mchoice#1{#2}{#3}{#4}{#5}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@register}
+% \changes{v0.07}{1996/12/14}
+% {Macro added}
+% Combined code for setting up |\bm@r@gister| with the correct
+% register type.
+% \begin{macrocode}
+\def\bm@register#1#2{%
+ \def\@tempa{#1\the#2}%
+ \afterassignment\bm@r@gister#2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@r@gister}
+% \changes{v0.06}{1996/12/12}
+% {Support \cs{mskip}}
+% \changes{v0.07}{1996/12/14}
+% {Combine all register macros}
+% |\mkern| itself would transfer to |\bm@command| without any special
+% test, but any explicit dimension following would be converted to
+% |\mathchar|. So trap this and grab the muskip as a muskip.
+% This is used in |\iiint|. |\penalty| was needed for the
+% AMS version of |\colon|, and so do most of the others as well.
+% \begin{macrocode}
+\def\bm@r@gister{%
+ \bm@xadd{\@tempa\space}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\bm@mathchar}
+% \changes{v0.10}{1997/01/04}
+% {Modify to use \cs{boldmath} or \cs{pmb} if needed.}
+% Change the family (math group) of a mathcode and then
+% use the modified code with |\mathchar|. If there is no
+% suitable bold font in the current math version, use the original
+% unmodified mathcode, but switch to |\boldmath| (if there is a bold
+% font there) or use `poor man's bold'. Note that these other
+% possibilities are only possible here, not for the otherwise similar
+% code for |\delimiter| or |\mathaccent|, as those commands
+% must work with fonts from the same math version.
+%
+% Finally recurse down the list.
+% \begin{macrocode}
+\def\bm@mathchar{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \@tempcntb\count@
+ \let\@tempa\bm@group
+% \end{macrocode}
+%
+% |\bm@changefam| will isolate the math group from the mathcode
+% and look up the offset in the current table.
+% \begin{macrocode}
+ \bm@changefam{}%
+% \end{macrocode}
+%
+% If the mathcode has changed, then just add the new |\mathchar|
+% (saving |\@gtempa| allows |\bmdefine| to optimise this to a
+% mathchardef if it turns out to be the only symbol in the argument).
+% \begin{macrocode}
+ \ifnum\count@>\@tempcntb
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \ifx\bm@command\@empty
+ \xdef\@gtempa{\mathchar\the\count@\space}%
+ \fi
+ \bm@xadd{\mathchar\the\count@\space}%
+ \else
+% \end{macrocode}
+%
+% Otherwise grab the math class from the math code
+% and add that (locally zapping |\bm@expand| as we don't want
+% to recurse at this point).
+% \begin{macrocode}
+ \begingroup
+ \divide\count@"1000
+ \let\bm@expand\relax
+ \bm@xadd\bm@class
+ \endgroup
+% \end{macrocode}
+% |\@tempa| will be |\bm@group| (which applies |\boldmath| and
+% |\mathchoice|) unless it was changed by |\bm@changefam| to |\bm@pmb|
+% (which applies a `poor man's bold' construction in a |\mathchoice|).
+% \begin{macrocode}
+ \edef\@tempb{%
+ \noexpand\@tempa{\mathchar\the\count@\space}}%
+ \@tempb
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@umathchar}
+% \changes{v1.2a}{2016/02/27}
+% {Macro added}
+% \changes{v1.2a}{2017/01/16}
+% {Test for zero table entry (\cs{boldmath}) added}
+% Version of \verb|\bm@mathchar| for \verb|\Umathchar|, this is easier
+% as no need to take apart the number, the match class and fam are provided
+% as distinct arguments.
+% \begin{macrocode}
+\def\bm@umathchar#1#2#3{%
+\@tempcnta#2\relax
+\count@\bm@table
+\ifnum\count@=\z@
+ \bm@gr@up\boldmath{\Umathchar#1 #2 #3 }%
+\else
+ \ifnum\count@=\m@ne
+ \else
+ \advance\@tempcnta\count@
+ \fi
+ \bm@xadd{\Umathchar#1\space
+ \the\@tempcnta\space\space
+ #3\space}%
+\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@pmb}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% Add a poor man's bold construction to the list being built.
+% \begin{macrocode}
+\def\bm@pmb#1{%
+ \bm@add{\bm@pmb@{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@pmb@}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% |\pmb| variant. (See \TeX{}Book, or AMS \textsf{amsbsy} package).
+% This one takes a bit more care to use smaller offsets in subscripts.
+% \begin{macrocode}
+\def\bm@pmb@#1{{%
+ \setbox\tw@\hbox{$\m@th\mkern.4mu$}%
+ \mathchoice
+ \bm@pmb@@\displaystyle\@empty{#1}%
+ \bm@pmb@@\textstyle\@empty{#1}%
+ \bm@pmb@@\scriptstyle\defaultscriptratio{#1}%
+ \bm@pmb@@\scriptscriptstyle\defaultscriptscriptratio{#1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@pmb@@}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% Helper macro. Box |#3| and set it three times in the style |#1|,
+% offset by an amount reduced by the ratio specified in |#2|.
+% \begin{macrocode}
+\def\bm@pmb@@#1#2#3{{%
+ \setbox\z@\hbox{$\m@th#1#3$}%
+ \dimen@#2\wd\tw@
+ \rlap{\copy\z@}%
+ \kern\dimen@
+ \raise1.5\dimen@\rlap{\copy\z@}%
+ \kern\dimen@
+ \box\z@}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@class}
+% \changes{v0.10}{1997/01/04}
+% {Macro added}
+% Convert a numeric math class back to a math class command.
+% |\mathord| is omitted in class $0$ and $7$ to save space and so
+% things work out right in constructions such as |x^a| where
+% |x^\mathord{a}| would not work.
+% \begin{macrocode}
+\def\bm@class{%
+ \ifcase\count@
+ \or
+ \mathop\or
+ \mathbin\or
+ \mathrel\or
+ \mathopen\or
+ \mathclose\or
+ \mathpunct\or
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@add}
+% \changes{v0.07}{1996/12/14}
+% {macro added}
+% A version of |\g@addto@macro| that internally uses a |\begingroup|
+% rather than a brace group\footnote{This bug is fixed in the \LaTeX\
+% kernel of 1996/12/01}, to save creating a mathord.
+%
+% As need to redefine it anyway, save some tokens by making
+% it specific to |\bm@command|, and to execute |\bm@expand|
+% to continue the loop.
+% \begin{macrocode}
+\def\bm@add#1{%
+ \begingroup
+ \toks@\expandafter{\bm@command#1}%
+ \xdef\bm@command{\the\toks@}%
+ \endgroup
+ \bm@expand}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@xadd}
+% An |\xdef| version of |\bm@add|.
+% \begin{macrocode}
+\def\bm@xadd#1{%
+ \begingroup
+ \toks@\expandafter{\bm@command}%
+ \xdef\bm@command{\the\toks@#1}%
+ \endgroup
+ \bm@expand}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@mathaccent}
+% \changes{v1.0e}{1997/11/21}
+% {Use bm on argument group, as spotted on c.t.t.}
+% |\mathaccent| version of |\bm@mathchar|.
+% \begin{macrocode}
+\def\bm@mathaccent{%
+ \bm@changefam{}%
+% \end{macrocode}
+% The next four lines were added a v1.0e. Without them |\bm{\hat{A}}|
+% makes the accent bold using |\bm| but the group |{A}| is made bold
+% via a |\mathchoice| construction as for any other group, as |\bm|
+% does not attempt to parse inside brace groups. While that produces
+% something acceptable for lower case letters, it produces
+% $\bm{\hat{{A}}}$ which is not too good. The braces may simply be
+% omitted:
+% |\bm{\hat A}| would work, producing $\bm{\hat A}$, however I did not
+% want to document such a restriction, so now modify bm so that such
+% brace groups are handled gracefully.
+%
+% It would be possible to locally make mathaccents take an argument
+% during the bm look-ahead, so the brace groups would then vanish
+% during expansion, however I would then need to explicitly skip past
+% \meta{filler} and also make sure that the end of parse token
+% was not gobbled in marginal cases like |$\bm\hat$|.
+%
+% So instead do the following which gets rid of \meta{filler}
+% with a redefinition of |\relax|, and just locally changes
+% |\bm@group| so that instead of doing a |\mathchoice| it simply adds
+% |\bgroup| and |\egroup| around the tokens, and lets bm modify the
+% tokens of the `argument'. This means that |\bm{\hat{A}}| now produces
+%\begin{verbatim}
+% \mathaccent 29790 \bgroup \mathchar 30017 \egroup
+%\end{verbatim}
+% The inner math list is a single mathchar, and so \TeX\ will not box
+% it, and the math accent will correctly position, taking into account
+% the skewchar information.
+%
+% As the normal bm lookahead is used, it is automatic that the parse
+% will end without trying to go past |\bm@end|.
+%
+% One disadvantage is that the group will mean that |\bm@previous|
+% will not be correctly updated. However that is only used for
+% delimiter checking, so can not matter here.
+% \begin{macrocode}
+ \begingroup
+ \def\bm@group##1{\endgroup\bm@xadd{\bgroup}##1\egroup}%
+ \def\bm@test@token{\endgroup\bm@test@token}%
+ \let\relax\@empty
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \bm@xadd{\mathaccent\the\count@\space}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@delimiter}
+% \changes{v1.0d}{1997/11/15}
+% {Support \cs{left}. null delimiter.}
+% Change both families (math groups) of a delcode and then
+% use the modified code with |\delimiter|. Don't change code `0'
+% as that denotes a null delimiter.
+% \begin{macrocode}
+\def\bm@delimiter{%
+ \ifnum\count@>\z@
+ \bm@changefam{}%
+ \bm@changefam{000}%
+ \fi
+ \bm@xadd{\delimiter\the\count@\space}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@radical}
+% Same for |\radical|.
+% \begin{macrocode}
+\def\bm@radical{%
+ \bm@changefam{}%
+ \bm@changefam{000}%
+ \bm@xadd{\radical\the\count@\space}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@mchar@}
+% Catcode 12 |\mathchar|, for |\ifx| tests.
+% \begin{macrocode}
+\edef\bm@mchar@{\meaning\mathchar}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@umchar@}
+% \changes{v1.2a}{2016/02/27}
+% {Macro added}
+% Catcode 12 |\Umathchar|, for |\ifx| tests.
+% \begin{macrocode}
+\edef\bm@umchar@{\string\U\expandafter\@gobble\meaning\mathchar}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@mchar@test}
+% Test if the |\meaning| starts with |\mathchar|. If it does, grab the
+% value into |\count@| and call |\bm@mathchar|, else just copy the
+% command into the accumulated tokens.
+% |#1|, |#2|, |#3| are all |\meaning| produced tokens, or `dummy tokens'
+% added at the time this is called. |#4| is the original token, in case
+% decide not to use the |\meaning|.
+% \changes{v1.2a}{2016/02/27}
+% {Additional arguments added}
+% \begin{macrocode}
+\def\bm@mchar@test#1"#2"#3"#4"#5\@nil#6{%
+ \xdef\meaning@{#1}%
+ \ifx\meaning@\bm@mchar@
+ \count@"#2\relax
+ \bm@mathchar
+ \else
+% \end{macrocode}
+% Test for \verb|\Umathchar|.
+% \begin{macrocode}
+ \ifx\meaning@\bm@umchar@
+ \bm@umathchar{"#2}{"#3}{"#4}%
+ \else
+% \end{macrocode}
+% Some other command: copy it straight over. If it is the first thing
+% added, and it is a |\relax| token, save it in |\bm@first| for use
+% in |\bm@define|.
+% \begin{macrocode}
+ \ifx\bm@previous\@empty
+ \ifx\relax#6%
+ \gdef\bm@first{#6}%
+ \fi
+ \fi
+ \bm@add{#6}%
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@changefam}
+% \changes{v0.10}{1997/01/04}
+% {Rewrite for new \cs{bm@table} system}
+% Pull out one specified hex digit and passes
+% it to |\bm@modify| to change. argument is empty normally but |000| to
+% access the second math group in a delimiter code.
+% \begin{macrocode}
+\def\bm@changefam#1{%
+ \@tempcnta\count@
+ \divide\@tempcnta"1000#1 %
+ \multiply\@tempcnta"1000#1 %
+ \advance\@tempcnta-\count@
+ \divide\@tempcnta-"100#1 %
+% \end{macrocode}
+% Having isolated the required math group (fam), look up
+% the offset in the current table.
+% \begin{macrocode}
+ \@tempcnta\bm@table
+% \end{macrocode}
+% If the offset is $-1$, keep |\count@| unchanged, but set |\@tempa|
+% to use poor man's bold. Otherwise increment |\count@| to change the
+% math group specified.
+% \begin{macrocode}
+ \ifnum\@tempcnta=\m@ne
+ \let\@tempa\bm@pmb
+ \else
+ \multiply\@tempcnta"100#1 %
+ \advance\count@\@tempcnta
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\bm@prime}
+% \changes{v1.0d}{1997/11/15}
+% {Macro added}
+% Support |'|. Earlier versions did not make the prime bold in a'.
+%
+% |\bm{a''}| will now produce (with the normal encodings)
+%\begin{verbatim}
+% \mathchar 30049
+% \bm@prime \mathchar 1584 \relax
+% \bm@prime \mathchar 1584 \relax
+%\end{verbatim}
+% So |\bm@prime| does essentially the same as the active definition of
+% |'|, which is to start a superscript group then keep adding |\prime|
+% for each |'| (or |\bm@prime|) following. Here modified to grab a
+% |\relax| delimited argument and use that instead of |\prime|.
+% |\bm@prime| is locally |\let| to |'| so the |\ifx| tests in |\pr@m@s|
+% don't need changing.
+% \begin{macrocode}
+\def\bm@prime{^\bgroup
+ \let\bm@prime'%
+ \def\prim@s##1\relax{##1\futurelet\@let@token\pr@m@s}%
+ \prim@s}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\boldsymbol}
+% \changes{v1.0b}{1997/04/14}
+% {Macro added}
+% \begin{macro}{\heavysymbol}
+% Finally, to ease conversion of documents between this package and
+% the \textsf{amsbsy} package:
+% \begin{macrocode}
+\let\boldsymbol\bm
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\heavysymbol\hm
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/required/tools/bm.ins b/macros/latex-dev/required/tools/bm.ins
new file mode 100644
index 0000000000..a148cb93ef
--- /dev/null
+++ b/macros/latex-dev/required/tools/bm.ins
@@ -0,0 +1,75 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+
+\generate{\file{bm.sty}{\from{bm.dtx}{package}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/bm.pdf b/macros/latex-dev/required/tools/bm.pdf
new file mode 100644
index 0000000000..a0d1d017d1
--- /dev/null
+++ b/macros/latex-dev/required/tools/bm.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/calc.dtx b/macros/latex-dev/required/tools/calc.dtx
new file mode 100644
index 0000000000..0bc90f736b
--- /dev/null
+++ b/macros/latex-dev/required/tools/calc.dtx
@@ -0,0 +1,1357 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File `calc.dtx'.
+%% Copyright (C) 1992--1995
+%% Kresten Krab Thorup and Frank Jensen.
+%% Copyright (C) 1997--2007
+%% Kresten Krab Thorup, Frank Jensen and the LaTeX3 Project.
+%%
+%% The original authors (fj@hugin.dk and krab@daimi.aau.dk) have
+%% contributed this package to the LaTeX distribution.
+%% Problems with this package should now be sent using latexbug.tex to
+%% the normal LaTeX bug report address.
+%
+%<*dtx>
+ \ProvidesFile{calc.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{calc}
+%<driver> \ProvidesFile{calc.drv}
+% \fi
+% \ProvidesFile{calc.dtx}
+ [2017/05/25 v4.3 Infix arithmetic (KKT,FJ)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\EnableCrossrefs
+\RecordChanges
+\usepackage{calc}
+\begin{document}
+\DocInput{calc.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{calc.dtx}
+%
+% \title{The \texttt{calc} package\\Infix notation
+% arithmetic in \LaTeX\thanks{We thank Frank Mittelbach for his
+% valuable comments and suggestions which have greatly improved
+% this package.}}
+% \author{Kresten Krab Thorup, Frank Jensen (and Chris Rowley)}
+% \date{\filedate}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \changes{v4.0d}{1997/11/08}
+% {Contributed to tools distribution}
+% \changes{v4.1a}{1998/06/07}
+% {Added text sizes: CAR}
+% \changes{v4.1a}{1998/06/07}
+% {Attempt to make user-syntax robust: CAR}
+%
+% \newenvironment{calc-syntax}
+% {\par
+% \parskip\medskipamount
+% \def\is{\ \hangindent3\parindent$\longrightarrow$~}%
+% \def\alt{\ $\vert$~}%
+% \rightskip 0pt plus 1fil
+% \def\<##1>{\mbox{\NormalSpaces$\langle$##1\/$\rangle$}}%
+% \IgnoreSpaces\obeyspaces%
+% }{\par\vskip\parskip}
+% {\obeyspaces\gdef\NormalSpaces{\let =\space}\gdef\IgnoreSpaces{\def {}}}
+%
+% \def\<#1>{$\langle$#1\/$\rangle$}%
+% \def\s#1{\ensuremath{[\![#1]\!]}}
+% \def\savecode#1{\hbox{${}_{\hookrightarrow[#1]}$}}
+% \def\gassign{\Leftarrow}
+% \def\lassign{\leftarrow}
+%
+% \begin{abstract}
+% The \texttt{calc} package reimplements the \LaTeX\ commands
+% |\setcounter|, |\addtocounter|, |\setlength|, and |\addtolength|.
+% Instead of a simple value, these commands now accept an infix
+% notation expression.
+% \end{abstract}
+%
+% \section{Introduction}
+%
+% Arithmetic in \TeX\ is done using low-level operations such as
+% |\advance| and |\multiply|. This may be acceptable when developing
+% a macro package, but it is not an acceptable interface for the
+% end-user.
+%
+% This package introduces proper infix notation arithmetic which is
+% much more familiar to most people. The infix notation is more
+% readable and easier to modify than the alternative: a sequence of
+% assignment and arithmetic instructions. One of the arithmetic
+% instructions (|\divide|) does not even have an equivalent in
+% standard \LaTeX.
+%
+% The infix expressions can be used in arguments to macros (the
+% \texttt{calc} package doesn't employ category code changes to
+% achieve its goals).\footnote{However, it therefore assumes that the
+% category codes of the special characters, such as \texttt{(*/)}
+% in its syntax do not change.}
+%
+% \section{Informal description}
+%
+% Standard \LaTeX\ provides the following set of commands to
+% manipulate counters and lengths \cite[pages 194 and~216]{latexman}.
+% \begin{itemize}
+% \item[]\hskip-\leftmargin
+% |\setcounter{|\textit{ctr}|}{|\textit{num}|}| sets the
+% value of the counter \textit{ctr} equal to (the value of)
+% \textit{num}. (Fragile)
+% \item[]\hskip-\leftmargin
+% |\addtocounter{|\textit{ctr}|}{|\textit{num}|}|
+% increments the value of the counter \textit{ctr} by (the
+% value of) \textit{num}. (Fragile)
+%
+% \item[]\hskip-\leftmargin
+% |\setlength{|\textit{cmd}|}{|\textit{len}|}| sets the value of
+% the length command \textit{cmd} equal to (the value of) \textit{len}.
+% (Robust)
+% \item[]\hskip-\leftmargin
+% |\addtolength{|\textit{cmd}|}{|\textit{len}|}| sets the value of
+% the length command \textit{cmd} equal to its current value plus
+% (the value of) \textit{len}. (Robust)
+% \end{itemize}
+% (The |\setcounter| and |\addtocounter| commands have global effect,
+% while the |\setlength| and |\addtolength| commands obey the normal
+% scoping rules.) In standard \LaTeX, the arguments to these commands
+% must be simple values. The \texttt{calc} package extends these
+% commands to accept infix notation expressions, denoting values of
+% appropriate types. Using the \texttt{calc} package, \textit{num} is
+% replaced by \<integer expression>, and \textit{len} is replaced by
+% \<glue expression>. The formal syntax of \<integer expression> and
+% \<glue expression> is given below.
+%
+% In addition to these commands to explicitly set a length, many \LaTeX\
+% commands take a length argument. After loading this package, most of
+% these commands will accept a \<glue expression>. This includes
+% the optional width argument of |\makebox|, the width argument of
+% |\parbox|, |minipage|, and a |tabular| |p|-column, and many similar
+% constructions. (This package does not redefine any of these commands,
+% but they are defined by default to read their arguments by |\setlength|
+% and so automatically benefit from the enhanced |\setlength| command
+% provided by this package.)
+%
+% In the following, we shall use standard \TeX\ terminology. The
+% correspondence between \TeX\ and \LaTeX\ terminology is as follows:
+% \LaTeX\ counters correspond to \TeX's count registers; they hold
+% quantities of type \<number>. \LaTeX\ length commands correspond to
+% \TeX's dimen (for rigid lengths) and skip (for rubber lengths)
+% registers; they hold quantities of types \<dimen> and \<glue>,
+% respectively.
+%
+% \TeX\ gives us primitive operations to perform arithmetic on registers as
+% follows:
+% \begin{itemize}
+% \item addition and subtraction on all types of quantities without
+% restrictions;
+% \item multiplication and division by an \emph{integer} can be
+% performed on a register of any type;
+% \item multiplication by a \emph{real} number (i.e., a number with a
+% fractional part) can be performed on a register of any type,
+% but the stretch and shrink components of a glue quantity are
+% discarded.
+% \end{itemize}
+% The \texttt{calc} package uses these \TeX\ primitives but provides a
+% more user-friendly notation for expressing the arithmetic.
+%
+% An expression is formed of numerical quantities (such as explicit
+% constants and \LaTeX\ counters and length commands) and binary
+% operators (the tokens `\texttt{+}', `\texttt{-}', `\texttt{*}', and
+% `\texttt{/}' with their usual meaning) using the familiar infix
+% notation; parentheses may be used to override the usual precedences
+% (that multiplication/division have higher precedence than
+% addition/subtraction).
+%
+% Expressions must be properly typed. This means, e.g., that a dimen
+% expression must be a sum of dimen terms: i.e., you cannot say
+% `\texttt{2cm+4}' but `\texttt{2cm+4pt}' is valid.
+%
+% In a dimen term, the dimension part must come first; the same holds
+% for glue terms. Also, multiplication and division by non-integer
+% quantities require a special syntax; see below.
+%
+% Evaluation of subexpressions at the same level of precedence
+% proceeds from left to right. Consider a dimen term such as
+% ``\texttt{4cm*3*4}''. First, the value of the factor \texttt{4cm} is
+% assigned to a dimen register, then this register is multiplied
+% by~$3$ (using |\multiply|), and, finally, the register is multiplied
+% by~$4$ (again using |\multiply|). This also explains why the
+% dimension part (i.e., the part with the unit designation) must come
+% first; \TeX\ simply doesn't allow untyped constants to be assigned
+% to a dimen register.
+%
+% The \texttt{calc} package also allows multiplication and division by
+% real numbers. However, a special syntax is required: you must use
+% |\real{|\<decimal constant>|}|\footnote{Actually, instead of
+% \<decimal constant>, the more general \<optional signs>\<factor> can
+% be used. However, that doesn't add any extra expressive power to
+% the language of infix expressions.} or
+% |\ratio{|\<dimen expression>|}{|\<dimen expression>|}| to denote a
+% real value to be used for multiplication/division. The first form has
+% the obvious meaning, and the second form denotes the number obtained
+% by dividing the value of the first expression by the value of the
+% second expression.
+%
+% A later addition to the package (in June 1998) allows an additional
+% method of specifying a factor of type dimen by setting some text
+% (in LR-mode) and measuring its dimensions: these are denoted as
+% follows.
+%\begin{quote}
+% |\widthof{|\<text>|}|\quad
+% |\heightof{|\<text>|}|\quad
+% |\depthof{|\<text>|}|
+%\end{quote}
+% These calculate the natural sizes of the \<text> in exactly the
+% same way as is done for the commands |\settowidth| etc.~on
+% Page~216 of the manual~\cite{latexman}.
+% In August 2005 the package was further extended to provide the command
+%\begin{quote}
+% |\totalheightof{|\<text>|}|
+%\end{quote}
+% This command does exactly what you'd expect from its name.
+% Additionally the package also provides the command
+%\begin{quote}
+% |\settototalheight{|\<cmd>|}{|\<text>|}|
+%\end{quote}
+%
+%
+% Note that there is a small difference in the usage of these two
+% methods of accessing text dimensions. After
+% |\settowidth{\txtwd}{Some text}| you can use:
+%\begin{verbatim}
+% \setlength{\parskip}{0.68\txtwd}
+%\end{verbatim}
+% whereas using the more direct access to the width of the text
+% requires the longer form for multiplication, thus:
+%\begin{verbatim}
+% \setlength{\parskip}{\widthof{Some text} * \real{0.68}}
+%\end{verbatim}
+%
+% \TeX\ discards the stretch and shrink components of glue when glue
+% is multiplied by a real number. So, for example,
+%\begin{verbatim}
+% \setlength{\parskip}{3pt plus 3pt * \real{1.5}}
+%\end{verbatim}
+% will set the paragraph separation to 4.5pt with no stretch or
+% shrink. Incidentally, note how spaces can be used to enhance
+% readability. When \TeX\ is scanning for a \<number> etc.\ it is
+% common to terminate the scanning with a space token or by inserting
+% \cs{relax}. As of version~4.3 \textsf{calc} allows \cs{relax} tokens
+% to appear in places where they would usually be used for terminating
+% \TeX's scanning. In short this is just before any of \texttt{+-*/)}
+% or at the end of the expression being evaluated.
+%
+% When \TeX\ performs arithmetic on integers, any fractional part of
+% the results are discarded. For example,
+%\begin{verbatim}
+% \setcounter{x}{7/2}
+% \setcounter{y}{3*\real{1.6}}
+% \setcounter{z}{3*\real{1.7}}
+%\end{verbatim}
+% will assign the value~$3$ to the counter~\texttt{x}, the value~$4$
+% to~\texttt{y}, and the value~$5$ to~\texttt{z}. This truncation
+% also applies to \emph{intermediate} results in the sequential
+% computation of a composite expression; thus, the following command
+%\begin{verbatim}
+% \setcounter{x}{3 * \real{1.6} * \real{1.7}}
+%\end{verbatim}
+% will assign~$6$ to~\texttt{x}.
+%
+% As an example of the use of |\ratio|, consider the problem of
+% scaling a figure to occupy the full width (i.e., |\textwidth|) of
+% the body of a page. Assume that the original dimensions of the
+% figure are given by the dimen (length) variables, |\Xsize| and
+% |\Ysize|. The height of the scaled figure can then be expressed by
+%\begin{verbatim}
+% \setlength{\newYsize}{\Ysize*\ratio{\textwidth}{\Xsize}}
+%\end{verbatim}
+%
+%
+%
+% Another new feature introduced in August 2005 was $\max$ and $\min$
+% operations with associated macros
+%\begin{quote}
+% |\maxof{|\<\textit{type} expression>|}{|\<\textit{type} expression>|}|
+% \\
+% |\minof{|\<\textit{type} expression>|}{|\<\textit{type} expression>|}|
+%\end{quote}
+% When \textit{type} is either \meta{glue} or \meta{dimen} these macros
+% are allowed only as part of addition or subtraction but when
+% \textit{type} is \meta{integer} they can also be used when
+% multiplying and dividing. In the latter case they follow the
+% same syntax rules as |\ratio| and |\real| which means they must come
+% after the |*| or the |/|. Thus
+%\begin{verbatim}
+% \setcounter{x}{3*\maxof{4+5}{3*4}+\minof{2*\real{1.6}}{5-1}}
+%\end{verbatim}
+% will assign $3\times\max(9,12)+\min(3,4)=39$ to |x|. Similarly
+%\begin{verbatim}
+% \setlength{\parindent}{%
+% \minof{3pt}{\parskip}*\real{1.5}*\maxof{2*\real{1.6}}{2-1}}
+%\end{verbatim}
+% will assign $\min(13.5\textrm{pt},4.5\cs{parskip})$ to \cs{parindent}
+%
+%
+%
+% \section{Formal syntax}
+%
+% The syntax is described by the following set of rules.
+% Note that the definitions of \<number>, \<dimen>, \<glue>,
+% \<decimal constant>, and \<plus or minus> are
+% as in Chapter~24 of The \TeX book~\cite{texbook}; and \<text>
+% is LR-mode material, as in the manual~\cite{latexman}.
+% We use \textit{type} as a meta-variable, standing for
+% `integer', `dimen', and `glue'.\footnote{This version of the
+% \texttt{calc} package doesn't support evaluation of muglue expressions.}
+%
+% \begin{calc-syntax}
+% \<\textit{type} expression>^^A
+% \is \<\textit{type} term>^^A
+% \alt \<\textit{type} expression> \<plus or minus> \<\textit{type} term>
+%
+% \<\textit{type} term>^^A
+% \is \<\textit{type} term> \<\textit{type} scan stop>
+% \alt \<\textit{type} factor>^^A
+% \alt \<\textit{type} term> \<multiply or divide> \<integer>^^A
+% \alt \<\textit{type} term> \<multiply or divide> \<real number>^^A
+% \alt \<\textit{type} term> \<multiply or divide>^^A
+% \<$\max$ or $\min$ integer>^^A
+%
+% \<\textit{type} scan stop>^^A
+% \is \<empty>^^A
+% \alt \<optional space>^^A
+% \alt |\relax|
+%
+% \<\textit{type} factor>^^A
+% \is \<\textit{type}>^^A
+% \alt \<text dimen factor>^^A
+% \alt \<$\max$ or $\min$ \textit{type}>^^A
+% \alt |(|$_{12}$ \<\textit{type} expression> |)|$_{12}$
+%
+% \<integer> \is \<number>
+%
+% \<$\max$ or $\min$ \textit{type}> \is \<$\max$ or $\min$ command>^^A
+% |{| \<\textit{type} expression> |}|^^A
+% |{| \<\textit{type} expression> |}|
+%
+% \<$\max$ or $\min$ command> \is |\maxof|^^A
+% \alt |\minof|
+%
+% \<text dimen factor>^^A
+% \is \<text dimen command>|{| \<text> |}|
+%
+% \<text dimen command>^^A
+% \is |\widthof|^^A
+% \alt |\heightof|^^A
+% \alt |\depthof|^^A
+% \alt |\totalheightof|^^A
+%
+% \<multiply or divide>^^A
+% \is |*|$_{12}$^^A
+% \alt |/|$_{12}$
+%
+% \<real number>^^A
+% \is |\ratio{| \<dimen expression> |}{| \<dimen expression> |}|^^A
+% \alt |\real{| \<optional signs> \<decimal constant> |}|
+%
+% \<plus or minus>^^A
+% \is |+|$_{12}$^^A
+% \alt |-|$_{12}$
+%
+% \<decimal constant>^^A
+% \is |.|$_{12}$^^A
+% \alt |,|$_{12}$^^A
+% \alt \<digit> \<decimal constant>^^A
+% \alt \<decimal constant> \<digit>
+%
+% \<digit>^^A
+% \is |0|$_{12}$^^A
+% \alt |1|$_{12}$^^A
+% \alt |2|$_{12}$^^A
+% \alt |3|$_{12}$^^A
+% \alt |4|$_{12}$^^A
+% \alt |5|$_{12}$^^A
+% \alt |6|$_{12}$^^A
+% \alt |7|$_{12}$^^A
+% \alt |8|$_{12}$^^A
+% \alt |9|$_{12}$
+%
+% \<optional signs>^^A
+% \is \<optional spaces>^^A
+% \alt \<optional signs> \<plus or minus> \<optional spaces>
+%
+% \end{calc-syntax}
+%
+%
+% Relying heavily on \TeX\ to do the underlying assignments, it is
+% only natural for \texttt{calc} to simulate \TeX's parsing machinery
+% for these quantities. Therefore it a)~imposes the same restrictions
+% on the catcode of syntax characters as \TeX\ and b)~tries to expand
+% its argument fully. a)~means that implicit characters for the tokens
+% |*|$_{12}$, |/|$_{12}$, |(|$_{12}$, and |)|$_{12}$ will not
+% work\footnote{e\TeX\ also assumes these catcodes when parsing a
+% \cs{numexpr}, \cs{dimexpr}, \cs{glueexpr}, or \cs{muglueexpr} and
+% does not allow implicit characters.} but because of~b), the
+% expansion should allow you to use macros that expand to explicit
+% syntax characters.
+%
+%
+% \StopEventually{
+% \begin{thebibliography}{1}
+% \bibitem{texbook}
+% \textsc{D. E. Knuth}.
+% \newblock \textit{The \TeX{}book} (Computers \& Typesetting Volume A).
+% \newblock Addison-Wesley, Reading, Massachusetts, 1986.
+% \bibitem{latexman}
+% \textsc{L. Lamport}.
+% \newblock \textit{\LaTeX, A Document Preparation System.}
+% \newblock Addison-Wesley, Reading, Massachusetts, Second
+% edition 1994/1985.
+% \end{thebibliography}
+% \PrintChanges
+% }
+%
+% \section{The evaluation scheme}
+% \label{evaluation:scheme}
+%
+% In this section, we shall for simplicity consider only expressions
+% containing `$+$' (addition) and `$*$' (multiplication) operators.
+% It is trivial to add subtraction and division.
+%
+% An expression $E$ is a sum of terms: $T_1+\cdots+T_n$; a term is a
+% product of factors: $F_1*\cdots*F_m$; a factor is either a simple
+% numeric quantity~$f$ (like \<number> as described in the \TeX book),
+% or a parenthesized expression~$(E')$.
+%
+% Since the \TeX\ engine can only execute arithmetic operations in a
+% machine-code like manner, we have to find a way to translate the
+% infix notation into this `instruction set'.
+%
+% Our goal is to design a translation scheme that translates~$X$ (an
+% expression, a term, or a factor) into a sequence of \TeX\ instructions
+% that does the following [Invariance Property]: correctly
+% evaluates~$X$, leaves the result in a global register~$A$ (using a
+% global assignment), and does not perform global assignments to the
+% scratch register~$B$; moreover, the code sequence must be balanced
+% with respect to \TeX\ groups. We shall denote the code sequence
+% corresponding to~$X$ by \s{X}.
+%
+% In the replacement code specified below, we use the following
+% conventions:
+% \begin{itemize}
+% \item $A$ and $B$ denote registers; all assignments to~$A$ will
+% be global, and all assignments to~$B$ will be local.
+% \item ``$\gassign$'' means global assignment to the register on
+% the lhs.
+% \item ``$\lassign $'' means local assignment to the register on
+% the lhs.
+% \item ``\savecode C'' means ``save the code~$C$ until the current
+% group (scope) ends, then execute it.'' This corresponds to
+% the \TeX-primitive |\aftergroup|.
+% \item ``$\{$'' denotes the start of a new group, and ``$\}$''
+% denotes the end of a group.
+% \end{itemize}
+%
+% Let us consider an expression $T_1+T_2+\cdots+T_n$. Assuming that
+% \s{T_k} ($1\le k\le n$) attains the stated goal, the following code
+% clearly attains the stated goal for their sum:
+% \begin{eqnarray*}
+% \s{T_1+T_2+\cdots+T_n}&\Longrightarrow&
+% \{\,\s{T_1}\,\} \; B\lassign A \quad
+% \{\,\s{T_2}\,\} \; B\lassign B+A \\
+% &&\qquad \ldots \quad \{\,\s{T_n}\,\} \; B\lassign B+A
+% \quad A\gassign B
+% \end{eqnarray*}
+% Note the extra level of grouping enclosing each of \s{T_1}, \s{T_2},
+% \ldots,~\s{T_n}. This will ensure that register~$B$, used to
+% compute the sum of the terms, is not clobbered by the intermediate
+% computations of the individual terms. Actually, the group
+% enclosing~\s{T_1} is unnecessary, but it turns out to be simpler if
+% all terms are treated the same way.
+%
+% The code sequence ``$\{\,\s{T_2}\,\}\;B\lassign B+A$'' can be translated
+% into the following equivalent code sequence:
+% ``$\{\savecode{B\lassign B+A}\,\s{T_2}\,\}$''. This observation turns
+% out to be the key to the implementation: The ``$\savecode{B\lassign
+% B+A}$'' is generated \emph{before} $T_2$ is translated, at the same
+% time as the `$+$' operator between $T_1$ and~$T_2$ is seen.
+%
+% Now, the specification of the translation scheme is straightforward:
+% \begin{eqnarray*}
+% \s{f}&\Longrightarrow&A\gassign f\\[\smallskipamount]
+% \s{(E')}&\Longrightarrow&\s{E'}\\[\smallskipamount]
+% \s{T_1+T_2+\cdots+T_n}&\Longrightarrow&
+% \{\savecode{B\lassign A}\,\s{T_1}\,\} \quad
+% \{\savecode{B\lassign B+A}\,\s{T_2}\,\} \\
+% &&\qquad \ldots \quad \{\savecode{B\lassign B+A}\,\s{T_n}\,\}
+% \quad A\gassign B
+% \\[\smallskipamount]
+% \s{F_1*F_2*\cdots*F_m}&\Longrightarrow&
+% \{\savecode{B\lassign A}\,\s{F_1}\,\} \quad
+% \{\savecode{B\lassign B*A}\,\s{F_2}\,\}\\
+% &&\qquad \ldots \quad \{\savecode{B\lassign B*A}\,\s{F_m}\,\}
+% \quad A\gassign B
+% \end{eqnarray*}
+% By structural induction, it is easily seen that the stated property
+% is attained.
+%
+% By inspection of this translation scheme, we see that we have to
+% generate the following code:
+% \begin{itemize}
+% \item we must generate ``$\{\savecode{B\lassign
+% A}\{\savecode{B\lassign A}$'' at the left border of an
+% expression (i.e., for each left parenthesis and the implicit
+% left parenthesis at the beginning of the whole expression);
+% \item we must generate ``$\}A\gassign B\}A\gassign B$'' at the
+% right border of an expression (i.e., each right parenthesis
+% and the implicit right parenthesis at the end of the full
+% expression);
+% \item `\texttt{*}' is replaced by ``$\}\{\savecode{B\lassign
+% B*A}$'';
+% \item `\texttt{+}' is replaced by
+% ``$\}A\gassign B\}\{\savecode{B\lassign
+% B+A}\{\savecode{B\lassign A}$'';
+% \item when we see (expect) a numeric quantity, we insert the
+% assignment code ``$A\gassign$'' in front of the quantity and let
+% \TeX\ parse it.
+% \end{itemize}
+%
+% \section{Implementation}
+%
+% For brevity define
+% \begin{calc-syntax}
+% \<numeric> \is \<number> \alt \<dimen> \alt \<glue> \alt \<muglue>
+% \end{calc-syntax}
+% So far we have ignored the question of how to determine the type of
+% register to be used in the code. However, it is easy to see that
+% (1)~`$*$' always initiates an \<integer factor>, (2)~all
+% \<numeric>s in an expression, except those which are part of an
+% \<integer factor>, are of the same type as the whole expression, and
+% all \<numeric>s in an \<integer factor> are \<number>s.
+%
+% We have to ensure that $A$ and~$B$ always have an appropriate type
+% for the \<numeric>s they manipulate. We can achieve this by having
+% an instance of $A$ and~$B$ for each type. Initially, $A$~and~$B$
+% refer to registers of the proper type for the whole expression.
+% When an \<integer factor> is expected, we must change $A$ and~$B$ to
+% refer to integer type registers. We can accomplish this by
+% including instructions to change the type of $A$ and~$B$ to integer
+% type as part of the replacement code for~`$*$; if we append such
+% instructions to the replacement code described above, we also ensure
+% that the type-change is local (provided that the type-changing
+% instructions only have local effect). However, note that the
+% instance of~$A$ referred to in $\savecode{B\lassign B*A}$ is the
+% integer instance of~$A$.
+%
+% We shall use |\begingroup| and |\endgroup| for the open-group and
+% close-group characters. This avoids problems with spacing in math
+% (as pointed out to us by Frank Mittelbach).
+%
+% \subsection{Getting started}
+%
+% Now we have enough insight to do the actual implementation in \TeX.
+% First, we announce the macro package.\footnote{Code moved to top of file}
+% \begin{macrocode}
+%<*package>
+%\NeedsTeXFormat{LaTeX2e}
+%\ProvidesPackage{calc}[\filedate\space\fileversion]
+% \end{macrocode}
+%
+% \subsection{Assignment macros}
+%
+% \begin{macro}{\calc@assign@generic}
+% \changes{v4.2}{2005/08/06}{Removed a few redundant \cs{expandafter}s}
+% The |\calc@assign@generic| macro takes four arguments: (1~and~2) the
+% registers to be used
+% for global and local manipulations, respectively; (3)~the lvalue
+% part; (4)~the expression to be evaluated.
+%
+% The third argument (the lvalue) will be used as a prefix to a
+% register that contains the value of the specified expression (the
+% fourth argument).
+%
+% In general, an lvalue is anything that may be followed by a variable
+% of the appropriate type. As an example, |\linepenalty| and
+% |\global\advance\linepenalty| may both be followed by an \<integer
+% variable>.
+%
+% The macros described below refer to the registers by the names
+% |\calc@A| and |\calc@B|; this is accomplished by
+% |\let|-assignments.
+%
+% As discovered in Section~\ref{evaluation:scheme}, we have to
+% generate code as
+% if the expression is parenthesized. As described below,
+% |\calc@open| is the macro that replaces a left parenthesis by its
+% corresponding \TeX\ code sequence. When the scanning process sees
+% the exclamation point, it generates an |\endgroup| and stops. As we
+% recall from Section~\ref{evaluation:scheme}, the correct expansion
+% of a right
+% parenthesis is ``$\}A\gassign B\}A\gassign B$''. The remaining
+% tokens of this expansion are inserted explicitly, except that the
+% last assignment has been replaced by the lvalue part (i.e.,
+% argument~|#3| of |\calc@assign@generic|) followed by |\calc@B|.
+% \begin{macrocode}
+\def\calc@assign@generic#1#2#3#4{\let\calc@A#1\let\calc@B#2%
+ \calc@open(#4!%
+ \global\calc@A\calc@B\endgroup#3\calc@B}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calc@assign@count}
+% \begin{macro}{\calc@assign@dimen}
+% \begin{macro}{\calc@assign@skip}
+% We need three instances of the |\calc@assign@generic| macro,
+% corresponding to the types \<integer>, \<dimen>, and \<glue>.
+% \begin{macrocode}
+\def\calc@assign@count{\calc@assign@generic\calc@Acount\calc@Bcount}
+\def\calc@assign@dimen{\calc@assign@generic\calc@Adimen\calc@Bdimen}
+\def\calc@assign@skip{\calc@assign@generic\calc@Askip\calc@Bskip}
+% \end{macrocode}
+% \end{macro}\end{macro}\end{macro}
+% These macros each refer to two registers, one
+% to be used globally and one to be used locally.
+% We must allocate these registers.
+% \begin{macrocode}
+\newcount\calc@Acount \newcount\calc@Bcount
+\newdimen\calc@Adimen \newdimen\calc@Bdimen
+\newskip\calc@Askip \newskip\calc@Bskip
+% \end{macrocode}
+%
+% \subsection{The \LaTeX\ interface}
+%
+% \begin{macro}{\setcounter}
+% \begin{macro}{\addtocounter}
+% \changes{v4.2}{2005/08/06}
+% {Fix to make \cs{addtocounter} work with \texttt{amstext}}
+% \begin{macro}{\steptocounter}
+% \changes{v4.2}{2005/08/06}
+% {Avoid redundant processing. PR/3795}
+% \begin{macro}{\setlength}
+% \begin{macro}{\addtolength}
+% As promised, we redefine the following standard \LaTeX\ commands:
+% |\setcounter|,
+% |\addtocounter|, |\setlength|, and |\addtolength|.
+% \begin{macrocode}
+\def\setcounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
+ {\calc@assign@count{\global\csname c@#1\endcsname}{#2}}}
+% \end{macrocode}
+% \begin{macrocode}
+ \def\addtocounter#1#2{\@ifundefined{c@#1}{\@nocounterr{#1}}%
+ {\calc@assign@count{\global\advance\csname c@#1\endcsname}{#2}}}%
+% \end{macrocode}
+% We also fix \cs{stepcounter} to not go through the whole \texttt{calc}
+% process.
+% \begin{macrocode}
+ \def\stepcounter#1{\@ifundefined {c@#1}%
+ {\@nocounterr {#1}}%
+ {\global\advance\csname c@#1\endcsname \@ne
+ \begingroup
+ \let\@elt\@stpelt \csname cl@#1\endcsname
+ \endgroup}}%
+% \end{macrocode}
+% If the \texttt{amstext} package is loaded we must add the
+% |\iffirstchoice@| switch as well. We patch the commands this
+% way since it's good practice when we know how many arguments they take.
+% \begin{macrocode}
+\@ifpackageloaded{amstext}{%
+ \expandafter\def\expandafter\stepcounter
+ \expandafter#\expandafter1\expandafter{%
+ \expandafter\iffirstchoice@\stepcounter{#1}\fi
+ }
+ \expandafter\def\expandafter\addtocounter
+ \expandafter#\expandafter1\expandafter#\expandafter2\expandafter{%
+ \expandafter\iffirstchoice@\addtocounter{#1}{#2}\fi
+ }
+}{}
+% \end{macrocode}
+% \begin{macrocode}
+\DeclareRobustCommand\setlength{\calc@assign@skip}
+\DeclareRobustCommand\addtolength[1]{\calc@assign@skip{\advance#1}}
+% \end{macrocode}
+% (|\setlength| and |\addtolength| are robust according to
+% \cite{latexman}.)
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The scanner}
+%
+% We evaluate expressions by explicit scanning of characters. We do
+% not rely on active characters for this.
+%
+% The scanner consists of two parts, |\calc@pre@scan| and
+% |\calc@post@scan|; |\calc@pre@scan| consumes left parentheses, and
+% |\calc@post@scan| consumes binary operator, |\real|, |\ratio|, and
+% right parenthesis tokens.
+%
+% \begin{macro}{\calc@pre@scan}
+% \begin{macro}{\@calc@pre@scan}
+% \changes{v4.2}{2005/08/06}
+% {Added macro and force expansion}
+%
+% Note that this is called at least once on every use of calc
+% processing, even when none of the extended syntax is present; it
+% therefore needs to be made very efficient.
+%
+% It reads the initial part of expressions, until some \<text dimen
+% factor> or \<numeric> is seen; in fact, anything not explicitly
+% recognized here is taken to be a \<numeric> of some sort as this
+% allows unary
+% `\texttt{+}' and unary `\texttt{-}' to be treated easily and
+% correctly\footnote{In the few contexts where signs are allowed:
+% this could, I think, be extended (CAR).} but means that anything
+% illegal will simply generate a \TeX-level error, often a
+% reasonably comprehensible one!
+%
+% The |\romannumeral-`\a| part is a little trick which forces expansion
+% in case |#1| is a normal macro, something that occurs from time to
+% time. A conditional test inside will possibly leave a trailing
+% \cs{fi} but this remnant is removed later when \cs{calc@post@scan}
+% performs the same trick.
+%
+% The many |\expandafter|s are needed to efficiently end the nested
+% conditionals so that |\calc@textsize| and |\calc@maxmin@addsub| can
+% process their argument.
+% \changes{v4.1a}{1998/06/07}
+% {Added code for text sizes: CAR}
+% \changes{v4.1b}{1998/07/07}
+% {Correction to ifx true case}
+% \changes{v4.2}{2005/08/06}
+% {Added \cs{maxof} and \cs{minof} operations}
+% \begin{macrocode}
+\def\calc@pre@scan#1{%
+ \expandafter\@calc@pre@scan\romannumeral-`\a#1}
+\def\@calc@pre@scan#1{%
+ \ifx(#1%
+ \expandafter\calc@open
+ \else
+ \ifx\widthof#1%
+ \expandafter\expandafter\expandafter\calc@textsize
+ \else
+ \ifx\maxof#1%
+ \expandafter\expandafter\expandafter\expandafter
+ \expandafter\expandafter\expandafter\calc@maxmin@addsub
+ \else
+ \calc@numeric% no \expandafter needed for this one.
+ \fi
+ \fi
+ \fi
+ #1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@open}
+% \begin{macro}{\calc@initB}
+% |\calc@open| is used when there is a left parenthesis right ahead.
+% This parenthesis is replaced by \TeX\ code corresponding to the code
+% sequence ``$\{\savecode{B\lassign A}\{\savecode{B\lassign A}$''
+% derived in Section~\ref{evaluation:scheme}. Finally,
+% |\calc@pre@scan| is
+% called again.
+% \begin{macrocode}
+\def\calc@open({\begingroup\aftergroup\calc@initB
+ \begingroup\aftergroup\calc@initB
+ \calc@pre@scan}
+\def\calc@initB{\calc@B\calc@A}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\calc@numeric}
+% |\calc@numeric| assigns the following value to |\calc@A| and then
+% transfers control to |\calc@post@scan|.
+% \begin{macrocode}
+\def\calc@numeric{\afterassignment\calc@post@scan \global\calc@A}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\widthof}
+% \begin{macro}{\heightof}
+% \begin{macro}{\depthof}
+% \changes{v4.1a}{1998/06/07}
+% {Added macros: CAR}
+% \begin{macro}{\totalheightof}
+% \changes{v4.2}{2005/08/06}
+% {Added macro}
+% \changes{v4.2}{2005/08/06}
+% {Added informative message for reserved macros}
+%
+% These do not need any particular definition when they are scanned
+% so, for efficiency and robustness, we make them all equivalent to
+% the same harmless (I hope) unexpandable command.\footnote{If this
+% level of safety is not needed then the code can be sped up:
+% CAR.} Thus the test in |\@calc@pre@scan| finds any of them.
+%
+% As we have to check for these commands explicitly we must ensure
+% that our definition wins. Using \cs{newcommand} gives an error when
+% loading \texttt{calc} and may be mildly surprising. This should be
+% a little more informative.
+% \begin{macrocode}
+\@for\reserved@a:=widthof,heightof,depthof,totalheightof,maxof,minof\do
+{\@ifundefined{\reserved@a}{}{%
+ \PackageError{calc}{%
+ The\space calc\space package\space reserves\space the\space
+ command\space name\space `\@backslashchar\reserved@a'\MessageBreak
+ but\space it\space has\space already\space been\space defined\space
+ with\space the\space meaning\MessageBreak
+ `\expandafter\meaning\csname\reserved@a\endcsname'.\MessageBreak
+ This\space original\space definition\space will\space be\space lost}%
+ {If\space you\space need\space a\space command\space with\space
+ this\space definition,\space you\space must\space use\space a\space
+ different\space name.}}%
+}
+\let\widthof\ignorespaces
+\let\heightof\ignorespaces
+\let\depthof\ignorespaces
+\let\totalheightof\ignorespaces
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@textsize}
+% \changes{v4.1a}{1998/06/07}
+% {Added macro: CAR}
+% \changes{v4.1a}{1998/06/07}
+% {Added macro: CAR}
+% \changes{v4.2}{2005/08/06}
+% {Extended macro with \cs{totalheightof}}
+% The presence of the above four commands invokes this code, where
+% we must distinguish them from each other.
+% This implementation is somewhat optimized by using low-level
+% code from the commands |\settowidth|, etc.\footnote{It is based on
+% suggestions by Donald Arseneau and David Carlisle.}
+%
+% Within the text argument we must restore the normal meanings of
+% the four user-level commands since arbitrary material can appear
+% in here, including further uses of calc.
+% \begin{macrocode}
+\def\calc@textsize #1#2{%
+ \begingroup
+ \let\widthof\wd
+ \let\heightof\ht
+ \let\depthof\dp
+ \def\totalheightof{\ht\dp}%
+% \end{macrocode}
+% We must expand the argument one level if it's \cs{totalheightof}
+% and it doesn't hurt the other three.
+% \begin{macrocode}
+ \expandafter\@settodim\expandafter{#1}%
+ {\global\calc@A}%
+ {%
+ \let\widthof\ignorespaces
+ \let\heightof\ignorespaces
+ \let\depthof\ignorespaces
+ \let\totalheightof\ignorespaces
+ #2}%
+ \endgroup
+ \calc@post@scan}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\calc@post@scan}
+% \begin{macro}{\@calc@post@scan}
+% \changes{v4.2}{2005/08/06}{Added macro and force expansion}
+% \changes{v4.3}{2007/08/22}{Discard terminating \cs{relax} tokens and
+% avoid extra error message from \cs{calc@next}}
+% The macro |\calc@post@scan| is called right after a value has been
+% read. At this point, a binary operator, a sequence of right
+% parentheses, an optional \cs{relax}, and the end-of-expression mark
+% (`|!|') is allowed.\footnote{Is \texttt{!} a good choice, CAR?}
+% Depending on our findings, we call a suitable macro to generate the
+% corresponding \TeX\ code (except when we detect the
+% end-of-expression marker: then scanning ends, and control is
+% returned to |\calc@assign@generic|).
+%
+% This macro may be optimized by selecting a different order of
+% |\ifx|-tests. The test for `\texttt{!}' (end-of-expression) is
+% placed first as it will always be performed: this is the only test
+% to be performed if the expression consists of a single \<numeric>.
+% This ensures that documents that do not use the extra expressive
+% power provided by the \texttt{calc} package only suffer a minimum
+% slowdown in processing time.
+% \begin{macrocode}
+\def\calc@post@scan#1{%
+ \expandafter\@calc@post@scan\romannumeral-`\a#1}
+\def\@calc@post@scan#1{%
+ \ifx#1!\let\calc@next\endgroup \else
+ \ifx#1+\let\calc@next\calc@add \else
+ \ifx#1-\let\calc@next\calc@subtract \else
+ \ifx#1*\let\calc@next\calc@multiplyx \else
+ \ifx#1/\let\calc@next\calc@dividex \else
+ \ifx#1)\let\calc@next\calc@close \else
+ \ifx#1\relax\let\calc@next\calc@post@scan \else
+ \def\calc@next{\calc@error#1}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \calc@next}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@add}
+% \begin{macro}{\calc@subtract}
+% \begin{macro}{\calc@generic@add}
+% \begin{macro}{\calc@addAtoB}
+% \begin{macro}{\calc@subtractAfromB}
+% The replacement code for the binary operators `\texttt{+}' and
+% `\texttt{-}' follow a common pattern; the only difference is the
+% token that is stored away by |\aftergroup|. After this replacement
+% code, control is transferred to |\calc@pre@scan|.
+% \begin{macrocode}
+\def\calc@add{\calc@generic@add\calc@addAtoB}
+\def\calc@subtract{\calc@generic@add\calc@subtractAfromB}
+\def\calc@generic@add#1{\endgroup\global\calc@A\calc@B\endgroup
+ \begingroup\aftergroup#1\begingroup\aftergroup\calc@initB
+ \calc@pre@scan}
+\def\calc@addAtoB{\advance\calc@B\calc@A}
+\def\calc@subtractAfromB{\advance\calc@B-\calc@A}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\real}
+% \begin{macro}{\ratio}
+% \begin{macro}{\calc@ratio@x}
+% \begin{macro}{\calc@real@x}
+% The multiplicative operators, `\texttt{*}' and `\texttt{/}', may be
+% followed by a |\real|, |\ratio|, |\minof|, or |\maxof| token. The
+% last two of these control sequences are defined by \texttt{calc} as
+% they are needed by the scanner for addition or subtraction while the
+% first two are not defined (at least not by the \texttt{calc}
+% package); this,
+% unfortunately, leaves them highly non-robust. We therefore
+% equate them to |\relax| but only if they have not already been
+% defined\footnote{Suggested code from David Carlisle.}
+% (by some other package: dangerous but possible!); this
+% will also make them appear to be undefined to a \LaTeX{} user
+% (also possibly dangerous).
+% \changes{v4.1a}{1998/06/07}
+% {Added macro set-ups to make them robust but undefined: CAR}
+% \begin{macrocode}
+\ifx\real\@undefined\let\real\relax\fi
+\ifx\ratio\@undefined\let\ratio\relax\fi
+% \end{macrocode}
+% In order to test for |\real| or |\ratio|, we define these
+% two.\footnote{May not need the extra names, CAR?}
+% \begin{macrocode}
+\def\calc@ratio@x{\ratio}
+\def\calc@real@x{\real}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\calc@multiplyx}
+% \changes{v4.2}{2005/08/06}
+% {Added $\protect\max$ and $\protect\min$ operations}
+% \begin{macro}{\calc@dividex}
+% \changes{v4.2}{2005/08/06}
+% {Added $\protect\max$ and $\protect\min$ operations}
+% Test which operator followed |*| or |/|. If none followed it's just
+% a standard multiplication or division.
+% \begin{macrocode}
+\def\calc@multiplyx#1{\def\calc@tmp{#1}%
+ \ifx\calc@tmp\calc@ratio@x \let\calc@next\calc@ratio@multiply \else
+ \ifx\calc@tmp\calc@real@x \let\calc@next\calc@real@multiply \else
+ \ifx\maxof#1\let\calc@next\calc@maxmin@multiply \else
+ \let\calc@next\calc@multiply
+ \fi
+ \fi
+ \fi
+ \calc@next#1}
+\def\calc@dividex#1{\def\calc@tmp{#1}%
+ \ifx\calc@tmp\calc@ratio@x \let\calc@next\calc@ratio@divide \else
+ \ifx\calc@tmp\calc@real@x \let\calc@next\calc@real@divide \else
+ \ifx\maxof#1\let\calc@next\calc@maxmin@divide \else
+ \let\calc@next\calc@divide
+ \fi
+ \fi
+ \fi
+ \calc@next#1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@multiply}
+% \begin{macro}{\calc@divide}
+% \begin{macro}{\calc@generic@multiply}
+% \begin{macro}{\calc@multiplyBbyA}
+% \begin{macro}{\calc@divideBbyA}
+% The binary operators `\texttt{*}' and `\texttt{/}' also insert code
+% as determined above. Moreover, the meaning of |\calc@A| and
+% |\calc@B| is changed as factors following a multiplication and
+% division operator always have integer type; the original meaning of
+% these macros will be restored when the factor has been read and
+% evaluated.
+% \begin{macrocode}
+\def\calc@multiply{\calc@generic@multiply\calc@multiplyBbyA}
+\def\calc@divide{\calc@generic@multiply\calc@divideBbyA}
+\def\calc@generic@multiply#1{\endgroup\begingroup
+ \let\calc@A\calc@Acount \let\calc@B\calc@Bcount
+ \aftergroup#1\calc@pre@scan}
+\def\calc@multiplyBbyA{\multiply\calc@B\calc@Acount}
+\def\calc@divideBbyA{\divide\calc@B\calc@Acount}
+% \end{macrocode}
+% Since the value to use in the multiplication/division operation is
+% stored in the |\calc@Acount| register, the |\calc@multiplyBbyA| and
+% |\calc@divideBbyA| macros use this register.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@close}
+% |\calc@close| generates code for a right parenthesis (which was
+% derived to be ``$\}A\gassign B\}A\gassign B$'' in
+% Section~\ref{evaluation:scheme}). After this code, the control is
+% returned to
+% |\calc@post@scan| in order to look for another right parenthesis or
+% a binary operator.
+% \begin{macrocode}
+\def\calc@close
+ {\endgroup\global\calc@A\calc@B
+ \endgroup\global\calc@A\calc@B
+ \calc@post@scan}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Calculating a ratio}
+%
+% \begin{macro}{\calc@ratio@multiply}
+% \begin{macro}{\calc@ratio@divide}
+% When |\calc@post@scan| encounters a |\ratio| control sequence, it hands
+% control to one of the macros |\calc@ratio@multiply| or |\calc@ratio@divide|,
+% depending on the preceding character. Those macros both forward the
+% control to the macro |\calc@ratio@evaluate|, which performs two steps: (1) it
+% calculates the ratio, which is saved in the global macro token
+% |\calc@the@ratio|; (2) it makes sure that the value of |\calc@B| will be
+% multiplied by the ratio as soon as the current group ends.
+%
+% The following macros call |\calc@ratio@evaluate| which multiplies
+% |\calc@B| by the ratio, but |\calc@ratio@divide| flips the arguments
+% so that the `opposite' fraction is actually evaluated.
+% \begin{macrocode}
+\def\calc@ratio@multiply\ratio{\calc@ratio@evaluate}
+\def\calc@ratio@divide\ratio#1#2{\calc@ratio@evaluate{#2}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\calc@Ccount}
+% \begin{macro}{\calc@numerator}
+% \begin{macro}{\calc@denominator}
+% We shall need two registers for temporary usage in the
+% calculations. We can save one register since we can reuse
+% |\calc@Bcount|.
+% \begin{macrocode}
+\newcount\calc@Ccount
+\let\calc@numerator=\calc@Bcount
+\let\calc@denominator=\calc@Ccount
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\calc@ratio@evaluate}
+% Here is the macro that handles the actual evaluation of ratios. The
+% procedure is
+% this: First, the two expressions are evaluated and coerced to
+% integers. The whole procedure is enclosed in a group to be able to
+% use the registers |\calc@numerator| and |\calc@denominator| for temporary
+% manipulations.
+% \begin{macrocode}
+\def\calc@ratio@evaluate#1#2{%
+ \endgroup\begingroup
+ \calc@assign@dimen\calc@numerator{#1}%
+ \calc@assign@dimen\calc@denominator{#2}%
+% \end{macrocode}
+% Here we calculate the ratio. First, we check for negative numerator
+% and/or denominator; note that \TeX\ interprets two minus signs the
+% same as a plus sign. Then, we calculate the integer part.
+% The minus sign(s), the integer part, and a decimal point, form the
+% initial expansion of the |\calc@the@ratio| macro.
+% \begin{macrocode}
+ \gdef\calc@the@ratio{}%
+ \ifnum\calc@numerator<0 \calc@numerator-\calc@numerator
+ \gdef\calc@the@ratio{-}%
+ \fi
+ \ifnum\calc@denominator<0 \calc@denominator-\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio-}%
+ \fi
+ \calc@Acount\calc@numerator
+ \divide\calc@Acount\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio\number\calc@Acount.}%
+% \end{macrocode}
+% Now we generate the digits after the decimal point, one at a time.
+% When \TeX\ scans these digits (in the actual multiplication
+% operation), it forms a fixed-point number with 16~bits for
+% the fractional part. We hope that six digits is sufficient, even
+% though the last digit may not be rounded correctly.
+% \begin{macrocode}
+ \calc@next@digit \calc@next@digit \calc@next@digit
+ \calc@next@digit \calc@next@digit \calc@next@digit
+ \endgroup
+% \end{macrocode}
+% Now we have the ratio represented (as the expansion of the global
+% macro |\calc@the@ratio|) in the syntax \<decimal constant>
+% \cite[page~270]{texbook}. This is fed to |\calc@multiply@by@real|
+% that will
+% perform the actual multiplication. It is important that the
+% multiplication takes place at the correct grouping level so that the
+% correct instance of the $B$ register will be used. Also note that
+% we do not need the |\aftergroup| mechanism in this case.
+% \begin{macrocode}
+ \calc@multiply@by@real\calc@the@ratio
+ \begingroup
+ \calc@post@scan}
+% \end{macrocode}
+% \end{macro}
+% The |\begingroup| inserted before the |\calc@post@scan| will be
+% matched by the |\endgroup| generated as part of the replacement of a
+% subsequent binary operator or right parenthesis.
+% \begin{macro}{\calc@next@digit}
+% \begin{macrocode}
+\def\calc@next@digit{%
+ \multiply\calc@Acount\calc@denominator
+ \advance\calc@numerator -\calc@Acount
+ \multiply\calc@numerator 10
+ \calc@Acount\calc@numerator
+ \divide\calc@Acount\calc@denominator
+ \xdef\calc@the@ratio{\calc@the@ratio\number\calc@Acount}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\calc@multiply@by@real}
+% In the following code, it is important that we first assign the
+% result to a dimen register. Otherwise, \TeX\ won't allow us to
+% multiply with a real number.
+% \begin{macrocode}
+\def\calc@multiply@by@real#1{\calc@Bdimen #1\calc@B \calc@B\calc@Bdimen}
+% \end{macrocode}
+% (Note that this code wouldn't work if |\calc@B| were a muglue
+% register. This is the real reason why the \texttt{calc} package
+% doesn't support muglue expressions. To support muglue expressions
+% in full, the |\calc@multiply@by@real| macro must use a muglue register
+% instead of |\calc@Bdimen| when |\calc@B| is a muglue register;
+% otherwise, a dimen register should be used. Since integer
+% expressions can appear as part of a muglue expression, it would be
+% necessary to determine the correct register to use each time a
+% multiplication is made.)
+% \end{macro}
+%
+% \subsection{Multiplication by real numbers}
+%
+% \begin{macro}{\calc@real@multiply}
+% \begin{macro}{\calc@real@divide}
+% This is similar to the |\calc@ratio@evaluate| macro above, except that
+% it is considerably simplified since we don't need to calculate the
+% factor explicitly.
+% \begin{macrocode}
+\def\calc@real@multiply\real#1{\endgroup
+ \calc@multiply@by@real{#1}\begingroup
+ \calc@post@scan}
+\def\calc@real@divide\real#1{\calc@ratio@evaluate{1pt}{#1pt}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{$\max$ and $\min$ operations}
+%
+% \begin{macro}{\maxof}
+% \begin{macro}{\minof}
+% \changes{v4.2}{2005/08/06}
+% {Added macros}
+% With version 4.2, the $\max$ and $\min$ operators were
+% added to \texttt{calc}. The user functions for them are \cs{maxof} and
+% \cs{minof} respectively.
+% These macros are internally similar to \cs{widthof} etc.\ in that they
+% are unexpandable and easily recognizable by the scanner.
+% \begin{macrocode}
+\let\maxof\@@italiccorr
+\let\minof\@@italiccorr
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\calc@Cskip}
+% \begin{macro}{\ifcalc@count@}
+% The $\max$ and $\min$ operations take two arguments so we need an extra
+% \<skip> register. We also add a switch for determining when to perform
+% a \<skip> or a \<count> assignment.
+% \begin{macrocode}
+\newskip\calc@Cskip
+\newif\ifcalc@count@
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\calc@maxmin@addsub}
+% \begin{macro}{\calc@maxmin@generic}
+% \changes{v4.2}{2005/08/06}{Macros added}
+% When doing addition or subtraction with a $\max$ or $\min$ operator, we
+% first check if |\calc@A| is a \<count> register or not and then set the
+% switch. Then call the real function which sets |\calc@A| to the desired
+% value and continue as usual with |\calc@post@scan|.
+% \begin{macrocode}
+\def\calc@maxmin@addsub#1#2#3{\begingroup
+ \ifx\calc@A\calc@Acount%
+ \calc@count@true
+ \else
+ \calc@count@false
+ \fi
+ \calc@maxmin@generic#1{#2}{#3}%
+ \endgroup
+ \calc@post@scan
+}
+% \end{macrocode}
+% Check the switch and do either \<count> or \<skip> assignments. Note that
+% |\maxof| and |\minof| are not set to |>| and |<| until after the
+% assignments, which ensures we can nest them without problems. Then set
+% |\calc@A| to the correct one.
+% \begin{macrocode}
+\def\calc@maxmin@generic#1#2#3{%
+ \begingroup
+ \ifcalc@count@
+ \calc@assign@count\calc@Ccount{#2}%
+ \calc@assign@count\calc@Bcount{#3}%
+ \def\minof{<}\def\maxof{>}%
+ \global\calc@A\ifnum\calc@Ccount#1\calc@Bcount
+ \calc@Ccount\else\calc@Bcount\fi
+ \else
+ \calc@assign@skip\calc@Cskip{#2}%
+ \calc@assign@skip\calc@Bskip{#3}%
+ \def\minof{<}\def\maxof{>}%
+ \global\calc@A\ifdim\calc@Cskip#1\calc@Bskip
+ \calc@Cskip\else\calc@Bskip\fi
+ \fi
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\calc@maxmin@divmul}
+% \begin{macro}{\calc@maxmin@multiply}
+% \begin{macro}{\calc@maxmin@divide}
+% \changes{v4.2}{2005/08/06}{Macros added}
+% When doing division or multiplication we must be using \<count> registers
+% so we set the switch. Other than that it is almost business as usual when
+% multiplying or dividing. |#1| is the instruction to either multiply or
+% divide |\calc@B| by |\calc@A|, |#2| is either |\maxof| or |\minof| which
+% is waiting in the input stream and |#3| and |#4| are the calc expressions.
+% We end it all as usual by calling |\calc@post@scan|.
+% \begin{macrocode}
+\def\calc@maxmin@divmul#1#2#3#4{%
+ \endgroup\begingroup
+ \calc@count@true
+ \aftergroup#1%
+ \calc@maxmin@generic#2{#3}{#4}%
+ \endgroup\begingroup
+ \calc@post@scan
+}
+% \end{macrocode}
+% The two functions called when seeing a |*| or a |/|.
+% \begin{macrocode}
+\def\calc@maxmin@multiply{\calc@maxmin@divmul\calc@multiplyBbyA}
+\def\calc@maxmin@divide {\calc@maxmin@divmul\calc@divideBbyA}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \section{Reporting errors}
+% \begin{macro}{\calc@error}
+% \changes{v4.0d}{1997/11/08}
+% {Use \cs{PackageError} for error messages (DPC)}
+% \changes{v4.0e}{1997/11/11}
+% {typo fixed}
+% If |\calc@post@scan| reads a character that is not one of `\texttt{+}',
+% `\texttt{-}', `\texttt{*}', `\texttt{/}', or `\texttt{)}', an error
+% has occurred, and this is reported to the user. Violations in the
+% syntax of \<numeric>s will be detected and reported by \TeX.
+% \changes{v4.1a}{1998/06/07}
+% {Improved, I hope, error message: CAR}
+% \begin{macrocode}
+\def\calc@error#1{%
+ \PackageError{calc}%
+ {`#1' invalid at this point}%
+ {I expected to see one of: + - * / )}}
+% \end{macrocode}
+% \end{macro}
+%
+% \section{Other additions}
+% \begin{macro}{\@settodim}
+% \changes{v4.2}{2005/08/06}
+% {Changed kernel macro}
+% \begin{macro}{\settototalheight}
+% \changes{v4.2}{2005/08/06}
+% {Added macro}
+% The kernel macro \cs{@settodim} is changed so that it runs through a list
+% containing \cs{ht}, \cs{wd}, and \cs{dp} and than advance the length
+% one step at a time. We just have to use a scratch register in case the
+% user decides to put in a \cs{global} prefix on the length register.
+% A search on the internet confirmed that some people do that kind of thing.
+% \begin{macrocode}
+\def\@settodim#1#2#3{%
+ \setbox\@tempboxa\hbox{{#3}}%
+ \dimen@ii=\z@
+ \@tf@r\reserved@a #1\do{%
+ \advance\dimen@ii\reserved@a\@tempboxa}%
+ #2=\dimen@ii
+ \setbox\@tempboxa\box\voidb@x}
+% \end{macrocode}
+% Now the user level macro is straightforward.
+% \begin{macrocode}
+\def\settototalheight{\@settodim{\ht\dp}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% That's the end of the package.
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+\endinput
+
diff --git a/macros/latex-dev/required/tools/calc.pdf b/macros/latex-dev/required/tools/calc.pdf
new file mode 100644
index 0000000000..694dfa5023
--- /dev/null
+++ b/macros/latex-dev/required/tools/calc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/changes.txt b/macros/latex-dev/required/tools/changes.txt
new file mode 100644
index 0000000000..e169707750
--- /dev/null
+++ b/macros/latex-dev/required/tools/changes.txt
@@ -0,0 +1,1671 @@
+=======================================================================
+This file lists changes to the LaTeX2e files in reverse chronological order.
+It is provided for convenience only. It therefore makes no claims to
+completeness or accuracy and it contains some references to files that
+are not part of the distribution.
+=======================================================================
+
+
+2019-09-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * varioref.dtx (subsection{Options}:
+ Option arabic added
+
+2019-08-31 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx: Add a necessary \expandafter so that redefinitions
+ of primitive specifiers give a warning (github/148)
+
+2019-08-25 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * varioref.dtx: \labelformat and \Ref now available in the kernel
+ so removed from this package but only if running on new kernel
+
+ (subsection{Options}):
+ Provide options space and nospace
+
+ (subsection{Defining the main macros}):
+ Don't drop a preceding space completely but reinsert it later
+ after setting a label;
+ Command \vp@gerefstar, \vref@star and \Vref@star added to support
+ hyperref better
+
+ (subsubsection{Supporting ranges}):
+ Added \vpagerefcompare, \vpagrefnearby and \vpagerefcomparenearby
+
+2019-03-01 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx (subsection{The output routines}):
+ Provide minrows counter for balancing.
+
+2019-02-06 David Carlisle <David.Carlisle@latex-project.org>
+
+ * longtable.dtx: Document the extra color groups
+
+#########################
+# 2019-01-05 Release
+#########################
+
+2019-01-05 David Carlisle <David.Carlisle@latex-project.org>
+
+ * xr.dtx: Fix to last update to avoid breaking \include handling.
+ (gh/106)
+
+2018-12-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx (section{The macros \texttt{\textbackslash @classz}):
+ Add extra \hskip1sp to guard against an \unskip at the start of
+ a c-column cell (gh/102)
+
+2018-12-27 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx (subsection{The output routines}):
+ Removed dead code, the case where this can go wrong is too
+ obscure to worry about it (gh/101)
+
+#########################
+# 2018-12-01 Release
+#########################
+
+2018-11-13 <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx: Do not expand argument of \@startpbox
+ while building the tabular preamble (sx/459285)
+
+2018-11-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx:
+ Support star with \docolaction (test first then execute)
+
+2018-10-13 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * trace.dtx (section{Implementation}):
+ Only reset \tracingoutput if not set by \showoutput earlier
+
+2018-10-01 David Carlisle <David.Carlisle@latex-project.org>
+
+ * xr.dtx: Update to handle \if tests in the aux file.
+ https://tex.stackexchange.com/a/452321
+
+2018-09-13 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx (section{The macros \@classz):
+ Add group to prevent color leak (github/72)
+
+#########################
+# 2018-04-01 PL 5 Release
+#########################
+
+2018-06-26 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx (subsection{Not balancing the columns}):
+ Re-add end penalty for multicols* environment to guard
+ against leftovers (git/53)
+
+2018-04-30 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx Explicitly place the row strut inside \\ before
+ hitting \cr in case the last cell is a multicolumn cell
+ (issue 42)
+
+2018-04-20 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: restoring column status when leaving a boxed
+ multicols so that any further \docolaction will know the
+ currect column (issue/39)
+
+2018-04-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx: Renamed internal \mcell@box to
+ \ar@mcellbox and \align@mcell to \ar@align@mcell
+ to avoid conflict with makecell package
+
+2018-01-28 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: use a single output routine that does both
+ balancing and cutting rather than changing them
+
+2017-11-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx: fixed bug reported on stack exchange SX68732 about
+ bad vertical placement with last column being an m-column
+
+ * array.dtx: fixed bug with m-cells when \extrarowheight is used
+
+ * array.dtx: added w and W column types to support lcr columns with
+ fixed width
+ (see TUB paper in 38/2: https://www.latex-project.org/publications )
+
+2017-09-28 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: set \linewidth as well as \hsize in the column
+ widths documentation.
+
+2017-04-11 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Make \clearpage behave like \newpage (pr/4511)
+
+2017-01-16 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: further fixes to luatex code branch for
+ https://tex.stackexchange.com/questions/349001
+
+2016-10-06 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * array.dtx: Fixed a 25 year old bug that surfaced for the first time.
+ \@halignto needs to be managed locally (pr/4488)
+
+2016-07-07 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: additional tests to cope with luatex's new treatment of
+ \mathchar.
+
+2016-07-01 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: show [tcb] optional argument in tabularx
+ syntax description.
+
+2016-06-07 David Carlisle <latex-bugs@latex-project.org>
+
+ * shellesc.dtx: typos in messages, and
+ improve use with plain etex or luatex
+
+2016-04-29 David Carlisle <latex-bugs@latex-project.org>
+
+ * shellesc.dtx: in classic tex code accidentally defined
+ \ShellEscape twice instead of defining \DelayedShellEscape
+ (Ulrike Fischer)
+
+2016-04-07 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Reset \boxmaxdepth back to \maxdimen when outputting
+ pages (issue SX302532).
+
+2016-02-27 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: add initial support for \Umathchardef defined tokens.
+
+2016-02-16 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * varioref.dtx: Delay generating a "may loop" warning or error
+ until we know that we aren't using \reftextfaraway
+ -- thanks to Morten Hoegholm for the fix
+
+2016-02-09 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * varioref.dtx: revamped some of the documentation to better
+ explain how varioref could be used in a multi-lingual context
+
+2016-02-08 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Ensure we are back in vmode before using
+ \prevdepth (pr/4448)
+ \col@number already initialized in the kernel, so not initializing
+ it in the package in case the document is in two-column (pr/4435)
+
+2016-02-03 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: support end code of {foo\endtabulax bar} again
+ (Reported by Ulrike Fischer)
+
+2016-02-02 David Carlisle <latex-bugs@latex-project.org>
+
+ * shellesc.dtx: Documentation typos (via Johannes_B at tex.sx)
+
+2016-01-08 David Carlisle <latex-bugs@latex-project.org>
+
+ * shellesc.dtx: Added new package
+
+2015-09-22 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * varioref.dtx: Fixed blunder from 2005 - galician option
+ clearly never used
+
+2015-08-19 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Reset \@textfloatsheight after page finishes (sx261884)
+
+2015-04-02 Joseph Wright <joseph.wright@morningstar2.co.uk>
+ * TDS-style zip improvements
+
+2015-04-02 Joseph Wright <latex-team@latex-project.org>
+ * Update CTAN link in README
+
+2015-03-31 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: Another rewrite of \remove@discardable@items to
+ capture the case of \vspace (remove) and \vspace* (keep) correctly
+
+2015-03-25 Frank Mittelbach <Frank.Mittelbach@latex-project.org>
+
+ * multicol.dtx: additional tracing info if forced breaks result in
+ overflow of column heights
+
+2015-03-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Detect when columns get too large during balancing
+ because the user requested more forced breaks than available
+ columns.
+
+ Fixed the logic for removing excess white space at column bottoms
+ (this is a source of trouble for sure)
+
+2015-03-07 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: - Use only `0.0001fil' for stretching in \vfilmaxdepth
+ - Set \boxmaxdepth in multi@column@out to avoid material getting too
+ far down
+ - Redesign the implementation of \end{multicols*}
+
+2014-11-07 Joseph Wright <latex-bugs@latex-project.org>
+
+ * Rename 00readme.txt to README (named README.txt in the development
+ repository)
+
+2014-10-28 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: In \end{multicols*} only add vertical space if not
+ doing already doing \raggedcolumns and add \null to hide the final
+ fill if added so that it doesn't get removed again.
+
+2014-10-28 Frank Mittelbach <latex-bugs@latex-project.org>
+ * afterpage.dtx, array.dtx, bm.dtx, calc.dtx, dcolumn.dtx,
+ delarray.dtx, enumerate.dtx, ftnright.dtx, hhline.dtx, layout.dtx,
+ longtable.dtx, multicol.dtx, showkeys.dtx, tabularx.dtx,
+ theorem.dtx, trace.dtx, varioref.dtx, verbatim.dtx, xspace.dtx
+
+ Fixed typos found by Karl Berry in documentation (no version number change)
+
+2014-09-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: change ragged columns to not just fill the
+ column but also back up by \maxdepth if they otherwise become
+ overfull as adding glue at the bottom means the column will
+ never have any depth and before they had. (pr/4395)
+
+ \maxdepth is applied to all column boxes. That was initially not
+ necessary as \splitmaxdepth was doing the trick. However, the
+ moment those boxes get reboxed this information is lost and
+ resulted in some subtle errors. (pr/4395)
+
+ Suppress even really bad overfull warnings while looping
+
+2014-08-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: set \prevdepth to 0pt (in the right place)
+ after adding the multicol material. Was not happening in boxed mode.
+ Test for excessive depth of columns using > not = (which nearly
+ ever will be correct)
+
+2014-07-03 <latex-bugs@latex-project.org>
+
+ * varioref.dtx: correct Romanian default text as suggested
+
+2014-06-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: color-leak fix introduced a spacing problem in
+ boxed mode as the added color commands were hiding any space
+ at the bottom of the box material (which thus didn't get
+ discarded)
+
+2014-05-14 David Carlisle <latex-bugs@latex-project.org>
+
+ * readme.txt: rename to 00readme.txt.
+
+2014-05-13 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: If \endtabularx not found, act as if it was at the start of
+ the end code.
+
+2014-04-24 David Carlisle <david.carlisle@latex-project.org>
+
+ * showkeys.dtx: modify \cite redefinition so {} in the optional argument
+ works (tools/4162)
+
+2014-04-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Support \docolaction
+
+2014-04-22 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Bug fix: color leak (https://tex.stackexchange.com/questions/138783)
+ Bug fix: space at column bottom (https://tex.stackexchange.com/questions/121692)
+ Bug fix: Reset \@mparbottom after page finishes
+
+2014-04-22 David Carlisle <david.carlisle@latex-project.org>
+
+ * tabularx.dtx: allow code before \endtabularx (pr/3722)
+
+2012-02-06 David Carlisle <david.carlisle@latex-project.org>
+
+ * tabularx.dtx: Avoid exceeding maxdimen
+ https://tex.stackexchange.com/questions/29194/how-to-typeset-tabularx-with-34-columns-error-message
+
+2011-12-20 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: RL language support fixed
+ Support for \enlargethispage
+ Balancing concept improved
+ Bug fix: Only re-add output penalty if it was
+ explicit in the source.
+
+2011/11/24 David Carlisle <david.carlisle@latex-project.org>
+
+ * showkeys.dtx: revert change made at v3.14 because of tools/4173
+
+2011-10-02 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Previous fix need one more expansion
+% (pr/4159,pr/4171)
+
+2010-11-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Avoid even \protected@edef in \vref@pagenum
+ to pacify french babel (pr/4093)
+
+2010-10-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: right-to-left language support added
+
+2010-08-06 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: typo corrections only -- thanks to Laurent Lyaudet
+
+2010-08-04 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Correct spacing -- same mistake as in \vref (pr/4123)
+ Defaults for esperanto added
+
+2010-04-06 Will Robertson <will.robertson@latex-project.org>
+
+ * xspace.dtx: Improve edge case for xspace (tools/3895)
+
+2010-02-25 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * ftnright.dtx: Check for split footnotes (pr/4099)
+
+2009-09-13 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Use \protected@edef to avoid problems
+ in complicated setups, e.g., microtype (pr/4080)
+
+2009-06-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Incorrect text in \reftextafter (pr/4070)
+
+2008-04-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: clarified customization with Babel in use.
+
+2007-09-07 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Added defaults for islandic
+
+2007-05-26 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: fixed missspellings of \extrasbazil and \extrasportuges
+
+2006-09-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Make the color of the rule between columns (if
+ any) a hook called \columnseprulecolor. Defaults to \normalcolor
+
+2006-05-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: support for bulgarian added.
+
+2006-05-14 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: support for croatian added.
+
+2006-05-08 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Bug fix for verbatim in output routine.
+
+2006-02-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Added \@minipagefalse to \end@dblfloat. Otherwise
+ that switch may end up being true after a figure* has ended,
+ messing up spacing afterwards randomly.
+
+2006-02-12 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Modified so the \@let@token can be \outer. Avoid
+ re-doing eTeX setup step multiple times for the original call of
+ \xspace.
+
+2006-01-09 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: Make \tag* and starred AMS environments work
+ (pr/3693). Fix varioref support so \vref* also works
+ (pr/3373). Added \showkeyslabelformat to avoid hard-wiring the
+ label format.
+
+2005-12-02 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Bahasa Malaysia defaults added.
+
+2005-11-26 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Single hyphen rather than -- in range for spanish
+ and galician.
+
+2005-11-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Added a few more brazil strings
+ Added a few more finnish strings
+ Added further galician defaults (and corrected spelling)
+ Corrections in italian strings
+
+2005-10-04 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Improved expansion method. Added use of higher level
+ functions for conditional processing. Simplified the code so that
+ difference between eTeX and non-eTeX is minimal.
+
+2005-09-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: corrected typo in documentation
+
+2005-09-14 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: corrected one default for polish
+
+2005-08-23 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * array.dtx: Removed spurious space.
+
+2005-08-06 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * calc.dtx: Improved expansion of arguments, added new
+ commands \maxof, \minof, \totalheightof and
+ \settototalheight.
+
+2005-07-26 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Improve test by exiting if \@let@token is a
+ letter. Add \xspaceremoveexception.
+
+2005-07-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: small change in italian.
+ small fix in german and ngerman (pr/3793)
+
+2005-06-09 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: fixed bug in Dutch localization (pr/3791)
+ added localization for romanian (pr/3790)
+
+2005-05-07 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Improve handling of active characters.
+
+2005-04-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Ukranian defaults added (by Mykola Lyakhovych)
+
+2005-04-09 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Basque defaults added (by I\~naki Larra\~naga
+ Murgoitio)
+
+2004-12-07 Morten Hoegholm <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Make extensible (tools/3712), fix active
+ characters (tools/3747) and update documentation.
+
+2004-10-30 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Added missing defaults for italian (by Lapo Mori)
+
+2004-07-03 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: fixing errors that happen only if multicol is
+ compiled with a special combination of docstrip modules.
+
+2004-05-08 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Use \@nil for testing in \is@pos@num
+
+2004-02-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: fixed a bug in magyar option
+
+2004-02-15 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Avoid self-referencing definition of
+ \@footnotetext (pr/3618)
+
+2003-12-29 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * fileerr.dtx: attempt to set exit code when reading x.tex (pr/3538)
+
+2003-12-19 David Carlisle <latex-bugs@latex-project.org>
+
+ * array.dtx: add \arraybackslash
+
+2003-10-05 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * bm.dtx: AMS version of \sqrt not working
+
+2003-09-01 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * bm.dtx: Forgotten to check for \hskip (pr/3572)
+
+2003-08-22 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Added \@noligs again, as I can be sure that
+ it is defined in the LaTeX kernel, so that other packages
+ can rely on \@noligs always being used.
+
+2003-04-30 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * trace.dtx: added option full to trace everything; set a few more
+ switches back to no-tracing on exit; make \tracingall trace full
+ even when full is not specified
+
+2003-04-17 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Catch problem with \columnbreak
+ in last line (found by Ulrike Fischer)
+
+2003-04-08 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Collect one additional line per column to account
+ for vanishing space at column breaks
+
+2003-03-29 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Options}):
+ Afrikaans option contributed by Danie Els <dnjels@sun.ac.za>.
+
+2003-03-18 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: changed the tracing output a bit
+
+2003-03-15 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Further corrections to the micro-spacing around the boxes produced
+ by multicols, so that grid typesetting (given right values for
+ other parameters) becomes a possibility.
+ Also added option "grid" which currently does nothing except
+ producing a warning if the grid might got lost.
+
+2003-02-17 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Add a kern to cancel potential depth of previous line at the
+ beginning of a multicols and also suppsed \lineskip
+
+ \multicolovershoot set back to 0pt as a default 2pt was simply
+ wrong in some applications (pr/3465)
+
+2003-01-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: changed error message when possible loop was
+ detected.
+
+ * somedefs.dtx: added version number to \ProvidesPackage line
+ (pr/3490)
+
+ * varioref.dtx: typo added a blank line into one macro
+
+2003-01-08 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Use \vref@label instead of \label to avoid
+ problems with amsmath. (pr/3489)
+
+2002-11-22 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * bm.dtx: Get math alphabets right (pr/3476)
+
+2002-11-06 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Changed default for \reftextbefore for options
+ english and american.
+ This is an incompatible change, but the original was bad English!
+ Changed default for \reftext...range for dutch as well.
+
+2002-06-18 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * fileerr.dtx: added space after ! better to match TeX's error
+ style (pr/3414)
+
+ * varioref.dtx: Use \vpageref inside \ref not \@vpageref
+ to get spacing correct (pr/3403)
+
+2002-06-14 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added \labelformat to support references that
+ automatically add "text" around the referenced number.
+
+ added \Ref and \Vref to generated references at the beinning of a
+ sentence (might be needed if \reformat is used)
+
+ added \vpagerefnum to support referencing the "number" within
+ commands like \refpageafter, e.g.
+
+ \renewcommand\reftextfaceafter {on page~\thevpagerefnum}
+
+ texts for "slovak" and "slovene" options added
+
+2001-09-04 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: correct typo in name \vref -> \vr@f
+
+2001-07-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * trace.dtx: use ltxdoc not ltugboat class for docu
+
+2001-05-28 Chris Rowley <latex-bugs@latex-project.org>
+
+ * dcolumn.dtx:
+
+ Documentation of centring improved (pr/3315)
+
+2001-04-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: changed my mind and also added \vpagerefrange*
+
+ * trace.dtx: added package to tools distribution
+
+2001-04-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Defining the main macros}): Added
+ \vref* and \vpageref* which do not add a space in front of the
+ generated text (ever) so that they can be used in situations like
+ (\vref{foo} ...) without added a space after the open parenthesis.
+
+2001-01-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Updated nynorsk defaults
+
+2000-12-30 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Updated Danish defaults
+
+2000-10-23 Chris Rowley <latex-bugs@latex-project.org>
+
+ * longtable.dtx:
+
+ Added a \noexpand (as in array.sty) for mathtext.sty
+
+2000-09-25 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx: Added the option italian as suggested by Claudio
+ Beccari, back in august 1998...
+
+2000-09-21 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx: Added the option german as proposed by Karsten
+ Tinnefeld <karsten@tinnefeld.com> in PR 3259
+
+2000-08-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Updated defaults for catalan
+
+2000-08-21 Chris Rowley <latex-bugs@latex-project.org>
+
+ * verbatim.dtx:
+
+2000-07-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: fixed color problem with rules between columns
+ (their color did depend on the color of the text at the break)
+
+2000-07-09 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: Don't output space if optional argument
+ to \vpageref is empty (pr/3230)
+
+2000-06-11 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{The output routines}): when
+ doing boxed mode do not restrict height of columns to \@colroom
+ (pr/3212)
+
+2000-05-05 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{Starting and ): Detect and fix
+ problem if a multicols ends at the top of a page
+
+2000-04-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added defaults for Czech
+
+2000-04-15 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * ftnright.dtx: Don't use math mode for footnote symbol
+ (pr/3172)
+
+2000-01-11 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added naustrian and ngerman options
+
+2000-01-07 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Disable hyphenation even if the font allows it.
+
+1999-12-14 Rainer Schoepf <latex-bugs@latex-project.org>
+
+1999-12-02 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: even more portugese defaults
+
+1999-11-25 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added portuguese defaults
+
+1999-10-21 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: allow multi-paragraph footnotes again. This functionality
+ was lost when the footnotes got reimplemented some time ago. (Problem
+ reported by Niels Ferguson)
+
+1999-09-03 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * DEFAULT.hea: updated for LPPL 1.2
+
+ * DEFAULT.pre: updated for LPPL 1.2
+
+1999-07-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Added some additional tracing code.
+ When balancing check that last column doesn't contain a forced
+ page break; if it does reject the solution.
+
+1999-07-09 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * updated headers to reflect LPPL 1.1
+
+1999-06-18 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: added documentation for \columnsep
+
+1999-06-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: minor documentation updates
+
+1999-05-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * tools.ins: added colbreak guard for multicol.sty
+
+1999-05-26 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{Manual column breaking}):
+ Added a \columnbreak command to allow manual column breaks.
+
+1999-05-01 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: reworded license text slightly
+
+1999-03-22 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: re-add \cs{mark} command which was commented out
+ by mistake at some point in 1998 (pr/2978)
+
+1999-03-05 David Carlisle <latex-bugs@latex-project.org>
+
+ * enumerate.dtx: extension hook tools/2916}
+
+ * verbatim.dtx: Add \begingroup/\endgroup to definition of
+ \verbatim(*)/\endverbatim(*) so that they can safely be
+ used without \begin/\end. Suggested by Donald Arseneau.
+
+1999-03-04 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * manifest.txt: Corrected typo.
+
+1999-03-03 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * tools.ins: New copyright info and preamble.
+
+1999-02-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: fixed reference to ltx3info.tex in license
+
+1999-02-13 David Carlisle <latex-bugs@latex-project.org>
+
+ * readme.txt: lppl
+
+1999-02-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: changed license text
+
+1998-12-31 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx: Added \noexpand in front of \ialign
+ to guard against interesting :-) changes to \halign done to support
+ text glyphs in math
+
+1998-12-03 Johannes Braams <latex-bugs@latex-project.org>
+
+ * ftnright.dtx: Made \@makecol colorsafe by adding
+ \color@begingroup, \color@endgroup and \normalcolor.
+
+1998-11-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: taken out fix for (pr/1866) as it produce undesired
+ results (see comments in doc of \vref) (pr/2909)
+
+ * varioref.dtx: Added two new user commands \vrefrange and
+ \vpagerefrange to support referencing a range of labels.
+ Also added customising commands \reftextlabelrange and
+ \reftextpagerange to support the above commands.
+ Added draft and final option (draft will turn errors into warnings).
+ Added austrian defaults (same a german).
+ Added greek defaults.
+ Removed incorrect warning for italian.
+ Added hungarian defaults.
+ Added russian defaults.
+ Added utility command \vrefpagenum and used it to shorten code
+ this will also fix a problem that in certain circumstances varioref
+ was not warning that another run was needed.
+
+1998-09-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: test if document ends in middle of multicols
+ and if so issue an error message instead of dying with an OR loop
+ pr/2873
+
+1998-08-17 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: new logic for dealing with \@footnotetext macro:
+ instead of redefining its definition completely, thereby possibly
+ overwriting a class change, we locally set \columnwidth to \textwidth
+ and then call the original definition. this will also solves a problem
+ with the situation of a footnote inside multicols inside a minipage
+ would vanish.
+
+ * varioref.dtx: added defaults for greek contributed by
+ Apostolos Syropoulos <apostolo@obelix.ee.duth.gr>
+
+1998-06-22 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * layout.dtx: renamed \bs to \LayOutbs to avoid possible conflicts
+ with other packages using this command. Originally the package
+ redefined \bs in case it already had a definition.
+ Also rename \type to \LayOuttype for the same reason.
+
+ Added \@doendpe to definition of
+ \endverbatim(*) (pr/3234)
+
+1998-06-17 Chris Rowley <latex-bugs@latex-project.org>
+
+ * calc.dtx:
+
+ Added \widthof etc
+
+ Made \ratio and \real robust
+
+ Enhanced documentation
+2004-02-27 <david.carlisle@latex-project.org>
+
+ * bm.sty: fix for "new" AMS math accent code. tools/3256
+
+2004-02-01 <david.carlisle@latex-project.org>
+
+ * longtable.dtx: \nobreak after table head, for tools/3484
+
+1998-05-13 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: Use \setlength so calc syntax may be used in
+ the width argument. tools/2793.
+
+ * longtable.dtx: Use \setlength so calc syntax may be used in p
+ arguments. tools/2793.
+
+1998-05-13 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx: also allow calc syntax in first arg of tabular*
+ (pr/2793)
+
+1998-05-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx: set the \hsize for p columns (and others) via
+ \setlength so that calc syntax can be applied (pr/2793)
+
+1998-05-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: support for amsmath displays (pr2175)
+ Actually this probably should be fixed in amsmath instead.
+
+1998-04-25 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added galician defaults contributed by Matthias
+ Moebius.
+
+1998-03-09 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: replace ~ by \nobreak\space so that \vref obeys
+ setting of \frenchspacing (pr/1866)
+
+1998-01-29 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Removed group around contents of optional argument
+ to \begin{multicols}{2}[...] so that the use of \section within
+ this argument works better.
+
+ * array.dtx: made \multicolumn long to match kernel change for
+ pr/2180 (forgotten at that time)
+
+1998-01-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{Not balancing the columns}):
+ added support for a version of multicols (star form) that doesn't
+ balance the columns on the last page.
+ Fixed a bit of the documentation (so that a toc is possible).
+
+1997-12-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx: moving a docstrip guard. this doesn't change
+ the style but prevents some code being added at the end of
+ the driver file
+
+1997-12-14 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: redefine \@footnotetext only within environment
+ not globally any longer. pr/2689 + some docu updates
+
+ * fileerr.dtx: fixed file date. pr/2689
+
+1997-12-06 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added default for polish language.
+
+1997-11-22 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: Make \bm{\hat{A}} work like \bm{\hat A} (from c.t.t).
+
+1997-11-18 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx: now finally set \columnwidth to width of column
+ pr2664
+
+1997-11-16 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: support mathcode hex 8000 (like prime) properly.
+ Support null delimiter \left. constructions.
+ Support breqn package.
+
+1997-11-11 David Carlisle <latex-bugs@latex-project.org>
+
+ * calc.dtx: Fix error message inserted at the weekend.
+
+1997-11-08 David Carlisle <latex-bugs@latex-project.org>
+
+ * manifest.txt: add calc.
+
+ * Makefile (FILES): add calc
+
+ * tools.ins: add calc.
+
+ * calc.dtx: Contributed to the distribution by
+ Kresten Krab Thorup and Frank Jensen. One minor change, use
+ \PackageError rather than the primitive \errormessge.
+
+1997-10-16 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: avoid using % in aux file. tools/2631
+
+1997-10-13 David Carlisle <latex-bugs@latex-project.org>
+
+ * xspace.dtx: test for space token added for tools/2632
+
+1997-10-09 David Carlisle <latex-bugs@latex-project.org>
+
+ * bm.dtx: Add extra braces around group code so \bm{\frac..} does
+ the right thing. (Spotted on c.t.t)
+
+1997-10-06 David Carlisle <latex-bugs@latex-project.org>
+
+ * dcolumn.dtx: Document use of math mode. tools/2616.
+
+1997-09-18 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: Fix \write catch for tools/2607.
+ (Fix page 401 of TeXBook at same time...)
+
+1997-07-09 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * tabularx.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * showkeys.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * multicol.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * longtable.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * layout.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * delarray.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+ * array.dtx: Documentation fixes by Andreas Schwab
+ <schwab@issan.informatik.uni-dortmund.de>.
+
+1997-07-07 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * tools.ins: added q.tex and r.tex files so that "run" and
+ "quit" mode is now also supported.
+
+ * fileerr.dtx: added q.tex and r.tex files so that "run" and
+ "quit" mode is now also supported.
+
+1997-06-28 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: New email address for David K.
+
+1997-06-13 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: support cite package for tools/2490
+
+1997-06-12 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx: added support for catalan
+
+1997-06-05 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * multicol.dtx: Applied improvement of documentation, kindly done
+ by Robin Fairbairns.
+
+1997-05-13 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * fontsmpl.dtx: Replaced \@changed@x@err by
+ \TextSymbolUnavailable, according to the change in ltoutenc.dtx.
+
+1997-04-30 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx (\verbatiminput): Added code to check for
+ existence of file to be input and print error message if not.
+
+1997-04-14 David Carlisle <latex-bugs@latex-project.org>
+
+ * tools.ins: add bm
+
+ * bm.dtx: Add to tools bundle.
+ Add \boldsymbol as alias for \bm
+
+1997-02-26 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: Spurious brace removed. Jean-Pierre Drucbert.
+
+1997-02-20 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: improve behaviour in case table too wide.
+
+1996-12-06 David Carlisle <latex-bugs@latex-project.org>
+
+ * xspace.dtx: alltt support. tools/2322.
+
+1996-11-21 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: new page break control.
+
+1996-11-02 David Carlisle <latex-bugs@latex-project.org>
+
+ * readme.txt: Add old docstrip note.
+
+1996-11-01 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: colour option. tools/2297.
+
+ * tools.ins: new style.
+
+1996-10-24 David Carlisle <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Fix guards for driver document. tools/2206
+
+1996-09-25 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx (\verbatiminput): Added \@addtofilelist and
+ \ProvidesFile so that the name of the file read in appears in the
+ \listfiles output.
+
+1996-09-23 David Carlisle <latex-bugs@latex-project.org>
+
+ * dcolumn.dtx: Fix case where no decimal point is used
+ in the `new' case of a the third argument being n.m.
+
+Fri Sep 6 15:24:17 1996 David Carlisle <carlisle@cs.man.ac.uk>
+
+ * showkeys.dtx: more changes following from /2252.
+
+Fri Aug 30 18:09:48 1996 David Carlisle <carlisle@cs.man.ac.uk>
+
+ * showkeys.dtx: more fudges for AMS tools/2252, and extra
+ group from Donald A. tools/2147
+
+Wed Jul 10 11:15:30 1996 David Carlisle <carlisle@cs.man.ac.uk>
+
+ * showkeys.dtx: Missing percent added for tools/2215
+
+1996-06-14 David Carlisle <latex-bugs@latex-project.org>
+
+ * array.dtx: change \kern\z@ to \hskip1sp for latex/2160
+ A few long lines wrapped.
+
+1996-06-04 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: \verbatim@noligs@list now processed after
+ \dospecials (PR 2138).
+
+1996-05-25 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx (subsection{Support for
+ \texttt{\textbackslash firsthline} and ):
+ Complete reimplementation after Mark Wooding pointed out that
+ they were everything else than correct --- hope i got it
+ right this time :-)
+
+1996-05-24 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Add a warning to re run LaTeX \AtEndDocument if
+ any longtable has failed to align on this run.
+
+1996-05-17 David Carlisle <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Add / to list of punctuation characters.
+
+ * showkeys.dtx: use \protected@edef rather than \def
+ so that the expansion of any macros is printed. tools/2147
+
+1996-05-07 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: add \hfil to match array package change.
+
+ * array.dtx: add \hfil to \@endpbox for tools/2120 (and to match
+ kernel version).
+
+1996-04-22 David Carlisle <latex-bugs@latex-project.org>
+
+ * array.dtx: Extra \kern\z@ for empty l colummns. latex/2122
+
+1996-04-16 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Version 4.02 using new algorithm of David Kastrup
+ to align tables without \setlongtables command.
+
+1996-02-28 David Carlisle <latex-bugs@latex-project.org>
+
+ * dcolumn.dtx: New feature (tools/2093) D{.}{.}{3.2} specifies a
+ column of figures that should be centred, assuming 3 places to
+ the left of the decimal point and 2 to the right.
+
+1996-02-01 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: allow \multicolumn and \hline to work inside
+ tabulars inside longtables. tools/2068
+
+1996-01-13 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Explain why with \OnlyDescription there will be an unresolved
+ reference pr/2047.
+
+1996-01-03 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: (Martin Schr"oder) remove ! which causes a
+ makeindex error in \changes entry. tools/2035
+
+1996-01-01 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * ftnright.dtx:
+ Finally got around to take out ltxdoc and use article for
+ documentation. pr/536
+ Also cleaned up use of ProvidesPackage.
+
+1995-12-28 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx:
+ Fixed section headings so that a toc is possible. pr/2033.
+
+ * multicol.dtx:
+ Fixed index entries. pr/2036
+
+1995-12-12 David Carlisle <latex-bugs@latex-project.org>
+
+ * tools.dst: Add trap for old docstrip.
+
+1995-11-23 David Carlisle <latex-bugs@latex-project.org>
+
+ * theorem.dtx: Fix \@newctr usage (Ulrik Vieth)
+
+ * layout.dtx: Documentation fixes (J"org Knappen).
+
+ * indentfirst.dtx: (Ulrik Vieth) Fix \GetFileInfo usage.
+ In the documentation.
+
+1995-11-22 David Carlisle <latex-bugs@latex-project.org>
+
+ * tools.dst: New style concurrent generation.
+
+ * showkeys.dtx: Fix \harvarditem: add SK code after the implicit
+ \item (as for \cite) not before.
+
+1995-11-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * theorem.dtx:
+ Ensure that there is an error message if one of the counters
+ in newtheorem are undefined pr/1861.
+
+ * array.dtx (subsection{Getting the spacing around rules right}):
+ ensure that the space between \hline\hline is visually \doublerulesep
+ and does not depend of the rulewidth (as it does with standard latex)
+ pr/1945
+ Added some documentation about rule handling concepts.
+
+1995-11-09 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: (Anil K Goel) Really measure the size of the
+ first row of the table not `assume' the size from the array
+ strut. (Avoids really bad first page break with two headings)
+
+ * showkeys.dtx: Take more care over redefining \protect commands
+
+1995-11-02 David Carlisle <latex-bugs@latex-project.org>
+
+ * array.dtx: Minor doc changes, no more ooverfull hboxes...
+
+1995-10-30 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : Added command \layout* wbhich recomputes the values
+ it needs before making the picture of the layout. (PR 1465)
+
+1995-10-30 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: Fix for tools/1744 (notref/varioref case)
+ Add final and draft options
+ Fix inner vmode case which could cause extra white space
+ to be added.
+
+1995-10-29 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx (section{The implementation}): Added the options
+ spanish, braziolian and portugues, as provided by
+ Ausberto S. Castro V. <ascv@inf.ufrgs.br> (PR 1837)
+
+1995-10-27 David Carlisle <latex-bugs@latex-project.org>
+
+ * afterpage.dtx: tools/1579/1880/1884
+
+1995-10-19 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Added defaults for Italian pr/1888
+
+ * multicol.dtx:
+ Added \@largefloatcheck so that floats being too large
+ will produce a warning. pr/1890
+
+1995-09-22 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Corrected vertical spacing if verbatim is nested
+ in quote (and other) environment. This error was introduced with
+ version v1.3c (1990/02/26). Clarified documentation on how to
+ define new verbatim-like environments.
+
+1995-08-06 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * tools.dst:
+ Updated copying conditions so that it is allowed to distribute
+ unpacked files together with the sources.
+
+1995-08-04 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Changed class used for documentation from
+ article to ltxdoc. pr/1788
+
+1995-06-25 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : The june 1995 release of LaTeX no longer needs two
+ hash marks when defining a newcommand inside the argument of
+ \DeclareOption.
+
+1995-06-15 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: replace ## by # in \DeclareOption, latex/1557
+
+1995-05-25 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Modify Caption handling again.
+
+1995-05-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Updated \DeclareOption declarations to reflect ##1 -> #1 change. pr/1557
+
+1995-05-07 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * fontsmpl.dtx:
+ Removed \pagestyle{empty} so that all pages produced by fontsmpl.tex
+ are numbered. pr/1559
+
+1995-05-03 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Removed extra backslash in argument to \cs.
+
+1995-05-02 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Explitly reset page height for tools/1584.
+ Modify caption handling.
+
+1995-04-26 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Removed \fileversion and \filedate.
+
+1995-04-25 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Modify brace hacks cf tools/1571
+ Allow 1100 longtables in a single document---A bug reported on a
+ `real document' by Mike Van Geest!
+
+ * showkeys.dtx: Fix inner horz mode case.
+ Add option handling: notref and notcite to stop the
+ redefinitions of those commands.
+
+1995-04-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx (section{The line separator \\}):
+ Fixed a serious bug that was present right from the beginning:
+ in some cases the last column of an array line could get an extra
+ math ord messing up the spacing. pr/1571.
+ (subsection{Bugs and Features}):
+ Added comment about the fact that a column (execpt for the first) refers to
+ the column specifier plus intercolumn material to the *right*.
+ Therefore \multicolumn{2}{|c|} is normally incorrect. pr/1443
+
+1995-04-08 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : Added the options 'integers' and 'reals'. The
+ default is the option 'integers'; this results in the 'old'
+ behaviour, where the values of parameters are presented
+ truncated. Using the option 'reals' will switch to presenting the
+ real val;ues of the parameters. This also affects the definition
+ of \Show and \Type.
+
+1995-04-06 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Options}):
+ Added norsk and nynorsk strings.
+ Modified Warning message about undefined Option texts.
+
+1995-04-03 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : Simplified the definition of \Show and \Type, the
+ effect is that now the complete value is shown (PR #1520)
+
+1995-03-20 David Carlisle <latex-bugs@latex-project.org>
+
+ * tabularx.dtx: Allow \tabularx to be used inside
+ \newenvironment definitions
+
+1995-03-17 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: Fix for tools/1434 (showkeys affecting footnote
+ placement)
+
+1995-03-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Fixed colour support (thanks to David)
+ Clarified copyright notice.
+ Updated driver file.
+
+1995-03-16 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: Fix for tools/1181 (Bad placement in with \item
+ and \bibitem) and tools/1496 (Working with new ams*)
+
+1995-03-14 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : Added the options french and francais (thanks to
+ Eric Picheral <Eric.Picheral@univ-rennes1.fr> who provided the
+ translations); introduced \notshown
+
+1995-01-10 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Added swedish strings.
+
+1994-12-08 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Add \tabularnewline.
+
+ * array.dtx: Add \tabularnewline.
+
+1994-11-22 David Carlisle <latex-bugs@latex-project.org>
+
+ * tools.dst: Avoid generating error messages on `.tex'.
+
+1994-11-15 David Carlisle <latex-bugs@latex-project.org>
+
+ * xspace.dtx: Make robust, add !
+
+1994-10-29 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx : Some of the dutch words should really be one word
+ instead of two (PR #1078)
+
+1994-10-25 Rainer Schoepf <latex-bugs@latex-project.org>
+
+ * verbatim.dtx: Changed code for handling verbatim as first thing
+ after an \item command. (This change had already been done in the
+ LaTeX2e kernel.)
+
+ * verbatim.dtx: Removed extra \typeout lines.
+
+1994-10-15 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx (subsection{Support for ...):
+ Added \firsthline and \lasthline from Companion.
+
+1994-10-03 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Correct change from 26 of August. Leave old code only add the new
+ one.
+
+1994-09-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Added strings for breton language, this also means adding a new option.
+
+1994-09-25 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Added danish strings.
+
+1994-09-23 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Options}):
+ Added finnish strings.
+
+1994-09-09 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: add \citefullauthor for (forthcoming) natbib.
+
+1994-09-08 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx: Stored texts in control sequences to allow the use
+ of other languages. Added the options english (default) and
+ dutch.
+
+ * tools.dst: Added the layout package
+
+1994-09-07 David Carlisle <latex-bugs@latex-project.org>
+
+ * showkeys.dtx: Version 3, supports varioref ref styles, and
+ natbib and harvard citation styles.
+ Also modify `internal vertical mode' case, to cope with modified
+ \caption behaviour in the LaTeX2e classes.
+ Modify \GetFileInfo usage, as suggested by Patrick Daly.
+
+1994-08-26 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{The output routines}):
+ Check explicitly for void boxes before assigning the current column
+ width to their width, because void boxes will not change.
+ Extract the kept marks before adding a penalty -10000 to the output box
+ when balancing, otherwise no marks will be found. (This bug was
+ introduced recently.
+
+1994-08-08 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * tools.dst:
+ Added a better informational message about the problems
+ that can arise when LaTeX tries to generate the file `.tex'
+
+1994-07-24 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Options}):
+ Added dutch defaults as suggested by Frank Poppe.
+ Explicitly expand label argument before passing it to \label, so that
+ varioref will work with babel.
+ Correct misspelling in spanish option.
+
+1994-07-14 Johannes Braams <latex-bugs@latex-project.org>
+
+ * layout.dtx: Moved the identification code to the front of the
+ file.
+ Needed to interchange to calls to \ttfamily and \footnotsize as
+ \footnotesize calls \normalfont in compatibility mode.
+ Added a check for negative arrowlength to \InsideHArrow
+
+1994-06-30 David Carlisle <latex-bugs@latex-project.org>
+
+ * longtable.dtx: Obey a \nofiles declaration. Remove special
+ handling of letter class, not needed for the latex2e version of
+ letter.
+
+ * showkeys.dtx: Correct \ProvidesPackage usage (previously had two
+ \providesPackage commands),
+
+1994-06-21 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx (subsection{Options}):
+ Added french defaults as suggested by Daniel Flippo.
+
+1994-06-20 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Correction was buggy, brace placed incorrectly.
+
+1994-06-11 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ \vpageref[above][one ]{one} didn't work because first
+ optional argument wasn't passed (found by Patrick Daly).
+
+1994-06-07 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (section{New macros and hacks for version 1.2}):
+ Updated float commands to contain \color@endgroup etc. so
+ that they work together with the color.sty package.
+ (Found by SPQR)
+
+1994-06-01 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx:
+ Added \null to the end of \multicolumn. This fixes
+ a bug that was long fixed in the original but never made it
+ into array.sty.
+ Use PackageError/Warning interface.
+
+1994-06-01 David Carlisle <latex-bugs@latex-project.org>
+
+ * somedefs.dtx: Use new style error commands.
+
+1994-05-28 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx:
+ Do not alloc \col@number any longer.
+ Use Standard Warning/info messages.
+
+ * fileerr.dtx:
+ Added file to the collection.
+
+1994-05-28 David Carlisle <latex-bugs@latex-project.org>
+
+ * manifest.txt: First draft.
+
+ * readme.txt: First draft.
+1994-05-27 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Warning about looping pages displayed in wrong order
+ (found by Wolfgang Christen).
+ (subsection{Defining the main macros}):
+ Added help message for loop error.
+ Use PackageError rather than \errmessage.
+ Use DeclareRobustCommand.
+ Added \NeedTeXFormat.
+
+1994-05-26 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * multicol.dtx (subsection{Starting and ):
+ fixed bug with "premulticols" not being a register
+ (tried to \the a string in tracing mode)
+
+1994-05-18 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * varioref.dtx:
+ Added defaults for brazil.
+
+1994-05-16 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx (section{The macros \texttt{\protect):
+ Use \@finalstrut in \@endpbox
+
+1994-03-23 Braams J.L. <latex-bugs@latex-project.org>
+
+ * layout.dtx : repaired bug in twosided mode.
+
+ Changed vertical positioning of the arrows identifying
+ \amrginparsep and \marginparwidth
+
+ Repaired bug in the preparation of the table of dimensions.
+
+ Produce two pages in twoside mode
+
+ Removed use of \wlog
+
+1994-03-14 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx:
+ Removed identification \typeout's.
+ Removed the check for the old version of the \@tfor macro.
+
+1994-02-28 Frank Mittelbach <latex-bugs@latex-project.org>
+
+ * array.dtx:
+ Moved the driver code in front so that the documentation can be
+ processed by simply running the file through LaTeX2e.
+
+ * ftnright.dtx:
+ Moved the driver code in front so that the documentation can be
+ processed by simply running the file through LaTeX2e.
+
+ * multicol.dtx:
+ Balance code rewritten; many changes to documentation etc.
+ Changed driver code slightly.
+ Moved the driver code in front so that the documentation can be
+ processed by simply running the file through LaTeX2e.
+
+ * theorem.dtx:
+ Changed driver code slightly.
+ Moved the driver code in front so that the documentation can be
+ processed by simply running the file through LaTeX2e.
+
diff --git a/macros/latex-dev/required/tools/dcolumn.dtx b/macros/latex-dev/required/tools/dcolumn.dtx
new file mode 100644
index 0000000000..38a4ab0da2
--- /dev/null
+++ b/macros/latex-dev/required/tools/dcolumn.dtx
@@ -0,0 +1,361 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: dcolumn.dtx Copyright (C) 1992-1996 1999-2001 David Carlisle
+%
+%<*dtx>
+ \ProvidesFile{dcolumn.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{dcolumn}
+%<driver>\ProvidesFile{dcolumn.drv}
+% \fi
+% \ProvidesFile{dcolumn.dtx}
+ [2014/10/28 v1.06 decimal alignment package (DPC)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+ \usepackage{dcolumn}
+ \DeleteShortVerb{\|}
+\begin{document}
+ \DocInput{dcolumn.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{dcolumn.dtx}
+%
+% \title{The \textsf{dcolumn} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle}
+% \date{\filedate}
+% \author{David Carlisle}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+% \changes{v1.00}{1992/02/17}{Initial version}
+% \changes{v1.01}{1992/06/12}{Re-issue for the new doc and docstrip.}
+% \changes{v1.02}{1994/03/14}{Re-issue for LaTeX2e}
+% \changes{v1.03}{1996/02/28}{New feature, after tools/2093}
+% \changes{v1.05}{1999/07/05}
+% {Minor doc changes latex/3058}
+% \changes{v1.06}{2001/05/28}
+% {More doc changes (suggested by BNB, done by CAR) latex/3315}
+%
+%
+%
+% \begin{abstract}
+% This package defines a system for defining columns of entries in an
+% \texttt{array} or \texttt{tabular} which are to be aligned on a
+% `decimal point'.
+% \end{abstract}
+%
+% \MakeShortVerb{\"}
+%
+% This package defines {\tt D} to be a column specifier with three
+% arguments.\\
+% "D{"\meta{sep.tex}"}{"\meta{sep.dvi}"}{"\meta{decimal
+% places}"}"
+%
+% \meta{sep.tex} should be a single character, this is used as the
+% separator in the {\tt .tex} file. Thus it will usually be `{\tt.}' or
+% `{\tt,}'.
+%
+% \mbox{\meta{sep.dvi}} is used as the separator in the output, this may
+% be the same as the first argument, but may be any math-mode
+% expression, such as "\cdot". It should be noted that \texttt{dcolumn}
+% always uses math mode for the digits as well as the separator.
+%
+% \meta{decimal places} should be the maximum number of decimal places
+% in the column. If this is negative, any number of decimal places can
+% be used in the column, and all entries will be centred on
+% (the leading edge of) the
+% separator. Note that this can cause a column to be too wide, compare
+% the first two columns in the example below. If this argument is
+% positive, the column uses macros equivalent to "\rightdots"
+% "\endrightdots" of {\tt array.sty}, otherwise the macros are
+% essentially equivalent to "\centerdots" "\endcenterdots".
+%
+% You may not want to use all three entries in the {\tt array} or {\tt
+% tabular} preamble, so you may define your own preamble specifiers
+% using "\newcolumntype".
+%
+% For example we may say:
+%
+% \noindent"\newcolumntype{d}[1]{D{.}{\cdot}{#1}}"
+%
+% {\tt d} takes a single argument specifying the number of decimal
+% places, and the {\tt .tex} file should use {\tt.}, with $\cdot$ being
+% used in the output.
+%
+% \noindent"\newcolumntype{.}{D{.}{.}{-1}}"
+%
+% {\tt .} specifies a column of entries to be centred on the~$.$.
+%
+% \noindent"\newcolumntype{,}{D{,}{,}{2}}"
+%
+% {\tt ,} specifies takes a column of entries with at most two decimal
+% places after a~$,$.
+%
+% \newcolumntype{d}[1]{D{.}{\cdot}{#1}}
+% \newcolumntype{.}{D{.}{.}{-1}}
+% \newcolumntype{,}{D{,}{,}{2}}
+%
+% The following table begins "\begin{tabular}{|d{-1}|d{2}|.|,|}"
+%
+% \begin{center}
+% \begin{tabular}{|d{-1}|d{2}|.|,|}
+% 1.2 & 1.2 &1.2 &1,2 \\
+% 1.23 & 1.23 &12.5 &300,2 \\
+% 1121.2& 1121.2&861.20 &674,29 \\
+% 184 & 184 &10 &69 \\
+% .4 & .4 & &,4 \\
+% & &.4 &
+% \end{tabular}
+% \end{center}
+%
+% Note that the first column, which had a negative \meta{decimal places}
+% argument is wider than the second column, so that the decimal point
+% appears in the middle of the column.
+% Also note that this package deals correctly with entries with no
+% decimal part, no integer part, and blank entries.
+%
+% If you have table headings (inserted with "\multicolumn{1}{c}{..}"
+% to over-ride the "D" column type) then it may be that neither of the
+% above `centred' or `right aligned' forms is quite what you want.
+% \begin{center}\small
+% \begin{tabular}[t]{|D..{-1}|D..{1}|D..{5.1}|}
+%\multicolumn{1}{|c|}{head}&
+%\multicolumn{1}{c|}{head}&
+%\multicolumn{1}{c|}{head}\\[3pt]
+% 1.2 & 1.2 &1.2 \\
+% 11212.2& 11212.2&11212.2 \\
+% .4 & .4 &.4
+% \end{tabular}
+% \hfill
+% \begin{tabular}[t]{|D..{-1}|D..{1}|D..{1.1}|}
+%\multicolumn{1}{|c|}{wide heading}&
+%\multicolumn{1}{c|}{wide heading}&
+%\multicolumn{1}{c|}{wide heading}\\[3pt]
+% 1.2 & 1.2 &1.2 \\
+% .4 & .4 &.4
+% \end{tabular}
+% \end{center}
+%
+% In both of these tables the first column is set with "D{.}{.}{-1}"
+% to produce a column centered on the ".", and the second column is
+% set with "D{.}{.}{1}" to produce a right aligned column.
+%
+% The centered column produces columns that are wider than necessary
+% to fit in the numbers under a heading as it has to ensure that the
+% decimal point is centred. The right aligned column two does not have
+% this drawback, but under a wide heading a column of small right
+% aligned figures looks a bit odd.
+%
+% In version v1.03 a third possibility is introduced. The third
+% \meta{decimal places} argument may specify \emph{both} the number of
+% digits to the left and to the right of the decimal place. The third
+% column in the first table above is set with "D{.}{.}{5.1}" and in the
+% second table, "D{.}{.}{1.1}", to specify
+% `five places to the left and one to the right' and `one place to the
+% left and% one to the right' respectively. (You may use `,' or other
+% tokens, not necessarily `.' in this argument.) The column of figures
+% is then positioned such that a number with the specified numbers of
+% digits is centred in the column.
+%
+% This notation also enables columns that are centred on the mid-point
+% of the separator, rather than its leading edge; for example
+% "D{+}{\,\pm\,}{3,3}" will give nice, symmetric layout of up to three
+% digits on either side of a $\pm$ sign.
+%
+% \StopEventually{}
+%
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% First we load {\tt array.sty} if it not already loaded.
+% \begin{macrocode}
+\RequirePackage{array}
+% \end{macrocode}
+%
+% The basic ideas behind these macros are explained in the documentation
+% for {\tt array.sty}. However they use three
+% tricks which may be useful in other contexts.
+% \begin{itemize}
+% \item The separator is surrounded in extra "{ }", so that it is set
+% with "\mathord" spacing, otherwise, for instance a `,' would have
+% extra space after it.
+% \item The separator is not given its special definition by making it
+% active, as this would not work for an entry such as "& .5 &", as the
+% first token of an alignment entry is read {\em before\/} the preamble
+% part, in case it is an "\omit", in which case the preamble is to be
+% omitted. Instead we switch the mathcode to (hex) 8000, which makes the
+% token act as if it were active.
+% \item Although \verb|\mathcode`.="8000| makes {\tt.} act as if it
+% were active, it is still not allowed in constructions such as
+% "\def.{}", even in math-mode, so we have to construct an active
+% version of the separator, this is done by making it the uppercase of
+% "~", and then using the construct\\
+% "\uppercase{\def~}{"\meta{definition}"}".\\
+% Note that the \meta{definition} is not uppercased, so the definition
+% can refer to the standard, non-active use of the separator.
+% \end{itemize}
+%
+% \begin{macro}{\DC@}
+% \changes{v1.03}{1996/02/28}{New feature, after tools/2093}
+% Set up uppercase tables as required, and then grab the first part of
+% the numerical argument into "\count@".
+% \begin{macrocode}
+\def\DC@#1#2#3{%
+ \uccode`\~=`#1\relax
+ \m@th
+ \afterassignment\DC@x\count@#3\relax{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DC@x}
+% \changes{v1.03}{1996/02/28}{Macro added}
+% If "\count@" is negative, centre on the decimal point. If it is
+% positive either "#1" will be empty in which case bad out decimal
+% part to the number of digits specified by "\count@" or (new feature
+% in v1.03) it is none empty in which case "\count@" contains the
+% number of digits to the left of the point, and "#1" contains a junk
+% token (probably ".") followed by the number of digits to the right
+% of the point. In either of these latter cases, "\DC@right" is used.
+% \begin{macrocode}
+\def\DC@x#1\relax#2#3{%
+ \ifnum\z@>\count@
+ \expandafter\DC@centre
+ \else
+ \expandafter\DC@right
+ \fi
+ {#2}{#3}{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DC@centre}
+% If centering on the decimal point, just need to box up the two halves.
+% \begin{macrocode}
+\def\DC@centre#1#2#3{%
+ \let\DC@end\DC@endcentre
+ \uppercase{\def~}{$\egroup\setbox\tw@=\hbox\bgroup${#2}}%
+ \setbox\tw@=\hbox{${\phantom{{#2}}}$}%
+ \setbox\z@=\hbox\bgroup$\mathcode`#1="8000 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DC@endcentre}
+% and then pad out the smaller of the two boxes so there is the same
+% amount of stuff either side of the point.
+% \begin{macrocode}
+\def\DC@endcentre{$\egroup
+ \ifdim \wd\z@>\wd\tw@
+ \setbox\tw@=\hbox to\wd\z@{\unhbox\tw@\hfill}%
+ \else
+ \setbox\z@=\hbox to\wd\tw@{\hfill\unhbox\z@}\fi
+ \box\z@\box\tw@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DC@right}
+% \changes{v1.03}{1996/02/28}{Re-implemented, after tools/2093}
+% This deals with both the cases where a specified number of decimal
+% places is given.
+% \begin{macrocode}
+\def\DC@right#1#2#3{%
+ \ifx\relax#3\relax
+% \end{macrocode}
+% If "#3" is empty, add "\hfill" to right align the column, and
+% Just set "\DC@rl" to begin a group, so nothing fancy is done with
+% the whole number part.
+% \begin{macrocode}
+ \hfill
+ \let\DC@rl\bgroup
+ \else
+% \end{macrocode}
+% Otherwise set "\DC@rl" so that the whole number part is put in a
+% box "\count@" times as wide as a digit.
+% In order to share code with the other branch, then move "#3" (the
+% number of decimal places) into "\count@" throwing away the `.' from
+% the user syntax.
+% \changes{v1.04}{1996/09/23}{Add \cs{hfill} so integer part
+% is still flush right if no decimal point used.}
+% \begin{macrocode}
+ \edef\DC@rl{to\the\count@\dimen@ii\bgroup\hss\hfill}%
+ \count@\@gobble#3\relax
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \let\DC@end\DC@endright
+% \end{macrocode}
+% Box 2 contains the decimal part, set to "\dimen@" which is
+% calculated below to be "\count@" times the width of a digit, plus
+% the with of the `decimal point'.
+% \begin{macrocode}
+ \uppercase{\def~}{$\egroup\setbox\tw@\hbox to\dimen@\bgroup${#2}}%
+ \setbox\z@\hbox{$1$}\dimen@ii\wd\z@
+ \dimen@\count@\dimen@ii
+ \setbox\z@\hbox{${#2}$}\advance\dimen@\wd\z@
+ \setbox\tw@\hbox to\dimen@{}%
+% \end{macrocode}
+% Box 0 contains the whole number part, either just at its natural
+% size for right aligned columns, or set to (the old value of)
+% "\count@" times the width of a digit. "\DC@rl" defined above
+% determines the two cases.
+% \begin{macrocode}
+ \setbox\z@\hbox\DC@rl$\mathcode`#1="8000 }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DC@endright}
+% \changes{v1.03}{1996/02/28}{Re-implemented, after tools/2093}
+% Just finish off the second box, and then put out both boxes.
+% \begin{macrocode}
+\def\DC@endright{$\hfil\egroup\box\z@\box\tw@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{D}
+% The user interface, define the {\tt D} column to take three arguments.
+% For special purposes, you may need to directly access "\DC@" rather
+% than the "D" column, eg to get a bold version you could use
+%\begin{verbatim}
+% \newcolumntype{E}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
+%\end{verbatim}
+% \begin{macrocode}
+\newcolumntype{D}[3]{>{\DC@{#1}{#2}{#3}}c<{\DC@end}}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \Finale
+\endinput
diff --git a/macros/latex-dev/required/tools/dcolumn.pdf b/macros/latex-dev/required/tools/dcolumn.pdf
new file mode 100644
index 0000000000..b169bf93aa
--- /dev/null
+++ b/macros/latex-dev/required/tools/dcolumn.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/delarray.dtx b/macros/latex-dev/required/tools/delarray.dtx
new file mode 100644
index 0000000000..8814fc2a58
--- /dev/null
+++ b/macros/latex-dev/required/tools/delarray.dtx
@@ -0,0 +1,206 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: delarray.dtx Copyright (C) 1991-1994 David Carlisle
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{delarray}
+%<package> [2014/10/28 v1.01 array delimiter package (DPC)]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{delarray}
+\GetFileInfo{delarray.sty}
+\begin{document}
+\title{The \textsf{delarray} package\thanks{This file
+ has version number \fileversion, last
+ revised \filedate.}}
+\author{David Carlisle}
+\date{\filedate}
+ \MaintainedByLaTeXTeam{tools}
+ \maketitle
+ \DocInput{delarray.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \changes{v1.00}{1992/07/06}
+% {Initial version after merging of newarray.sty to array.sty}
+%
+% \changes{v1.01}{1994/03/14}
+% {Update to LaTeX2e}
+%
+%
+% \section{Examples}
+%
+%
+% The addition to {\tt array.sty} added in {\tt delarray.sty} is
+% a system of implicit |\left| |\right| pairs. If you want an array
+% surrounded by parentheses, you can enter:\\
+% |\begin{array}({cc})| \ldots
+% \[ \begin{array}({cc})a&b\\c&d\end{array} \]
+%
+% Similarly if an environment equivalent to \PlainTeX's |\cases| could
+% be defined by:\\
+% |\begin{array}\{{lL}.| \ldots
+%
+% \newcolumntype{L}{>{$}l<{$}}
+% \[ f(x)=\begin{array}\{{lL}.
+% 0 &if $x=0$\\
+% \sin(x)/x&otherwise
+% \end{array} \]
+% Here |L| is supposed to denote a column of left aligned L-R text. It
+% may be defined via: |\newcolumntype{L}{>{$}l<{$}}|, as discussed in
+% {\tt array.sty}.
+% Note that as the delimiters must always be used in pairs, the `|.|'
+% must be used to denote a `null delimiter'.
+%
+% This feature is especially useful if the |[t]| or |[b]|
+% arguments are also used. In these cases the result is not equivalent
+% to surrounding the environment by |\left|\ldots|\right|, as
+% can be seen from the following example:
+% \[
+% \begin{array}[t]({c}) 1\\2\\3 \end{array}
+% \begin{array}[c]({c}) 1\\2\\3 \end{array}
+% \begin{array}[b]({c}) 1\\2\\3 \end{array}
+% \quad\mbox{not}\quad
+% \left(\begin{array}[t]{c} 1\\2\\3 \end{array}\right)
+% \left(\begin{array}[c]{c} 1\\2\\3 \end{array}\right)
+% \left(\begin{array}[b]{c} 1\\2\\3 \end{array}\right)
+% \]
+% \begin{verbatim}
+% \begin{array}[t]({c}) 1\\2\\3 \end{array}
+% \begin{array}[c]({c}) 1\\2\\3 \end{array}
+% \begin{array}[b]({c}) 1\\2\\3 \end{array}
+% \quad\mbox{not}\quad
+% \left(\begin{array}[t]{c} 1\\2\\3 \end{array}\right)
+% \left(\begin{array}[c]{c} 1\\2\\3 \end{array}\right)
+% \left(\begin{array}[b]{c} 1\\2\\3 \end{array}\right)
+% \end{verbatim}
+%
+%
+% \StopEventually{}
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\RequirePackage{array}[1994/02/03]
+% \end{macrocode}
+%
+% \begin{macro}{\@tabarray}
+% This macro tests for an optional bracket and then calls up
+% |\@@array| or |\@@array[c]| (as default).
+% \begin{macrocode}
+\def\@tabarray{\@ifnextchar[{\@@array}{\@@array[c]}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@array}
+% This macro tests for an optional delimiter before the left brace
+% of the main preamble argument. If there is no delimiter,
+% |\@arrayleft| and |\@arrayright| are made a no-ops, and
+% |\@array| is called with the positional argument. Otherwise
+% call |\@del@array|.
+% \begin{macrocode}
+\def\@@array[#1]{\@ifnextchar\bgroup
+ {\let\@arrayleft\relax\let\@arrayright\relax\@array[#1]}%
+ {\@del@array[#1]}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@del@array}
+% We now know that we have an {\tt array} (or {\tt tabular}) with
+% delimiters.
+% \begin{macrocode}
+\def\@del@array[#1]#2#3#4{%
+% \end{macrocode}
+% The following line is completely redundant but it does catch errors
+% involving delimiters before the processing of the alignment begins.
+% A common error is likely to be omitting the `.' in a
+% |\cases|-type construction. This causes the first token of the
+% alignment to be gobbled, possibly causing lots of spurious errors
+% before the cause of the error, the missing delimiter, is discovered as
+% |\@arrayright| puts the alignment and the delimiters together.
+% \begin{macrocode}
+ \setbox\z@\hbox{$\left#2\right#4$}%
+% \end{macrocode}
+% In the case of a `c' argument we do not need to rebox the alignment,
+% so we can define |\@arrayleft| and |\@arrayright| just to
+% insert the delimiters.
+% \begin{macrocode}
+ \if#1c\def\@arrayleft{\left#2}\def\@arrayright{\right#4}%
+% \end{macrocode}
+% Otherwise we (should) have a {\tt[t]} or {\tt[b]} argument, so first we
+% store the alignment, without delimiters in box0.
+% \begin{macrocode}
+ \else\def\@arrayleft{\setbox\z@}%
+% \end{macrocode}
+% Then after the alignment is finished:
+% \begin{macrocode}
+ \def\@arrayright{%
+% \end{macrocode}
+% Calculate the amount the box needs to be lowered (this will be
+% negative in the case of |[b]|). A little bit of arithmetic cf.\
+% the \TeX{}Book, Appendix G, rule 8. We calculate the amount this
+% way, rather than just taking the difference between the depth of box0
+% and the depth of the box defined below, as the depth of that box may
+% be affected by the delimiters if |\delimitershortfall| or
+% |\delimiterfactor| have non-standard values.
+% \begin{macrocode}
+ \dimen@=\dp\z@
+ \advance\dimen@-\ht\z@
+ \divide \dimen@ by \tw@
+ \advance\dimen@ by\fontdimen22 \textfont\tw@
+% \end{macrocode}
+% Now lower the alignment and the delimiters into place.
+% \begin{macrocode}
+ \lower\dimen@\hbox{$\left#2\vcenter{\unvbox\z@}\right#4$}}%
+% \end{macrocode}
+% End the |\if#1c|
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% Now that we have defined |\@arrayleft| and |\@arrayright|, call
+% |\@array|.
+% \begin{macrocode}
+ \@array[#1]{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+% \subsection{newarray.sty}
+% All the features of the old {\tt newarray} style option have been
+% merged into the {\tt array} or {\tt delarray} options.
+% \changes{v1.00}{1992/07/06}
+% {Stop generating a `shell' newarray.sty}
+%
+%
+% \Finale
+\endinput
diff --git a/macros/latex-dev/required/tools/delarray.pdf b/macros/latex-dev/required/tools/delarray.pdf
new file mode 100644
index 0000000000..6f80eb57c4
--- /dev/null
+++ b/macros/latex-dev/required/tools/delarray.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/enumerate.dtx b/macros/latex-dev/required/tools/enumerate.dtx
new file mode 100644
index 0000000000..984d36d415
--- /dev/null
+++ b/macros/latex-dev/required/tools/enumerate.dtx
@@ -0,0 +1,335 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: enumerate.dtx Copyright 1993 1994 1999 David Carlisle
+%
+%<*dtx>
+ \ProvidesFile{enumerate.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{enumerate}
+%<driver> \ProvidesFile{enumerate.drv}
+% \fi
+% \ProvidesFile{enumerate.dtx}
+ [2015/07/23 v3.00 enumerate extensions (DPC)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{enumerate}
+\begin{document}
+\DocInput{enumerate.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{enumerate.dtx}
+% \title{The \textsf{enumerate} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle}
+% \date{\filedate}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \changes{v1.00}{1990/00/00}{First version (since lost)}
+% \changes{v2.00}{1991/07/25}{New Algorithm}
+% \changes{v2.01}{1992/06/26}{Re-issue for the new doc and docstrip.}
+% \changes{v2.02}{1994/01/31}{Update for LaTeX2e}
+% \changes{v3.00}{1999/03/05}{Add extension hook for tools/2916}
+% \changes{v3.00}{2015/07/23}{Documentation fixes tools/2916}
+%
+% \begin{abstract}
+% This package gives the enumerate environment an optional argument
+% which determines the style in which the counter is printed.
+%
+% An occurrence of one of the tokens |A a I i| or |1| produces the value
+% of the counter printed with (respectively) |\Alph \alph \Roman \roman|
+% or |\arabic|.
+%
+% These letters may be surrounded by any strings involving any other
+% \TeX\ expressions, however the tokens |A a I i 1| must be inside a
+% |{ }| group if they are not to be taken as special.
+% \end{abstract}
+%
+% \section{Examples}
+%\showboxdepth=10
+% \showboxbreadth=10
+% \[
+% \parbox{2.2in}{\hbadness2000
+% \begin{enumerate}[EX i.]
+% \item one one one one one one one
+% one one one one one\label{LA}
+% \item two
+% \begin{enumerate}[{example} a)]
+% \item one of two one of two one of two\label{LB}
+% \item two of two
+% \end{enumerate}
+% \end{enumerate}
+% \begin{enumerate}[{A}-1]
+% \item one\label{LC}
+% \item two
+% \end{enumerate}}
+% \hspace{20pt}
+% \vcenter{\hsize=2.4in
+% \begin{verbatim}
+% \begin{enumerate}[EX i.]
+% \item one one one one one one one
+% one one one one\label{LA}
+% \item two
+% \begin{enumerate}[{example} a)]
+% \item one of two one of two
+% one of two\label{LB}
+% \item two of two
+% \end{enumerate}
+% \end{enumerate}
+%
+% \begin{enumerate}[{A}-1]
+% \item one\label{LC}
+% \item two
+% \end{enumerate}
+% \end{verbatim}
+% }\]
+%
+% |\label| and |\ref| may be used as with the standard {\tt
+% enumerate} environment. |\ref| only produces the counter value,
+% not the whole label. |\ref| prints the value in the same style
+% as |\item|, as determined by the presence of one of the tokens
+% |A a I i 1| in the optional argument. In the above example
+% |\ref{LA}|, |\ref{LB}| and |\ref{LC}| produce
+% `\ref{LA}', `\ref{LB}' and `\ref{LC}' respectively.
+%
+% \StopEventually{}
+%
+%\section{Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macro}{\@enlab}
+% Internal token register used to build up the label command from the
+% optional argument.
+% \begin{macrocode}
+\newtoks\@enLab
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enQmark}
+% This just expands to a `?'. |\ref| will produce this, if no counter
+% is printed.
+% \begin{macrocode}
+\def\@enQmark{?}
+% \end{macrocode}
+% \end{macro}
+%
+% The next four macros build up the command that will print the item
+% label. They each gobble one token or group from the optional argument,
+% and add corresponding tokens to the register |\@enLab|. They each end
+% with a call to |\@enloop|, which starts the processing of the next
+% token.
+% \begin{macro}{\@enLabel}
+% Add the counter to the label. |#2| will be one of the `special'
+% tokens |A a I i 1|, and is thrown away. |#1| will be a command
+% like |\Roman|.
+% \begin{macrocode}
+\def\@enLabel#1#2{%
+ \edef\@enThe{\noexpand#1{\@enumctr}}%
+ \@enLab\expandafter{\the\@enLab\csname the\@enumctr\endcsname}%
+ \@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enSpace}
+% \begin{macro}{\@enSp@ce}
+% Add a space to the label. The tricky bit is to gobble the space token,
+% as you can not do this with a macro argument.
+% \begin{macrocode}
+\def\@enSpace{\afterassignment\@enSp@ce\let\@tempa= }
+\def\@enSp@ce{\@enLab\expandafter{\the\@enLab\space}\@enloop}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@enGroup}
+% Add a |{ }| group to the label.
+% \begin{macrocode}
+\def\@enGroup#1{\@enLab\expandafter{\the\@enLab{#1}}\@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enOther}
+% Add anything else to the label
+% \begin{macrocode}
+\def\@enOther#1{\@enLab\expandafter{\the\@enLab#1}\@enloop}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enloop}
+% \begin{macro}{\@enloop@}
+% The body of the main loop.
+% Eating tokens this way instead of using |\@tfor| lets you see
+% spaces and {\bf all} braces. |\@tfor| would treat {\tt a} and
+% |{a}| as special, but not |{{a}}|.
+% \begin{macrocode}
+\def\@enloop{\futurelet\@entemp\@enloop@}
+% \end{macrocode}
+% \begin{macrocode}
+\def\@enloop@{%
+ \ifx A\@entemp \def\@tempa{\@enLabel\Alph }\else
+ \ifx a\@entemp \def\@tempa{\@enLabel\alph }\else
+ \ifx i\@entemp \def\@tempa{\@enLabel\roman }\else
+ \ifx I\@entemp \def\@tempa{\@enLabel\Roman }\else
+ \ifx 1\@entemp \def\@tempa{\@enLabel\arabic}\else
+ \ifx \@sptoken\@entemp \let\@tempa\@enSpace \else
+ \ifx \bgroup\@entemp \let\@tempa\@enGroup \else
+ \ifx \@enum@\@entemp \let\@tempa\@gobble \else
+ \let\@tempa\@enOther
+% \end{macrocode}
+% Hook for possible extensions
+% \begin{macrocode}
+ \@enhook
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi\fi\fi\fi\fi\fi\fi\fi
+% \end{macrocode}
+% \end{macro}
+% Process the current token, then look at the next.
+% \begin{macrocode}
+ \@tempa}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enhook}
+% Hook for possible extensions.
+% Some packages may want to extend the number of special characters
+% that are associated with counter representations. This feature
+% was requested to enable Russian alphabetic counting, but here
+% I give an example of a footnote symbol counter, triggered by |*|.
+%
+% To enable a new counter type based on a letter, you just need
+% to add a new |\ifx| clause by analogy with the code above.
+% So for example to make |*| trigger footnote symbol counting.
+% a package should do the following.
+%
+% Initialise the hook, in case the package is loaded before
+% \textsf{enumerate}.
+%\begin{verbatim}
+% \providecommand\@enhook{}
+%\end{verbatim}
+%
+% Add to the hook a new |\ifx| clause that associates |*| with the
+% |\fnsymbol| counter command.
+%\begin{verbatim}
+% \g@addto@macro\@enhook{%
+% \ifx *\@entemp
+% \def\@tempa{\@enLabel\fnsymbol}%
+% \fi}
+%\end{verbatim}
+% This code sequence should work whether it is loaded before or after
+% this enumerate package. Any number of new counter types may be added
+% in this way.
+%
+% At this point we just need initialise the hook, taking care not
+% to over write any definitions another package may already have added.
+% \begin{macrocode}
+\providecommand\@enhook{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\enumerate}
+% The new {\tt enumerate} environment. This is the first half of the
+% original enumerate environment. If there is an optional argument, call
+% |\@@enum@| to define the label commands, otherwise call
+% |\@enum@| which is the second half of the original definition.
+% \begin{macrocode}
+\def\enumerate{%
+ \ifnum \@enumdepth >3 \@toodeep\else
+ \advance\@enumdepth \@ne
+ \edef\@enumctr{enum\romannumeral\the\@enumdepth}\fi
+ \@ifnextchar[{\@@enum@}{\@enum@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@enum@}
+% Handle the optional argument..
+% \begin{macrocode}
+\def\@@enum@[#1]{%
+% \end{macrocode}
+% Initialise the loop which will break apart the optional argument.
+% The command to print the label is built up in |\@enlab|.
+% |\@enThe| will be used to define |\theenum|\,$n$.
+% \begin{macrocode}
+ \@enLab{}\let\@enThe\@enQmark
+% \end{macrocode}
+% The |\@enum@| below is never expanded, it is used to detect the end
+% of the token list.
+% \begin{macrocode}
+ \@enloop#1\@enum@
+% \end{macrocode}
+% Issue a warning if we did not find one of the `special' tokens.
+% \begin{macrocode}
+ \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
+ ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
+% \end{macrocode}
+% Define |\labelenum|$\,n$ and |\theenum|$\,n$.
+% \begin{macrocode}
+ \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
+ \expandafter\let\csname the\@enumctr\endcsname\@enThe
+% \end{macrocode}
+% Set the counter to 7 so that we get the width of `vii' if roman
+% numbering is in force then set |\leftmargin|$\,n$. to the width of the
+% label plus |\labelsep|.
+% \begin{macrocode}
+ \csname c@\@enumctr\endcsname7
+ \expandafter\settowidth
+ \csname leftmargin\romannumeral\@enumdepth\endcsname
+ {\the\@enLab\hspace{\labelsep}}%
+% \end{macrocode}
+% Finally call |\@enum@| which is the second half of the original
+% definition.
+% \begin{macrocode}
+ \@enum@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@enum@}
+% All the list parameters have now been defined, so call |\list|. This
+% is taken straight from the original definition of |\enumerate|.
+% \begin{macrocode}
+\def\@enum@{\list{\csname label\@enumctr\endcsname}%
+ {\usecounter{\@enumctr}\def\makelabel##1{\hss\llap{##1}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex-dev/required/tools/enumerate.pdf b/macros/latex-dev/required/tools/enumerate.pdf
new file mode 100644
index 0000000000..70a69f6ce1
--- /dev/null
+++ b/macros/latex-dev/required/tools/enumerate.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fileerr.dtx b/macros/latex-dev/required/tools/fileerr.dtx
new file mode 100644
index 0000000000..3b5895a5f6
--- /dev/null
+++ b/macros/latex-dev/required/tools/fileerr.dtx
@@ -0,0 +1,123 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \def\fileversion{v1.1a} \def\filedate{2003/12/28}
+% \iffalse This is a METACOMMENT
+% Doc-Source file to use with LaTeX2e
+% Copyright (C) 1994-2004 Frank Mittelbach, all rights reserved.
+% \fi
+% \title{File not found error\thanks{This file has version
+% \fileversion\ last revised \filedate}}
+% \author{Frank Mittelbach}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \changes{v1.0e}{97/07/07}{Added q and r replies (PR/2525).}
+%
+% \section{Introduction}
+% When \LaTeXe{} is unable to find a file it will ask for an
+% alternative file name. However, sometimes the problem is
+% only noticed by \TeX{}, and in that case \TeX{} insists on
+% getting a valid file name; any other attempt to leave this
+% error loop will fail.\footnote{On some systems, \TeX{}
+% accepts a special character denoting the end of file to
+% return from this loop, e.g.\ Control-D on UNIX or Control-Z
+% on DOS.} Many users try to respond in the same way as to
+% normal error messages, e.g.\ by typing \meta{return}, or |s|
+% or |x|, but \TeX{} will interpret this as a file name and
+% will ask again.
+% \par To provide a graceful exit out of this loop, we define
+% a number of files which emulate the normal behavior of
+% \TeX{} in the error loop as far as possible.
+% \par After installing these files the user can respond with
+% |h|, |q|, |r|, |s|, |e|, |x|, and on some systems also with
+% \meta{return} to \TeX's missing file name question.
+% \StopEventually{}
+%
+% \section{The documentation driver}
+% This code will generate the documentation. Since it is the
+% first piece of code in the file, the documentation can be
+% obtained by simply processing this file with \LaTeXe.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document} \DocInput{fileerr.dtx} \end{document}
+%</driver>
+% \end{macrocode}
+% \section{The files}
+%
+% \subsection{Asking for help with {\tt h}}
+% When the user types |h| in the file error loop \TeX{} will
+% look for the file |h.tex|. In this file we put a message
+% informing the user about the situation (we use |^^J| to
+% start new lines in the message) and then finish with a
+% normal |\errmessage| command thereby bringing up \TeX's
+% normal error mechanism.
+% \begin{macrocode}
+%<*help>
+\newlinechar=`\^^J
+\message{! The file name provided could not be found.^^J%
+Use `<enter>' to continue processing,^^J%
+`S' to scroll future errors^^J%
+`R' to run without stopping,^^J%
+`Q' to run quietly,^^J%
+or `X' to terminate TeX}
+\errmessage{}
+%</help>
+% \end{macrocode}
+%
+% \subsection{Scrolling this and further errors with {\tt s}}
+% For the response |s| we put a message into the file |s.tex|
+% and start |\scrollmode| to scroll further error messages in
+% this run. On systems that allow |.tex| as a file name we
+% can also trap a single \meta{return} from the user.
+% \begin{macrocode}
+%<+scroll|return|run,batch> \message{File ignored}
+%<+scroll> \scrollmode
+%<+run> \nonstopmode
+%<+batch> \batchmode
+% \end{macrocode}
+%
+% \subsection{Exiting the run with {\tt x} or {\tt e}}
+%
+% If the user enters |x| or |e| to stop \TeX{}, we need to put
+% something into the corresponding file which will force \TeX{} to
+% give up. We achieve this by turning off terminal output and then
+% asking \TeX{} to stop: first by using the internal \LaTeX{} name
+% |\@@end|, and if that doesn't work because something other than
+% \LaTeX{} is used, by trying the \TeX{} primitive |\end|. The
+% |\errmessage| is there to ensure that \TeX{}'s internal "history"
+% variable is set to |error_message_issued|. This in turn will
+% hopefully set the exit code on those operating systems that
+% implement return codes (though there is no guarantee for this).
+% \changes{v1.1a}{2003/12/28}{Attempt to set exit code (pr/3538).}
+% \begin{macrocode}
+%<+edit|exit> \batchmode \errmessage{}\csname @@end\endcsname \end
+% \end{macrocode}
+% We end every file with an explicit |\endinput| which prevents
+% the docstrip program from putting the character table into
+% the generated files.
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%%
+% \Finale
diff --git a/macros/latex-dev/required/tools/fileerr.pdf b/macros/latex-dev/required/tools/fileerr.pdf
new file mode 100644
index 0000000000..2bd1aff4b3
--- /dev/null
+++ b/macros/latex-dev/required/tools/fileerr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/fontsmpl.dtx b/macros/latex-dev/required/tools/fontsmpl.dtx
new file mode 100644
index 0000000000..961bdda71f
--- /dev/null
+++ b/macros/latex-dev/required/tools/fontsmpl.dtx
@@ -0,0 +1,338 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \title{A font sampler}
+% \author{Alan Jeffrey}
+% \date{v0.11}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+%%
+%
+% \changes{v0.01}{1994/05/01}{Created this test document as part of
+% accents.dtx.}
+% \changes{v0.02}{1994/05/12}{Added the t1enc and ot1enc packages.}
+% \changes{v0.03}{1994/05/14}{Moved fontsmpl to its own dtx file.}
+% \changes{v0.03}{1994/05/14}{Removed the t1enc and ot1enc packages.}
+% \changes{v0.04}{1994/05/14}{Removed some debugging code, improved
+% documentation.}
+% \changes{v0.05}{1994/05/14}{Tidied up some more. Removed the fontenc
+% package.}
+% \changes{v0.06}{1994/10/27}{Added testing for all the commands in
+% ltoutenc.}
+% \changes{v0.06}{1994/10/27}{Switched off error for `commands not
+% defined in this encoding'.}
+% \changes{v0.07}{1994/10/29}{Added testing for \cs{dots},
+% \cs{copyright} and \cs{textregistered}.}
+% \changes{v0.07}{1994/10/29}{Replaced ??? for missing characters by
+% \textbf{?}.}
+% \changes{v0.08}{1994/10/30}{Added testing for \cs{k} and \cs{t}.}
+% \changes{v0.08}{1994/10/30}{Removed testing for any glyphs not in
+% usrguide.}
+% \changes{v0.08}{1994/10/30}{Allowed overfull boxes in the accent test
+% to extend out into the right margin.}
+% \changes{v0.10}{1995/09/19}{Corrected placement of docstrip guard.}
+% \changes{v0.11}{1997/05/13}{Replaced \cs{@changed@x@err} by
+% \cs{TextSymbolUnavailable}, according to the change in
+% \texttt{ltoutenc.dtx}.}
+%
+% \section{Introduction}
+%
+% This document describes the font test document |fontsmpl.tex| and the
+% accompanying package |fontsmpl.sty|. This produces a test of a font
+% family, printing a sample text, a table of accents, and a sample of
+% commands such as |\pounds|.
+%
+% It can be used in two ways. The |fontsmpl| package provides the
+% command |\fontsample|, which produces a sample of the current font.
+%
+% The |fontsmpl| document prompts interactively for a font family (for
+% example `|cmr|') and produces a sample of that family.
+%
+% \StopEventually{}
+%
+% \section{Documentation}
+%
+% This docstrip document has three docstrip options:
+% \begin{itemize}
+% \item |document| the code for |fontsmpl.tex|.
+% \item |package| the code for |fontsmpl.sty|.
+% \item |driver| this documentation.
+% \end{itemize}
+% The code for the driver is:
+% \begin{macrocode}
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{ltxdoc}
+\begin{document}
+ \DocInput{fontsmpl.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+% \section{Font sample document}
+%
+% The sample document prompts for a family, and uses the |fontsmpl|
+% package. If there is a file |fontsmpl.cfg|, this is loaded.
+% \changes{v0.9}{1995/05/07}{Removed \cs{pagestyle} empty}
+% \begin{macrocode}
+%<*document>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage{fontsmpl}
+\makeatletter
+\InputIfFileExists{fontsmpl.cfg}{}{}
+\makeatother
+\typein[\family]{Please enter a family name (for example `cmr').}
+\title{Test of \LaTeX{} font family `\family'}
+\author{Font sample produced with `fontsmpl'}
+\raggedright
+\begin{document}
+\maketitle
+\fontfamily{\family}\selectfont
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\itshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\slshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\scshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\upshape\bfseries
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\itshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\slshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\scshape
+\fontencoding{T1}\selectfont\fontsample
+\fontencoding{OT1}\selectfont\fontsample
+\end{document}
+%</document>
+% \end{macrocode}
+%
+% \section{Font sample package}
+%
+% The |fontsmpl| package is a \LaTeXe{} package.
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{fontsmpl}[1994/10/29 Font sample package]
+% \end{macrocode}
+%
+% \begin{macro}{\fontsample}
+% The |\fontsample| command prints out a sample text, a
+% selection of glyphs, and a table of accents.
+% \begin{macrocode}
+\newcommand{\fontsample}{%
+ Test of font \f@encoding/\f@family/\f@series/\f@shape.
+ \fontsampletext
+ \fontsampleglyphs
+ \fontsampleaccents
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontsampletext}
+% A sample text, taken from Knuth's |testfont.tex|.
+% \begin{macrocode}
+\newcommand{\fontsampletext}{%
+ Some text:
+ \begin{quote}\begin{flushleft}
+ On November 14, 1885, Senator \& Mrs.~Leland Stanford called
+ together at their San Francisco mansion the 24~prominent men who
+ had been chosen as the first trustees of The Leland Stanford
+ Junior University. They handed to the board the Founding Grant
+ of the University, which they had executed three days before.
+ This document---with various amendments, legislative acts, and
+ court decrees---remains as the University's charter. In bold,
+ sweeping language it stipulates that the objectives of the
+ University are ``to qualify students for personal success and
+ direct usefulness in life; and to promote the publick welfare by
+ exercising an influence in behalf of humanity and civilization,
+ teaching the blessings of liberty regulated by law, and
+ inculcating love and reverence for the great principles of
+ government as derived from the inalienable rights of man to life,
+ liberty, and the pursuit of happiness.''
+ \\
+ (!`THE DAZED BROWN FOX QUICKLY GAVE 12345--67890 JUMPS!)
+ \\
+ ?`But aren't Kafka's Schlo\ss\
+ and \AE sop's \OE uvres often na\"\i ve vis-\`a-vis the
+ d\ae monic ph\oe nix's official r\^ole in fluffy s\t ouffl\'es?
+ \\
+
+ \end{flushleft}\end{quote}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fontsampleglyphs}
+% \begin{macro}{\fontsampleglyph}
+% A list of sample glyph commands.
+% \begin{macrocode}
+\newcommand{\fontsampleglyphs}{%
+ Some glyphs:
+ \begin{quote}\begin{flushleft}
+ \fontsampleglyph{\#}
+ \fontsampleglyph{\$}
+ \fontsampleglyph{\%}
+ \fontsampleglyph{\&}
+ \fontsampleglyph{\AA}
+ \fontsampleglyph{\AE}
+ \fontsampleglyph{\DH}
+ \fontsampleglyph{\DJ}
+ \fontsampleglyph{\L}
+ \fontsampleglyph{\NG}
+ \fontsampleglyph{\OE}
+ \fontsampleglyph{\O}
+ \fontsampleglyph{\P}
+ \fontsampleglyph{\SS}
+ \fontsampleglyph{\S}
+ \fontsampleglyph{\TH}
+ \fontsampleglyph{\_}
+ \fontsampleglyph{\aa}
+ \fontsampleglyph{\ae}
+ \fontsampleglyph{\copyright}
+ \fontsampleglyph{\dag}
+ \fontsampleglyph{\ddag}
+ \fontsampleglyph{\dh}
+ \fontsampleglyph{\dj}
+ \fontsampleglyph{\dots}
+ \fontsampleglyph{\guillemotleft}
+ \fontsampleglyph{\guillemotright}
+ \fontsampleglyph{\guilsinglleft}
+ \fontsampleglyph{\guilsinglright}
+ \fontsampleglyph{\i}
+ \fontsampleglyph{\j}
+ \fontsampleglyph{\l}
+ \fontsampleglyph{\ng}
+ \fontsampleglyph{\oe}
+ \fontsampleglyph{\o}
+ \fontsampleglyph{\pounds}
+ \fontsampleglyph{\quotedblbase}
+ \fontsampleglyph{\quotesinglbase}
+ \fontsampleglyph{\ss}
+ \fontsampleglyph{\textasciicircum}
+ \fontsampleglyph{\textasciitilde}
+ \fontsampleglyph{\textbackslash}
+ \fontsampleglyph{\textbar}
+ \fontsampleglyph{\textbullet}
+ \fontsampleglyph{\textcompwordmark}
+ \fontsampleglyph{\textemdash}
+ \fontsampleglyph{\textendash}
+ \fontsampleglyph{\textexclamdown}
+ \fontsampleglyph{\textgreater}
+ \fontsampleglyph{\texthyphenchar}
+ \fontsampleglyph{\textless}
+ \fontsampleglyph{\textperiodcentered}
+ \fontsampleglyph{\textquestiondown}
+ \fontsampleglyph{\textquotedblleft}
+ \fontsampleglyph{\textquotedblright}
+ \fontsampleglyph{\textquotedbl}
+ \fontsampleglyph{\textquoteleft}
+ \fontsampleglyph{\textquoteright}
+ \fontsampleglyph{\textvisiblespace}
+ \fontsampleglyph{\th}
+ \fontsampleglyph{\{}
+ \fontsampleglyph{\}}
+ \end{flushleft}\end{quote}
+}
+\newcommand{\fontsampleglyph}[1]{%
+ \ifx#1\@undefined
+ {\typewriterfont\string#1}~is~undefined
+ \else
+ {\typewriterfont\string#1}~is~`#1'
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\fontsampleaccents}
+% \begin{macro}{\fontsampleaccent}
+% A sample of accents.
+% \begin{macrocode}
+\newcommand{\fontsampleaccents}{%
+ Some accents:
+ \begin{quote}\begin{flushleft}
+ \fontsampleaccent{\"} \\
+ \fontsampleaccent{\'} \\
+ \fontsampleaccent{\.} \\
+ \fontsampleaccent{\=} \\
+ \fontsampleaccent{\H} \\
+ \fontsampleaccent{\^} \\
+ \fontsampleaccent{\`} \\
+ \fontsampleaccent{\b} \\
+ \fontsampleaccent{\c} \\
+ \fontsampleaccent{\d} \\
+ \fontsampleaccent{\k} \\
+ \fontsampleaccent{\u} \\
+ \fontsampleaccent{\v} \\
+ \fontsampleaccent{\~}
+ \end{flushleft}\end{quote}
+}
+\newcommand{\fontsampleaccent}[1]{%
+ \makebox[1em][r]{\typewriterfont\string#1}
+ \makebox[15em][l]{%
+ #1A#1C#1D#1E#1G#1I#1L#1N%
+ #1O#1R#1S#1T#1U#1Y#1Z%
+ #1a#1c#1d#1e#1g#1\i#1i#1l#1n%
+ #1o#1r#1s#1t#1u#1y#1z%
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\typewriterfont}
+% Not all sites have the T1 typewriter fonts, so we set the
+% typewriter font to be a fixed font.
+% \begin{macrocode}
+\DeclareFixedFont{\typewriterfont}
+ {\encodingdefault}{\ttdefault}{\mddefault}{\updefault}{10}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TextSymbolUnavailable}
+% Switch off the error message from missing glyphs.
+% \begin{macrocode}
+\def\TextSymbolUnavailable#1{%
+ \textbf{?}\PackageInfo{fontsmpl}{%
+ Command \protect#1 undefined in encoding \f@encoding%
+ }%
+}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%\Finale
+\endinput
+
+
diff --git a/macros/latex-dev/required/tools/fontsmpl.pdf b/macros/latex-dev/required/tools/fontsmpl.pdf
new file mode 100644
index 0000000000..20626d2340
--- /dev/null
+++ b/macros/latex-dev/required/tools/fontsmpl.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/ftnright.dtx b/macros/latex-dev/required/tools/ftnright.dtx
new file mode 100644
index 0000000000..5739172f85
--- /dev/null
+++ b/macros/latex-dev/required/tools/ftnright.dtx
@@ -0,0 +1,1018 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%\iffalse % this is a METACOMMENT !
+%
+%% Package `ftnright' to use with LaTeX 2e
+%% Copyright (C) 1989-2004 Frank Mittelbach, all rights reserved.
+%<+package>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<+package>\ProvidesPackage{ftnright}
+%<+package> [2014/10/28 v1.1f footnote layout package (FMi)]
+%
+% \fi
+%%
+%%
+%
+%
+% \DoNotIndex{\;}
+%^^A \DoNotIndex{\@cclv}
+%^^A \DoNotIndex{\@colht}
+%^^A \DoNotIndex{\@colroom}
+% \DoNotIndex{\@combinedblfloats}
+% \DoNotIndex{\@combinefloats}
+% \DoNotIndex{\@dblfloatplacement}
+% \DoNotIndex{\@deferlist}
+% \DoNotIndex{\@empty}
+%^^A \DoNotIndex{\@fcolmadefalse}
+%^^A \DoNotIndex{\@firstcolumnfalse}
+%^^A \DoNotIndex{\@firstcolumntrue}
+% \DoNotIndex{\@freelist}
+% \DoNotIndex{\@ixpt}
+%^^A \DoNotIndex{\@leftcolumn}
+%^^A \DoNotIndex{\@m}
+%^^A \DoNotIndex{\@makecol}
+%^^A \DoNotIndex{\@makefntext}
+%^^A \DoNotIndex{\@maxdepth}
+% \DoNotIndex{\@midlist}
+%^^A \DoNotIndex{\@outputbox}
+%^^A \DoNotIndex{\@outputdblcol}
+%^^A \DoNotIndex{\@outputpage}
+% \DoNotIndex{\@ptsize}
+%^^A \DoNotIndex{\@setsize}
+% \DoNotIndex{\@spaces}
+%^^A \DoNotIndex{\@startcolumn}
+%^^A \DoNotIndex{\@startdblcolumn}
+% \DoNotIndex{\@tempdima}
+% \DoNotIndex{\@textbottom}
+% \DoNotIndex{\@texttop}
+%^^A \DoNotIndex{\@thefnmark}
+% \DoNotIndex{\@viiipt}
+% \DoNotIndex{\@whilesw}
+% \DoNotIndex{\@width}
+%^^A \DoNotIndex{\@xstartcol}
+% \DoNotIndex{\@xpt}
+% \DoNotIndex{\advance}
+% \DoNotIndex{\begingroup}
+% \DoNotIndex{\box}
+%^^A \DoNotIndex{\boxmaxdepth}
+%^^A \DoNotIndex{\columnseprule}
+%^^A \DoNotIndex{\columnwidth}
+% \DoNotIndex{\count}
+% \DoNotIndex{\def}
+% \DoNotIndex{\dimen}
+% \DoNotIndex{\dp}
+% \DoNotIndex{\else}
+% \DoNotIndex{\endgroup}
+% \DoNotIndex{\fi}
+% \DoNotIndex{\filedate}
+% \DoNotIndex{\filename}
+% \DoNotIndex{\fileversion}
+%^^A \DoNotIndex{\footins}
+%^^A \DoNotIndex{\footnoterule}
+%^^A \DoNotIndex{\footnotesep}
+%^^A \DoNotIndex{\footnotesize}
+%^^A \DoNotIndex{\ftn@amount}
+% \DoNotIndex{\gdef}
+% \DoNotIndex{\global}
+% \DoNotIndex{\hbox}
+% \DoNotIndex{\hfil}
+% \DoNotIndex{\hss}
+% \DoNotIndex{\ht}
+%^^A \DoNotIndex{\if@fcolmade}
+%^^A \DoNotIndex{\if@firstcolumn}
+% \DoNotIndex{\ifcase}
+%^^A \DoNotIndex{\ifvoid}
+% \DoNotIndex{\ifx}
+%^^A \DoNotIndex{\insert}
+% \DoNotIndex{\ixpt}
+% \DoNotIndex{\let}
+% \DoNotIndex{\llap}
+% \DoNotIndex{\long}
+%^^A \DoNotIndex{\maxdepth}
+%^^A \DoNotIndex{\newdimen}
+%^^A \DoNotIndex{\newskip}
+% \DoNotIndex{\noindent}
+% \DoNotIndex{\normalsize}
+% \DoNotIndex{\or}
+%^^A \DoNotIndex{\parindent}
+%^^A \DoNotIndex{\preparefootins}
+%^^A \DoNotIndex{\rcol@footinsskip}
+%^^A \DoNotIndex{\saved@footinsskip}
+% \DoNotIndex{\setbox}
+% \DoNotIndex{\skip}
+% \DoNotIndex{\space}
+%^^A \DoNotIndex{\strutbox}
+%^^A \DoNotIndex{\textheight}
+%^^A \DoNotIndex{\textwidth}
+% \DoNotIndex{\unvbox}
+% \DoNotIndex{\vbox}
+% \DoNotIndex{\viiipt}
+% \DoNotIndex{\vrule}
+% \DoNotIndex{\vskip}
+%^^A \DoNotIndex{\wlog}
+% \DoNotIndex{\xdef}
+% \DoNotIndex{\xpt}
+% \DoNotIndex{\z@}
+%
+% \changes{v1.1a}{1994/01/24}{Upgrades for LaTeX2e}
+% \changes{v1.1b}{1994/01/24}{Driver moved in front}
+% \changes{v1.1c}{1996/01/01}{Use article.cls for documentation}
+%
+% \renewcommand{\.}{\penalty500} %^^A for certain breaks
+%
+% \setlength{\hfuzz}{2pt} ^^A allow small overshot in verbatim
+%
+% \GetFileInfo{ftnright.sty}
+%
+% \title{Footnotes in a multi-column layout\thanks
+% {The \LaTeX{} package {\tt \filename} which is described
+% in this article has the version number \fileversion{} dated
+% \filedate.}}
+% \author{Frank Mittelbach}
+%
+%
+% \maketitle
+%
+% \pageshrink 1pt %^^A compensate for the \thanks marker
+%
+%
+% \section{Preface to version 1.1}
+%
+% The new release is a basically unchanged version of the original. I
+% upgraded the macros so that they work with \LaTeXe{} and used some
+% of the additional flexibility introduced therein. For example, the
+% command |\preparefootins| is now automatically called at
+% |\begin{document}|, thus allowing the user to adjust the
+% |\textheight| in the preamble.
+%
+% It is not surprisingly that I was forced to change some of the
+% macros because they dig deep into \LaTeX{}'s output routines.
+% Fortunately this is something normally not necessary when upgrading
+% other \LaTeX~2.09 styles to \LaTeXe{} packages.
+%
+% I also upgraded the documentation to conform to the \LaTeXe{}
+% terminology, e.g., this is a package since document classes will not
+% know about it. However it is very likely that i have missed some
+% necessary corrections.
+%
+% \section{Introduction}
+%
+%
+% The placement of footnotes in a multicolumn layout always bothered
+% me. The approach taken by \LaTeX{} (i.e., placing the footnotes
+% separately under each column) might be all right if nearly no
+% footnotes are present. But it looks clumsy when both columns contain
+% footnotes, especially when they occupy different amounts of space.
+%
+% In the multicolumn package~\cite{art:FMi89b}, I used page-wide
+% footnotes at the bottom of the page, but again the result doesn't
+% look very pleasant since short footnotes produce undesired gaps of
+% white space. Of course, the main goal of this package was a
+% balancing algorithm for columns which would allow switching between
+% different numbers of columns on the same page. With this feature,
+% the natural place for footnotes seems to be the bottom of the
+% page\footnote{You cannot use column footnotes at the bottom, since
+% the number of columns can differ on one page.} but looking at some
+% of the results it seems best to avoid footnotes in such a layout
+% entirely.
+%
+%
+% Another possibility is to turn footnotes into endnotes, i.e.,
+% printing them at the end of every chapter or the end of the entire
+% document. But I assume everyone who has ever read a book using such
+% a layout will agree with me, that it is a pain to search back and
+% forth, so that the reader is tempted to ignore the endnotes
+% entirely.
+%
+% When I wrote the article about ``Future extensions of
+% \TeX{}''~\cite{inproc:FMi90} I was again dissatisfied with the
+% outcome of the footnotes, and since this article should show certain
+% aspects of high quality typesetting, I decided to give the footnote
+% problem a try and modified the \LaTeX{} output routine for this
+% purpose. The layout I used was inspired by the yearbook of the
+% Gutenberg Gesellschaft Mainz \cite{book:GG}. Later on, I found that
+% it is also recommended by Jan White \cite{book:JWh88}. On the layout
+% of footnotes I also consulted books by Jan Tschichold
+% \cite{book:JTs87} and Manfred Simoneit \cite{book:MSi89}, books I
+% would recommend to everyone being able to read German texts.
+%
+%
+% \subsection{Description of the new layout}
+%
+% The result of this effort is presented in this paper and the reader
+% can judge for himself whether it was successful or
+% not.\footnote{Please note, that this option only changed the
+% placement of footnotes. Since this article also makes use of the
+% {\tt doc} package \cite{bk:GMS94}, that assigns tiny numbers to
+% code lines sprinkled throughout the text, the resulting design is
+% not perfect. This package is now a standard part of \LaTeXe.}
+% The main idea for this layout is to assemble the
+% footnotes of all columns on a page and place them all together at
+% the bottom of the right column. Allowing for enough space between
+% footnotes and text, and in addition, setting the footnotes in
+% smaller type\footnote{The standard layout in \TUB{} uses the same
+% size for footnotes and text, giving the footnotes, in my opinion,
+% much too much prominence.} I decided that one could omit the
+% footnote separator rule which is used in most publications prepared
+% with \TeX{}.\footnote{People who prefer the rule can add it by
+% redefining the command {\tt\bslash footnoterule}
+% \cite[p.~156]{book:LLa86}. Please, note, that this command should
+% occupy no space, so that a negative space should be used to
+% compensate for the width of the rule used.} Furthermore, I decided
+% to place the footnote markers\footnote{\label{thisftn}The tiny
+% numbers or symbols, e.g., the `\ref{thisftn}' in front of this
+% footnote.} at the baseline instead of raising them as
+% superscripts.\footnote{Of course, this is done only for the mark
+% preceding the footnote text and not the one used within the main
+% text where a raised number or symbol set in smaller type will help
+% to keep the flow of thoughts, uninterrupted.}
+%
+% All in all, I think this generates a neat layout, and surprisingly
+% enough, the necessary changes to the \LaTeX{} output routine are
+% nevertheless astonishingly simple.
+%
+% \subsection{The use of the package}
+%
+% This package might be used together with any other package
+% for \LaTeX{} which does not change the three internals changed by
+% {\tt \filename}.\footnote{These are the macros {\tt\bslash
+% @startcolumn}, {\tt\bslash @makecol}, and {\tt\bslash @outputdblcol},
+% as we will see below. Of course, the package will take only effect
+% with a document class using a two-column layout (like {\tt ltugboat})
+% or when the user additionally specifies {\tt twocolumn} as a
+% document class option in the {\tt\bslash documentclass} command.} In
+% most cases, it is best to use this package as the very last
+% package in the preamble to make sure that its
+% settings are not overwritten by other packages.
+%
+% It is unfortunate that the current \LaTeX{} has nearly no provisions
+% to make such changes without overwriting the internal routines. In
+% the \LaTeX3 implementation, we will certainly add some hooks that
+% will make such changes more easy.
+%
+%
+% \subsection{Limitations}
+%
+% If in the first column there is more than a full column worth of footnote
+% material the material will be split resulting in footnotes out of
+% order. This issue is now detected and generates an error but the package is
+% unable to gracefully handle it. This gives you two options: either rearrange
+% your input so that it will use less footnotes in the first column (or add
+% some pagebreaks at suitable places) or allow explicitly for more material to
+% be gathered. The latter can be achieved by adding
+%\begin{verbatim}
+%\makeatletter
+%\def\preparefootins{%
+% \global\rcol@footinsskip\skip\footins
+% \global\skip\footins\z@
+% \global\count\footins\z@
+% \global\dimen\footins2\textheight}
+%\makeatother
+%\end{verbatim}
+% to the preamble of your document. However, with this you allow two columns
+% worth of footnote material and that means that some of your footnotes are
+% likely to be detached from their reference and show up on a later page!
+%
+% \StopEventually{
+%
+% \begin{small}
+% \begin{thebibliography}{1}
+%
+% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
+% and \textsc{A.~Samarin}.
+% \newblock The \LaTeX{} Companion.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1994.
+%
+% \bibitem{book:GG}
+% Hans-Joachim Koppitz, editor.
+% \newblock {\em {Gutenberg Jahrbuch}}.
+% \newblock Gutenberg-Gesellschaft, Mainz.
+%
+% \bibitem{book:LLa86}
+% Leslie Lamport.
+% \newblock {\em {\LaTeX:} A Document Preparation System}.
+% \newblock Addison-Wesley, Reading, Massachusetts, 1986.
+%
+% \bibitem{src:ltxiii94}
+% \LaTeX3 project.
+% \newblock \LaTeXe distribution, 1994.
+% \newblock Sources for {\LaTeXe} the successor to \LaTeX~2.09.
+%
+% \bibitem{art:FMi89b}
+% Frank Mittelbach
+% \newblock An environment for multi-column output.
+% \newblock {\em TUGboat}, 10(3):407--415, November 1989.
+%
+% \bibitem{inproc:FMi90}
+% Frank Mittelbach
+% \newblock E-{\TeX}: Guidelines to future {\TeX} extensions.
+% \newblock In Lincoln K. Durst, editor, {\em \TUB}, 11(3):
+% {\em 1990 TUG Annual Meeting Proceedings}, pages
+% 337--345, September 1990.
+%
+% \bibitem{book:MSi89}
+% Manfred Siemoneit.
+% \newblock {\em Typographisches {G}estalten}.
+% \newblock Polygraph Verlag, Frankfurt am Main, second edition, 1989.
+%
+% \bibitem{book:JTs87}
+% Jan Tschichold.
+% \newblock {\em {Ausgew\"ahlte Aufs\"atze \"uber Fragen der Gestalt des
+% Buches}}.
+% \newblock Birkh\"auser Verlag, Basel, 1987.
+% \newblock Second printing.
+%
+% \bibitem{book:JWh88}
+% Jan White.
+% \newblock {\em Graphic Design for the Electronic Age}.
+% \newblock Watson Guptill, Xerox Press, New York, 1988.
+%
+% \end{thebibliography}
+% \end{small}
+%
+% \onecolumn
+% \PrintIndex
+% \PrintChanges
+% }
+%
+%
+%
+% \section{The documentation driver}
+%
+% The first bit of code contains the documentation driver file for
+% \TeX{}, i.e., the file that will produce the documentation you are
+% currently reading. It will be extracted from this file by the {\tt
+% docstrip} program. If you don't want to make any changes to the
+% presentation you can alternatively process the \texttt{.dtx} file
+% directly with \LaTeXe{} to obtain the documentation.
+% \changes{v1.0d}{1992/04/19}{Added driver file to source}
+% \changes{v1.0e}{1993/05/13}{Added history generation}
+% \begin{macrocode}
+%<*driver>
+\documentclass[twocolumn]{article}
+
+\usepackage{ftnright}
+\usepackage{doc}
+\AtBeginDocument{\MakeShortVerb{\|}}
+
+\newcommand{\TUB}{{\sl TUGboat\/}}
+\renewcommand\DescribeMacro[1]{\fbox
+ {\PrintDescribeMacro{#1}}}
+\renewcommand\DescribeEnv[1]{\fbox
+ {\PrintDescribeEnv{#1}}}
+\renewcommand\PrintMacroName[1]{}
+
+\setlength{\parindent}{1em}
+\setlength{\parskip}
+ {2pt plus1pt minus1pt}
+\setlength{\headsep}{20pt}
+\setlength{\columnsep}{1.5pc}
+\renewcommand{\bottomfraction}{.4}
+
+\flushbottom
+\CodelineIndex
+\RecordChanges % produce history
+\EnableCrossrefs
+
+\setcounter{IndexColumns}{2}
+\IndexPrologue{\section{Index}
+ All numbers denote code lines where
+ the corresponding entry is used,
+ underlined entries point to the
+ definition.}
+
+\begin{document}
+ \DocInput{ftnright.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+% \section{The Implementation}
+%
+%
+% As usual, we start by identifying the current version of this package
+% file in the transcript file.\footnote{Nico Poppelier suggested
+% omitting the {\tt\bslash typeout} statements in the production
+% version of the files to avoid showing all that unnecessary
+% information to the user. While I accept his criticism as valid, I
+% decided that this information should at least be placed into the
+% transcript file to make it easier to detect problems arising from
+% the use of older versions. This happens now automatically as the command
+% \texttt{\string\ProvidesPackage} will only write to the transcript file.}
+% This actually happens at the very top of this file so it is commented out
+% here.
+%\begin{verbatim}
+%\ProvidesPackage{ftnright}[\filedate\space
+% LaTeX2e package \fileversion]
+%\end{verbatim}
+%
+% To implement the layout described, above we have to distinguish
+% between the left and the right column on a page. For this purpose
+% \LaTeX{} maintains the switch |\if@firstcolumn|. When assembling
+% material for the left (i.e., the first) column, footnotes should
+% take up no space, since they are held over for the second column. In
+% the second column these footnotes are combined with the ones found
+% there and placed a suitable distance from the main text at the
+% bottom of this column.
+%
+% This means that we have to change certain parameters for the
+% insertion |\footins| when we construct the second column. The right
+% place to do this is in the \LaTeX{} macro |\@outputdblcol| which we
+% are going to change later on. What settings for the insertion
+% parameters are appropriate? For setting the first column
+% |\count|\.|\footins| and |\skip|\.|\footins| should both be zero
+% since footnotes are held over while for the second column
+% |\count|\.|\footins| should be $1000$ and the |\skip|\.|\footins|
+% has to be set to the desired separation between main text and
+% footnotes.\footnote{A value of $1000$ means that there is a
+% one-to-one relationship between the real size of the footnote and
+% the size finally occupied by the footnote on the current page.}
+%
+%
+% We will allow one column of footnotes (i.e., the right column) at
+% most, so that |\dimen|\.|\footins| has to equal |\textheight|. In
+% principle, it would be possible to allow for even more footnotes,
+% but this would complicate matters enormously.\footnote{It is not
+% possible to make {\tt\bslash dimen\bslash footins} larger than
+% {\tt\bslash textheight} directly, because this would result in a
+% full left column (with text) and more than one column of footnotes.
+% Instead, one has to make footnotes visible to the page generation
+% algorithm again at the moment when a full column of footnotes is
+% assembled, but we still have some space left in the first column. It
+% is a nice enhancement, and, I suppose, it is of some value for
+% preparing publications in certain disciplines, so here is the
+% challenge~\ldots}
+%
+%
+% \begin{macro}{\preparefootins}
+% \begin{macro}{\saved@footinsskip}
+% Since a document usually starts with a left column, we have to
+% set |\count| and |\skip|\.|\footins| on top-level to zero. For
+% this purpose, we define a macro |\preparefootins| which will
+% first save the current value of |\skip|\.|\footins| in a safe
+% place. This saved value will be used later for the second column.
+% In this way, it is possible for the user or a designer of a
+% document class to adjust this parameter without fiddling with the
+% code of this package file.
+% \begin{macrocode}
+%<*package>
+\def\preparefootins{%
+ \global\rcol@footinsskip\skip\footins
+ \global\skip\footins\z@
+ \global\count\footins\z@
+% \end{macrocode}
+% We will also assign |\textheight| to |\dimen|\.|\footins| to
+% allow the user to change this parameter in the preamble.
+% \begin{macrocode}
+ \global\dimen\footins\textheight}
+% \end{macrocode}
+% It is necessary to make the assignments above |\global| because
+% we are going to use this macro in the output routine which has an
+% implicit grouping level to keep the changes made by it local.
+% \end{macro}
+% Of course, we have to allocate the {\sf skip} register that we
+% used above:
+% \begin{macrocode}
+\newskip\rcol@footinsskip
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@outputdblcol}
+% Now we have all the necessary tools available to tackle
+% |\@outputdblcol|. We have to remember that when
+% |\if@firstcolumn| equals |\iftrue|, we are currently starting to
+% build the second column, i.e., that the first column is already
+% assembled. Therefore, the macro will start with the following
+% code:
+% \begin{macrocode}
+\def\@outputdblcol{\if@firstcolumn
+ \global\@firstcolumnfalse
+% \end{macrocode}
+% After changing the switch, we save the first column (which was
+% placed by preceding macros in |\@outputbox|) in the box register
+% |\@leftcolumn|. Since we are inside the output routine, all those
+% assignments have to be |\global| to take any effect.
+% \begin{macrocode}
+ \global\setbox\@leftcolumn\box\@outputbox
+% \end{macrocode}
+% Then, we make the footnotes visible to the page generation
+% algorithm by setting |\count\footins| to $1000$ (|\@m| is an
+% abbreviation for this number) and |\skip\footins| to its saved
+% value (i.e., |\rcol@footinsskip|).
+% \begin{macrocode}
+ \global\count\footins\@m
+ \global\skip\footins\rcol@footinsskip
+% \end{macrocode}
+% We also have to reinsert all footnotes left over from the first
+% column to make sure that they are reconsidered by the page
+% generation algorithm of \TeX{} using the new values for |\count|
+% and |\skip|\.|\footins|. But this will be done later in the
+% macro |\@startcolumn|.
+%
+% If we have just finished the right column, i.e., when
+% |\if@firstcolumn| equals |\iffalse|, we will reset the |\footins|
+% parameters as explained above using the utility macro
+% |\preparefootins|.
+% \begin{macrocode}
+ \else \preparefootins
+% \end{macrocode}
+% Then, we compose both columns in |\@outputbox|, combine them with
+% all page-wide floats for this page (|\@combinedblfloats|), attach
+% header and footer, and ship out the result (|\@outputpage|).
+% Finally we look to see whether it is possible to generate
+% following pages consisting only of page-wide
+% floats.\footnote{This part is copied directly from the original
+% \LaTeX{} macro. Details about the used macros, their interfaces
+% and meanings can be found in the \LaTeXe{} source
+% code~\cite{src:ltxiii94}.}
+% \begin{macrocode}
+ \global\@firstcolumntrue
+ \setbox\@outputbox\vbox{\hbox to\textwidth
+ {\hbox to\columnwidth
+ {\box\@leftcolumn\hss}%
+ \hfil\vrule\@width\columnseprule\hfil
+ \hbox to\columnwidth
+ {\box\@outputbox\hss}}}%
+ \@combinedblfloats\@outputpage
+ \begingroup
+ \@dblfloatplacement\@startdblcolumn
+ \@whilesw\if@fcolmade\fi
+ {\@outputpage\@startdblcolumn}%
+ \endgroup
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@startcolumn}
+% \changes{v1.0b}{1990/08/11}{Macro added to correct float problems}
+% There is a fundamental flaw in \LaTeX's output routine for float
+% columns and float pages: split footnotes, i.e., footnotes which
+% are only partly typeset on the preceding page are not resolved.
+% They are held over until \LaTeX{} starts a page (or column)
+% containing text besides floats again. For our current layout,
+% this would mean, that if \LaTeX{} decided to make the right
+% column of a page a float column, footnotes from the left column
+% would appear on a later page. A real cure for this problem would
+% be to rewrite two-thirds of \LaTeX{}'s output routine, so I am
+% leaving this open for the interested reader.
+%
+% \begin{figure}[b]
+% \fbox{%^^A
+% \newlength{\puzzlewd}%^^A
+% \setlength{\puzzlewd}{\columnwidth}%^^A
+% \addtolength{\puzzlewd}{-2.1\fboxsep}%^^A
+% \begin{minipage}{\puzzlewd}
+% \vspace{17pt}
+% \begin{center}
+% \bf Puzzle:
+% \end{center}
+% \vspace{-3pt}
+% \small
+% \begin{quote}
+% \rightskip \leftmargini plus 2.5em
+% Given a simple \TeX{} document containing only straight text, is
+% it possible for the editor, after
+% deleting one sentence, to end up with a document
+% producing an extra page?
+%
+% We assume that the deleted text contains no \TeX{} macros and
+% that the document was prepared
+% with a standard macro package like the one used for \TUB\/ production.
+% \end{quote}
+% \vspace{7pt}
+% \begin{flushright}
+% The answer will be given in the next issue.
+% \end{flushright}
+% \vspace{7pt}
+% \end{minipage}}
+% \end{figure}
+%
+% But the problem shows up even if only one float is contributed to
+% the right column since \LaTeX{} assumes that the whole column is
+% usable, whereas some of it might actually be already devoted to
+% footnotes from the left column. So we have to change the output
+% routine at least in the part that contributes floats to the next
+% column. The macro involved is called |\@startcolumn|. The first
+% thing we do is to check and see whether any deferred floats
+% exists.
+% \begin{macrocode}
+\def\@startcolumn{%
+ \ifx\@deferlist\@empty
+% \end{macrocode}
+% If not, we set the switch |\if@fcolmade| to {\tt false} which
+% says that we did not succeed in making a float column. Then, we
+% set |\@colroom| to |\@colht|. The register |\@colht| holds the
+% amount of space that is available for floats, text, and footnotes
+% in one column, i.e., it equals |\textheight| minus the space
+% devoted to page-wide floats. |\@colroom| is a similar register
+% which holds the value |\@colht| minus space for column floats
+% that are already contributed to the current column. Of course,
+% both values should be equal when we start a new column.
+% \begin{macrocode}
+ \global\@fcolmadefalse
+ \global\@colroom\@colht
+ \else
+% \end{macrocode}
+% If there are floats waiting for a change to be processed, the
+% situation is more difficult. In this case, we have to reduce both
+% |\@colht| and |\@colroom| by the amount of space that will be
+% needed for the footnotes from the left column. So we must check
+% whether such footnotes are present. As we have not reinserted
+% them in |\@outputdblcol|, we can check the |\footins| box.
+% \begin{macrocode}
+ \ifvoid\footins\else
+% \end{macrocode}
+% If there are some, we measure the space that will be occupied by
+% them. This measurement is not really exact. If we have a full
+% column of footnotes, it will be too high, but this does matter
+% since we need it only for an upper bound on the free space
+% available for floats.
+% \begin{macrocode}
+ \ftn@amount\ht\footins
+ \advance\ftn@amount\dp\footins
+ \advance\ftn@amount\skip\footins
+ \fi
+% \end{macrocode}
+% We then reduce the |\@colht| by this amount and again assign
+% |\@colroom| the value of |\@colht|. If no footnotes are present,
+% we subtract zero, so there is no harm in doing this operation
+% all the time.
+% \begin{macrocode}
+ \global\advance\@colht-\ftn@amount
+ \global\@colroom\@colht
+% \end{macrocode}
+% Now, we call another internal \LaTeX{} macro that will try to
+% contribute floats to the next column. It will use the register
+% |\@colht| when trying to build up a float column, which is the
+% reason for reducing this register. If it succeeds, it will set the
+% switch |\if@fcolmade| to {\tt true}, otherwise, to {\tt false}. If
+% no float column is possible, it will try to place some or all of
+% the deferred floats to the top or the bottom of the next column,
+% thereby, using and reducing the value of the register |\@colroom|.
+% \begin{macrocode}
+ \@xstartcol
+% \end{macrocode}
+% Afterwards, we have to restore the correct values for |\@colht|
+% and |\@colroom| again, but this time, they may differ, so that we
+% have to |\advance| both registers separately by |\ftn@amount|.
+% \begin{macrocode}
+ \global\advance\@colht\ftn@amount
+ \global\advance\@colroom\ftn@amount
+ \fi
+% \end{macrocode}
+% Now, after doing the things depending on the status of the
+% |\@deferlist|, we have to incorporate the left over footnotes in
+% the new column. First we check whether a float column was
+% produced by |\@xstartcol| or not.
+% \begin{macrocode}
+ \if@fcolmade
+% \end{macrocode}
+% If so, we do something awful. To make use of the |\@makecol|
+% macro, which attaches footnotes to |\box| $255$ and places the
+% result in the box register |\@outputbox|, we have to assign
+% |\@outputbox| (i.e., the result of |\@xstartcol|) to |\box|
+% $255$.\footnote{In German, we call this ``from the back through
+% the chest into the eyes''.}
+% \begin{macrocode}
+ \setbox\@cclv\box\@outputbox
+ \@makecol
+ \else
+% \end{macrocode}
+% If no float column was produced, we reinsert the held over
+% footnotes so that they can be reconsidered by the page generation
+% algorithm of \TeX. But it is necessary to ensure that this
+% operation is done only when footnotes are actually
+% present.\footnote{Otherwise, we might get an undesired extra
+% vertical space coming from {\tt\bslash skip\bslash footins}, even
+% if there are no footnotes on the page.}
+% \begin{macrocode}
+ \ifvoid\footins\else
+ \insert\footins{\unvbox\footins}\fi
+ \fi}
+% \end{macrocode}
+% \begin{macro}{\ftn@amount}
+% Of course, we also have to allocate the {\sf dimen} register. It
+% will be automatically initialized to zero.
+% \begin{macrocode}
+\newdimen\ftn@amount
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+% \begin{macro}{\@xstartcol}
+% \changes{v1.1a}{1994/01/24}{Macro reintroduced}
+% The macro |\@xtsartcol| was removed in \LaTeXe{} but we introduce
+% it here again for the moment.
+% \begin{macrocode}
+\def\@xstartcol{%
+ \@tryfcolumn \@deferlist
+ \if@fcolmade
+ \else
+ \begingroup
+ \let \@tempb \@deferlist
+ \global \let \@deferlist \@empty
+ \let \@elt \@scolelt
+ \@tempb
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@makecol}
+% The other internal macro that we have to change is |\@makecol|, a
+% macro that is called whenever one column of material is assembled
+% and column floats and footnotes have to be added. Again, we have
+% to distinguish between actions for the first and the second
+% column.
+% \begin{macrocode}
+\def\@makecol{\if@firstcolumn
+% \end{macrocode}
+% For the first column, we leave the footnotes in their box and
+% simply save the contents of box $255$ in the |\box| register
+% |\@outputbox|.
+% \begin{macrocode}
+ \setbox\@outputbox\box\@cclv
+% \end{macrocode}
+%
+% But if the user erroneously forgot to specify a twocolumn layout, we
+% will always typeset the first column, so that the footnotes are
+% never printed. Therefore we better check for this special case
+% and output the footnotes on a separate page in an
+% emergency.\footnote{Otherwise, the footnotes are held over for
+% ever, preventing \TeX{} from finishing the document successfully.
+% Instead, \TeX{} will produce infinity many empty pages at the end
+% of the document, trying in vain to output the held over
+% footnotes. This problem was found by Rainer Sch\"opf when we
+% prepared the paper for the Cork conference.}
+% \changes{v1.0c}{1990/08/24}{Introduced crude recovery if
+% twocolumn false.}
+% \changes{v1.0d}{1992/06/19}{Better help message}
+% \begin{macrocode}
+ \if@twocolumn \else
+ \ifvoid\footins \else
+ \@latexerr{ftnright package
+ used in one-column mode}%
+ {The ftnright package was designed to
+ work with LaTeX's standard^^Jtwocolumn
+ option. It does *not* work with the
+ multicol package.^^JSo please specify
+ `twocolumn' in the
+ \noexpand\documentclass command.}%
+ \shipout\box\footins \fi\fi
+% \end{macrocode}
+% What we also need to check is if there is so much footnote material that
+% it resulted in a footnote being split. If that happens the whole
+% algorithm falls apart and the footnotes get out of sync. For the
+% moment we simply detect it here, perhaps some better scheme can be
+% implemented. One way to avoid this is to allow more than |\textheight| of
+% footnotes in |\preparefootins|. However, that isn't such a good idea
+% either as that means that a footnote from column one, might end up
+% completely on a later page.
+% \changes{v1.1f}{2010/02/25}{Check for split footnotes (pr/4099)}
+% \begin{macrocode}
+ \ifnum\insertpenalties>\z@
+ \@latexerr{ftnright package
+ scrambled footnotes}%
+ {There is too much footnote material in
+ the first column and ftnright^^Jis
+ unable to cope with this.^^JYou need
+ to reduce the amount to get a properly
+ formatted page.}%
+ \fi
+ \else
+% \end{macrocode}
+% When we construct the second column, we must first check whether
+% footnotes are actually present. If not, we perform the same
+% actions as before.
+% \begin{macrocode}
+ \ifvoid\footins
+ \setbox\@outputbox\box\@cclv
+ \else
+% \end{macrocode}
+% But, if footnotes are present, it may be possible that the whole
+% column consists of footnotes, i.e., |\box| $255$ is empty. In
+% this case, there is no use in placing any glue (|\skip\footins|)
+% in front,\footnote{In fact, it would be a mistake since this glue
+% was not taken into account when the footnotes where assembled, so
+% it would produce an overfull box.} so we have to check for this
+% possibility.
+% \begin{macrocode}
+ \setbox\@outputbox\vbox
+ {\ifvoid\@cclv \else
+ \unvbox\@cclv
+ \vskip\skip\footins\fi
+% \end{macrocode}
+% But in any case, we place the |\footnoterule| in front of the
+% footnotes even if this macro is not used by this
+% package.\footnote{This decision is certainly open to criticism,
+% since there is nothing to separate. On the other hand, a rule or
+% some other ornament in front of the footnotes is part of the
+% design which should be used consistently throughout a document.
+% As a last argument in favor of the rule, consider the situation
+% where \LaTeX{} decided to place only floats and footnotes into
+% the right hand column. In this case a separator again seems
+% adequate. In this situation one can even argue that it is
+% necessary to put in the {\tt \bslash skip\.\bslash footins}.}
+% This ends the if-statement testing whether footnotes are present
+% or not. It also ends the code which differs depending on the
+% column number.
+% \changes{v1.1d}{1998/12/02}{Added the color@group macros and
+% \texttt{\protect\bslash normalcolor} to make this colorsafe}
+% \begin{macrocode}
+ \color@begingroup
+ \normalcolor
+ \footnoterule\unvbox\footins
+ \color@endgroup}\fi
+ \fi
+% \end{macrocode}
+% Now the column floats are added at the top and the bottom, and
+% the |\@outputbox| is adjusted to the full column height so that
+% the glue inside will stretch in certain situations.\footnote{It
+% is an interesting question as to whether the current layout works
+% well with bottom floats or not. Actually, I would prefer to place
+% the footnotes below the bottom floats instead of above, as it is
+% done here. At least when the floats are part of the document and
+% not puzzles thrown in. But I was too lazy to implement it
+% because I seldom use floats. If somebody implements this layout
+% (some parts of this macro have to be changed) I would be
+% interested in seeing the code and some sample results.} Again,
+% this code is copied verbatim from the original source, so I won't
+% dwell on details.\footnote{I only changed {\tt\bslash dimen128}
+% into {\tt\bslash @tempdima} which is, besides being faster and
+% shorter, only a cosmetic change. The use of this hardwired {\sf
+% dimen} register seems to indicate that this part of \LaTeX{} was
+% written very early and left unchanged since then: an interesting
+% fact for software archaeologists.}\footnote{For the \LaTeXe{}
+% upgrade I had to add the support for the
+% {\tt\string\enlargethispage} command---let's hope I did it in the
+% correct way.}
+% \changes{v1.1a}{1994/01/24}{Upgrades for LaTeX2e}
+% \begin{macrocode}
+ \xdef\@freelist{\@freelist\@midlist}%
+ \global \let \@midlist \@empty
+ \@combinefloats
+ \ifvbox\@kludgeins
+ \@makespecialcolbox
+ \else
+ \setbox\@outputbox\vbox to\@colht
+ {\boxmaxdepth\maxdepth
+ \@texttop
+ \@tempdima\dp\@outputbox
+ \unvbox\@outputbox
+ \vskip-\@tempdima
+ \@textbottom}%
+ \fi
+ \global\maxdepth\@maxdepth}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\footnotesize}
+% \changes{v1.1a}{1994/01/24}{Upgrades for LaTeX2e}
+% Now we can tackle the remaining small changes to the standard
+% layout. I decided to use a smaller size for footnotes but with a
+% slightly larger leading than usual. This means that we have to
+% redefine the |\footnotesize| macro which depends on options like
+% {\tt 11pt} etc. Fortunately, there is a simple way to find out
+% the main size of the document: the macro |\@ptsize| contains $0$,
+% $1$, or $2$ standing for $10$, $11$, or $12$ points document text
+% size.\footnote{In the new release I used the definitions from the
+% class option files \texttt{size1?.clo} and modified them
+% slightly. In the previous release there was no correction for the
+% list parameters etc., thus giving you incorrect spacing if
+% somebody used display lists in footnotes.}
+% \begin{macrocode}
+\ifcase \@ptsize
+\renewcommand\footnotesize{%
+ \@setfontsize\footnotesize\@viiipt{9.9}%
+ \abovedisplayskip 6\p@\@plus2\p@\@minus4\p@
+ \abovedisplayshortskip \z@ \@plus\p@
+ \belowdisplayshortskip
+ 3\p@\@plus\p@\@minus2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 3\p@ \@plus\p@ \@minus\p@
+ \parsep 2\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep}%
+ \belowdisplayskip \abovedisplayskip
+}
+\or
+\renewcommand\footnotesize{%
+ \@setfontsize\footnotesize\@ixpt{11.1}%
+ \abovedisplayskip 8\p@\@plus2\p@\@minus4\p@
+ \abovedisplayshortskip \z@ \@plus\p@
+ \belowdisplayshortskip
+ 4\p@ \@plus2\p@ \@minus2\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 4\p@ \@plus2\p@\@minus2\p@
+ \parsep 2\p@ \@plus\p@ \@minus\p@
+ \itemsep \parsep}%
+ \belowdisplayskip \abovedisplayskip
+}
+\or
+\renewcommand\footnotesize{%
+ \@setfontsize\footnotesize\@xpt{12.3}%
+ \abovedisplayskip10\p@\@plus2\p@\@minus5\p@
+ \abovedisplayshortskip \z@ \@plus3\p@
+ \belowdisplayshortskip
+ 6\p@ \@plus3\p@ \@minus3\p@
+ \def\@listi{\leftmargin\leftmargini
+ \topsep 6\p@ \@plus2\p@ \@minus2\p@
+ \parsep 3\p@ \@plus2\p@ \@minus\p@
+ \itemsep \parsep}%
+ \belowdisplayskip \abovedisplayskip
+}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\footnoterule}
+% Setting footnotes in smaller type and separating them with
+% sufficient space from the main text allow us to omit the
+% |\footnoterule| normally used.
+% \begin{macrocode}
+\let\footnoterule\@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\footnotesep}
+% \changes{v1.1a}{1994/01/24}{Upgrades for LaTeX2e}
+% Individual footnotes are separated from each other by a more or
+% less baseline skip of the text size. This can be specified with
+% the following code:
+% \begin{macrocode}
+\AtBeginDocument
+ {\global\footnotesep\ht\strutbox}
+% \end{macrocode}
+% The use of the \LaTeXe{} hook |\AtBeginDocument| is a big help
+% since it allows us to defer everything that might depend on user
+% setting inside the preamble to the |\begin{document}| environment
+% start.
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@makefntext}
+% And finally, a small but nice change, to the mark at the
+% beginning of the footnote text. We will place it at the baseline
+% instead of raising it as a superscript. Additionally, it will get
+% a dot as punctuation.
+% \changes{v1.0c}{1990/08/24}{Added dot as recommended by Tschichold.}
+% \changes{v1.1e}{2000/04/14}{Don't use math mode for footnote symbol
+% (pr/3172)}
+% \begin{macrocode}
+\long\def\@makefntext#1{\parindent 1em
+ \noindent\hbox to 2em{}%
+ \llap{\@thefnmark.\,\,}#1}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \section{Initialisation}
+%
+% We defined the macro |\preparefootins| above, but we also have to use
+% it to prepare typesetting the first column. As a default for the
+% separation of footnotes and text on the second column, we use the
+% following:
+% \begin{macrocode}
+\setlength{\skip\footins}
+ {10pt plus 5pt minus 3pt}
+\AtBeginDocument{\preparefootins}
+%</package>
+% \end{macrocode}
+% Of course, this value can be changed by the user as
+% described in the introduction.
+%
+% \Finale
+%
+%
+%
+
+\endinput
diff --git a/macros/latex-dev/required/tools/ftnright.pdf b/macros/latex-dev/required/tools/ftnright.pdf
new file mode 100644
index 0000000000..0a2e5747b5
--- /dev/null
+++ b/macros/latex-dev/required/tools/ftnright.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/hhline.dtx b/macros/latex-dev/required/tools/hhline.dtx
new file mode 100644
index 0000000000..1da01d757b
--- /dev/null
+++ b/macros/latex-dev/required/tools/hhline.dtx
@@ -0,0 +1,322 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: hhline.dtx Copyright (C) 1991-1994 David Carlisle
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{hhline}
+%<package> [2014/10/28 v2.03 Table rule package (DPC)]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{hhline}
+\GetFileInfo{hhline.sty}
+\begin{document}
+\title{The \textsf{hhline} package\thanks{This file
+ has version number \fileversion, last
+ revised \filedate.}}
+\author{David Carlisle}
+\date{\filedate}
+ \MaintainedByLaTeXTeam{tools}
+ \maketitle
+ \DeleteShortVerb{\|}
+ \DocInput{hhline.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \changes{v1.00}{1991/06/04}{Initial Version}
+% \changes{v2.00}{1991/11/06}
+% {Add tilde which allows \cmd\cline-like constructions.}
+% \changes{v2.01}{1992/06/26}
+% {Re-issue for the new doc and docstrip.}
+% \changes{v2.02}{1994/03/14}
+% {Update for LaTeX2e.}
+% \changes{v2.03}{1994/05/23}
+% {New style warning.}
+%
+%
+%
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% "\hhline" produces a line like "\hline", or a double line like
+% "\hline\hline", except for its interaction with vertical lines.
+% \end{abstract}
+%
+% \arrayrulewidth=1pt
+% \doublerulesep=3pt
+%
+% \section{Introduction}
+% The argument to "\hhline" is similar to the preamble of an {\tt
+% array} or {\tt tabular}. It consists of a list of tokens with the
+% following meanings:
+% \[
+% \begin{tabular}{cl}
+% "=" & A double hline the width of a column.\\
+% "-" & A single hline the width of a column.\\[10pt]
+% "~" & A column with no hline.\\[10pt]
+%
+% "|" & A vline which `cuts' through a double (or single) hline.\\
+% ":" & A vline which is broken by a double hline.\\[10pt]
+%
+% "#" & A double hline segment between two vlines.\\
+% "t" & The top half of a double hline segment.\\
+% "b" & The bottom half of a double hline segment.\\
+%
+% "*" & "*{3}{==#}" expands to "==#==#==#",
+% as in the {\tt*}-form for the preamble.
+% \end{tabular}
+% \]
+% If a double vline is specified ("||" or "::") then the hlines
+% produced by "\hhline" are broken. To obtain the effect of an hline
+% `cutting through' the double vline, use a "#" or omit the vline
+% specifiers, depending on whether or not you wish the double vline to
+% break.
+%
+% The tokens {\tt t} and {\tt b} must be used between two vertical
+% rules. "|tb|" produces the same lines as "#", but is much less
+% efficient. The main use for these are to make constructions like
+% "|t:" (top left corner) and ":b|" (bottom right corner).
+%
+% If "\hhline" is used to make a single hline, then the argument
+% should only contain the tokens "-", "~" and "|" (and
+% {\tt*}-expressions).
+%
+% An example using most of these features is:
+% \[
+% \vcenter{\hsize=2in\begin{verbatim}
+% \begin{tabular}{||cc||c|c||}
+% \hhline{|t:==:t:==:t|}
+% a&b&c&d\\
+% \hhline{|:==:|~|~||}
+% 1&2&3&4\\
+% \hhline{#==#~|=#}
+% i&j&k&l\\
+% \hhline{||--||--||}
+% w&x&y&z\\
+% \hhline{|b:==:b:==:b|}
+% \end{tabular}
+% \end{verbatim}
+% }
+% \qquad
+% \begin{tabular}{||cc||c|c||}
+% \hhline{|t:==:t:==:t|}
+% a&b&c&d\\
+% \hhline{|:==:|~|~||}
+% 1&2&3&4\\
+% \hhline{#==#~|=#}
+% i&j&k&l\\
+% \hhline{||--||--||}
+% w&x&y&z\\
+% \hhline{|b:==:b:==:b|}
+% \end{tabular}
+% \]
+%
+% The lines produced by \LaTeX's "\hline" consist of a single (\TeX\
+% primitive) "\hrule". The lines produced by "\hhline" are made
+% up of lots of small line segments. \TeX\ will place these very
+% accurately in the {\tt .dvi} file, but the program that you use to
+% print the {\tt .dvi} file may not line up these segments exactly. (A
+% similar problem can occur with diagonal lines in the {\tt picture}
+% environment.)
+%
+% If this effect causes a problem, you could try a different driver
+% program, or if this is not possible, increasing "\arrayrulewidth"
+% may help to reduce the effect.
+%
+% \StopEventually{}
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macro}{\HH@box}
+% Makes a box containing a double hline segment. The most common case,
+% both rules of length "\doublerulesep" will be stored in "\box1", this
+% is not initialised until "\hhline" is called as the user may change
+% the parameters "\doublerulesep" and "\arrayrulewidth". The two
+% arguments to "\HH@box" are the widths (ie lengths) of the top and
+% bottom rules.
+% \begin{macrocode}
+\def\HH@box#1#2{\vbox{%
+ \hrule \@height \arrayrulewidth \@width #1
+ \vskip \doublerulesep
+ \hrule \@height \arrayrulewidth \@width #2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\HH@add}
+% Build up the preamble in the register "\toks@".
+% \begin{macrocode}
+\def\HH@add#1{\toks@\expandafter{\the\toks@#1}}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\HH@xexpast}
+% \begin{macro}{\HH@xexnoop}
+% We `borrow' the version of "\@xexpast" from Mittelbach's array.sty,
+% as this allows "#" to appear in the argument list.
+% \begin{macrocode}
+\def\HH@xexpast#1*#2#3#4\@@{%
+ \@tempcnta #2
+ \toks@={#1}\@temptokena={#3}%
+ \let\the@toksz\relax \let\the@toks\relax
+ \def\@tempa{\the@toksz}%
+ \ifnum\@tempcnta >0 \@whilenum\@tempcnta >0\do
+ {\edef\@tempa{\@tempa\the@toks}\advance \@tempcnta \m@ne}%
+ \let \@tempb \HH@xexpast \else
+ \let \@tempb \HH@xexnoop \fi
+ \def\the@toksz{\the\toks@}\def\the@toks{\the\@temptokena}%
+ \edef\@tempa{\@tempa}%
+ \expandafter \@tempb \@tempa #4\@@}
+
+\def\HH@xexnoop#1\@@{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\hhline}
+% Use a simplified version of "\@mkpream" to break apart the argument
+% to "\hhline". Actually it is oversimplified, It assumes that the
+% vertical rules are at the end of the column. If you were to specify
+% "c|@{xx}|" in the array argument, then "\hhline" would not be
+% able to access the first vertical rule. (It ought to have an "@"
+% option, and add "\leaders" up to the width of a box containing the
+% "@"-expression. We use a loop made with "\futurelet" rather
+% than "\@tfor" so that we can use "#" to denote the crossing of
+% a double hline with a double vline.\\
+% "\if@firstamp" is true in the first column and false otherwise.\\
+% "\if@tempswa" is true if the previous entry was a vline
+% (":", "|" or "#").
+% \begin{macrocode}
+\def\hhline#1{\omit\@firstamptrue\@tempswafalse
+% \end{macrocode}
+% Put two rules of width "\doublerulesep" in "\box1"
+% \begin{macrocode}
+\global\setbox\@ne\HH@box\doublerulesep\doublerulesep
+% \end{macrocode}
+% If Mittelbach's {\tt array.sty} is loaded, we do not need the negative
+% "\hskip"'s around vertical rules.
+% \begin{macrocode}
+ \xdef\@tempc{\ifx\extrarowheight\HH@undef\hskip-.5\arrayrulewidth\fi}%
+% \end{macrocode}
+% Now expand the {\tt*}-forms and add dummy tokens ( "\relax" and
+% "`" ) to either end of the token list. Call "\HH@let" to start
+% processing the token list.
+% \begin{macrocode}
+ \HH@xexpast\relax#1*0x\@@\toks@{}\expandafter\HH@let\@tempa`}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\HH@let}
+% Discard the last token, look at the next one.
+% \begin{macrocode}
+\def\HH@let#1{\futurelet\@tempb\HH@loop}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\HH@loop}
+% The main loop. Note we use "\ifx" rather than "\if" in
+% version~2 as the new token "~" is active.
+% \begin{macrocode}
+\def\HH@loop{%
+% \end{macrocode}
+% If next token is "`", stop the loop and put the lines into this row
+% of the alignment.
+% \begin{macrocode}
+ \ifx\@tempb`\def\next##1{\the\toks@\cr}\else\let\next\HH@let
+% \end{macrocode}
+% "|", add a vertical rule (across either a double or
+% single hline).
+% \begin{macrocode}
+ \ifx\@tempb|\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
+ \HH@add{\@tempc\vline\@tempc}\else
+% \end{macrocode}
+% ":", add a broken vertical rule (across a double hline).
+% \begin{macrocode}
+ \ifx\@tempb:\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
+ \HH@add{\@tempc\HH@box\arrayrulewidth\arrayrulewidth\@tempc}\else
+% \end{macrocode}
+% "#", add a double hline segment between two vlines.
+% \begin{macrocode}
+ \ifx\@tempb##\if@tempswa\HH@add{\hskip\doublerulesep}\fi\@tempswatrue
+ \HH@add{\@tempc\vline\@tempc\copy\@ne\@tempc\vline\@tempc}\else
+% \end{macrocode}
+% "~", A column with no hline (this gives an effect similar to
+% \verb+\cline+).
+% \begin{macrocode}
+ \ifx\@tempb~\@tempswafalse
+ \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
+ \HH@add{\hfil}\else
+% \end{macrocode}
+% "-", add a single hline across the column.
+% \begin{macrocode}
+ \ifx\@tempb-\@tempswafalse
+ \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
+ \HH@add{\leaders\hrule\@height\arrayrulewidth\hfil}\else
+% \end{macrocode}
+% "=", add a double hline across the column.
+% \begin{macrocode}
+ \ifx\@tempb=\@tempswafalse
+ \if@firstamp\@firstampfalse\else\HH@add{&\omit}\fi
+% \end{macrocode}
+% Put in as many copies of "\box1" as possible with
+% "\leaders", this may leave gaps at the ends, so put an extra box
+% at each end, overlapping the "\leaders".
+% \begin{macrocode}
+ \HH@add
+ {\rlap{\copy\@ne}\leaders\copy\@ne\hfil\llap{\copy\@ne}}\else
+% \end{macrocode}
+% "t", add the top half of a double hline segment, in a "\rlap"
+% so that it may be used with {\tt b}.
+% \begin{macrocode}
+ \ifx\@tempb t\HH@add{\rlap{\HH@box\doublerulesep\z@}}\else
+% \end{macrocode}
+% "b", add the bottom half of a double hline segment in a "\rlap"
+% so that it may be used with {\tt t}.
+% \begin{macrocode}
+ \ifx\@tempb b\HH@add{\rlap{\HH@box\z@\doublerulesep}}\else
+% \end{macrocode}
+% Otherwise ignore the token, with a warning.
+% \begin{macrocode}
+ \PackageWarning{hhline}%
+ {\meaning\@tempb\space ignored in \noexpand\hhline argument%
+ \MessageBreak}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi
+% \end{macrocode}
+% Go around the loop again.
+% \begin{macrocode}
+ \next}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+\endinput
diff --git a/macros/latex-dev/required/tools/hhline.pdf b/macros/latex-dev/required/tools/hhline.pdf
new file mode 100644
index 0000000000..d4ccc822d4
--- /dev/null
+++ b/macros/latex-dev/required/tools/hhline.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/indentfirst.dtx b/macros/latex-dev/required/tools/indentfirst.dtx
new file mode 100644
index 0000000000..16b99653cd
--- /dev/null
+++ b/macros/latex-dev/required/tools/indentfirst.dtx
@@ -0,0 +1,77 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: indent.dtx Copyright (C) 1991-1994 David Carlisle
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{indentfirst}
+%<package> [1995/11/23 v1.03 Indent first paragraph (DPC)]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{indentfirst}
+\GetFileInfo{indentfirst.sty}
+\begin{document}
+\title{The \textsf{indentfirst} package\thanks{This file
+ has version number \fileversion, last
+ revised \filedate.}}
+\author{David Carlisle}
+\date{\filedate}
+\MaintainedByLaTeXTeam{tools}
+\maketitle
+\DocInput{indentfirst.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% \changes{v1.00}{1991/01/02}{Initial version}
+% \changes{v1.01}{1992/06/26}{Re-issue for the new doc and docstrip}
+% \changes{v1.02}{1994/01/31}{Re-issue for LaTeX2e}
+% \changes{v1.03}{1995/11/23}{Typo fixes in documentation}
+%
+% \begin{abstract}
+% Make the first line of all sections etc., be indented by the usual
+% paragraph indentation. This should work with all the standard document
+% classes.
+% \end{abstract}
+%
+% \CheckSum{4}^^A Still I think a record:-)
+%
+% \StopEventually{}
+%
+% \begin{macro}{\if@afterindent}
+% \LaTeX\ uses the switch |\if@afterindent| to decide whether to indent
+% after a section heading. We just need to make sure that this is always
+% true.
+% \begin{macrocode}
+%<*package>
+\let\@afterindentfalse\@afterindenttrue
+\@afterindenttrue
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/required/tools/indentfirst.pdf b/macros/latex-dev/required/tools/indentfirst.pdf
new file mode 100644
index 0000000000..8ac0d1f3e8
--- /dev/null
+++ b/macros/latex-dev/required/tools/indentfirst.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/layout.dtx b/macros/latex-dev/required/tools/layout.dtx
new file mode 100644
index 0000000000..848eb54fb2
--- /dev/null
+++ b/macros/latex-dev/required/tools/layout.dtx
@@ -0,0 +1,1025 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%\iffalse
+% This file is built for \LaTeXe, so we make sure an error is
+% generated when it is used with another format
+%<*dtx>
+\ProvidesFile{layout.dtx}
+%</dtx>
+%<+package>\NeedsTeXFormat{LaTeX2e}
+%<+package>\ProvidesPackage{layout}
+%<+driver>\ProvidesFile{layout.drv}
+%\ProvidesFile{layout.dtx}
+ [2014/10/28 v1.2c Show layout parameters]
+%
+% A short driver is provided that can be extracted if necessary by
+% the \textsf{DocStrip} program provided with \LaTeXe.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+
+\usepackage{layout}
+
+\newcommand\Lopt[1]{\textsf{#1}}
+\pagestyle{myheadings}
+\DisableCrossrefs
+\begin{document}
+\DocInput{layout.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%\fi
+% \changes{v1.1c}{1994/07/13}{Moved Identification code to the front
+% and removed the permanent use of \cs{filedate} and friends}
+% \changes{v1.1d}{1994/09/08}{Stored texts in control sequences to
+% allow other languages}
+%
+% \GetFileInfo{layout.dtx}
+% \title{Displaying page layout variables}
+% \author{Kent McPherson a.o.\thanks{Converted for \LaTeXe\ by
+% Johannes Braams and modified by Hideo Umeki}}
+% \date{\filedate}
+%
+% \markboth{layout package version \fileversion\space as of \filedate}
+% {layout package version \fileversion\space as of \filedate}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \section{Introduction}
+%
+% This \LaTeXe\ package is a reimplementation of
+% \texttt{layout.sty} by Kent McPherson. It defines the command
+% |\layout| which produces an overview of the layout of the current
+% document. The command |\layout*| recomputes the values it uses to
+% produce the overview.
+%
+% The figure on the next page shows the output of the |\layout|
+% command for this document.
+%
+% \begin{figure}[p]
+% \layout
+% \end{figure}
+%
+% \StopEventually{}
+%
+% \section{The implementation}
+%
+% \changes{v1.1b}{1994/03/23}{removed the \cs{wlog} as
+% \cs{ProvidesPackage} does that now}
+% \changes{v1.1d}{1994/09/08}{Added language options dutch and
+% english}
+%
+% This package prints a figure to illustrate the layout that is
+% implemented by the document class. In the figure several words
+% appear. They are stored in control sequences to be able to select
+% a different language.
+% \changes{v1.1e}{1994/10/29}{The dutch texts should be one word.}
+% \changes{v1.1f}{1995/03/14}{Added \cs{notshown}}
+% \changes{v1.1f}{1995/03/14}{Added option french}
+% \changes{v1.1j}{1995/10/29}{Added the options spanish, brazilian and
+% portuguese}
+% \changes{v1.1k}{1995/11/23}{Documentation fixes}
+% \changes{v1.2}{1998/04/13}{Redesign of the output by Hideo Umeki}
+% \changes{v1.2c}{2000/09/21}{Added option german}
+% \changes{v1.2c}{2000/09/25}{Added option for italian by Claudio Beccari}
+% \begin{macrocode}
+%<*package>
+\DeclareOption{dutch}{%
+ \def\Headertext{Kopregel}
+ \def\Bodytext{Broodtekst}
+ \def\Footertext{Voetregel}
+ \def\MarginNotestext{Marge\\Notities}
+ \def\oneinchtext{een inch}
+ \def\notshown{niet getoond}
+ }
+\DeclareOption{german}{%
+ \def\Headertext{Kopfzeile}
+ \def\Bodytext{Haupttext}
+ \def\Footertext{Fu{\ss}zeile}
+ \def\MarginNotestext{Rand-\\ notizen}
+ \def\oneinchtext{ein Zoll}
+ \def\notshown{ohne Abbildung}
+ }
+\DeclareOption{ngerman}{\ExecuteOptions{german}}
+\DeclareOption{english}{%
+ \def\Headertext{Header}
+ \def\Bodytext{Body}
+ \def\Footertext{Footer}
+ \def\MarginNotestext{Margin\\Notes}
+ \def\oneinchtext{one inch}
+ \def\notshown{not shown}
+ }
+\DeclareOption{french}{%
+ \def\Headertext{Ent\^{e}te}
+ \def\Bodytext{Corps}
+ \def\Footertext{Pied de page}
+ \def\MarginNotestext{Marge\\Notes}
+ \def\oneinchtext{un pouce}
+ \def\notshown{non affich\'{e}}
+ }
+\DeclareOption{francais}{\ExecuteOptions{french}}
+\DeclareOption{spanish}{%
+ \def\Headertext{Encabezamiento}
+ \def\Bodytext{Cuerpo}
+ \def\Footertext{Pie de p\'agina}
+ \def\MarginNotestext{Notas\\ Marginales}
+ \def\oneinchtext{una pulgada}
+ \def\notshown{no mostradas}
+ }
+\DeclareOption{portuguese}{%
+ \def\Headertext{Cabe\c{c}alho}
+ \def\Bodytext{Corpo}
+ \def\Footertext{Rodap\'e}
+ \def\MarginNotestext{Notas\\ Marginais}
+ \def\oneinchtext{uma polegada}
+ \def\notshown{n\~ao mostradas}
+ }
+\DeclareOption{brazilian}{%
+ \def\Headertext{Cabe\c{c}alho}
+ \def\Bodytext{Corpo}
+ \def\Footertext{Rodap\'e}
+ \def\MarginNotestext{Notas\\ Marginais}
+ \def\oneinchtext{uma polegada}
+ \def\notshown{n\~ao mostradas}
+ }
+\DeclareOption{italian}{%
+ \def\Headertext{Testatina}
+ \def\Bodytext{Corpo}
+ \def\Footertext{Piedino}
+ \def\MarginNotestext{Note\\ Marginali}
+ \def\oneinchtext{un pollice}
+ \def\notshown{non mostrato}
+ }
+% \end{macrocode}
+%
+% This package has an option \Lopt{verbose}. Using it will make the
+% command |\layout| type some of the parameters on the terminal.
+% \begin{macrocode}
+\DeclareOption{verbose}{\let\LayOuttype\typeout}
+\DeclareOption{silent}{\let\LayOuttype\@gobble}
+% \end{macrocode}
+%
+% \changes{v1.1h}{1995/04/07}{Added the options \Lopt{integers}
+% (default) and \Lopt{reals}}
+%
+% The normal behaviour of this package when showing the values of
+% the parameters is to truncate them. However, if you want to see
+% the real parameter values you can use the option \Lopt{reals} to
+% get that effect.
+% \changes{v1.1i}{1995/06/25}{\LaTeX\ release 1995/06/01 no longer
+% needs double hashmarks in the argument of \cs{DeclareOption}}
+% \begin{macrocode}
+\def\lay@value{}
+\DeclareOption{integers}{%
+ \renewcommand*{\lay@value}[2]{%
+ \expandafter\number\csname #1@#2\endcsname pt}}
+\DeclareOption{reals}{%
+ \renewcommand*{\lay@value}[2]{\the\csname #2\endcsname}}
+% \end{macrocode}
+%
+% The default language is English, the default mode is
+% \Lopt{silent} and the default way of showing parameter values is
+% to use integers.
+% \begin{macrocode}
+\ExecuteOptions{english,silent,integers}
+\ProcessOptions
+% \end{macrocode}
+%
+% \begin{macro}{\LayOutbs}
+% Define |\LayOutbs| to produce a backslash. We use a definition
+% which also works with OT1 fonts.
+% \changes{v1.2b}{1998/06/21}{Renamed \cs{bs} to avoid possible conflicts
+% with other packages}
+% \begin{macrocode}
+\newcommand\LayOutbs{}
+\chardef\LayOutbs`\\
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ConvertToCount}
+% This macro stores the value of a \emph{length} register in a
+% \emph{count} register.
+% \begin{macrocode}
+\def\ConvertToCount#1#2{%
+% \end{macrocode}
+% First copy the value
+% \begin{macrocode}
+ #1=#2
+% \end{macrocode}
+% Then divide it by 65536.
+% \begin{macrocode}
+ \divide #1 by 65536}
+% \end{macrocode}
+% The result of this is that the \emph{count} register holds the
+% value of the \emph{length} register in points.
+% \end{macro}
+%
+% \begin{macro}{\SetToHalf}
+% \begin{macro}{\SetToQuart}
+% Small macros used in computing positions.
+% \begin{macrocode}
+\def\SetToHalf#1#2{#1=#2\relax\divide#1by\tw@}
+\def\SetToQuart#1#2{#1=#2\relax\divide#1by4}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Identify}
+% A small macro used in identifying dimensions.
+% \begin{macrocode}
+\def\Identify#1{%
+ \put(\PositionX,\PositionY){\circle{20}}
+ \put(\PositionX,\PositionY){\makebox(0,0){\tiny #1}}
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\InsideHArrow}
+% This macro is used to produce two horizontal arrows inside a box.
+% The argument gives the width of the box.
+% \changes{v1.1c}{1994/07/14}{Added check for a negative arrow length}
+% \begin{macrocode}
+\def\InsideHArrow#1{{%
+ \ArrowLength = #1
+ \divide\ArrowLength by \tw@
+ \advance\ArrowLength by -10
+ \advance\PositionX by -10
+ \ifnum\ArrowLength<\z@
+ \put(\PositionX,\PositionY){\vector(1,0){-\ArrowLength}}
+ \advance\PositionX by 20
+ \put(\PositionX,\PositionY){\vector(-1,0){-\ArrowLength}}
+ \else
+ \put(\PositionX,\PositionY){\vector(-1,0){\ArrowLength}}
+ \advance\PositionX by 20
+ \put(\PositionX,\PositionY){\vector(+1,0){\ArrowLength}}
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\InsideVArrow}
+% This macro is used to produce two vertical arrows inside a box.
+% The argument gives the height of the box.
+% \begin{macrocode}
+\def\InsideVArrow#1{{%
+ \ArrowLength = #1
+ \divide\ArrowLength by \tw@
+ \advance\ArrowLength by -10
+ \advance\PositionY by -10
+ \put(\PositionX,\PositionY){\vector(0,-1){\ArrowLength}}
+ \advance\PositionY by 20
+ \put(\PositionX,\PositionY){\vector(0,+1){\ArrowLength}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\OutsideHArrow}
+% This macro is used to produce two horizontal arrows to delimit a
+% length. The first argument is the position for the right arrow,
+% the second argument gives the length and the third specifies the
+% length of the arrows.
+% \begin{macrocode}
+\def\OutsideHArrow#1#2#3{{%
+ \PositionX = #1
+ \advance\PositionX by #3
+ \put(\PositionX,\PositionY){\vector(-1,0){#3}}
+ \PositionX = #1 \advance\PositionX-#2
+ \advance\PositionX by -#3
+ \put(\PositionX,\PositionY){\vector(+1,0){#3}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\OutsideVArrow}
+% This macro is used to produce two vertical arrows to delimit a
+% length. The first argument is the position for the lower arrow,
+% the second argument gives the length and the third and fourth
+% specify the lenghts of the lower and upper arrow.
+% \begin{macrocode}
+\def\OutsideVArrow#1#2#3#4{{%
+ \PositionY = #1
+ \advance\PositionY by -#3
+ \put(\PositionX,\PositionY){\vector(0,+1){#3}}
+ \PositionY = #1
+ \advance\PositionY#2
+ \advance\PositionY#4
+ \put(\PositionX,\PositionY){\vector(0,-1){#4}}
+}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Show}
+% \changes{v1.1g}{1995/04/03}{Simplified the definition, now show
+% complete value}
+% \changes{v1.1h}{1995/04/07}{Use \cs{lay@value} to show the value
+% because of the option which decides which of two ways of doing it
+% should be used}
+%
+% Macro used in the table that shows the setting of the parameters.
+% \begin{macrocode}
+\def\Show#1#2{\LayOutbs #2 = \lay@value{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Type}
+% \changes{v1.1g}{1995/04/03}{Simplified the definition, now show
+% complete value}
+% \changes{v1.1h}{1995/04/07}{Use \cs{lay@value} to show the value
+% because of the option which decides which of two ways of doing it
+% should be used}
+% \changes{v1.2b}{1998/06/21}{Renamed \cs{type} to \cs{LayOuttype}
+% to avoid possible conflicts with other packages}
+%
+% Macro used to show a setting of a parameter on the terminal.
+% \begin{macrocode}
+\def\Type#1#2{%
+ \LayOuttype{#2 = \lay@value{#1}{#2}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\oneinch}
+% A constant, giving the length of an inch in points (approximately)
+% \begin{macrocode}
+\newcount\oneinch
+\oneinch=72
+% \end{macrocode}
+% \end{macro}
+%
+% Because the overview of the layout is produced in a figure
+% environment we need to allocate a number of counters that are
+% used to store the values of various dimensions.
+%
+% \begin{macro}{\cnt@paperwidth}
+% \begin{macro}{\cnt@paperheight}
+% The dimensions of the paper
+% \begin{macrocode}
+\newcount\cnt@paperwidth
+\newcount\cnt@paperheight
+\ConvertToCount\cnt@paperwidth\paperwidth
+\ConvertToCount\cnt@paperheight\paperheight
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@hoffset}
+% \begin{macro}{\cnt@voffset}
+% the offsets,
+% \begin{macrocode}
+\newcount\cnt@hoffset
+\newcount\cnt@voffset
+\ConvertToCount\cnt@hoffset\hoffset
+\ConvertToCount\cnt@voffset\voffset
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@textheight}
+% \begin{macro}{\cnt@textwidth}
+% dimensions of the text area,
+% \begin{macrocode}
+\newcount\cnt@textheight
+\newcount\cnt@textwidth
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@topmargin}
+% \begin{macro}{\cnt@oddsidemargin}
+% \begin{macro}{\cnt@evensidemargin}
+% margins,
+% \begin{macrocode}
+\newcount\cnt@topmargin
+\newcount\cnt@oddsidemargin
+\newcount\cnt@evensidemargin
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@headheight}
+% \begin{macro}{\cnt@headsep}
+% dimensions of the running heads,
+% \begin{macrocode}
+\newcount\cnt@headheight
+\newcount\cnt@headsep
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@marginparsep}
+% \begin{macro}{\cnt@marginparwidth}
+% \begin{macro}{\cnt@marginparpush}
+% marginal paragraphs,
+% \begin{macrocode}
+\newcount\cnt@marginparsep
+\newcount\cnt@marginparwidth
+\newcount\cnt@marginparpush
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\cnt@footskip}
+% the distance between the running footers and the text,
+% \begin{macrocode}
+\newcount\cnt@footskip
+% \end{macrocode}
+% \end{macro}
+% and the height of the footers, which is needed here to display a
+% box, but which isn't used by \LaTeX.
+% \begin{macro}{\fheight}
+% \begin{macrocode}
+\newcount\fheight
+\fheight=12
+% \end{macrocode}
+% \end{macro}
+%
+% Apart from integer representations of the page layout parameters
+% we also need registers to store reference values in.
+%
+% \begin{macro}{\ref@top}
+% The position of the top of the `printable area' is
+% one inch below the top of the paper by default. The value of
+% |\ref@top| is relative to the lower left corner of the picture
+% environment that will be used.
+%
+% \begin{macrocode}
+\newcount\ref@top
+\ref@top=\cnt@paperheight \advance\ref@top by -\oneinch
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref@hoffset}
+% \begin{macro}{\ref@voffset}
+% For the offsets,
+% \begin{macrocode}
+\newcount\ref@hoffset
+\newcount\ref@voffset
+% \end{macrocode}
+% The |\hoffset| and |\voffset| values are added to the default
+% offset of one inch.
+% \begin{macrocode}
+\ref@hoffset=\cnt@hoffset \advance\cnt@hoffset by \oneinch
+\ref@voffset=\cnt@voffset
+% \end{macrocode}
+%
+% |\cnt@voffset| is converted to be relative to the origin of the
+% picture.
+% \begin{macrocode}
+\cnt@voffset=\ref@top
+\advance\cnt@voffset by -\ref@voffset
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\ref@head}
+% and the text areas, running heads,
+% \begin{macrocode}
+\newcount\ref@head
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref@body}
+% body of the text
+% \begin{macrocode}
+\newcount\ref@body
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref@foot}
+% and running footers.
+% \begin{macrocode}
+\newcount\ref@foot
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ref@margin}
+% \begin{macro}{\ref@marginwidth}
+% \begin{macro}{\ref@marginpar}
+% These are different for even and odd pages, so they are computed
+% by |\layout|.
+% \begin{macrocode}
+\newcount\ref@margin
+\newcount\ref@marginwidth
+\newcount\ref@marginpar
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% The following are a number of scratch registers, used in the
+% positioning of the various pices of the picture.
+% \begin{macrocode}
+\newcount\Interval
+\newcount\ExtraYPos
+\newcount\PositionX
+\newcount\PositionY
+\newcount\ArrowLength
+% \end{macrocode}
+%
+% \begin{macro}{\lay@getvalues}
+% \changes{v1.1j}{1995/10/30}{Added macro to compute values at later
+% time}
+% All values that might change during the document are computed by
+% calling the macro |\lay@getvalues|. By default this macro is
+% executed at |\begin{document}|.
+% \begin{macrocode}
+\def\lay@getvalues{%
+ \ConvertToCount\cnt@textheight\textheight
+ \ConvertToCount\cnt@textwidth\textwidth
+ \ConvertToCount\cnt@topmargin\topmargin
+ \ConvertToCount\cnt@oddsidemargin\oddsidemargin
+ \ConvertToCount\cnt@evensidemargin\evensidemargin
+ \ConvertToCount\cnt@headheight\headheight
+ \ConvertToCount\cnt@headsep\headsep
+ \ConvertToCount\cnt@marginparsep\marginparsep
+ \ConvertToCount\cnt@marginparwidth\marginparwidth
+ \ConvertToCount\cnt@marginparpush\marginparpush
+ \ConvertToCount\cnt@footskip\footskip
+ \ref@head=\ref@top
+ \advance\ref@head by -\ref@voffset
+ \advance\ref@head by -\cnt@topmargin
+ \advance\ref@head by -\cnt@headheight
+ \ref@body=\ref@head
+ \advance\ref@body by -\cnt@headsep
+ \advance\ref@body by -\cnt@textheight
+ \ref@foot=\ref@body
+ \advance\ref@foot by -\cnt@footskip
+ }
+\AtBeginDocument{\lay@getvalues}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\computevalues}
+%
+% \begin{macro}{\layout}
+% \begin{macro}{\layout*}
+% The command |\layout| makes the picture and table that display
+% the current settings of the layout parameters.
+%
+% \changes{v1.1b}{1994/03/23}{Produce two pages in twoside mode}
+% \changes{v1.1j}{1995/10/30}{Added \cs{layout*}}
+% \begin{macrocode}
+\newcommand\layout{%
+ \@ifstar{\lay@getvalues\lay@xlayout}{\lay@xlayout}}
+\def\lay@xlayout{%
+ \lay@layout
+ \if@twoside
+ \lay@layout
+ \fi}
+% \end{macrocode}
+%
+% \begin{macro}{\lay@layout}
+% The internal macro |\lay@layout| does all the dirty work.
+% \begin{macrocode}
+\newcommand\lay@layout{%
+ \thispagestyle{empty}
+% \end{macrocode}
+%
+% The actions of |\layout| depend on the pagestyle.
+% \begin{macrocode}
+ \if@twoside
+ \ifodd\count\z@
+% \end{macrocode}
+%
+% Here we deal with an odd page in the twosided case.
+%
+% \begin{macrocode}
+ \typeout{Two-sided document style, odd page.}
+% \end{macrocode}
+%
+% So we compute |\ref@marginwidth|, |\ref@marginpar| and
+% |\ref@margin|.
+% \changes{v1.1}{1994/02/23}{Added check for reversemargin}
+% \begin{macrocode}
+ \ref@marginwidth=\cnt@oddsidemargin
+ \ref@marginpar=\oneinch
+ \advance\ref@marginpar by \ref@hoffset
+ \advance\ref@marginpar by \cnt@oddsidemargin
+ \ref@margin\ref@marginpar
+ \if@reversemargin
+ \advance\ref@marginpar by -\cnt@marginparsep
+ \advance\ref@marginpar by -\cnt@marginparwidth
+ \else
+ \advance\ref@marginpar by \cnt@textwidth
+ \advance\ref@marginpar by \cnt@marginparsep
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+%
+% Here we deal with an even page in the twosided case.
+%
+% \begin{macrocode}
+ \typeout{Two-sided document style, even page.}
+% \end{macrocode}
+%
+% So we compute |\ref@marginwidth|, |\ref@marginpar| and
+% |\ref@margin|.
+% \changes{v1.1}{1994/02/23}{Added check for reversemargin}
+% \begin{macrocode}
+ \ref@marginwidth=\cnt@evensidemargin
+ \ref@marginpar=\oneinch
+ \advance\ref@marginpar by \ref@hoffset
+ \advance\ref@marginpar by \cnt@evensidemargin
+ \ref@margin\ref@marginpar
+ \if@reversemargin
+ \advance\ref@marginpar by \cnt@textwidth
+ \advance\ref@marginpar by \cnt@marginparsep
+ \else
+ \advance\ref@marginpar by -\cnt@marginparsep
+ \advance\ref@marginpar by -\cnt@marginparwidth
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \else
+% \end{macrocode}
+%
+% Finally we the case for single sided printing.
+%
+% \changes{v1.1}{1994/02/23}{Added check for reversemargin}
+% \begin{macrocode}
+ \typeout{One-sided document style.}
+ \ref@marginwidth=\cnt@oddsidemargin
+ \ref@marginpar=\oneinch
+ \advance\ref@marginpar by \ref@hoffset
+ \advance\ref@marginpar by \cnt@oddsidemargin
+ \ref@margin\ref@marginpar
+ \if@reversemargin
+ \advance\ref@marginpar by -\cnt@marginparsep
+ \advance\ref@marginpar by -\cnt@marginparwidth
+ \else
+ \advance\ref@marginpar by \cnt@textwidth
+ \advance\ref@marginpar by \cnt@marginparsep
+ \fi
+ \fi
+% \end{macrocode}
+%
+%
+% Now we begin the picture environment; dividing all the lengths by
+% two is done by setting |\unitlength| to \texttt{0.5pt}
+% \begin{macrocode}
+ \setlength{\unitlength}{.5pt}
+ \begin{picture}(\cnt@paperwidth,\cnt@paperheight)
+ \centering
+ \thicklines
+% \end{macrocode}
+%
+% First we have the pagebox and reference lines,
+%
+% \begin{macrocode}
+ \put(0,0){\framebox(\cnt@paperwidth,\cnt@paperheight){\mbox{}}}
+ \put(0,\cnt@voffset){\dashbox{10}(\cnt@paperwidth,0){\mbox{}}}
+ \put(\cnt@hoffset,0){\dashbox{10}(0,\cnt@paperheight){\mbox{}}}
+% \end{macrocode}
+%
+% then the header,
+%
+% \begin{macrocode}
+ \put(\ref@margin,\ref@head){%
+ \framebox(\cnt@textwidth,\cnt@headheight)%
+ {\footnotesize\Headertext}}
+% \end{macrocode}
+%
+% the body of the text area,
+%
+% \begin{macrocode}
+ \put(\ref@margin,\ref@body){%
+ \framebox(\cnt@textwidth,\cnt@textheight){\Bodytext}}
+% \end{macrocode}
+%
+% the footer
+%
+% \begin{macrocode}
+ \put(\ref@margin,\ref@foot){%
+ \framebox(\cnt@textwidth,\fheight){\footnotesize\Footertext}}
+% \end{macrocode}
+%
+% and the space for marginal notes.
+%
+% \begin{macrocode}
+ \put(\ref@marginpar,\ref@body){%
+ \framebox(\cnt@marginparwidth,\cnt@textheight)%
+ {\footnotesize\shortstack{\MarginNotestext}}}
+% \end{macrocode}
+%
+% Then we start putting in `arrows' to mark the various parameters.
+% From here we use |\thinlines|.
+% \begin{macrocode}
+ \thinlines
+% \end{macrocode}
+%
+% |\PositionX| and |\PositionY| will be the coordinates of the center of
+% the arrow displaying |\textwidth|.
+% \begin{macrocode}
+ \SetToHalf\PositionX\cnt@textwidth
+ \advance\PositionX by \ref@margin
+% \end{macrocode}
+% The arrow should be a bit above the bottom of the `body box'.
+% \begin{macrocode}
+ \PositionY = \ref@body
+ \advance\PositionY by 50
+% \end{macrocode}
+% An identifying number is put here, in a circle.
+% \begin{macrocode}
+ \Identify{8}
+% \end{macrocode}
+% Then the arrow is drawn.
+% \begin{macrocode}
+ \InsideHArrow\cnt@textwidth
+% \end{macrocode}
+%
+% Now the |\textheight|
+% \begin{macrocode}
+ \SetToHalf\PositionY\cnt@textheight
+ \advance\PositionY by \ref@body
+% \end{macrocode}
+%
+% The x-position of the arrow is at $4/5$ of the width of the `body
+% box'.
+% \begin{macrocode}
+ \PositionX = \cnt@textwidth
+ \divide\PositionX by 5
+ \multiply \PositionX by 4
+ \advance\PositionX by \ref@margin
+% \end{macrocode}
+%
+% An identifying number is put here, in a circle.
+% \begin{macrocode}
+ \Identify{7}
+ \InsideVArrow\cnt@textheight
+% \end{macrocode}
+%
+%
+% The |\hoffset|,
+% \changes{v1.2}{1998/04/13}{\cs{PositionY} for label 1 is
+% fixed at 50}
+% \begin{macrocode}
+ \PositionY = 50
+ \SetToHalf\PositionX\cnt@hoffset
+ \Identify{1}
+ \InsideHArrow\cnt@hoffset
+% \end{macrocode}
+%
+%
+% The width of the margin.
+% \changes{v1.2}{1998/04/13}{The direction of the arrows should be
+% switched by the sign of \cs{oddsidemargin}}
+% \begin{macrocode}
+ \SetToQuart\PositionY\cnt@textheight
+ \advance\PositionY by \ref@body
+ \ifnum\ref@marginwidth > 0
+ \OutsideHArrow\ref@margin\ref@marginwidth{20}
+ \PositionX = \cnt@hoffset
+ \else
+ \OutsideHArrow\cnt@hoffset{-\ref@marginwidth}{20}
+ \PositionX = \ref@margin
+ \fi
+ \advance\PositionX by -30
+ \Identify{3}
+% \end{macrocode}
+%
+% the |\marginparwidth|,
+% \begin{macrocode}
+ \SetToQuart\PositionY\cnt@textheight
+ \advance\PositionY by \ref@body
+% \end{macrocode}
+% This arrow has to be bit below the one for the |\oddsidemargin|
+% or\\ |\evensidemargin|.
+% \begin{macrocode}
+ \advance\PositionY by 30
+ \SetToHalf\PositionX\cnt@marginparwidth
+ \advance\PositionX by \ref@marginpar
+ \Identify{10}
+ \InsideHArrow\cnt@marginparwidth
+% \end{macrocode}
+%
+%
+% The |\marginparsep|, this depends on single or double sided
+% printing.
+% \begin{macrocode}
+ \advance\PositionY by 30
+ \if@twoside
+% \end{macrocode}
+%
+% Twosided mode, reversemargin;
+% \changes{v1.1b}{1994/03/23}{\cs{OutSideHArrow} should be
+% \cs{OutsideHArrow}}
+% \changes{v1.2}{1998/04/13}{Added check for reversemargin}
+% \begin{macrocode}
+ \if@reversemargin
+ \ifodd\count\z@
+ \OutsideHArrow\ref@margin\cnt@marginparsep{20}
+ \PositionX = \ref@margin
+ \else
+ \OutsideHArrow\ref@marginpar\cnt@marginparsep{20}
+ \PositionX = \ref@marginpar
+ \fi
+ \else
+% \end{macrocode}
+% Not reversemargin;
+% \begin{macrocode}
+ \ifodd\count\z@
+ \OutsideHArrow\ref@marginpar\cnt@marginparsep{20}
+ \PositionX = \ref@marginpar
+ \else
+ \OutsideHArrow\ref@margin\cnt@marginparsep{20}
+ \PositionX = \ref@margin
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+%
+% Single sided mode.
+% \changes{v1.2}{1998/04/13}{Added check for reversemargin}
+% \begin{macrocode}
+ \if@reversemargin
+ \OutsideHArrow\ref@margin\cnt@marginparsep{20}
+ \PositionX = \ref@margin
+ \else
+ \OutsideHArrow\ref@marginpar\cnt@marginparsep{20}
+ \PositionX = \ref@marginpar
+ \fi
+ \fi
+% \end{macrocode}
+% \changes{v1.2}{1998/04/13}{The \cs{PositionX} of the label 9 is
+% changed to the left side of the arrows}
+% \begin{macrocode}
+ \advance\PositionX by -\cnt@marginparsep
+ \advance\PositionX by -30
+ \Identify{9}
+% \end{macrocode}
+%
+% Identify the |\footskip|. The arrow will be located on $1/8$th of
+% the |\textwidth|.
+% \changes{v1.2}{1998/04/13}{The \cs{PositionY} of the label 11 is
+% changed to the upper side of the arrows}
+% \begin{macrocode}
+ \PositionX = \cnt@textwidth
+ \divide\PositionX by 8
+ \advance\PositionX by \ref@margin
+ \OutsideVArrow\ref@foot\cnt@footskip{20}{20}
+ \PositionY = \ref@foot
+ \advance\PositionY by \cnt@footskip
+ \advance\PositionY by 30
+ \Identify{11}
+% \end{macrocode}
+%
+% Identify the |\voffset|. The arrow will be located a bit to the
+% left of the edge of the paper.
+% \begin{macrocode}
+ \PositionX = \cnt@paperwidth
+ \advance\PositionX by -50
+ \PositionY = \cnt@paperheight
+ \ExtraYPos = \PositionY
+ \advance\ExtraYPos by -\cnt@voffset
+ \advance\PositionY by \cnt@voffset
+ \divide\PositionY by \tw@
+ \Identify{2}
+ \InsideVArrow\ExtraYPos
+% \end{macrocode}
+%
+% Identify |\topmargin|, |\headheight| and |\headsep|.
+%
+% The arrows will be located on $1/8$th of the |\textwidth|, with
+% intervals of the same size, stored in |\Interval|.
+% \begin{macrocode}
+ \Interval = \cnt@textwidth
+ \divide\Interval by 8
+ \PositionX = \ref@margin
+ \advance\PositionX by \Interval
+% \end{macrocode}
+% First the |\topmargin|. If |\topmargin| has a positive value, the
+% arrow is upward. Otherwise, it is downward. The number label is
+% always placed at the base of the arrow.
+% \changes{v1.2}{1998/04/13}{The direction of the arrows should be
+% switched by the sign of \cs{topmargin}}
+% \begin{macrocode}
+ \ifnum\cnt@topmargin > \z@
+ \ExtraYPos = \ref@head
+ \advance\ExtraYPos\cnt@headheight
+ \OutsideVArrow\ExtraYPos\cnt@topmargin{20}{20}
+ \PositionY = \ExtraYPos
+ \advance\PositionY by \cnt@topmargin
+ \else
+ \ExtraYPos = \cnt@voffset
+ \OutsideVArrow\ExtraYPos{-\cnt@topmargin}{20}{20}
+ \PositionY = \ExtraYPos
+ \advance\PositionY by -\cnt@topmargin
+ \fi
+ \advance\PositionY by 30
+ \Identify{4}
+ \advance\PositionX by \Interval
+% \end{macrocode}
+% Then the |\headheight|
+% \changes{v1.2}{1998/04/13}{The \cs{PositionY} of the label 5 is
+% fixed}
+% \begin{macrocode}
+ \OutsideVArrow\ref@head\cnt@headheight{20}{20}
+ \PositionY = \ref@head
+ \advance\PositionY by \cnt@headheight
+ \advance\PositionY by 30
+ \Identify{5}
+ \advance\PositionX by \Interval
+% \end{macrocode}
+% and finally the |\headsep|
+% \changes{v1.2}{1998/04/13}{The \cs{PositionY} of the label 6 is
+% fixed}
+% \begin{macrocode}
+ \ExtraYPos=\ref@body
+ \advance\ExtraYPos\cnt@textheight
+ \OutsideVArrow\ExtraYPos\cnt@headsep{20}{20}
+ \PositionY = \ref@body
+ \advance\PositionY by \cnt@textheight
+ \advance\PositionY by -30
+ \Identify{6}
+% \end{macrocode}
+%
+% Here we can end the picture environment and insert a little
+% space.
+% \begin{macrocode}
+ \end{picture}
+
+ \medskip
+% \end{macrocode}
+%
+% Below the picture we put a table to show the actual values of the
+% parameters. Note that fractional points are truncated, i.e.,
+% \texttt{72.27pt} is displayed as \texttt{72pt}
+%
+% The table is typeset inside a box with a depth of 0 to always
+% keep it on the same page as the picture.
+% \changes{v1.1b}{1994/03/23}{Showing oddside and evenside margins was
+% defective}
+% \changes{v1.1c}{1994/07/14}{in compatibility mode \cs{footnotesize}
+% calls \cs{normalfont}; therefore we need to switch to a tt font
+% later}
+% \changes{v1.1f}{1995/03/14}{introduced \cs{notshown}}
+% \begin{macrocode}
+ \vtop to 0pt{%
+ \@minipagerestore\footnotesize\ttfamily
+ \begin{tabular}{@{}rl@{\hspace{20pt}}rl}
+ 1 & \oneinchtext\ + \LayOutbs\texttt{hoffset}
+ & 2 & \oneinchtext\ + \LayOutbs\texttt{voffset} \\
+ 3 & \if@twoside
+ \ifodd\count\z@ \Show{cnt}{oddsidemargin}
+ \else \Show{cnt}{evensidemargin}
+ \fi
+ \else
+ \Show{cnt}{oddsidemargin}
+ \fi & 4 & \Show{cnt}{topmargin} \\
+ 5 & \Show{cnt}{headheight} & 6 & \Show{cnt}{headsep} \\
+ 7 & \Show{cnt}{textheight} & 8 & \Show{cnt}{textwidth} \\
+ 9 & \Show{cnt}{marginparsep}&10& \Show{cnt}{marginparwidth} \\
+ 11& \Show{cnt}{footskip} & & \Show{cnt}{marginparpush}
+ \rlap{(\notshown)}\\
+ & \Show{ref}{hoffset} & & \Show{ref}{voffset} \\
+ & \Show{cnt}{paperwidth} & & \Show{cnt}{paperheight} \\
+
+ \end{tabular}\vss}
+% \end{macrocode}
+% When the option \Lopt{verbose} was used the following lines will
+% show dimensions on the terminal.
+% \begin{macrocode}
+ \Type{ref}{hoffset}
+ \Type{ref}{voffset}
+ \Type{cnt}{textheight}
+ \Type{cnt}{textwidth}
+% \end{macrocode}
+% Finally we start a new page.
+% \begin{macrocode}
+ \newpage
+}
+%</package>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \Finale
+\endinput
diff --git a/macros/latex-dev/required/tools/layout.pdf b/macros/latex-dev/required/tools/layout.pdf
new file mode 100644
index 0000000000..2c06d2b63c
--- /dev/null
+++ b/macros/latex-dev/required/tools/layout.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/longtable.dtx b/macros/latex-dev/required/tools/longtable.dtx
new file mode 100644
index 0000000000..9a3b5c03b8
--- /dev/null
+++ b/macros/latex-dev/required/tools/longtable.dtx
@@ -0,0 +1,2154 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: longtable.dtx Copyright (C) 1990-2019 David Carlisle
+%
+%<*dtx>
+ \ProvidesFile{longtable.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<package>\ProvidesPackage{longtable}
+%<driver> \ProvidesFile{longtable.drv}
+% \fi
+% \ProvidesFile{longtable.dtx}
+ [2019/02/06 v4.12 Multi-page Table package (DPC)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{longtable}
+\begin{document}
+\DocInput{longtable.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{longtable.dtx}
+% \title{The \textsf{longtable} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle\thanks{The new algorithm for aligning `chunks'
+% of a table used in version 4 of this package was devised coded
+% and documented by David Kastrup.}}
+% \date{\filedate}
+%
+% \let\package\textsf
+% \let\env\textsf
+% \providecommand\finalclearpage{\clearpage}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \begin{abstract}
+% This package defines the \env{longtable} environment, a multi-page
+% version of \env{tabular}.
+% \end{abstract}
+%
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \changes{v0.00}{1989/11/06}
+% {`Version 0' distributed as longtab.sty
+% always used just one chunk for the whole table}
+%
+% \changes{v1.00}{1990/12/20}
+% {Initial version}
+%
+% \changes{v2.00}{1991/06/17}
+% {Support NFSS and array.sty}
+%
+% \changes{v3.00}{1992/03/16}
+% {New implementation. tables may now start anywhere on the page.}
+%
+% \changes{v3.01}{1992/04/06}
+% {(Michel Goossens) If a chunk ends on a line in which the first
+% entry is empty, weird errors occur. Added special begin and end
+% groups, (\cs{ifnum}0 ) stuff as explained in Appendix D.}
+%
+% \changes{v3.02}{1992/04/09}
+% {(Michel Goossens) Longtable fails if the table counter is reset
+% during a document. Now use an internal counter, but still
+% increment table so \cs{caption} and \cs{label} work out right.}
+%
+% \changes{v3.03}{1992/06/25}
+% {Add \cs{@ifundefined\{reset@font\}} so that the documentation may
+% be processed with old versions of \LaTeX.}
+% \changes{v3.03}{1992/06/25}
+% {Modify the treatment of \cs{d@llar} to match the new versions of
+% Mittelbach's array.sty (array.sty v2.0h)}
+%
+% \changes{v3.04}{1992/11/12}
+% {(Jean-Pierre Drucbert) Longtable failed when used with
+% \cs{includeonly}.}
+% \changes{v3.04}{1992/11/12}
+% {Fix bug which stopped \cs{kill} working correctly in headings.}
+% \changes{v3.04}{1992/11/12}
+% {(Graham Gough) Made \cs{setlongtables} issue a warning message.}
+% \changes{v3.04}{1992/11/12}
+% {(Sebastian Rahtz) longtable ran out of memory on really long
+% tables. Another bug introduced in V3.}
+%
+% \changes{v3.05}{1992/11/20}
+% {(Juergen Peus) Table was hard coded into the captions, Now the
+% captions use \cs{fnum@table}, so \cs{tablename} will be used.}
+%
+% \changes{v3.06}{1993/01/21}
+% {(Ingo Hoffmann) longtable fails with letter style.
+% The table counter is not defined, and the .aux file is not used in
+% the same way. This version will use a .lta file for letter style.}
+%
+% \changes{v3.07}{1993/06/09}
+% {Allow the \LaTeX\ syntax \cs{setcounter}\{LTchunksize\}\{10\}}
+%
+% \changes{v3.08}{1993/06/09}
+% {Update for \LaTeXe}
+%
+% \changes{v3.09}{1994/03/15}
+% {New ltxdoc style}
+%
+% \changes{v3.11}{1994/05/22}
+% {Option handling added, new style errors and warnings}
+%
+% \changes{v3.12}{1994/06/30}
+% {Remove special letter class handling from v3.06, not needed for
+% new letter class}
+%
+% \changes{v4.00}{1996/04/08}
+% {(DK) New algorithm to align chunks devised and coded by David
+% Kastrup}
+%
+% \changes{v4.02}{1996/04/16}
+% {(DPC/DK) documentation improvements}
+%
+% \changes{v4.06}{1997/06/28}
+% {(DK) new email address}
+%
+%
+%
+% \makeatletter
+% \def\@oddfoot{\normalfont\rmfamily\dotfill Page \thepage\dotfill}
+% \def\@oddhead{\dotfill{\normalfont\ttfamily longtable.sty}\dotfill}
+% \def\ps@titlepage{\let\@oddhead\@empty}
+% \makeatother
+%
+%
+% \setlength\LTleft\parindent
+% \setlength\LTright\fill
+% \setcounter{LTchunksize}{10}
+%
+% \def\v{\char`}
+%
+% ^^A \vbox to 100pt makes the page breaks the same on the first run.
+% \changes{v3.08}{1993/06/09}
+% {No need to use \cs{vbox} with \LaTeXe\ minipage}
+% \noindent\begin{minipage}[t][130pt]{\textwidth}
+% \listoftables
+% \end{minipage}
+%
+% \section{Introduction}
+%
+% The \package{longtable} package defines a new environment,
+% \DescribeEnv{longtable}
+% \env{longtable}, which has most of the features of the \env{tabular}
+% environment, but produces tables which may be broken by \TeX's
+% standard page-breaking algorithm. It also shares some features with
+% the \env{table} environment. In particular it uses the same counter,
+% \texttt{table}, and has a similar "\caption" command. Also, the
+% standard "\listoftables" command lists tables produced by either the
+% \env{table} or \env{longtable} environments.
+%
+% The following example uses most of the features of the \env{longtable}
+% environment. An edited listing of the input for this example appears
+% in Section~\ref{listing}.
+%
+% \textbf{Note:} Various parts of the following table will
+% \textbf{not} line up correctly until this document has been run
+% through \LaTeX\ several times. This is a characteristic feature of
+% this package, as described below.
+%
+% \begin{longtable}{@{*}r||p{1in}@{*}}
+% KILLED & LINE!!!! \kill
+% \caption
+% [An optional table caption (used in the list of tables)]
+% {A long table\label{long}}\\
+% \hline\hline
+% \multicolumn{2}{@{*}c@{*}}%
+% {This part appears at the top of the table}\\
+% \textsc{First}&\textsc{Second}\\
+% \hline\hline
+% \endfirsthead
+% \caption[]{(continued)}\\
+% \hline\hline
+% \multicolumn{2}{@{*}c@{*}}%
+% {This part appears at the top of every other page}\\
+% \textbf{First}&\textbf{Second}\\
+% \hline\hline
+% \endhead
+% \hline
+% This goes at the&bottom.\\
+% \hline
+% \endfoot
+% \hline
+% These lines will&appear\\
+% in place of the & usual foot\\
+% at the end& of the table\\
+% \hline
+% \endlastfoot
+% \env{longtable} columns are specified& in the \\
+% same way as in the \env{tabular}& environment.\\
+% "@{*}r||p{1in}@{*}"& in this case.\\
+% Each row ends with a& "\\" command.\\
+% The "\\" command has an& optional\\
+% argument, just as in& the\\
+% \env{tabular}&environment.\\[10pt]
+% See the effect of "\\[10pt]"&?\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Also "\hline" may be used,& as in \env{tabular}.\\
+% \hline
+% That was a "\hline"&.\\
+% \hline\hline
+% That was "\hline\hline"&.\\
+% \multicolumn{2}{||c||}%
+% {This is a \ttfamily\v\\multicolumn\v{2\v}\v{||c||\v}}\\
+% If a page break occurs at a "\hline" then& a line is drawn\\
+% at the bottom of one page and at the& top of the next.\\
+% \hline
+% The "[t] [b] [c]" argument of \env{tabular}& can not be used.\\
+% The optional argument may be one of& "[l] [r] [c]"\\
+% to specify whether the table should be& adjusted\\
+% to the left, right& or centrally.\\
+% \hline\hline
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Some lines may take up a lot of space, like this: &
+% \raggedleft This last column is a ``p'' column so this
+% ``row'' of the table can take up several lines. Note however that
+% \TeX\ will never break a page within such a row. Page breaks only
+% occur between rows of the table or at "\hline" commands.
+% \tabularnewline
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% Lots of lines& like this.\\
+% \hline
+% Lots\footnote{This is a footnote.} of lines& like this.\\
+% Lots of lines& like this\footnote{\env{longtable} takes special
+% precautions, so that footnotes may also be used in `p' columns.}\\
+% \hline
+% Lots of lines& like this.\\
+% Lots of lines& like this.
+% \end{longtable}
+%
+% \section{Chunk Size}
+%
+% \DescribeMacro{LTchunksize}
+% In order to \TeX\ multi-page tables, it is necessary to break up the
+% table into smaller chunks, so that \TeX\ does not have to keep
+% everything in memory at one time. By default \env{longtable} uses 20
+% rows per chunk, but this can be set by the user, with e.g.,
+% "\setcounter{LTchunksize}{10}".\footnote
+% {You can also use the plain \TeX\ syntax
+% {\ttfamily\v\\LTchunksize=10.}}
+% These chunks do not affect page breaking,
+% thus if you are using a \TeX\ with a lot of memory, you can set
+% "LTchunksize" to be several pages of the table. \TeX\ will run
+% faster with a large "LTchunksize". However, if necessary,
+% \env{longtable} can work with "LTchunksize" set to 1, in which case
+% the memory taken up is negligible.
+% Note that if you use the commands for setting the table head or foot
+% (see below), the "LTchunksize" must be at least as large as the
+% number of rows in each of the head or foot sections.
+%
+% This document specifies "\setcounter{LTchunksize}{10}". If you look
+% at the previous table, after the \emph{first} run of \LaTeX\ you will
+% see that various parts of the table do not line up.
+% \LaTeX\ will also have printed a warning that the column
+% widths had changed. \env{longtable} writes information onto the
+% ".aux" file, so that it can line up the different chunks.
+% Prior to version~4 of this package, this information was not used
+% unless a "\setlongtables" command was issued, however, now the
+% information is always used, using a new algorithm\footnote{Due to
+% David Kastrup.} and so "\setlongtables" is no longer needed. It is
+% defined (but does nothing) for the benefit of old documents that
+% use it.
+%
+% \begin{table}
+% \centering
+% \begin{tabular}{||l|l|l||}
+% \hline\hline
+% A&\env{tabular}& environment\\
+% \hline
+% within&a floating&\env{table}\\
+% \hline\hline
+% \end{tabular}
+% \caption{A floating table}
+% \end{table}
+%
+% \section{Captions and Headings}
+%
+% At the start of the table one may specify lines which are to appear at
+% the top of every page (under the headline, but before the other lines
+% of the table).
+% \DescribeMacro{\endhead}
+% The lines are entered as normal, but the last "\\" command is
+% replaced by a "\endhead" command.
+% \DescribeMacro{\endfirsthead}
+% If the first page should have a different heading, then this should be
+% entered in the same way, and terminated with the "\endfirsthead"
+% command. The "LTchunksize" should be at least as large as the
+% number of rows in the heading.
+% \DescribeMacro{\endfoot}
+% There are also "\endfoot" and "\endlastfoot"
+%\DescribeMacro{\endlastfoot}
+% commands which are used in the same way (at the \emph{start} of the
+% table) to specify rows (or an "\hline") to appear at the bottom of
+% each page. In certain situations, you may want to place lines which
+% logically belong in the table body at the end of the \env{firsthead},
+% or the beginning of the \env{lastfoot}. This helps to control which
+% lines appear on the first and last page of the table.
+%
+% \DescribeMacro{\caption}%
+% The "\caption{...}" command is essentially equivalent to\\
+% "\multicolumn{n}{c}{\parbox{\LTcapwidth}{...}}"\\
+% where \texttt{n} is the number of columns of the table. You may set
+% the width of the caption with a command such as
+% "\setlength{\LTcapwidth}{2in}"
+% in the preamble of your document. The default is 4in. "\caption" also
+% writes the information to produce an entry in the list of tables. As
+% with the "\caption" command in the \env{figure} and \env{table}
+% environments, an optional argument specifies the text to appear in the
+% list of tables if this is different from the text to appear in the
+% caption. Thus the caption for table \ref{long} was specified as
+% {\ttfamily
+% "\caption"[An optional table caption
+% (used in the list of tables)]\v{A long
+% table"\label{long}"\v}}.
+%
+% You may wish the caption on later pages to be different to that on the
+% first page. In this case put the "\caption" command in the first
+% heading, and put a subsidiary caption in a "\caption[]" command in
+% the main heading. If the optional argument to "\caption" is empty,
+% no entry is made in the list of tables. Alternatively, if you do not
+% want the table number to be printed each time, use the "\caption*"
+% command.
+%
+% The captions are set based on the code for the \package{article}
+% class.
+% If you have redefined the standard "\@makecaption" command to produce
+% a different format for the captions, you may
+% need to make similar changes to the \package{longtable} version,
+% "\LT@makecaption". See the code section for more details.
+%
+% A more convenient method of customising captions is given by the
+% \package{caption(2)} package, which provides commands for customising
+% captions, and arranges that the captions in standard environments, and
+% many environments provided by packages (including \package{longtable})
+% are modified in a compatible manner.
+%
+% You may use the "\label" command so that you can cross reference
+% \env{longtable}s with "\ref". Note however, that the "\label" command
+% should not be used in a heading that may appear more than once. Place
+% it either in the \env{firsthead}, or in the body of the table. It
+% should not be the \emph{first} command in any entry.
+%
+% \section{Multicolumn entries}
+%
+% The "\multicolumn" command may be used in \env{longtable} in exactly
+% the same way as for \env{tabular}. So you may want to skip this
+% section, which is rather technical, however coping with "\multicolumn"
+% is one of the main problems for an environment such as
+% \env{longtable}. The main effect that a user will see is that
+% certain combinations of "\multicolumn" entries will result in a
+% document needing more runs of \LaTeX\ before the various `chunks' of
+% a table align.
+%
+% The examples in this section are set with "LTchunksize" set to the
+% minimum value of one, to demonstrate the effects when "\multicolumn"
+% entries occur in different chunks.
+%
+% \begin{table}[!htp]
+% \begin{center}
+% \LTchunksize=1
+% \makeatletter
+%
+% \global\let\LT@save@row\relax
+% \let\LT@warn\@gobble
+% \let\LT@final@warn\relax
+%
+% \newcommand\ltexample[1]{
+% \stepcounter{LT@tables}
+% \expandafter\let\csname LT@\romannumeral\c@LT@tables\endcsname
+% \LT@save@row
+% \addtocounter{LT@tables}{-1}
+% \begin{longtable}{|c|c|c|}
+% \caption{A difficult {\cs{multicolumn}} combination:
+% pass #1\label{pass#1}}\\
+% \hline
+% 1&2&3\\
+% \multicolumn{3}{|c|}{wide multicolumn spanning 1--3}\\
+% \multicolumn{2}{|c|}{multicolumn 1--2}&3\\
+% wide 1&2&3\\
+% \hline
+% \end{longtable}
+% }
+%
+% \ltexample{1}
+%
+% \ltexample{2}
+%
+% \ltexample{3}
+%
+% \ltexample{4}
+%
+% \end{center}
+% \end{table}
+%
+% Consider Table~\ref{pass1}.
+% In the second chunk, \env{longtable} sees the wide
+% multicolumn entry. At this point it thinks that the first two
+% columns are very narrow. All
+% the width of the multicolumn entry is assumed to be in the
+% third column. (This is a `feature' of \TeX's primitive "\halign"
+% command.) \env{longtable} then passes the information that there
+% is a wide third column to the later chunks, with the result that the
+% first pass over the table is too wide.
+%
+% If the `saved row' from this first pass was re-inserted into the
+% table on the next pass, the table would line up in two passes, but
+% would be much two wide.
+%
+% \DescribeMacro{\kill}%
+% The solution to this problem used in Versions 1~and~2, was to use a
+% "\kill" line. If a line is "\kill"ed, by using "\kill" rather than
+% "\\" at the end of the line, it is used in calculating
+% column widths, but removed from the final table. Thus entering
+% "\kill"ed copies of the last two rows before the wide multicolumn
+% entry would mean that "\halign" `saw' the wide entries in the first
+% two columns, and so would not widen the third column by so much to
+% make room for the multicolumn entry.
+%
+% In Version~3, a new solution was introduced. If the saved row in
+% the ".aux" file was not being used, \env{longtable} used a special
+% `draft' form of "\multicolumn", this modified the definition, so the
+% spanning entry was never considered to be wider than the columns it
+% spanned. So after the first pass, the ".aux" file stored the
+% widest normal entry for each column, no column was widened due to
+% "\span"ned columns. By default \env{longtable} ignored the ".aux"
+% file, and so each run of \LaTeX\ was considered a first pass. Once the
+% "\setlongtables" declaration was given, the saved row in the ".aux"
+% file, and the proper definition of "\multicolumn" were used. If any
+% "\multicolumn" entry caused one of the columns to be widened, this
+% information could not be passed back to earlier chunks, and so the
+% table would not correctly line up until the third pass. This algorithm
+% always converged in three passes as described above, but in examples
+% such as the ones in Tables \ref{pass1}--\ref{pass4}, the final
+% widths were not optimal as the width of column~2, which is
+% determined by a "\multicolumn" entry was not known when the final
+% width for column~3 was fixed, due to the fact that \emph{both}
+% "\multicolumn" commands were switched from `draft' mode to `normal'
+% mode at the same time.
+%
+% Version~4 alleviates the problem considerably.
+% The first pass of the table will
+% indeed have the third column much too wide. However, on the next pass
+% \env{longtable} will notice the error and reduce the column width
+% accordingly. If this has to propagate to chunks before the
+% "\multicolumn" one, an additional pass will, of course, be
+% needed. It is possible to construct tables where this rippling up of
+% the correct widths takes several passes to `converge' and produce a
+% table with all chunks aligned. However in
+% order to need many passes one needs to construct a table with
+% many overlapping "\multicolumn" entries, all being wider than the
+% natural widths of the columns they span, and all occurring in
+% different chunks. In the typical case the algorithm will converge
+% after three or four passes, and, the benefits of not needing to edit
+% the document before the final run to add "\setlongtables", and the
+% better choice of final column widths in the case of multiple
+% "\multicolumn" entries will hopefully more than pay for the extra
+% passes that may possibly be needed.
+%
+% So Table~\ref{pass1} converges after 4~passes, as seen in
+% Table~\ref{pass4}.
+%
+% You can still speed the convergence by introducing judicious "\kill"
+% lines, if you happen to have constellations like the above.
+%
+% If you object even to \LaTeX-ing a file twice, you should
+% make the first line of
+% every \env{longtable} a "\kill" line that contains the widest entry
+% to be used in each column. All chunks will then line up on the first
+% pass.
+%
+% \section{Adjustment}
+%
+% The optional argument of \env{longtable} controls the
+% horizontal alignment of the table. The possible options are "[c]",
+% "[r]" and "[l]", for centring,
+% right and left adjustment, respectively.
+% \DescribeMacro{\LTleft}
+% Normally centring is the default, but this document specifies
+% \DescribeMacro{\LTright}
+%\begin{verbatim}
+% \setlength\LTleft\parindent
+% \setlength\LTright\fill
+%\end{verbatim}
+% in the preamble,
+% which means that the tables are set flush left, but
+% indented by the usual paragraph indentation. Any lengths can be
+% specified for these two parameters, but at least one of them should be
+% a rubber length so that it fills up the width of the page, unless
+% rubber lengths are added between the columns using the
+% "\extracolsep" command.
+% For instance
+%\begin{verbatim}
+% \begin{tabular*}{\textwidth}{@{\extracolsep{...}}...}
+%\end{verbatim}
+% produces a full width table, to get a similar effect with
+% \env{longtable} specify
+%\begin{verbatim}
+% \setlength\LTleft{0pt}
+% \setlength\LTright{0pt}
+% \begin{longtable}{@{\extracolsep{...}}...}
+%\end{verbatim}
+%
+% \section{Changes}
+%
+% This section highlights the major changes since version~2. A more
+% detailed change log may be produced at the end of the code listing
+% if the "ltxdoc.cfg" file specifies
+%\begin{verbatim}
+% \AtBeginDocument{\RecordChanges}
+% \AtEndDocument{\PrintChanges}
+%\end{verbatim}
+%
+% Changes made between versions 2 and 3.
+% \begin{itemize}
+% \item The mechanism for adding the head and foot of the table has been
+% completely rewritten. With this new mechanism, \env{longtable} does
+% not need to issue a "\clearpage" at the start of the table, and so the
+% table may start half way down a page. Also the "\endlastfoot" command
+% which could not safely be implemented under the old scheme, has been
+% added.
+% \item \env{longtable} now issues an error if started in the scope of
+% "\twocolumn", or the \env{multicols} environment.
+% \item The separate documentation file "longtable.tex" has been
+% merged with the package file, "longtable.dtx" using Mittelbach's
+% \package{doc} package.
+% \item Support for footnotes has been added. Note however that
+% "\footnote" will not work in the `head' or `foot' sections of the
+% table. In order to put a footnote in those sections (e.g., inside a
+% caption), use "\footnotemark" at that point, and "\footnotetext"
+% anywhere in the table \emph{body} that will fall on the same page.
+% \item The treatment of "\multicolumn" has changed, making
+% "\kill" lines unnecessary, at the price of sometimes requiring a
+% third pass through \LaTeX.
+% \item The "\newpage" command now works inside a \env{longtable}.
+% \end{itemize}
+%
+% Changes made between versions 3 and 4.
+% \begin{itemize}
+% \item A new algorithm is used for aligning chunks. As well as the
+% widest width in each column, \package{longtable} remembers which
+% chunk produced this maximum. This allows it to check that the
+% maximum is still achieved in later runs. As \package{longtable} can
+% now deal with columns shrinking as the file is edited, the
+% "\setlongtables" system is no longer needed and is disabled.
+%
+% \item An extra benefit of the new algorithm's ability to deal with
+% `shrinking' columns is that it can give better (narrower) column
+% widths in the case of overlapping "\multicolumn" entries in
+% different chunks than the previous algorithm produced.
+%
+% \item The `draft' multicolumn system has been removed, along with
+% related commands such as "\LTmulticolumn".
+%
+% \item The disadvantage of the new algorithm is that it can take more
+% passes. The theoretical maximum is approximately twice the length
+% of a `chain' of columns with overlapping "\multicolumn" entries,
+% although in practice it usually converges as fast as the old
+% version. (Which always converged in three passes once
+% "\setlongtables" was activated.)
+%
+% \item "\\*" and "\nopagebreak" commands may be used to control page
+% breaking.
+%
+% \end{itemize}
+%
+%
+% \section{Summary}
+%
+% ^^A Allow the table to stick into the left margin.
+% \setlength{\LTleft}{0pt plus 1fill minus 1fill}
+% \setlength{\LTright}{0pt}
+%
+% \begin{longtable}{@{}l@{\hspace{10pt}}p{.8\linewidth}@{}}
+% \caption[A summary of \env{longtable} commands]%
+% {\normalsize A summary of \env{longtable} commands}\\
+% \multicolumn{2}{c}{\textbf{Parameters}}\\*
+% \hline
+% "\LTleft"&
+% Glue to the left of the table. \hfill("\fill")\\
+% "\LTright"&
+% Glue to the right of the table. \hfill("\fill")\\
+% "\LTpre"&
+% Glue before the the table. \hfill("\bigskipamount")\\
+% "\LTpost"&
+% Glue after the the table. \hfill("\bigskipamount")\\
+% "\LTcapwidth"&
+% The width of a parbox containing the caption.\hfill(4in)\\
+% "LTchunksize"&
+% The number of rows per chunk. \hfill(20)\\[5pt]
+% \multicolumn{2}{c}{\textbf{Optional
+% arguments to} \ttfamily\v\\begin\v{longtable\v}}\\*
+% \hline
+% \it none& Position as specified by "\LTleft" and "\LTright".\\
+% "[c]"& Centre the table.\\
+% "[l]"& Place the table flush left.\\
+% "[r]"& Place the table flush right.\\[5pt]
+% \pagebreak[2]
+% \multicolumn{2}{c}{\textbf{Commands
+% to end table rows}}\\*
+% \hline
+% "\\"&
+% Specifies the end of a row\\
+% "\\"\oarg{dim}& Ends row, then adds vertical space
+% (as in the \env{tabular} environment).\\
+% "\\*"&
+% The same as "\\" but disallows a page break after the row.\\
+% "\tabularnewline"&
+% Alternative to "\\" for use in the scope of "\raggedright" and
+% similar commands that redefine "\\".\\
+% "\kill"&
+% Row is `killed', but is used in calculating widths.\\
+% "\endhead"&
+% Specifies rows to appear at the top of every page.\\
+% "\endfirsthead"&
+% Specifies rows to appear at the top the first page.\\
+% "\endfoot"&
+% Specifies rows to appear at the bottom of every page.\\
+% "\endlastfoot"&
+% Specifies rows to appear at the bottom of the last page.\\[5pt]
+% \multicolumn{2}{c}{\textbf{\env{longtable} caption commands}}\\*
+% \hline
+% "\caption"\marg{caption}&
+% Caption `Table ?: \meta{caption}', and a `\meta{caption}'
+% entry in the list of tables.\\
+% "\caption"\oarg{lot}\marg{caption}&
+% Caption `Table ?: \meta{caption}', and a `\meta{lot}'
+% entry in the list of tables.\\
+% "\caption[]"\marg{caption}&
+% Caption `Table ?: \meta{caption}',
+% but no entry in the list of tables.\\
+% "\caption*"\marg{caption}&
+% Caption `\meta{caption}', but no entry in the list of tables.\\[5pt]
+% \multicolumn{2}{c}{%^^A
+% \textbf{Commands available at the start of a row}}\\*
+% \hline
+% "\pagebreak"&
+% Force a page break.\\*
+% "\pagebreak"\oarg{val}& A `hint' between 0 and 4
+% of the desirability of a break.\\
+% "\nopagebreak"& Prohibit a page break.\\*
+% "\nopagebreak"\oarg{val}& A `hint' between 0 and 4 of the undesirability
+% of a break.\\
+% "\newpage"&
+% Force a page break.\\[5pt]
+% \multicolumn{2}{c}{\textbf{Footnote commands
+% available inside \env{longtable}}}\\*
+% \hline
+% "\footnote"&
+% Footnotes, but may not be used in the table head \& foot.\\*
+% "\footnotemark"&
+% Footnotemark, may be used in the table head \& foot.\\*
+% "\footnotetext"&
+% Footnote text, use in the table body.\\[5pt]
+% \multicolumn{2}{c}{\textbf{Setlongtables}}\\
+% \hline
+% "\setlongtables"& Obsolete command. Does nothing now.
+% \end{longtable}
+%
+%
+% \finalclearpage
+% \section{Verbatim highlights from Table \protect\ref{long}}
+% \label{listing}
+% \begingroup\catcode`\/=0
+% \begin{verbatim}
+% \begin{longtable}{@{*}r||p{1in}@{*}}
+% KILLED & LINE!!!! \kill
+% \caption[An optional table caption /ldots]{A long table\label{long}}\\
+% \hline\hline
+% \multicolumn{2}{@{*}c@{*}}%
+% {This part appears at the top of the table}\\
+% \textsc{First}&\textsc{Second}\\
+% \hline\hline
+% \endfirsthead
+% \caption[]{(continued)}\\
+% \hline\hline
+% \multicolumn{2}{@{*}c@{*}}%
+% {This part appears at the top of every other page}\\
+% \textbf{First}&\textbf{Second}\\
+% \hline\hline
+% \endhead
+% \hline
+% This goes at the&bottom.\\
+% \hline
+% \endfoot
+% \hline
+% These lines will&appear\\
+% in place of the & usual foot\\
+% at the end& of the table\\
+% \hline
+% \endlastfoot
+% \env{longtable} columns are specified& in the \\
+% same way as in the \env{tabular}& environment.\\
+% /ldots
+% \multicolumn{2}{||c||}{This is a /ldots}\\
+% /ldots
+% Some lines may take/ldots&
+% \raggedleft This last column is a ``p'' column/ldots
+% \tabularnewline
+% /ldots
+% Lots of lines& like this.\\
+% /ldots
+% \hline
+% Lots\footnote{/ldots} of lines& like this.\\
+% Lots of lines& like this\footnote{/ldots}\\
+% \hline
+% Lots of lines& like this.\\
+% /ldots
+% \end{longtable}
+% \end{verbatim}
+% \endgroup
+%
+% \StopEventually{}
+%
+% \finalclearpage
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Initial code}
+%
+% Before declaring the package options, we must define some defaults
+% here.
+%
+% \begin{macro}{\LT@err}
+% The error generating command
+% \begin{macrocode}
+\def\LT@err{\PackageError{longtable}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@warn}
+% The warning generating command
+% \begin{macrocode}
+\def\LT@warn{\PackageWarning{longtable}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@final@warn}
+% \changes{v4.04}{1996/05/24}
+% {Macro added}
+% If any \env{longtable}s have not aligned, generate a warning at the
+% end of the run at "\AtEndDocument".
+% \begin{macrocode}
+\def\LT@final@warn{%
+ \AtEndDocument{%
+ \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
+ \global\let\LT@final@warn\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Options}
+%
+% The first two options deal with error handling. They are compatible
+% with the options used by the \texttt{tracefnt} package.
+%
+% \begin{macro}{errorshow}
+% \emph{Only} show errors on the terminal. `warnings' are just sent to
+% the log file.
+% \changes{v3.14}{1995/04/25}
+% {Change string from LT to longtable}
+% \begin{macrocode}
+\DeclareOption{errorshow}{%
+ \def\LT@warn{\PackageInfo{longtable}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{pausing}
+% \changes{v3.14}{1995/04/25}
+% {Change string from LT to longtable}
+% \changes{v3.15}{1995/06/15}
+% {Use single hash for latex/1557}
+% Make every warning message into an error so \TeX\ stops.
+% May be useful for debugging.
+% \begin{macrocode}
+\DeclareOption{pausing}{%
+ \def\LT@warn#1{%
+ \LT@err{#1}{This is not really an error}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{set}
+% \begin{macro}{final}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) make set and final options no op}
+% The next options are just alternative syntax for the
+% "\setlongtables" declaration.
+% \begin{macrocode}
+\DeclareOption{set}{}
+\DeclareOption{final}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+% \subsection{User Settable Parameters}
+%
+% \begin{macro}{\LTleft}
+% \begin{macro}{\LTright}
+% Glue to the left and right of the table, default "\fill" (ie
+% centred).
+% \begin{macrocode}
+\newskip\LTleft \LTleft=\fill
+\newskip\LTright \LTright=\fill
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LTpre}
+% \begin{macro}{\LTpost}
+% Glue before and after the \env{longtable}. "\bigskip" by default.
+% \begin{macrocode}
+\newskip\LTpre \LTpre=\bigskipamount
+\newskip\LTpost \LTpost=\bigskipamount
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LTchunksize}
+% Chunk size (The number of rows taken per "\halign"). Default 20.
+% \begin{macrocode}
+\newcount\LTchunksize \LTchunksize=20
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@LTchunksize}
+% Added in V3.07 to allow the \LaTeX\ syntax
+% "\setcounter{LTchunksize}{10}".
+% \begin{macrocode}
+\let\c@LTchunksize\LTchunksize
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LTcapwidth}
+% Width of the "\parbox" containing the caption. Default 4in.
+% \begin{macrocode}
+\newdimen\LTcapwidth \LTcapwidth=4in
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Internal Parameters}
+%
+% \begin{macro}{\LT@head}
+% \begin{macro}{\LT@firsthead}
+% \begin{macro}{\LT@foot}
+% \begin{macro}{\LT@lastfoot}
+% Boxes for the table head and foot.
+% \begin{macrocode}
+\newbox\LT@head
+\newbox\LT@firsthead
+\newbox\LT@foot
+\newbox\LT@lastfoot
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LT@cols}
+% Counter for number of columns.
+% \begin{macrocode}
+\newcount\LT@cols
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@rows}
+% Counter for rows up to chunksize.
+% \begin{macrocode}
+\newcount\LT@rows
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@LT@tables}
+% Counter for the tables, added in V3.02. Previous versions just used
+% the \LaTeX\ counter "table", but this fails if "table" is
+% reset during a document, eg \package{report} class resets it every
+% chapter.
+%
+% This was changed from "\newcount\LT@tables" in V3.04. \LaTeX\ counters
+% are preserved correctly when "\includeonly" is used. In the rest of
+% the file "\LT@tables" has been replaced by "\c@LT@tables" without
+% further comment.
+% \begin{macrocode}
+\newcounter{LT@tables}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@LT@chunks}
+% \changes{v4.00}{1996/04/08}
+% {(DK) Chunk counter added}
+% We need to count through the chunks of our tables from Version~4 on.
+% \begin{macrocode}
+\newcounter{LT@chunks}[LT@tables]
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@table}
+% \begin{macro}{\fnum@table}
+% \begin{macro}{\tablename}
+% If the "table" counter is not defined (eg in "letter" style), define
+% it. (Added in V3.06.)
+% \begin{macrocode}
+\ifx\c@table\undefined
+ \newcounter{table}
+ \def\fnum@table{\tablename~\thetable}
+\fi
+\ifx\tablename\undefined
+ \def\tablename{Table}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LT@out}
+% In a normal style, "longtable" uses the ".aux" file to record the
+% column widths. With "letter.sty", use a separate ".lta" file.
+% (Added in V3.06.)
+%
+% Not needed for new letter class.
+%\begin{verbatim}
+%\ifx\startlabels\undefined
+% \let\@auxout\@auxout
+%\else
+% {\@input{\jobname.lta}}%
+% \newwrite\@auxout
+% \immediate\openout\@auxout=\jobname.lta
+%\fi
+%\end{verbatim}
+% \end{macro}
+%
+% \begin{macro}{\LT@p@ftn}
+% Temporary storage for footnote text in a `p' column.
+% \begin{macrocode}
+\newtoks\LT@p@ftn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@end@pen}
+% Special penalty for the end of the table. Done this way to save using
+% up a count register.
+% \begin{macrocode}
+\mathchardef\LT@end@pen=30000
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \env{longtable} environment}
+%
+% \begin{macro}{\longtable}
+% Called by "\begin{longtable}". This implementation does not work in
+% multiple column formats. "\par" added at V3.04.
+% \begin{macrocode}
+\def\longtable{%
+ \par
+ \ifx\multicols\@undefined
+ \else
+ \ifnum\col@number>\@ne
+ \@twocolumntrue
+ \fi
+ \fi
+ \if@twocolumn
+ \LT@err{longtable not in 1-column mode}\@ehc
+ \fi
+ \begingroup
+% \end{macrocode}
+% Check for an optional argument.
+% \begin{macrocode}
+ \@ifnextchar[\LT@array{\LT@array[x]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@array}
+% Start setting the alignment.
+% Based on "\@array" from the \LaTeX\ kernel
+% and the \package{array} package.
+%
+% Since Version 3.02, \package{longtable} has used the internal counter
+% "\c@LT@tables". The \LaTeX\ counter "table" is still incremented
+% so that "\caption" works correctly.
+% \begin{macrocode}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+% \end{macrocode}
+% Set up the glue around the table if an optional argument given.
+% \begin{macrocode}
+ \if l#1%
+ \LTleft\z@ \LTright\fill
+ \else\if r#1%
+ \LTleft\fill \LTright\z@
+ \else\if c#1%
+ \LTleft\fill \LTright\fill
+ \fi\fi\fi
+% \end{macrocode}
+% Set up these internal commands for \env{longtable}.
+% \changes{v3.13}{1994/12/08}
+% {add \cs{tabularnewline}}
+% \changes{v3.14}{1995/04/25}
+% {(Mike Van Geest) rename \cs{LT@mc} to
+% \cs{LT@mcol} to allow 1100 tables}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) don't need multicolumn warning}
+%\begin{verbatim}
+% \global\let\LT@mcw@rn\relax
+%\end{verbatim}
+% \begin{macrocode}
+ \let\LT@mcol\multicolumn
+% \end{macrocode}
+% \changes{v3.17}{1996/01/31}
+% {Reset \cs{hline} and \cs{multicolumn} in nested tabular
+% and array, for tools/2068}
+% Now redefine "\@tabarray" to restore "\hline" and "\multicolumn" so
+% that arrays and tabulars nested in longtable (or in page headings on
+% longtable pages) work out OK. Saving the original definitions done
+% here so that you can load the \package{array} package before or after
+% \package{longtable}.
+% \begin{macrocode}
+ \let\LT@@tabarray\@tabarray
+ \let\LT@@hl\hline
+ \def\@tabarray{%
+ \let\hline\LT@@hl
+% \end{macrocode}
+%\begin{verbatim}
+% \let\multicolumn\LT@mcol
+%\end{verbatim}
+% \begin{macrocode}
+ \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+% \end{macrocode}
+% \changes{v4.05}{1996/11/12}
+% {\cs{nopagebreak} and \cs{pagebreak} added}
+% More or less standard definitions, but first start a "\noalign".
+% \begin{macrocode}
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox
+% \end{macrocode}
+%
+% \changes{v4.08}{1998/01/20}
+% {Move \cs{@endpbox} definition earlier and define \cs{@@endpbox}
+% and \cs{@@startpbox} for non-array case. tools/2736}
+% \begin{macrocode}
+ \let\@endpbox\LT@endpbox
+% \end{macrocode}
+% Set up internal commands according to Lamport or Mittelbach.
+% \begin{macrocode}
+ \ifx\extrarowheight\@undefined
+% \end{macrocode}
+% Initialise these commands as in \env{tabular} from the \LaTeX\ kernel.
+% \begin{macrocode}
+ \let\@acol\@tabacol
+ \let\@classz\@tabclassz \let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}%
+ \let\@@startpbox\@startpbox
+ \let\@@endpbox\@endpbox
+ \let\LT@LL@FM@cr\@tabularcr
+ \else
+% \end{macrocode}
+% Initialise these commands as in \package{array}. "\d@llar"
+% replaced by "\d@llarbegin" "\d@llarend" in V3.03 to match
+% \package{array} V2.0h. We do not need to set "\d@llarbegin" and
+% "\d@llarend" as the \package{array} package gives them the correct
+% values at the top level.
+% \begin{macrocode}
+ \advance\@tempdima\extrarowheight
+ \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+% \end{macrocode}
+% The rest of this macro is mainly based on \package{array} package, but
+% should work for the standard \env{tabular} too.
+% \begin{macrocode}
+ \setbox\@arstrutbox\hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \let\@sharp##\let\protect\relax
+% \end{macrocode}
+% Interpret the preamble argument.
+% \begin{macrocode}
+ \begingroup
+ \@mkpream{#2}%
+% \end{macrocode}
+% We need to rename "\@preamble" here as F.M.'s scheme uses
+% "\global", and we may need to nest "\@mkpream", eg for
+% "\multicolumn"
+% or an \env{array}.
+% We do not need to worry about nested \env{longtable}s though!
+% \begin{macrocode}
+ \xdef\LT@bchunk{%
+% \end{macrocode}
+% \changes{v4.00}{1996/04/08}
+% {(DK) Increment Chunk counter}
+% \begin{macrocode}
+ \global\advance\c@LT@chunks\@ne
+ \global\LT@rows\z@\setbox\z@\vbox\bgroup
+% \end{macrocode}
+% \changes{v4.05}{1996/11/12}
+% {\cs{LT@setprevdepth} added}
+% The following line was added in v4.05.
+% In order to get the "\penalties" to work at chunk boundaries
+% Need to take more care about where and when "\lineskip" glue
+% is added. The following does nothing at top of table, and in
+% header chunks, but in normal body chunks it sets "\prevdepth"
+% (to 0pt, but any value would do) so that "\lineskip" glue will
+% be added. the important thing to note is that the glue will be
+% added \emph{after} any vertical material coming from "\noalign".
+% \begin{macrocode}
+ \LT@setprevdepth
+% \end{macrocode}
+%
+% \changes{v4.10}{2000/10/22}
+% {\cs{noexpand} added (as in array.sty) for mathtext.sty, CAR}
+% \begin{macrocode}
+ \tabskip\LTleft \noexpand\halign to\hsize\bgroup
+% \tabskip\LTleft\halign to\hsize\bgroup
+ \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \endgroup
+% \end{macrocode}
+% Find out how many columns we have (store in "\LT@cols").
+% \begin{macrocode}
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+% \end{macrocode}
+% Get the saved row from "\LT@i"\ldots"\LT@ix" (from the
+% ".aux" file), or make a new blank row.
+% \begin{macrocode}
+ \LT@make@row
+% \end{macrocode}
+% A few more internal commands for \env{longtable}.
+% \begin{macrocode}
+ \m@th\let\par\@empty
+ \everycr{}\lineskip\z@\baselineskip\z@
+% \end{macrocode}
+% Start the first chunk.
+% \begin{macrocode}
+ \LT@bchunk}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@no@pgbk}
+% \changes{v4.05}{1996/11/12}
+% {Macro added}
+% Can simplify the standard "\@no@pgbk" as this is vmode only
+% but then need to close the "\noalign".
+% \begin{macrocode}
+\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@start}
+% This macro starts the process of putting the table on the current
+% page. It is not called until either a "\\" or "\endlongtable" command
+% ends a chunk, as we do not know until that point which of the four
+% possible head or foot sections have been specified.
+%
+% It begins by redefining itself, so that the table is only started
+% once! Until V3.04, was redefined to "\relax", now use "\endgraf" to
+% force the page-breaker to wake up.
+% \begin{macrocode}
+\def\LT@start{%
+ \let\LT@start\endgraf
+ \endgraf\penalty\z@\vskip\LTpre
+% \end{macrocode}
+% Start a new page if there is not enough room for the table head, foot,
+% and one extra line.
+% \begin{macrocode}
+ \dimen@\pagetotal
+ \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \ht\LT@foot
+% \end{macrocode}
+% \changes{v3.16}{1995/11/09}
+% {Measure the first line of the table}
+% At this point I used to add "\ht\@arstrutbox" and "\dp\@arstrutbox"
+% as a measure of a row size. However this can fail spectacularly
+% for "p" columns which might be much larger. Previous versions could
+% end up with the table starting with a foot, then a page break then
+% a head \emph{then} a `first head'! So now measure the first line of
+% the table accurately by "\vsplit"ting it out of the first chunk.
+% \begin{macrocode}
+ \dimen@ii\vfuzz
+ \vfuzz\maxdimen
+ \setbox\tw@\copy\z@
+ \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
+ \setbox\tw@\vbox{\unvbox\tw@}%
+ \vfuzz\dimen@ii
+ \advance\dimen@ \ht
+ \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@\dp
+ \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \advance\dimen@ -\pagegoal
+ \ifdim \dimen@>\z@\vfil\break\fi
+% \end{macrocode}
+% Store height of page minus table foot in "\@colroom".
+% \changes{v3.14}{1995/05/02}
+% {Set \cs{@colroom}, for tools/1584}
+% \begin{macrocode}
+ \global\@colroom\@colht
+% \end{macrocode}
+% If the foot is non empty, reduce the "\vsize" and "\@colroom"
+% accordingly.
+% \begin{macrocode}
+ \ifvoid\LT@foot\else
+ \advance\vsize-\ht\LT@foot
+ \global\advance\@colroom-\ht\LT@foot
+ \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
+ \maxdepth\z@
+ \fi
+% \end{macrocode}
+% Put the table head on the page, and then switch to the new output
+% routine.
+% \changes{v4.11}{2004/02/01}
+% {\cs{nobreak}, for tools/3484}
+% \begin{macrocode}
+ \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+ \output{\LT@output}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endlongtable}
+% Called by "\end{longtable}".
+% \begin{macrocode}
+\def\endlongtable{%
+% \end{macrocode}
+% Essentially add a final "\\". But as we now know the number of
+% actual chunks, we first strip away all entries referring to a
+% maximum entry beyond the table (this can only happen if a table has
+% been shortened, or the table numbering has gone awry). In that case
+% we at least start collecting valid new information with the last
+% chunk of this table, by removing the width constraint.
+% \changes{v4.01}{1996/04/11}
+% {(DPC) use \cs{noalign} to sneak in \cs{LT@entry@chop}}
+% \begin{macrocode}
+ \crcr
+ \noalign{%
+ \let\LT@entry\LT@entry@chop
+ \xdef\LT@save@row{\LT@save@row}}%
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+% \end{macrocode}
+% Write the dummy row to the ".aux" file.
+% Since V3.06, use ".lta" for "letter.sty".
+% \changes{v3.12}{1994/06/30}
+% {Do not write if \cs{nofiles} in operation.}
+% \begin{macrocode}
+ \if@filesw
+ {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
+% \end{macrocode}
+% Since Version 3.02, \package{longtable} has used the internal counter
+% "\c@LT@tables" rather than the \LaTeX\ counter \textsf{table}. This
+% information looks entirely different from version~3
+% information. Still, we don't need to rename the macro name because
+% later code will consider the information to have no columns, and
+% thus will throw the old data away.
+% \begin{macrocode}
+ \gdef\expandafter\noexpand
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ {\LT@save@row}}}%
+ \fi
+% \end{macrocode}
+% At this point used to
+% issue a warning if a "\multicolumn" has been set in draft mode.
+% \changes{v4.01}{1996/04/11}
+% {(DPC) No need for multicolumn warnings}
+%\begin{verbatim}
+% \LT@mcw@rn
+%\end{verbatim}
+% If the last chunk has different widths than the first, warn the user.
+% Also trigger a warning to rerun \LaTeX\ at the end of the document.
+% \changes{v4.04}{1996/05/24}
+% {Use \cs{LT@final@warn}}
+% \begin{macrocode}
+ \ifx\LT@save@row\LT@@save@row
+ \else
+ \LT@warn{Column \@width s have changed\MessageBreak
+ in table \thetable}%
+ \LT@final@warn
+ \fi
+% \end{macrocode}
+% Force one more go with the \env{longtable} output routine.
+% \begin{macrocode}
+ \endgraf\penalty -\LT@end@pen
+% \end{macrocode}
+% Now close the group to return to the standard routine.
+% \begin{macrocode}
+ \endgroup
+% \end{macrocode}
+% Reset "\@mparbottom" to allow marginpars close to the end of the
+% table.\footnote{This can not be the correct. However if it is omitted,
+% there is a problem with marginpars, for example on page~3 of this
+% document. Any Output Routine Gurus out there?}
+% \begin{macrocode}
+ \global\@mparbottom\z@
+ \pagegoal\vsize
+ \endgraf\penalty\z@\addvspace\LTpost
+% \end{macrocode}
+% Footnotes. As done in the \package{multicol} package.
+% \begin{macrocode}
+ \ifvoid\footins\else\insert\footins{}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Counting Columns}
+%
+% Columns are counted by examining "\@preamble", rather than simply
+% getting "\@mkpream" to increment the counter as it builds the
+% preamble so that this package works with many of the packages which
+% add extra column specifiers to \LaTeX's standard ones.
+%
+% Version~1 counted "\@sharp"'s to calculate the number of columns,
+% this was changed for Version~2 as it does not work with the NFSS. Now
+% count "&"'s. ("lfonts.new" (and now the Standard \LaTeX\ definition)
+% defines "\@tabclassz" so that "\@sharp" is inside a group.)
+%
+% \begin{macro}{\LT@nofcols}
+% Find the next "&", then look ahead to see what is next.
+% \begin{macrocode}
+\def\LT@nofcols#1&{%
+ \futurelet\@let@token\LT@n@fcols}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@n@fcols}
+% Add one, then stop at an "\LT@nofcols" or look for the next
+% "&". The "\expandafter" trick was added in Version~3, also the
+% name changed from "\@LT@nofcols" to preserve the "\LT@" naming
+% convention.
+% \begin{macrocode}
+\def\LT@n@fcols{%
+ \advance\LT@cols\@ne
+ \ifx\@let@token\LT@nofcols
+ \expandafter\@gobble
+ \else
+ \expandafter\LT@nofcols
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The {\ttfamily\bslash\bslash} and \cs{kill} Commands}
+%
+% \begin{macro}{\LT@tabularcr}
+% \changes{v4.05}{1996/11/12}
+% {Code re-organised for the *-form processing.}
+% The internal definition of "\\".
+% In the "*" form, insert a "\nobreak" after the next "\cr" (or "\crcr").
+%
+% This star form processing was finally added in v4.05. For the previous
+% six or seven years the comment at this point said
+% \begin{quote}\small
+% This definition also accepts "\\*", which acts in the same way as
+% "\\". \env{tabular} does this, but \env{longtable} probably ought to
+% make "\\*" prevent page breaking.
+% \end{quote}
+%
+% "{\ifnum0=`}\fi" added in version 3.01, required if the first entry
+% is empty.
+% The above in fact is not good enough, as with \package{array} package
+% it can introduce a "{}" group in math mode, which changes the spacing.
+% So use the following variant. Added in v3.14.
+% \changes{v3.14}{1995/04/25}
+% {More fun with \cs{ifnum} cf tools/1571}
+% \begin{macrocode}
+\def\LT@tabularcr{%
+ \relax\iffalse{\fi\ifnum0=`}\fi
+ \@ifstar
+ {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
+ \LT@t@bularcr}%
+ {\LT@t@bularcr}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@crcr}
+% \changes{v4.05}{1996/11/12}
+% {Macro added}
+% \begin{macrocode}
+\let\LT@crcr\crcr
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@setprevdepth}
+% \changes{v4.05}{1996/11/12}
+% {Macro added}
+% This will be redefined to set the "\prevdepth"
+% at the start of a chunk.
+% \begin{macrocode}
+\let\LT@setprevdepth\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@t@bularcr}
+% \begin{macrocode}
+\def\LT@t@bularcr{%
+% \end{macrocode}
+% Increment the counter, and do \env{tabular}'s "\\" or finish the
+% chunk.\\ The "\expandafter" trick was added in Version~3.
+% Set the "\prevdepth" at the start of a new chunk. (Done here
+% so not set in header chunks).
+% \begin{macrocode}
+ \global\advance\LT@rows\@ne
+ \ifnum\LT@rows=\LTchunksize
+ \gdef\LT@setprevdepth{%
+ \prevdepth\z@\global
+ \global\let\LT@setprevdepth\relax}%
+ \expandafter\LT@xtabularcr
+ \else
+ \ifnum0=`{}\fi
+ \expandafter\LT@LL@FM@cr
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@xtabularcr}
+% This just looks for an optional argument.
+% \begin{macrocode}
+\def\LT@xtabularcr{%
+ \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@ntabularcr}
+% The version with no optional argument.
+% "\ifnum0=`{\fi}" added in version 3.01. Changed in 3.14.
+% \begin{macrocode}
+\def\LT@ntabularcr{%
+ \ifnum0=`{}\fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@argtabularcr}
+% The version with an optional argument.
+% "\ifnum0=`{\fi}" added in version 3.01. Changed in 3.14.
+% \begin{macrocode}
+\def\LT@argtabularcr[#1]{%
+ \ifnum0=`{}\fi
+ \ifdim #1>\z@
+ \unskip\@xargarraycr{#1}%
+ \else
+ \@yargarraycr{#1}%
+ \fi
+% \end{macrocode}
+% Add the dummy row, and finish the "\halign".
+% \begin{macrocode}
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@echunk}
+% \changes{v4.05}{1996/11/12}
+% {\cs{unskip} added for pagebreak support}
+% This ends the current chunk, and removes the dummy row.
+% \begin{macrocode}
+\def\LT@echunk{%
+ \crcr\LT@save@row\cr\egroup
+ \global\setbox\@ne\lastbox
+% \end{macrocode}
+% The following line was added in v4.05.
+% \package{longtable} relies on "\lineskip" glue (which is 0pt) to
+% provide break points between each row so the table may be split
+% into pages.
+%
+% Previous releases left the "\lineskip" glue at the end of each chunk
+% that had been added when the dummy row was added. There was no glue
+% at the start of the next chunk as \TeX\ normally does not put
+% "\lineskip" glue at the top of a box. This meant that normally the
+% chunks fitted together perfectly, however "\noalign" material at a
+% chunk boundary came before the first row of the next chunk
+% but after the lineskip glue at the end of this chunk. This is the
+% wrong place, e.g., it means even a "\penalty10000" does not stop a
+% break as the "\lineskip" glue in the previous item on the list
+% provides a legal breakpoint. So now remove the "\lineskip" glue that
+% was before the dummy row and introduce "\LT@setprevdepth" to set the
+% "\prevdepth" at the start of the next chunk, to make sure "\lineskip"
+% glue is added later.
+% \begin{macrocode}
+ \unskip
+ \egroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@entry}
+% \changes{v4.00}{1996/04/08}
+% {(DK) Macro added}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) Use \cs{ifhmode} trick to determine first entry}
+% We here give the `basic' definition of "\LT@entry", namely that used
+% in alignment templates. It has a "\kern" only if the maximum is
+% imposed from a different chunk.
+% The "\ifhmode" test reveals the first entry, when we don't want to add
+% an "&".
+% \begin{macrocode}
+\def\LT@entry#1#2{%
+ \ifhmode\@firstofone{&}\fi\omit
+ \ifnum#1=\c@LT@chunks
+ \else
+ \kern#2\relax
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@entry@chop}
+% \changes{v4.00}{1996/04/08}
+% {(DK) Macro added}
+% This definition for the argument of "\LT@save@row" is used to scrap
+% all those maxima which could not be verified because they occur
+% after the end of the table. This can happen only if a table has been
+% shortened (or the sequencing got mixed up) since the
+% previous run.
+% Note that this is premature: the last chunk still is going to be
+% set, and with the chopped limits.
+% \begin{macrocode}
+\def\LT@entry@chop#1#2{%
+ \noexpand\LT@entry
+ {\ifnum#1>\c@LT@chunks
+ 1}{0pt%
+ \else
+ #1}{#2%
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@entry@write}
+% \changes{v4.07}{1997/10/16}
+% {Avoid use of percent. tools/2631}
+% To write an entry for the "aux" file, we use a slightly
+% surprising definition which has the sole purpose of avoiding
+% overfull lines (which might break \TeX{}'s limits when reading the
+% "aux" file, probably you'd need to have a few hundred columns before
+% this happened but\ldots).
+% \begin{macrocode}
+\def\LT@entry@write{%
+ \noexpand\LT@entry^^J%
+ \@spaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@kill}
+% This ends the current chunk as above, but strips off two rows, the
+% `dummy row' and the `killed row' before starting the next chunk.
+% Since V3.04, the old chunk is reboxed at the start of the box
+% containing the next chunk. This allows "\kill" to be used in headers,
+% which must be processed in a single box.
+% \begin{macrocode}
+\def\LT@kill{%
+ \LT@echunk
+ \LT@get@widths
+ \expandafter\LT@rebox\LT@bchunk}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@rebox}
+% Drop the old chunk (box0) back at the top of the new chunk, removing
+% the killed row. This macro added at V3.04.
+% \begin{macrocode}
+\def\LT@rebox#1\bgroup{%
+ #1\bgroup
+ \unvbox\z@
+ \unskip
+ \setbox\z@\lastbox}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The Dummy Row}
+%
+% The dummy row is kept inside of the macro "\LT@save@row".
+%
+% \begin{macro}{\LT@blank@row}
+% \begin{macro}{\LT@build@blank}
+% \changes{v4.00}{1996/04/08}
+% {(DK) Macro added}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) Don't mess with \cs{multicolumn} on draft passes}
+% Create a blank row if we are not using the info in the ".aux" file.
+% \begin{macrocode}
+\def\LT@blank@row{%
+ \xdef\LT@save@row{\expandafter\LT@build@blank
+ \romannumeral\number\LT@cols 001 }}
+% \end{macrocode}
+% Whoops! What's that supposed to be? A drop-in replacement for the
+% first task of Appendix~D in the \TeX book. The "\romannumeral"
+% produces "\LT@cols" instances of "m" followed by "i". The below
+% macro then replaces the "m"s by appropriate entries.
+% \begin{macrocode}
+\def\LT@build@blank#1{%
+ \if#1m%
+ \noexpand\LT@entry{1}{0pt}%
+ \expandafter\LT@build@blank
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\LT@make@row}
+% \changes{v4.00}{1996/04/08}
+% {(DK) New implementation}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) Make this the default behaviour, not needing
+% \cs{setlongtables}}
+%
+% Prior to version 4, by default did not use information in the
+% ".aux" file but now we can define "\LT@make@row" to use the ".aux"
+% file, even on the `draft' passes.
+% \begin{macrocode}
+\def\LT@make@row{%
+ \global\expandafter\let\expandafter\LT@save@row
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ \ifx\LT@save@row\relax
+ \LT@blank@row
+% \end{macrocode}
+% Now a slightly difficult part comes. Before we decide making the
+% template from the ".aux" file info we check that the number of
+% fields has remained the same. If it hasn't, either the table format
+% has changed, or we have the wrong table altogether. In both cases,
+% we decide to better drop all gathered information and start over.
+% \changes{v4.01}{1996/04/11}
+% {(DPC) Use \cs{if} test rather than \cs{ifx}\cs{@empty}}
+%
+% The expansion between "!"\ldots"!" below will be empty if the number
+% of "\LT@entry" macros
+% including arguments in "\LT@save@row" is equal to "\LT@cols". If it
+% is not empty, we throw the row away and start from scratch.
+% \begin{macrocode}
+ \else
+ {\let\LT@entry\or
+ \if!%
+ \ifcase\expandafter\expandafter\expandafter\LT@cols
+ \expandafter\@gobble\LT@save@row
+ \or
+ \else
+ \relax
+ \fi
+ !%
+ \else
+ \aftergroup\LT@blank@row
+ \fi}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\setlongtables}
+% Redefine "\LT@make@row" to use information in the ".aux" file,
+% if there is a saved row for this table with the right number of
+% columns.
+%
+% Since Version 3.02, \package{longtable} has used the internal counter
+% "\c@LT@tables" rather than the \LaTeX\ counter \textsf{table}.
+% The warning message was added at V3.04, as was the "\global", to stop
+% save-stack overflow.
+%
+% Since Version 4.01 "\setlongtables" does nothing as it is not
+% needed, but is defined as "\relax" for the benefit of old documents.
+% \changes{v3.12}{1994/06/30}
+% {Warning altered to fit line on terminal.}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) make into no op}
+% \begin{macrocode}
+\let\setlongtables\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@get@widths}
+% This is the heart of \package{longtable}. If it were not for the table
+% head and foot, this macro together with the modified "\\" command
+% would form the basis of quite a simple little package file for long
+% tables. It is closely modelled on the "\endvrulealign" macro of
+% appendix D of the \TeX book.
+% \begin{macrocode}
+\def\LT@get@widths{%
+% \end{macrocode}
+% "\global" added at V3.04, to stop save-stack overflow.
+% \begin{macrocode}
+% \end{macrocode}
+% Loop through the last row, discarding glue, and saving box widths. At
+% V3.04 changed the scratch box to 2, as the new "\kill" requires that
+% "\box0" be preserved.
+% \begin{macrocode}
+ \setbox\tw@\hbox{%
+ \unhbox\@ne
+ \let\LT@old@row\LT@save@row
+ \global\let\LT@save@row\@empty
+ \count@\LT@cols
+ \loop
+ \unskip
+ \setbox\tw@\lastbox
+ \ifhbox\tw@
+ \LT@def@row
+ \advance\count@\m@ne
+ \repeat}%
+% \end{macrocode}
+% Remember the widths if we are in the first chunk.
+% \begin{macrocode}
+ \ifx\LT@@save@row\@undefined
+ \let\LT@@save@row\LT@save@row
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@def@row}
+% \changes{v4.00}{1996/04/08}
+% {(DK) New implementation}
+% Add a column to the dummy row. Name changed from "\defLT@save@row"
+% in Version~3, to preserve the "\LT@" naming convention.
+% \begin{macrocode}
+\def\LT@def@row{%
+% \end{macrocode}
+% We start by picking the respective entry from our old row.
+% These redefinitions of "\LT@entry" are local to the group started
+% in "\LT@get@widths".
+% \begin{macrocode}
+ \let\LT@entry\or
+ \edef\@tempa{%
+ \ifcase\expandafter\count@\LT@old@row
+ \else
+ {1}{0pt}%
+ \fi}%
+% \end{macrocode}
+% Now we tack the right combination in front of "\LT@save@row":
+% \begin{macrocode}
+ \let\LT@entry\relax
+ \xdef\LT@save@row{%
+ \LT@entry
+ \expandafter\LT@max@sel\@tempa
+ \LT@save@row}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@max@sel}
+% \changes{v4.00}{1996/04/08}
+% {(DK) macro added}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) minor modifications}
+% And this is how to select the right combination. Note that we take
+% the old maximum information only if the size does not change in
+% \emph{either} direction. If the size has grown, we of course have a
+% new maximum. If the size has shrunk, the old maximum (which was
+% explicitly not enforced because of being in the current chunk) is
+% invalid, and we start with this chunk as the new size. Note that
+% even in the case of equality we \emph{must} use the "\the\wd\tw@"
+% construct instead of "#2" because "#2" might be read in from the
+% file, and so could have "\catcode"~11 versions of "p" and~"t" in~it
+% which we want to be replaced by their `proper' "\catcode"~12 versions.
+% \begin{macrocode}
+\def\LT@max@sel#1#2{%
+ {\ifdim#2=\wd\tw@
+ #1%
+ \else
+ \number\c@LT@chunks
+ \fi}%
+ {\the\wd\tw@}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \cs{hline} Command}
+%
+% \begin{macro}{\LT@hline}
+% "\hline" and "\hline\hline" both produce \emph{two} lines.
+% The only difference being the glue and penalties between them.
+% This is so that a page break at a "\hline" produces a line on both
+% pages.\footnote
+% {\env{longtable} has always done this, but perhaps it would be
+% better if hlines were \emph{omitted} at a page break, as the head and
+% foot usually put a hline here anyway.}
+% Also this "\hline" is more like a "\cline{1-\LT@cols}".
+% \env{tabular}'s "\hline" would draw lines the full width of the page.
+% \begin{macrocode}
+\def\LT@hline{%
+ \noalign{\ifnum0=`}\fi
+ \penalty\@M
+ \futurelet\@let@token\LT@@hline}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@@hline}
+% This code is based on "\cline". Two copies of the line are produced,
+% as described above.
+% \begin{macrocode}
+\def\LT@@hline{%
+ \ifx\@let@token\hline
+ \global\let\@gtempa\@gobble
+ \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
+ \else
+ \global\let\@gtempa\@empty
+ \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\LT@sep}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\penalty\@M}%
+ \@gtempa}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Captions}
+%
+% \begin{macro}{\LT@caption}
+% The caption is "\multicolumn{\LT@cols}{c}{"\meta{a parbox with the
+% table's caption}"}"
+% \begin{macrocode}
+\def\LT@caption{%
+ \noalign\bgroup
+ \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@c@ption}
+% Caption command (with [optional argument]). "\protect" added in
+% Version~3. "\fnum@table" added at V3.05.
+% \changes{v3.14}{1995/05/02}
+% {Call \cs{LT@makecaption} not \cs{LT@mkcaption}}
+% \changes{v3.14}{1995/05/24}
+% {Add new control argument}
+% \begin{macrocode}
+\def\LT@c@ption#1[#2]#3{%
+ \LT@makecaption#1\fnum@table{#3}%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else
+ {\let\\\space
+ \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@capti@n}
+% Caption command (no [optional argument])
+% \changes{v3.14}{1995/05/02}
+% {Call \cs{LT@makecaptionx} not \cs{LT@mkcaption}}
+% \changes{v3.14}{1995/05/24}
+% {Call \cs{LT@makecaption} with \cs{@gobble} or \cs{@firstofone}}
+% \begin{macrocode}
+\def\LT@capti@n{%
+ \@ifstar
+ {\egroup\LT@c@ption\@gobble[]}%
+ {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\LT@makecaption}
+% Put the caption in a box of width 0pt, so that it never affects the
+% column widths. Inside that is a "\parbox" of width
+% "\LTcapwidth".
+% \changes{v3.14}{1995/05/02}
+% {Renamed from \cs{LT@mkcaption},
+% and modified to call \cs{@makecaption}}
+% \changes{v3.14}{1995/05/02}
+% {Use the first arg to remove counter for star form}
+% \begin{macrocode}
+\def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+% \end{macrocode}
+% Based on article class "\@makecaption", "#1" is "\@gobble" in star
+% form, and "\@firstofone" otherwise.
+% \begin{macrocode}
+ \sbox\@tempboxa{#1{#2: }#3}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1{#2: }#3%
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \endgraf\vskip\baselineskip}%
+ \hss}}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The Output Routine}
+%
+% The method used here for interfacing a special purpose output routine
+% to the standard \LaTeX\ routine is lifted straight out of
+% F.~Mittelbach's \package{multicol} package.
+%
+% \begin{macro}{\LT@output}
+% Actually this is not so bad, with FM leading the way.
+% \begin{macrocode}
+\def\LT@output{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum\outputpenalty > -\LT@end@pen
+% \end{macrocode}
+% If this was a float or a marginpar we complain.
+% \begin{macrocode}
+ \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \else
+% \end{macrocode}
+% We have reached the end of the table, on the scroll at least,
+% \begin{macrocode}
+ \setbox\z@\vbox{\unvbox\@cclv}%
+ \ifdim \ht\LT@lastfoot>\ht\LT@foot
+% \end{macrocode}
+% The last foot might not fit, so:\footnote{An alternative would be to
+% vsplit off a bit of the last chunk, so that the last page did not just
+% have head and foot sections, but it is hard to do this in a consistent
+% manner.}
+% \begin{macrocode}
+ \dimen@\pagegoal
+ \advance\dimen@-\ht\LT@lastfoot
+ \ifdim\dimen@<\ht\z@
+ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \setbox\z@\vbox{\box\LT@head}%
+% \end{macrocode}
+% End of "\ifdim\dimen@<\ht\@cclc".
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% End of "\ifdim \ht\LT@lastfoot > \ht\LT@foot".
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% Reset "\@colroom".
+% \changes{v3.14}{1995/05/02}
+% {Reset \cs{@colroom}, for tools/1584}
+% \begin{macrocode}
+ \global\@colroom\@colht
+ \global\vsize\@colht
+% \end{macrocode}
+% Put the last page of the table on to the main vertical list.
+% \begin{macrocode}
+ \vbox
+ {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
+% \end{macrocode}
+% End of "\ifnum\outputpenalty > -\LT@end@pen".
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% Else "\outputpenalty > -\@Mi".
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% If we have not reached the end of the table,
+% \begin{macrocode}
+ \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+% \end{macrocode}
+% Reset "\vsize".
+% \changes{v3.14}{1995/05/02}
+% {Reset \cs{vsize}, for tools/1584}
+% \begin{macrocode}
+ \global\vsize\@colroom
+% \end{macrocode}
+% Put the head at the top of the next page.
+% \changes{v4.11}{2004/02/01}
+% {\cs{nobreak}, for tools/3484}
+% \begin{macrocode}
+ \copy\LT@head\nobreak
+% \end{macrocode}
+% End of "\ifnum\outputpenalty <-\@Mi".
+% \begin{macrocode}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Commands for the the table head and foot}
+%
+% \begin{macro}{\LT@end@hd@ft}
+% The core of "\endhead" and friends. Store the current chunk in the
+% box specified by "#1". Issue an error if the table has already
+% started. Then start a new chunk.
+% \begin{macrocode}
+\def\LT@end@hd@ft#1{%
+ \LT@echunk
+% \end{macrocode}
+% Changed from "\relax" to "\endgraf" at V3.04, see "\LT@start".
+% \begin{macrocode}
+ \ifx\LT@start\endgraf
+ \LT@err
+ {Longtable head or foot not at start of table}%
+ {Increase LTchunksize}%
+ \fi
+ \setbox#1\box\z@
+ \LT@get@widths
+ \LT@bchunk}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endfirsthead}
+% \begin{macro}{\endhead}
+% \begin{macro}{\endfoot}
+% \begin{macro}{\endlastfoot}
+% Call "\LT@end@hd@ft" with the appropriate box.
+% \begin{macrocode}
+\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
+\def\endhead{\LT@end@hd@ft\LT@head}
+\def\endfoot{\LT@end@hd@ft\LT@foot}
+\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{The \cs{multicolumn} command}
+%
+% Earlier versions needed a special `draft' form of "\multicolumn".
+% This is not needed in version~4, and so these commands have been
+% removed.
+%
+% \begin{macro}{\LTmulticolumn}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) macro removed}
+% \end{macro}
+%
+% \begin{macro}{\LT@mcwarn}
+% \changes{v4.01}{1996/04/11}
+% {(DPC) macro removed}
+% \end{macro}
+%
+% \subsection{Footnotes}
+%
+% The standard "\footnote" command works in a "c" column, but we
+% need to modify the definition in a "p" column to overcome the
+% extra level of boxing. These macros are based on the \package{array}
+% package, but should be OK for the standard \env{tabular}.
+%
+% \begin{macro}{\LT@startpbox}
+% \changes{v4.09}{1998/05/13}
+% {Use \cs{setlength}, so that calc extensions apply. tools/2793}
+% Add extra code to switch the definition of "\@footnotetext".
+% \begin{macrocode}
+\def\LT@startpbox#1{%
+ \bgroup
+% \end{macrocode}
+% \changes{v4.12}{2019/02/06}{Color group to match array package}
+% \begin{macrocode}
+ \color@begingroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \vrule \@height \ht\@arstrutbox \@width \z@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@endpbox}
+% After the parbox is closed, expand "\LT@p@ftn" which will execute a
+% series of\\
+% "\footnotetext["\meta{num}"]{"\meta{note}"}"\\
+% commands. After being lifted out of the parbox, they can migrate on
+% their own from here.
+% \changes{v3.10}{1994/05/15}
+% {Use \cs{@finalstrut}}
+% \changes{v4.03}{1996/05/07}
+% {Use \cs{hfil} for tools/2120}
+% \begin{macrocode}
+\def\LT@endpbox{%
+ \@finalstrut\@arstrutbox
+% \end{macrocode}
+% \changes{v4.12}{2019/02/06}{Color group to match array package}
+% \begin{macrocode}
+ \color@endgroup
+ \egroup
+ \the\LT@p@ftn
+ \global\LT@p@ftn{}%
+ \hfil}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\LT@p@ftntext}
+% Inside the `p' column, just save up the footnote text in a token
+% register.
+% \begin{macrocode}
+\def\LT@p@ftntext#1{%
+ \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
+ \global\LT@p@ftn\expandafter{\@tempa{#1}}}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+\endinput
+
diff --git a/macros/latex-dev/required/tools/longtable.ins b/macros/latex-dev/required/tools/longtable.ins
new file mode 100644
index 0000000000..1fc3c12dfa
--- /dev/null
+++ b/macros/latex-dev/required/tools/longtable.ins
@@ -0,0 +1,75 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+
+\generate{\file{longtable.sty}{\from{longtable.dtx}{package}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/longtable.pdf b/macros/latex-dev/required/tools/longtable.pdf
new file mode 100644
index 0000000000..87a022140c
--- /dev/null
+++ b/macros/latex-dev/required/tools/longtable.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/manifest.txt b/macros/latex-dev/required/tools/manifest.txt
new file mode 100644
index 0000000000..8b0f9e32d0
--- /dev/null
+++ b/macros/latex-dev/required/tools/manifest.txt
@@ -0,0 +1,111 @@
+% \iffalse meta-comment
+%
+% Copyright 1993-2016
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%
+% CONTENTS OF THE TOOLS BUNDLE
+% ============================
+
+tools-overview.tex
+ Overview of the content of the tools bundle.
+
+array.dtx
+ Extended versions of the environments array, tabular and tabular*.
+dcolumn.dtx
+ Alignment on `decimal points' in tabular entries. Requires array.
+delarray.dtx
+ Adds `large delimiters' around arrays. Requires array.
+hhline.dtx
+ Finer control over horizontal rules in tables. Requires array.
+longtable.dtx
+ Multipage tables. (Does not require array, but uses the extended
+ features if both are loaded.)
+tabularx.dtx
+ Defines tabularx environment (similar to tabular*) but modifies
+ column widths, not inter-column space, to achieve a desired
+ table width.
+
+afterpage.dtx
+ Place text after the current page.
+
+bm.dtx
+ Access bold math symbols.
+
+calc.dtx
+ Infix arithmetic expresions. Contributed to the distribution by
+ Kresten Krab Thorup and Frank Jensen.
+
+enumerate.dtx
+ Extended version of the enumerate environment.
+
+fileerr.dtx
+ Suite of small files which may be used to control TeX's
+ missing file error loop.
+
+fontsmpl.dtx
+ Package and test file for producing `font samples'
+
+ftnright.dtx
+ Place footnotes in the right hand column in two-column mode.
+
+indentfirst.dtx
+ Indent the first paragraph of sections etc.
+
+layout.dtx
+ Produces an overview of the layout of the current document.
+
+multicol.dtx
+ Typeset text in columns, with the length of the final columns
+ `balanced'.
+
+rawfonts.dtx
+ Preload fonts under the old internal font names of LaTeX2.09.
+ Not recomended for new packages, but may help when updating old
+ files.
+
+shellesc.dtx
+ Unified interface for accessing system commands.
+
+showkeys.dtx
+ Draft mode showing the `keys' used by \label, \ref, \cite etc.
+
+somedefs.dtx
+ Selective handling of package options. (Used in rawfonts.sty.)
+
+theorem.dtx
+ Flexible definition of `theorem-like' environments.
+
+trace.dtx
+ The package helps to suppress and to control the amount of tracing
+ output (\tracingall) by taming calc and making NFSS less noisy.
+
+varioref.dtx
+ `Smart' handling of page references.
+
+verbatim.dtx
+ Flexible version of verbatim environment.
+
+xr.dtx
+ eXternall References. Extend \ref to access \label commands in
+ other documents.
+
+xspace.dtx
+ Smart space command that avoids the common mistake of missing
+ spaces after command names.
diff --git a/macros/latex-dev/required/tools/multicol-2017-04-11.sty b/macros/latex-dev/required/tools/multicol-2017-04-11.sty
new file mode 100644
index 0000000000..e8558e4ce0
--- /dev/null
+++ b/macros/latex-dev/required/tools/multicol-2017-04-11.sty
@@ -0,0 +1,1042 @@
+%%
+%% This is an old release of `multicol.sty',
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at http://latex-project.org/bugs.html
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%%
+%% Package `multicol' to use with LaTeX2e
+%% Copyright 1989-2016 Frank Mittelbach
+%%
+%% In addition to the terms of LPPL any distributed version
+%% (unchanged or modified) of multicol has to keep the statement
+%% about the moral obligation for using multicol. In case of major
+%% changes where this would not be appropriate the author of the
+%% changed version should contact the copyright holder.
+%%
+%%
+%% Moral obligation for using multicol:
+%% ------------------------------------
+%%
+%% Users of multicol who wish to include or use multicol or a modified
+%% version in a proprietary and commercially market product are asked
+%% under certain conditions (see below) for the payment of a license
+%% fee. The size of this fee is to be determined, in each instance,
+%% by the commercial user, depending on his/her judgment of the value of
+%% multicol for his/her product.
+%%
+%%
+%% The conditions for this are as follows:
+%%
+%% The producer of a proprietary and commercially market product
+%% that involves typesetting using multicol is asked to determine
+%% the value of a license fee for using multicol if
+%%
+%% - the product is a document and the producer has decided to
+%% include multicol to typeset (parts of) the document or has
+%% directed the author of the document to include multicol (for
+%% example, by providing a class file to be used by the author)
+%%
+%% - the product is a LaTeX class or package that includes multicol
+%%
+%%
+%% There is no moral obligation in case
+%%
+%% - the product is a document but producer has not directed
+%% the author to include multicol (in that case the moral obligation
+%% lies with the author of the document)
+%%
+%% - the product does not involve typesetting, e.g., consists, for
+%% example, of distributing multicol and its documentation.
+%%
+%% - the product is not proprietary, i.e., is made available as free
+%% software itself (which doesn't prohibit its commercial marketing)
+%%
+%% - multicol is used for non-commercial purposes
+%%
+%%
+%% Determining a license fee might result in a license fee of zero
+%% (i.e., no payment) in case a producer has determined that the use
+%% of multicol has no enhancing effect on the product. This is a
+%% plausible scenario, i.e., in the above two cases the producer is
+%% only asked to evaluate the value of multicol for the product
+%% not for the payment of a license fee per se (which might or might
+%% not follow from this evaluation).
+%%
+%% The license fee, if any, can be payed either to the LaTeX3 fund
+%% (see ltx3info.txt in the base LaTeX distribution) or to the author of
+%% the program who can be contacted at
+%%
+%% Frank.Mittelbach@latex-project.org
+%%
+\NeedsTeXFormat{LaTeX2e}[1997/12/01]
+\ProvidesPackage{multicol}
+ [2017/04/11 v1.8q multicolumn formatting (FMi)]
+%%
+\DeclareOption{twocolumn}
+ {\PackageWarning{multicol}{May not work
+ with the twocolumn option}}
+\newcount\c@tracingmulticols
+\DeclareOption{errorshow}
+ {\c@tracingmulticols\z@}
+\DeclareOption{infoshow}
+ {\c@tracingmulticols\@ne}
+\DeclareOption{balancingshow}
+ {\c@tracingmulticols\tw@}
+\DeclareOption{markshow}
+ {\c@tracingmulticols\thr@@}
+\DeclareOption{debugshow}
+ {\c@tracingmulticols5\relax}
+\let\mc@gridwarn\maxdimen
+\DeclareOption{grid}{\def\mc@gridwarn{\maxdepth}}
+\DeclareOption{colaction}{%
+ \def\mc@col@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status
+ {\ifmc@firstcol 1\else 2\fi}}%
+ \mc@firstcolfalse}%
+ \def\mc@lastcol@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status{3}}}%
+}
+\let\mc@col@status@write\relax
+\let\mc@lastcol@status@write\relax
+\ProcessOptions
+\def\multicols#1{\col@number#1\relax
+ \ifnum\col@number<\tw@
+ \PackageWarning{multicol}%
+ {Using `\number\col@number'
+ columns doesn't seem a good idea.^^J
+ I therefore use two columns instead}%
+ \col@number\tw@ \fi
+ \ifnum\col@number>10
+ \PackageError{multicol}%
+ {Too many columns}%
+ {Current implementation doesn't
+ support more than 10 columns.%
+ \MessageBreak
+ I therefore use 10 columns instead}%
+ \col@number10 \fi
+ \ifx\@footnotetext\mult@footnotetext\else
+ \let\orig@footnotetext\@footnotetext
+ \let\@footnotetext\mult@footnotetext
+ \fi
+ \@ifnextchar[\mult@cols{\mult@cols[]}}
+\long\def\mult@footnotetext#1{\begingroup
+ \columnwidth\textwidth
+ \orig@footnotetext{#1}\endgroup}
+\def\mult@cols[#1]{\@ifnextchar[%
+ {\mult@@cols{#1}}%
+ {\mult@@cols{#1}[\premulticols]}}
+\def\mult@@cols#1[#2]{%
+ \par
+ \ifinner \@boxedmulticolstrue
+ \else
+ \ifnum \doublecol@number>\z@
+ \@boxedmulticolstrue
+ \fi
+ \fi
+ \mult@info\z@
+ {Starting environment with
+ \the\col@number\space columns%
+ \if@boxedmulticols\MessageBreak
+ (boxed mode)\fi
+ }%
+ \enough@room{#2}%
+ #1\par\addvspace\multicolsep
+ \ifdim \prevdepth = -\@m\p@
+ \else
+ \@tempcnta\prevdepth
+ \@tempcntb\baselineskip
+ \divide\@tempcnta\@tempcntb
+ \advance\@tempcnta\@ne
+ \dimen@\prevdepth
+ \advance\dimen@ -\@tempcnta\baselineskip
+ \advance\dimen@ \topskip
+ \kern-\dimen@
+ \fi
+ \begingroup
+ \prepare@multicols
+ \if@boxedmulticols
+ \setbox\mult@box\vbox\bgroup
+ \color@setgroup
+ \fi
+ \ignorespaces}
+\newif\if@boxedmulticols
+\@boxedmulticolsfalse
+\newbox\mult@box
+\def\enough@room#1{%
+ \if@boxedmulticols\else
+ \par
+ \bgroup\@nobreakfalse\addpenalty\z@\egroup
+ \page@free \pagegoal
+ \advance \page@free -\pagetotal
+ \@tempskipa#1\relax
+ \mult@info\z@
+ {Current page:\MessageBreak
+ height=%
+ \the\pagegoal: used \the\pagetotal
+ \space -> free=\the\page@free
+ \MessageBreak
+ needed \the\@tempskipa
+ \space(for #1)}%
+ \ifdim \page@free <#1\newpage \fi
+ \fi}
+\def\prepare@multicols{%
+ \multicol@leftmargin\@totalleftmargin
+ \@totalleftmargin\z@
+ \parshape\z@
+ \doublecol@number\col@number
+ \multiply\doublecol@number\tw@
+ \advance\doublecol@number\mult@rightbox
+ \if@boxedmulticols
+ \let\l@kept@firstmark\kept@firstmark
+ \let\l@kept@botmark\kept@botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \else
+ \nointerlineskip {\topskip\z@\null}%
+ \output{%
+ \global\setbox\partial@page\vbox
+ {%
+ \ifvoid\partial@page\else
+ \PackageError{multicol}%
+ {Error saving partial page}%
+ {The part of the page before
+ the multicols environment was
+ nearly full with^^Jthe result
+ that starting the environment
+ will produce an overfull
+ page. Some^^Jtext may be lost!
+ Please increase \premulticols
+ either generally or for this%
+ ^^Jenvironment by specifying a
+ suitable value in the second
+ optional argument to^^Jthe
+ multicols environment.}
+ \unvbox\partial@page
+ \box\last@line
+ \fi
+ \unvbox\@cclv
+ \global\setbox\last@line\lastbox
+ }%
+ \prep@keptmarks
+ \global\let\kept@topmark\firstmark
+ }\eject
+ \advance\@colroom-\ht\partial@page
+ \set@mult@vsize\relax
+ \output{\multi@column@out}%
+ \init@mult@footins
+ \reinsert@footnotes
+ \def\clearpage{%
+ \ifx\@deferlist\@empty\else
+ \PackageError{multicol}%
+ {Deferred floats not cleared}%
+ {A \string\clearpage\space inside multicols acts like
+ \string\newpage\space and doesn't clear floats.\MessageBreak
+ Move it before the multicols environment if you need it.}%
+ \fi
+ \newpage}%
+ \fi
+ \vbadness\@Mi \hbadness5000
+ \tolerance\multicoltolerance
+ \pretolerance\multicolpretolerance
+ \setemergencystretch\col@number\hsize
+ \set@floatcmds
+ \advance\baselineskip\multicolbaselineskip
+ \hsize\linewidth \advance\hsize\columnsep
+ \advance\hsize-\col@number\columnsep
+ \divide\hsize\col@number
+ \full@width\linewidth
+ \linewidth\hsize
+ \columnwidth\hsize
+}
+\def\init@mult@footins{%
+ \multiply\count\footins\col@number
+ \multiply\skip \footins\col@number
+}
+\def\set@mult@vsize#1{%
+ \vsize\@colroom
+ \@tempdima\baselineskip
+ \advance\@tempdima-\topskip
+ \advance\vsize\@tempdima
+ \vsize\col@number\vsize
+ \advance\vsize-\@tempdima
+ \advance\vsize\col@number\baselineskip
+ #1\advance\vsize
+ \c@collectmore\baselineskip}
+\newdimen\multicol@leftmargin
+\def\endmulticols{\par
+ \if@boxedmulticols
+ \remove@discardable@items\color@endgroup\egroup
+ \balance@columns
+ \return@nonemptymark{first}%
+ \kept@firstmark
+ \return@nonemptymark{bot}%
+ \kept@botmark
+ \page@sofar
+ \global\let\kept@firstmark
+ \l@kept@firstmark
+ \global\let\kept@botmark
+ \l@kept@botmark
+ \mult@info\tw@
+ {Restore kept marks to\MessageBreak
+ first: \meaning\kept@firstmark
+ \MessageBreak bot\space\space:
+ \meaning\kept@botmark }%
+ \else
+ \ifdim\pagegoal=\maxdimen
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \unvbox\colbreak@box\fi
+ \fi
+ \penalty\z@
+ \output{\balance@columns@out}%
+ \eject
+ \ifvbox\partial@page
+ \unvbox\partial@page\fi
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \mult@info\tw@
+ {Make kept marks empty}%
+ \fi
+ \@checkend{multicols}%
+ \endgroup
+ \global\c@unbalance\z@
+ \if@boxedmulticols\else
+ \reinsert@footnotes
+ \ifdim \pagegoal=\maxdimen
+ \global\vsize\@colroom
+ \else
+ \enough@room\postmulticols
+ \fi
+ \fi
+ \addvspace\multicolsep
+ \prevdepth\z@
+ \mult@info\z@
+ {Ending environment
+ \if@boxedmulticols
+ \space(boxed mode)\fi
+ }}
+\newcount\c@unbalance
+\newcount\c@collectmore
+\newcount\doublecol@number
+\newcount\multicoltolerance
+\newcount\multicolpretolerance
+\newdimen\full@width
+\newdimen\page@free
+\newdimen\premulticols
+\newdimen\postmulticols
+\newskip\multicolsep
+\newskip\multicolbaselineskip
+\newbox\partial@page
+\newbox\last@line
+\c@unbalance = 0
+\c@collectmore = 0
+\multicoltolerance = 9999
+\multicolpretolerance = -1
+\premulticols = 50pt
+\postmulticols= 20pt
+\multicolsep = 12pt plus 4pt minus 3pt
+\multicolbaselineskip=0pt
+\def\process@cols#1#2{\count@#1\relax
+ \loop
+ #2%
+ \advance\count@\tw@
+ \ifnum\count@<\doublecol@number
+ \repeat}
+\def\page@sofar{%
+ \process@cols\mult@rightbox
+ {\ifvoid\count@
+ \setbox\count@\hbox to\hsize{}%
+ \else
+ \wd\count@\hsize
+ \fi}%
+ \count@\col@number \advance\count@\m@ne
+ \mult@info\z@
+ {Column spec: \the\full@width\space = indent
+ + columns + sep =\MessageBreak
+ \the\multicol@leftmargin\space
+ + \the\col@number\space
+ x \the\hsize\space
+ + \the\count@\space
+ x \the\columnsep
+ }%
+\ifvmode\else\errmessage{Multicol Error}\fi
+ \nointerlineskip
+ \setbox\z@\hbox{p}\global\dimen\tw@\dp\z@
+ \moveright\multicol@leftmargin
+ \hbox to\full@width{%
+ \mc@align@columns
+ \rlap{\phantom p}%
+ }%
+ \prevdepth\z@
+ \kern-\dimen\tw@
+ \ifdim\dimen\tw@ > \mc@gridwarn
+ \PackageWarning{multicol}%
+ {Very deep columns!\MessageBreak
+ Grid alignment might be broken}%
+ \fi
+}
+\def\columnseprulecolor{\normalcolor}
+\def\reinsert@footnotes{\ifvoid\footins\else
+ \insert\footins{}\fi}
+\def\vfilmaxdepth{\vskip \z@ \@plus .0001fil
+ \@minus \maxdepth}
+\def\multi@column@out{%
+ \ifnum\outputpenalty <-\@M
+ \speci@ls \else
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \setbox\@cclv\vbox{%
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \unvbox\@cclv}%
+ \fi
+ \splittopskip\topskip
+ \splitmaxdepth\maxdepth
+ \boxmaxdepth\maxdepth
+ \dimen@\@colroom
+ \divide\skip\footins\col@number
+ \ifvoid\footins \else
+ \leave@mult@footins
+ \fi
+ \let\ifshr@kingsaved\ifshr@king
+ \ifvbox \@kludgeins
+ \advance \dimen@ -\ht\@kludgeins
+ \ifdim \wd\@kludgeins>\z@
+ \shr@nkingtrue
+ \fi
+ \fi
+ \process@cols\mult@gfirstbox{%
+ \setbox\count@
+ \vsplit\@cclv to\dimen@
+ \set@keptmarks
+ \setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@
+ \ifshr@nking\vfilmaxdepth\fi}%
+ }%
+ \setbox\mult@rightbox
+ \vsplit\@cclv to\dimen@
+ \set@keptmarks
+ \setbox\mult@rightbox\vbox to\dimen@
+ {\unvbox\mult@rightbox
+ \ifshr@nking\vfilmaxdepth\fi}%
+ \let\ifshr@king\ifshr@kingsaved
+ \ifvoid\@cclv \else
+ \unvbox\@cclv
+ \ifnum\outputpenalty=\@M
+ \else
+ \penalty\outputpenalty
+ \fi
+ \ifvoid\footins\else
+ \PackageWarning{multicol}%
+ {I moved some lines to
+ the next page.\MessageBreak
+ Footnotes on page
+ \thepage\space might be wrong}%
+ \fi
+ \ifnum \c@tracingmulticols>\thr@@
+ \hrule\allowbreak \fi
+ \fi
+ \ifx\@empty\kept@firstmark
+ \let\firstmark\kept@topmark
+ \let\botmark\kept@topmark
+ \else
+ \let\firstmark\kept@firstmark
+ \let\botmark\kept@botmark
+ \fi
+ \let\topmark\kept@topmark
+ \mult@info\tw@
+ {Use kept top mark:\MessageBreak
+ \meaning\kept@topmark
+ \MessageBreak
+ Use kept first mark:\MessageBreak
+ \meaning\kept@firstmark
+ \MessageBreak
+ Use kept bot mark:\MessageBreak
+ \meaning\kept@botmark
+ \MessageBreak
+ Produce first mark:\MessageBreak
+ \meaning\firstmark
+ \MessageBreak
+ Produce bot mark:\MessageBreak
+ \meaning\botmark
+ \@gobbletwo}%
+ \boxmaxdepth\maxdimen
+ \setbox\@cclv\vbox{\unvbox\partial@page
+ \page@sofar}%
+ \@makecol\@outputpage
+ \global\let\kept@topmark\botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \mult@info\tw@
+ {(Re)Init top mark:\MessageBreak
+ \meaning\kept@topmark
+ \@gobbletwo}%
+ \global\@colroom\@colht
+ \global \@mparbottom \z@
+ \global \@textfloatsheight \z@
+ \process@deferreds
+ \@whilesw\if@fcolmade\fi{\@outputpage
+ \global\@colroom\@colht
+ \process@deferreds}%
+ \mult@info\@ne
+ {Colroom:\MessageBreak
+ \the\@colht\space
+ after float space removed
+ = \the\@colroom \@gobble}%
+ \set@mult@vsize \global
+ \fi}
+\def\leave@mult@footins{%
+ \advance\dimen@-\skip\footins
+ \advance\dimen@-\ht\footins
+}
+\def\speci@ls{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum \outputpenalty<-\@MM
+ \PackageError{multicol}{Document end
+ inside multicols environment}\@ehd
+ \@specialoutput
+ \else
+ \ifnum\outputpenalty = -\@Mv
+ \mult@info\@ne{Forced column
+ break seen}%
+ \global\advance\vsize-\pagetotal
+ \global\setbox\colbreak@box
+ \vbox{%
+ \ifvoid\colbreak@box
+ \else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \fi
+ \boxmaxdepth\maxdepth
+ \setbox\@cclv\vbox{%
+ \unvbox\@cclv
+ \remove@discardable@items}%
+ \dimen@\dp\@cclv
+ \unvbox\@cclv
+ \kern-\dimen@
+ }%
+ \reinsert@footnotes
+ \else
+ \PackageWarningNoLine{multicol}%
+ {Floats and marginpars not
+ allowed inside `multicols'
+ environment!}%
+ \unvbox\@cclv\reinsert@footnotes
+ \xdef\@freelist{\@freelist\@currlist}%
+ \gdef\@currlist{}%
+ \fi
+ \fi
+ \else \@doclearpage \fi
+}
+\def\process@deferreds{%
+ \@floatplacement
+ \@tryfcolumn\@deferlist
+ \if@fcolmade\else
+ \begingroup
+ \let\@tempb\@deferlist
+ \gdef\@deferlist{}%
+ \let\@elt\@scolelt
+ \@tempb \endgroup
+ \fi}
+\newif\ifshr@nking
+\def\raggedcolumns{%
+ \@bsphack\shr@nkingtrue\@esphack}
+\def\flushcolumns{%
+ \@bsphack\shr@nkingfalse\@esphack}
+\def\balance@columns@out{%
+ \setbox\mult@box\vbox{%
+ \ifvoid\colbreak@box\else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \mult@info\@ne{Re-adding
+ forced break(s) in balancing}%
+ \fi
+ \unvbox\@cclv
+ \remove@discardable@items
+ }%
+ \balance@columns
+ \iftoo@bad
+ \mult@info\@ne
+ {Balancing failed ...
+ cut a normal page}%
+ \setbox\@cclv\vbox
+ {\vskip\topskip
+ \vskip-\splittopskip
+ \unvbox\mult@box}%
+ \multi@column@out
+ \else
+ \global\vsize\@colroom
+ \global\advance\vsize\ht\partial@page
+ \ifvbox\@kludgeins\insert\@kludgeins
+ {\unvbox\@kludgeins}\fi
+ \unvbox\partial@page
+ \return@nonemptymark{first}\kept@firstmark
+ \return@nonemptymark{bot}\kept@botmark
+ \page@sofar
+ \penalty\z@
+ \fi
+}
+\def\balance@columns{%
+ \get@keptmarks\mult@box
+ \setbox\mult@box\vbox{%
+ \penalty-\@M
+ \unvbox\mult@box
+ }%
+ \@tempdima\topskip
+ \splittopskip\@tempdima
+ \@plus\multicolundershoot
+ \@minus\multicolovershoot
+ \splitmaxdepth\maxdepth
+ \boxmaxdepth\maxdepth
+ \setbox\@tempboxa\vsplit\mult@box to\z@
+ \@tempdima\ht\mult@box
+ \advance\@tempdima\dp\mult@box
+ \divide\@tempdima\col@number
+ \count@\@tempdima
+ \divide\count@\baselineskip
+ \dimen@\count@\baselineskip
+ \advance\dimen@\topskip
+ \ifdim \dimen@ >\@tempdima
+ \advance\dimen@-\baselineskip
+ \fi
+ \advance\dimen@\c@unbalance\baselineskip
+ \mult@info\@ne
+ {Balance columns\on@line:
+ \ifnum\c@unbalance=\z@\else
+ (off balance=\number\c@unbalance)\fi
+ \@gobbletwo}%
+ \ifnum\dimen@<\topskip
+ \mult@info\@ne
+ {Start value
+ \the\dimen@ \space ->
+ \the\topskip \space (corrected)}%
+ \dimen@\topskip
+ \fi
+ \vbadness\@M
+ \vfuzz \maxdimen
+ \last@try-\p@
+ \loop
+ {\process@cols\mult@grightbox
+ {\global\setbox\count@
+ \box\voidb@x}}%
+ \global\setbox\mult@grightbox
+ \copy\mult@box
+ \too@badfalse
+ \forcedbreak@leftoverfalse
+ {\process@cols\mult@firstbox{%
+ \global\setbox\count@
+ \vsplit\mult@grightbox to\dimen@
+ \global\setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@}%
+ \ifnum\c@tracingmulticols>\@ne
+ \@tempcnta\count@
+ \advance\@tempcnta-\mult@grightbox
+ \divide\@tempcnta \tw@
+ \message{^^JColumn
+ \number\@tempcnta\space
+ badness: \the\badness\space}%
+ \fi
+ \ifnum\badness>\c@columnbadness
+ \ifnum\c@tracingmulticols>\@ne
+ \message{too bad
+ (>\the\c@columnbadness)}%
+ \fi
+ \too@badtrue
+ \fi
+ }}%
+ \global\setbox\mult@grightbox
+ \vbox{\unvbox\mult@grightbox}%
+ \setbox\mult@nat@firstbox
+ \vbox{\unvcopy\mult@firstbox}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{^^JFirst column
+ = \the\dimen@\space
+ (\the\ht\mult@nat@firstbox)}\fi
+ \ifnum\c@tracingmulticols>\@ne
+ \message{<> last column =
+ \the\ht\mult@grightbox^^J}%
+ \fi
+ \ifdim\ht\mult@grightbox >\dimen@
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: last
+ column too large!}%
+ \fi
+ \else
+ \setbox\@tempboxa
+ \copy\mult@grightbox
+ \setbox\z@\vsplit\@tempboxa to\maxdimen
+ \ifvoid\@tempboxa
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{Final badness:
+ \the\badness}%
+ \fi
+ \ifnum\badness>\c@finalcolumnbadness
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox\vfil}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{ setting natural
+ (> \the\c@finalcolumnbadness)}%
+ \fi
+ \fi
+ \else
+ \@tempdima\@colroom
+ \advance\@tempdima \maxbalancingoverflow
+ \ifdim \dimen@ < \@tempdima
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: unprocessed
+ forced break(s) in last column!}%
+ \fi
+ \else
+ \forcedbreak@leftovertrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Failed: columns too large
+ with unprocessed forced break(s)!}%
+ \fi
+ \fi
+ \fi
+ \fi
+ \ifdim\ht\mult@nat@firstbox<\dimen@
+ \ifdim\ht\mult@nat@firstbox>\last@try
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Retry: using natural
+ height of first column!}%
+ \fi
+ \dimen@\ht\mult@nat@firstbox
+ \last@try\dimen@
+ \advance\dimen@-\p@
+ \fi
+ \fi
+ \iftoo@bad
+ \advance\dimen@\p@
+ \repeat
+ \ifforcedbreak@leftover
+ \too@badtrue
+ \else
+ \if@boxedmulticols\else
+ \ifdim\dimen@>\@colroom
+ \dimen@\@colroom
+ \fi
+ \fi
+ \process@cols\mult@rightbox
+ {\@tempcnta\count@
+ \advance\@tempcnta\@ne
+ \vfuzz\z@
+ \setbox\count@\vbox to\dimen@
+ {%
+ \vskip \z@
+ \@plus-\multicolundershoot
+ \@minus-\multicolovershoot
+ \unvbox\@tempcnta
+ \ifshr@nking\vfilmaxdepth\fi
+ }%
+ \ifnum\badness>\@M
+ \vfuzz\maxdimen % no overfull warning
+ \setbox\@tempboxa \vbox to\dimen@
+ {\vskip-\maxbalancingoverflow
+ \unvcopy\count@}%
+ \ifnum\badness>\@M
+ \mult@info\@ne
+ {Balanced column more than
+ \the\maxbalancingoverflow\space
+ too large}%
+ \too@badtrue
+ \else
+ \mult@info\@ne
+ {Balanced column
+ too large, but less than
+ \the\maxbalancingoverflow}%
+ \fi
+ \fi
+ }%
+ \fi
+}
+\newdimen\maxbalancingoverflow
+\maxbalancingoverflow=12pt
+
+\newbox\mult@rightbox
+\newbox\mult@grightbox
+\newbox\mult@gfirstbox
+\newbox\mult@firstbox
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa
+\let\@tempa\relax
+\@ifundefined{emergencystretch}
+ {\newdimen\emergencystretch}{}
+\def\setemergencystretch#1#2{%
+ \emergencystretch 4pt
+ \multiply\emergencystretch#1}
+
+\def\set@floatcmds{%
+ \let\@dblfloat\@dbflt
+ \def\end@dblfloat{\@endfloatbox
+ \@largefloatcheck
+ \outer@nobreak
+ \ifnum\@floatpenalty<\z@
+ \@cons\@deferlist\@currbox
+ \fi
+ \ifnum\@floatpenalty=-\@Mii
+ \@Esphack
+ \fi}}
+\def\kept@topmark{{}{}}
+\let\kept@firstmark\@empty
+\let\kept@botmark\@empty
+\def\return@nonemptymark#1#2{%
+ \ifx#2\@empty
+ \else
+ \mult@info\tw@
+ {Returned #1 mark:\MessageBreak
+ \meaning#2}%
+ \toks@\expandafter{#2}%
+ \mark{\the\toks@}%
+ \nobreak
+ \fi}
+\def\get@keptmarks#1{%
+ \begingroup
+ \vbadness\@M
+ \setbox#1\copy#1%
+ \setbox#1\vsplit#1to\maxdimen
+ \set@keptmarks
+ \endgroup
+}
+\def\set@keptmarks{%
+ \ifx\kept@firstmark\@empty
+ \expandafter\gdef\expandafter
+ \kept@firstmark
+ \expandafter{\splitfirstmark}%
+ \ifx\kept@firstmark\@empty\else
+ \mult@info\tw@
+ {Set kept first mark:\MessageBreak
+ \meaning\kept@firstmark%
+ \@gobbletwo}%
+ \fi
+ \fi
+ \expandafter\def\expandafter\@tempa
+ \expandafter{\splitbotmark}%
+ \ifx\@tempa\@empty\else
+ \global\let\kept@botmark\@tempa
+ \mult@info\tw@
+ {Set kept bot mark:\MessageBreak
+ \meaning\kept@botmark%
+ \@gobbletwo}%
+ \fi}%
+\def\prep@keptmarks{%
+ \if@boxedmulticols \else
+ \get@keptmarks\partial@page
+ \fi}
+\skip0=0pt
+\edef\the@zero@skip{\the\skip0}
+\def\remove@discardable@items{%
+ \unpenalty
+ \edef\@tempa{\the\lastskip}%
+ \unskip
+ \ifx\@tempa\the@zero@skip
+ \edef\@tempb{\the\lastskip}%
+ \ifx\@tempb\the@zero@skip
+ \else
+ \unskip
+ \ifnum \lastpenalty=\@M
+ \vskip\@tempb\vskip\@tempa\relax
+ \else
+ \remove@discardable@items
+ \fi
+ \fi
+ \else
+ \remove@discardable@items
+ \fi
+}
+\newif\iftoo@bad
+\def\too@badtrue{\global\let\iftoo@bad\iftrue}
+\def\too@badfalse{\global\let\iftoo@bad\iffalse}
+\newif\ifforcedbreak@leftover
+\newcount\c@columnbadness
+\c@columnbadness=10000
+\newcount\c@finalcolumnbadness
+\c@finalcolumnbadness=9999
+
+\newdimen\last@try
+
+\newdimen\multicolovershoot
+\newdimen\multicolundershoot
+\multicolovershoot=0pt
+\multicolundershoot=2pt
+\newbox\mult@nat@firstbox
+\def\mult@info#1#2{%
+ \ifnum\c@tracingmulticols>#1%
+ \GenericWarning
+ {(multicol)\@spaces\@spaces}%
+ {Package multicol: #2}%
+ \fi
+}
+ \@namedef{multicols*}{%
+ \ifinner
+ \PackageWarning{multicol}%
+ {multicols* inside a box does
+ not make sense.\MessageBreak
+ Going to balance anyway}%
+ \else
+ \let\balance@columns@out
+ \multi@column@out
+ \fi
+ \begin{multicols}
+}
+\@namedef{endmulticols*}{%
+ \par
+ \ifdim\lastskip>\z@ \vskip-\lastskip \fi
+ \ifdim \prevdepth>\z@
+ \vskip-\ifdim\prevdepth>\boxmaxdepth
+ \boxmaxdepth
+ \else \prevdepth \fi
+ \fi
+ \ifshr@nking\else
+ \vfil
+ \fi
+ \end{multicols}}
+\mathchardef\@Mv=10005
+\def\columnbreak{%
+ \ifnum\col@number<\tw@
+ \PackageError{multicol}%
+ {\noexpand\columnbreak outside multicols}%
+ {This command can only be used within
+ a multicols or multicols* environment.}%
+ \else
+ \ifvmode
+ \penalty -\@Mv\relax
+ \else
+ \@bsphack
+ \vadjust{\penalty -\@Mv\relax}%
+ \@esphack
+ \fi
+ \fi}
+\newbox\colbreak@box
+\def\LR@column@boxes{%
+ \process@cols\mult@gfirstbox{%
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+ \mc@col@status@write
+ \box\count@
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss}%
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+}
+
+\def\RL@column@boxes{%
+ \process@cols\mult@gfirstbox{%
+ \hskip\hsize
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss
+ }%
+ \hskip\hsize
+ \process@cols\mult@gfirstbox{%
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+ \hskip-\hsize
+ \mc@col@status@write
+ \box\count@
+ \hskip-\hsize
+ \hskip-\columnsep
+ }%
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+ \hskip-\hsize
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+ \hskip-\hsize
+ \hskip\full@width
+ }
+\newcommand\RLmulticolcolumns
+ {\let\mc@align@columns
+ \RL@column@boxes}
+\newcommand\LRmulticolcolumns
+ {\let\mc@align@columns
+ \LR@column@boxes}
+\LRmulticolcolumns
+\newcount\mc@col@check@num
+
+\newcommand\docolaction[4][1]{%
+ \ifx\mc@col@status@write\relax
+ \PackageError{multicol}%
+ {Option 'colaction' not selected}%
+ {\string\docolaction\space
+ requires the use of the 'colaction'
+ option on the package}%
+ \fi
+ \global\advance\mc@col@check@num\@ne
+ \edef\mc@col@type{\expandafter\ifx
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname\relax
+ 0\else
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname
+ \fi}%
+ \ifcase \mc@col@type\relax
+ \ifcase #1\or #2\or#3\or#4\fi
+ \or
+ #2% % 1 First col
+ \or
+ #3% % 2 any middle col
+ \or
+ #4% % 3 last col
+ \else
+ \ERROR
+ \fi
+ \edef\next{\write\@auxout
+ {\string\mc@set@col@status
+ {mc@col-\the\mc@col@check@num}%
+ {\mc@col@type}}}%
+ \next
+}
+\def\mc@col@status#1{%
+ \gdef\mc@curr@col@status{#1}}
+\def\mc@set@col@status#1#2{%
+ \global\expandafter\let\csname #1\endcsname
+ \mc@curr@col@status}
+\AtEndDocument{\def\mc@set@col@status#1#2{%
+ \ifnum #2=\mc@curr@col@status\else
+ \@tempswatrue
+ \fi}%
+}
+\newif\ifmc@firstcol
+\mc@firstcoltrue
+\endinput
+%%
+%% End of file `multicol.sty'.
diff --git a/macros/latex-dev/required/tools/multicol.dtx b/macros/latex-dev/required/tools/multicol.dtx
new file mode 100644
index 0000000000..d68f471fcd
--- /dev/null
+++ b/macros/latex-dev/required/tools/multicol.dtx
@@ -0,0 +1,4450 @@
+% \iffalse meta-comment
+%
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%
+% \iffalse This is a METACOMMENT
+%
+%% Package `multicol' to use with LaTeX2e
+%% Copyright 1989-2019 Frank Mittelbach
+%%
+%% In addition to the terms of LPPL any distributed version
+%% (unchanged or modified) of multicol has to keep the statement
+%% about the moral obligation for using multicol. In case of major
+%% changes where this would not be appropriate the author of the
+%% changed version should contact the copyright holder.
+%%
+%%
+%% Moral obligation for using multicol:
+%% ------------------------------------
+%%
+%% Users of multicol who wish to include or use multicol or a modified
+%% version in a proprietary and commercially market product are asked
+%% under certain conditions (see below) for the payment of a license
+%% fee. The size of this fee is to be determined, in each instance,
+%% by the commercial user, depending on his/her judgment of the value of
+%% multicol for his/her product.
+%%
+%%
+%% The conditions for this are as follows:
+%%
+%% The producer of a proprietary and commercially market product
+%% that involves typesetting using multicol is asked to determine
+%% the value of a license fee for using multicol if
+%%
+%% - the product is a document and the producer has decided to
+%% include multicol to typeset (parts of) the document or has
+%% directed the author of the document to include multicol (for
+%% example, by providing a class file to be used by the author)
+%%
+%% - the product is a LaTeX class or package that includes multicol
+%%
+%%
+%% There is no moral obligation in case
+%%
+%% - the product is a document but producer has not directed
+%% the author to include multicol (in that case the moral obligation
+%% lies with the author of the document)
+%%
+%% - the product does not involve typesetting, e.g., consists, for
+%% example, of distributing multicol and its documentation.
+%%
+%% - the product is not proprietary, i.e., is made available as free
+%% software itself (which doesn't prohibit its commercial marketing)
+%%
+%% - multicol is used for non-commercial purposes
+%%
+%%
+%% Determining a license fee might result in a license fee of zero
+%% (i.e., no payment) in case a producer has determined that the use
+%% of multicol has no enhancing effect on the product. This is a
+%% plausible scenario, i.e., in the above two cases the producer is
+%% only asked to evaluate the value of multicol for the product
+%% not for the payment of a license fee per se (which might or might
+%% not follow from this evaluation).
+%%
+%% The license fee, if any, can be payed either to the LaTeX3 fund
+%% (see ltx3info.txt in the base LaTeX distribution) or to the author of
+%% the program who can be contacted at
+%%
+%% Frank.Mittelbach@latex-project.org
+%%
+%<*dtx>
+ \ProvidesFile{multicol.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}[2018-04-01]
+%<package>
+%<package>\providecommand\DeclareRelease[3]{}
+%<package>\providecommand\DeclareCurrentRelease[2]{}
+%<package>
+%<package>\DeclareRelease{}{2017-04-11}{multicol-2017-04-11.sty}
+%<package>\DeclareCurrentRelease{}{2018-04-01}
+%<package>
+%<package>\ProvidesPackage{multicol}
+%<driver> \ProvidesFile{multicol.drv}
+% \fi
+% \ProvidesFile{multicol.dtx}
+ [2019/03/01 v1.8w multicolumn formatting (FMi)]
+%
+%
+%%
+%
+% \changes{v1.5n}{1997/06/05}{Applied improvement of documentation,
+% kindly done by Robin Fairbairns.}
+% \changes{v1.4h}{1992/06/04}{Added mark tracing with
+% tracingmulticols$\ge2$}
+% \changes{v1.4a}{1992/02/11}{Added support for multicol in inner mode}
+% \changes{v1.0d}{1989/05/17}{All lines shortened to 72 or less.}
+% \changes{v1.0e}{1989/06/21}{Redefinition of description env. to use
+% \cs{descriptionmargin}\quotechar=5pt
+% in documentation.}
+% \changes{v1.0f}{1989/07/11}{Changed \cs{z@} to 0pt in redefinition of
+% description.}
+% \changes{v1.1a}{1989/09/20}{\cs{multicolssep} changed to \cs{multicolsep}.}
+%
+% \def\description{\list{}{\labelwidth 0pt \leftmargin\descriptionmargin
+% \itemindent-\leftmargin \let\makelabel\descriptionlabel}}
+% \newdimen\descriptionmargin \descriptionmargin=5pt
+%
+% \DoNotIndex{\@M,\@Mi,\@bsphack,\@cclv,\@colht,\@currlist,\@deferlist}
+% \DoNotIndex{\@elt,\@esphack,\@floatplacement}
+% \DoNotIndex{\@ifundefined,\@ifnextchar,\@makecol}
+% \DoNotIndex{\@ne,\@outputpage,\@scolelt,\@spaces,\@tempb,\@tempcnta}
+% \DoNotIndex{\@width}
+% \DoNotIndex{\addvspace,\advance,\allowbreak}
+% \DoNotIndex{\baselineskip,\begingroup,\box,\columnsep,\copy,\count}
+% \DoNotIndex{\count@,\def,\dimen@,\divide,\docdate}
+% \DoNotIndex{\edef,\eject,\egroup,\else,\endgroup,\endinput}
+% \DoNotIndex{\fi,\fileversion,\filedate}
+% \DoNotIndex{\gdef,\global}
+% \DoNotIndex{\hbox,\hfil,\hrule,\ht,\hss}
+% \DoNotIndex{\ifdim,\ifnum,\ifvoid,\ignorespaces,\insert,\immediate}
+% \DoNotIndex{\let,\loop}
+% \DoNotIndex{\maxdepth,\message,\multiply}
+% \DoNotIndex{\newbox,\newcount,\newdimen,\newskip,\number,\newpage}
+% \DoNotIndex{\outputpenalty,\p@,\penalty}
+% \DoNotIndex{\relax,\repeat,\setbox,\skip,\space,\splitmaxdepth}
+% \DoNotIndex{\splittopskip,\string,\sixt@@n}
+% \DoNotIndex{\the,\thepage,\thr@@,\topskip,\tw@,\typeout}
+% \DoNotIndex{\unvbox,\vbox,\vfill,\vsplit,\voidb@x,\vrule}
+% \DoNotIndex{\write,\wd}
+% \DoNotIndex{\z@}
+%
+% \MakeShortVerb{\|}
+% \newcommand{\mc}{\textsf{multicols}}
+% \newcommand{\TUB}{{\sl TUGboat\/}}
+% \newcommand{\TB}{{\sl\TeX book\/}}
+%
+%
+% \setcounter{StandardModuleDepth}{2}
+% \setcounter{collectmore}{3}
+%
+% \GetFileInfo{multicol.dtx}
+% \title{An environment for multicolumn output\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}%
+% \thanks{Note: This package is released under terms which affect
+% its use in commercial applications. Please see the details at
+% the top of the source file.}}
+% \author{Frank Mittelbach\\
+% {\rm Email:} see top of the source file}
+% \date{Printed \today}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \begin{abstract}
+% This article describes the use and the implementation of the \mc{}
+% environment. This environment allows switching between
+% one and multicolumn format on the same page. Footnotes are handled
+% correctly (for the most part), but will be placed at the bottom of
+% the page and not under each column. \LaTeX{}'s float mechanism,
+% however, is partly disabled in this implementation. At the
+% moment only page-wide floats (i.e., star-forms) can be used within
+% the scope of the environment.
+% \end{abstract}
+%
+% \begin{multicols}{3}[\section*{Preface to version 1.8}]
+% The 1.8 release improves on the balancing approach. If due to a
+% limited number of break points (e.g., due to large objects) the
+% balanced columns exceed the available vertical space, then
+% balancing is canceled and a normal page is produced first. Some
+% overflow is allowed (controlled by the parameter
+% |\maxbalancingoverflow| which defaults to 12pt). This ensures
+% that we only cut a normal page if we get enough material carried
+% over to next page.
+%
+% Also added was support for |\enlargethispage|. This means it is
+% now possible to request a page to be artificially enlarged or
+% shortened. Note that if you enlarge pages by more than one line
+% you may have to increase the \textsf{collectmore} counter value to
+% ensure that enough material is being picked up.
+%
+% This command was used on the second page of this manual to shorten
+% it by one line, in order to get rid of a number of widow lines on
+% the following pages.
+%
+% There are also some small enhancements to the balancing algorithm
+% including a ways to require a minimum number of rows in the result.
+%
+% Finally, version 1.8 adds the command |\docolaction| to help with
+% more complicated actions that depend on the current column. This
+% command expects 3 arguments: code that is executed if we are in
+% the ``first'' column, code to execute if we end up in any
+% ``middle'' column (if there are more than two) and finally code to
+% execute if we are in the ``last'' column. Thus
+%\begin{verbatim}
+% \docolaction{first}
+% {middle}{last}
+%\end{verbatim}
+% would typeset a different word depending the type of column this
+% code is executed. Using it like this is probably pointless, but
+% you can imagine applications like writing something into the
+% nearest margin, etc.
+%
+% As this feature needs at least two \LaTeX{} runs to produce correct
+% results and as it adds to the processing complexity it is only
+% made available if one add the option \texttt{colaction} when
+% loading the package.
+%
+% \end{multicols}
+%
+%
+% \begin{multicols}{3}[\section*{Preface to version 1.7
+% (right to left support)}]
+% The 1.7 release adds support for languages that are typeset
+% right-to-left. For those languages the order of the columns on the page
+% also need to be reversed---something that wasn't supported before. The next
+% paragraph demonstrates the result (as it is typeset as if we are writing
+% in a left-to-right language--- so read the rightmost column
+% first). The change is initialized via
+% |\RLmulticolcolumns| and returning to left-right (default)
+% is done via |\LRmulticolcolumns|.
+% \end{multicols}
+%
+% \RLmulticolcolumns
+%
+% \begin{multicols}{3}
+% Right-to-left typesetting will only reverse the column orders. Any
+% other support needed will have to be provided by other means,
+% e.g., using appropriate fonts and reversing the writing directions
+% within the columns. As footnotes are typeset in full measure the
+% footnote rule needs to be redefined as if they are below a single
+% column, i.e., using |\textwidth| not |\columnwidth|. For example:
+%\begin{verbatim}
+%\renewcommand \footnoterule{%
+% \kern-3pt\hbox to\textwidth
+% {\hskip .6\textwidth
+% \hrulefill }%
+% \kern2.6pt}
+%\end{verbatim}
+% \end{multicols}
+%
+% \LRmulticolcolumns
+%
+% \begin{multicols}{3}[\section*{Preface to version 1.5 + 1.6}]
+% \hbadness=10000
+% The 1.5 release contains two major changes: \mc{} will now
+% support up to 10 columns and two more tuning possibilities have
+% been added to the balancing routine. The balancing routine now
+% checks the badness
+% of the resulting columns and rejects solutions that are larger
+% than a certain threshold.
+% At the same time \mc{} has been upgraded to run under \LaTeXe{}.
+%
+% Later changes to 1.5 include |\columnbreak| and |multicols*|.
+%
+% For version 1.6 micro-spacing around the boxes produced by \mc{}
+% has been improved to allow for baseline-grid typesetting.
+% \end{multicols}
+%
+%
+% \setcounter{collectmore}{2}
+% \begin{multicols}{3}[\section{Introduction}]
+% \hbadness=10000
+% Switching between two-column and one-column layout is possible in
+% \LaTeX{}, but every use of |\twocolumn| or |\onecolumn|
+% starts a new page. Moreover, the last page of two-column output
+% isn't balanced and this often results in an empty, or nearly
+% empty, right column. When I started to write macros for
+% \textsf{doc.sty} (see ``The \texttt{doc}--Option'', \TUB\
+% volume 10~\#2, pp.~245--273) I thought that it would be nice to
+% place the index
+% on the same page as the bibliography. And balancing the last page
+% would not only look better, it also would save space; provided of
+% course that it is also possible to start the next article on the
+% same page. Rewriting the index environment was comparatively easy,
+% but the next goal, designing an environment which takes care of
+% footnotes, floats, etc., was a harder task. It took me a whole
+% weekend\footnote{I started with the algorithm given in the \TeX
+% book on page 417. Without this help a weekend would not have been
+% enough. (This remark was made in the documentation of the initial
+% release, since then several hundreds more hours went into
+% improving the original code.)} to get together the few lines of
+% code below and there is
+% still a good chance that I missed something after all.
+%
+% Try it and, hopefully, enjoy it; and {\em please\/} direct bug
+% reports and suggestions back to Mainz.
+% \end{multicols}
+%
+%
+% \setcounter{collectmore}{0}
+% \begin{multicols}{3}[\section{The User Interface}]
+% \hbadness=10000
+% To use the environment one simply says\\*[2mm]
+% \hspace*{2mm}|\begin{multicols}{|\meta{number}|}|
+% \hspace*{12mm}\meta{multicolumn text}\\
+% \hspace*{2mm}|\end{multicols}|\\[2mm]
+% where \meta{number} is the required number of columns and
+%^^A\meta{multicolumn text}
+% $\langle${\it multi\-column text\/}$\rangle$ may contain arbitrary
+% \LaTeX{} commands, except that floats and marginpars are not
+% allowed in the current implementation\footnote{This is dictated by
+% lack of time. To implement floats one has to reimplement the
+% whole \LaTeX{} output routine.}.
+%
+% \enlargethispage{-1\baselineskip}
+%
+% \DescribeMacro\premulticols
+% As its first action, the \textsf{multicols} environment measures the
+% current page to determine whether there is enough room for some
+% portion of multicolumn output. This is controlled by the
+% \meta{dimen} variable |\premulticols| which can be changed by
+% the user with ordinary \LaTeX{} commands.
+% \DescribeMacro\multicolsep
+% If the space is less than |\premulticols|, a new page is
+% started. Otherwise, a |\vskip| of |\multicolsep| is
+% added.\footnote{Actually the added space may be less because we use
+% \cs{addvspace} (see the \LaTeX{} manual for further
+% information about this command).}
+%
+% \DescribeMacro\postmulticols
+% When the end of the \mc{} environment is encountered, an
+% analogous mechanism is employed, but now we test whether there is a
+% space larger than |\postmulticols| available. Again we add
+% |\multicolsep| or start a new page.
+%
+% It is often convenient to spread some text over all columns, just
+% before the multicolumn output, without any page break in between. To
+% achieve this the \mc{} environment has an optional second
+% argument which can be used for this purpose. For example, the text
+% you are now reading was started with
+% \begin{verbatim}
+% \begin{multicols}{3}
+% [\section{The User
+% Interface}] ...
+%\end{verbatim}
+% If such text is unusually long (or short) the value of
+% |\premulticols| might need adjusting to prevent a bad page
+% break. We therefore provide a third argument which can be used to
+% overwrite the default value of |\premulticols| just for this
+% occasion. So if you want to combine some longer single column text
+% with a multicols environment you could write
+% \begin{verbatim}
+% \begin{multicols}{3}
+% [\section{Index}
+% This index contains ...]
+% [6cm]
+% ...
+%\end{verbatim}
+%
+%
+% \DescribeMacro\columnsep
+% The space between columns is controlled by the length parameter
+% |\columnsep|. The width for the individual columns is automatically
+% calculated from this parameter and the current |\linewidth|. In this
+% article a value of \textsf{\the\columnsep} was used.
+%
+%
+% \DescribeMacro\columnseprule
+% Separation of columns with vertical rules is achieved by setting the
+% parameter |\columnseprule| to some positive value. In this
+% article a value of \textsf{.4pt} was used.
+%
+% \DescribeMacro\columnseprulecolor
+% The color of the rules separating the columns can be specified through
+% |\columnseprulecolor|. The default value is |\normalcolor|.
+%
+% \DescribeMacro\multicolbaselineskip
+% Since narrow columns tend to need adjustments in interline spacing
+% we also provide a \meta{skip} parameter called
+% |\multicolbaselineskip| which is added to the
+% |\baselineskip| parameter inside the \mc{}
+% environment. Please use this parameter with care or leave it alone;
+% it is intended only for package file designers since even small
+% changes might produce totally unexpected changes to your document.
+%
+%
+% \subsection{Balancing columns}
+%
+%
+% Besides the previously mentioned parameters, some others are
+% provided to influence the layout of the columns generated.
+%
+% Paragraphing in \TeX{} is controlled by several parameters. One of
+% the most important is called |\tolerance|: this controls the
+% allowed `looseness' (i.e.\ the amount of blank space between words).
+% Its default value is 200 (the \LaTeX{} |\fussy|) which is too
+% small for narrow columns. On the other hand the |\sloppy|
+% declaration (which sets |\tolerance| to $10000=\infty$) is too
+% large, allowing really bad spacing.\footnote{Look at the next
+% paragraph, it was set with the \cs{sloppy} declaration.}
+%
+% \begin{sloppypar}
+% \DescribeMacro\multicoltolerance \DescribeMacro\multicolpretolerance
+% We therefore use a |\multicoltolerance| parameter for the
+% |\tolerance| value inside the \mc{} environment. Its default value
+% is 9999 which is less than infinity but `bad' enough for most
+% paragraphs in a multicolumn environment. Changing its value should
+% be done outside the \mc{} environment. Since |\tolerance| is set
+% to |\multicoltolerance| at the beginning of every \textsf{multicols}
+% environment one can locally overwrite this default by assigning
+% \verb*+\tolerance = +\meta{desired value}. There also exists a
+% |\multicolpretolerance| parameter holding the value for
+% |\pretolerance| within a \mc{} environment. Both parameters are
+% usually used only by package designers.
+% \end{sloppypar}
+%
+% Generation of multicolumn output can be divided into two parts. In
+% the first part we are collecting material for a page, shipping it
+% out, collecting material for the next page, and so on. As a second
+% step, balancing will be done when the end of the \mc{} environment
+% is reached.
+% In the first step \TeX{} might consider more material whilst
+% finding the final column content than it actually uses when shipping out the
+% page. This might cause a problem if a footnote is encountered in
+% the part of the input considered, but not used, on the current page.
+% In this case the footnote might show up on the current page, while the
+% footnotemark corresponding to this footnote might be set on the next
+% one.\footnote{The reason behind this behavior is the asynchronous
+% character of the \TeX{} {\it page\_builder}.
+% However, this
+% could be avoided by defining very complicated output
+% routines which don't use \TeX{} primitives like
+% \cs{insert} but do everything by hand.
+% This is clearly beyond the scope of a weekend problem.}
+% Therefore the \mc{} environment gives a warning
+% message\footnote{This message will be generated even if there are no
+% footnotes in this part of the text.} whenever it is unable to use
+% all the material considered so far.
+%
+% If you don't use footnotes too often the chances of something
+% actually going wrong are very slim, but if this happens you can help
+% \TeX{} by using a |\pagebreak| command in the final document.
+% Another way to influence the behavior of \TeX{} in this respect is
+% given by the counter variable `\textsf{collectmore}'. If you use the
+% |\setcounter| declaration to set this counter to \meta{number},
+% \TeX{} will consider \meta{number} more (or less) lines before
+% making its final decision. So a value of $-1$ may solve all your
+% problems at the cost of slightly less optimal columns.
+%
+%
+% In the second step (balancing columns) we have other bells and
+% whistles. First of all you can say |\raggedcolumns| if you
+% don't want the bottom lines to be aligned.
+% The default is |\flushcolumns|, so \TeX{} will normally try to
+% make both
+% the top and bottom baselines of all columns align.
+%
+% If there is only a small amount of material available for balancing
+% then you may end up with very few lines per column. In an extreme
+% case there may be only one line which looks distinctly odd. In that
+% case it might be better to have more material distributed to the
+% earlier columns even if that means that later columns are empty or
+% partially empty. This is controlled through the counter
+% `\textsf{minrows}' (default 1). If set to a higher value then the
+% balancing will have at least that many rows in the first column (and
+% also all further columns until it runs outs of material).
+%
+% Additionally you can set another counter, the `\textsf{unbalance}'
+% counter, to some positive \meta{number}. This will make all but the
+% right-most column \meta{number} of lines longer than they would
+% normally have been. `Lines' in this context refer to normal text
+% lines (i.e.\ one |\baselineskip| apart); thus, if your columns
+% contain displays,
+% for example, you may need a higher \meta{number}
+% to shift something from one column into another. A negative value can make sense if
+% you have set \textsf{minrows} and want to locally adjust that.
+%
+% Unlike `\textsf{collectmore},' the `\textsf{unbalance}' counter is reset
+% to zero at the end of the environment so it only applies to one
+% \mc{} environment.
+%
+% The two methods may be combined but I suggest using these features
+% only when fine tuning important publications.
+%
+% Two more general tuning possibilities were added with version~1.5.
+% \TeX{} allows to measure the badness of a column in terms of an
+% integer value, where 0 means optimal and any higher value means a
+% certain amount of extra white space. 10000 is considered to be
+% infinitely bad (\TeX{} does not distinguish any further). In addition
+% the special value 100000 means overfull (i.e., the column contains
+% more text than could possibly fit into it).
+%
+% The new release now measures every generated column and ignores
+% solutions where at least one column has a badness being larger than
+% the value of the counter \textsf{columnbadness}. The default value for
+% this counter is 10000, thus \TeX{} will accept all solutions except
+% those being overfull.
+% By setting the counter to a smaller value you can force the algorithm
+% to search for solutions that do not have columns with a lot of white
+% space.
+%
+% However, if the setting is too low, the algorithm may not find any
+% acceptable solution at all and will then finally choose the extreme
+% solution of placing all text into the first column.
+%
+% Often, when columns are balanced, it is impossible to find a solution
+% that distributes the text evenly over all columns. If that is the case
+% the last column usually has less text than the others. In the earlier
+% releases this text was stretched to produce a column with the same
+% height as all others, sometimes resulting in really ugly looking
+% columns.
+%
+% In the new release this stretching is only done if the badness of
+% the final column is not larger than the value of the counter
+% \textsf{finalcolumnbadness}. The default setting is 9999, thus preventing
+% the stretching for all columns that \TeX{} would consider infinitely
+% bad. In that case the final column is allowed to run short which gives
+% a much better result.
+%
+% And there are two more parameters of some experimental nature, one
+% called |\multicolovershoot| the other |\multicolundershoot|. They
+% control the amount of space a column within the \mc{} environment is
+% allowed to be ``too full'' or ``too short'' without affecting the
+% column badness. They are set to 0pt and 2pt, respectively.
+%
+% Finally, when doing the balancing at the end, columns may become
+% higher than the remaining available space. In that case the
+% algorithm aborts and instead generates a normal page. However, if the
+% amount is not too large, e.g., a line or so, then it might be better to
+% keep everything on the same page instead of starting a new page with
+% just one line after balancing. So the parameter
+% |\maxbalancingoverflow| governs this process: only when the excess
+% gets larger than its value balancing is aborted.
+%
+% \subsection{Not balancing the columns}
+%
+% Although this package was written to solve the problem of balancing
+% columns, I got repeated requests to provide a version where all
+% white space is automatically placed in the last column or
+% columns. Since version v1.5q this now exists: if you use
+% \texttt{multicols*} instead of the usual environment the columns on
+% the last page are not balanced. Of course, this environment only
+% works on top-level, e.g., inside a box one has to balance to
+% determine a column height in absence of a fixed value.
+%
+%
+% \subsection{Manually breaking columns}
+%
+% Another request often voiced was: ``How do I tell \LaTeX{} that it
+% should break the first column after this particular line?''. The
+% |\pagebreak| command (which works with the two-column option of
+% \LaTeX{}) is of no use here since it would end the collection phase
+% of \mc{} and thus all columns on that page. So with version 1.5u
+% the |\columnbreak| command was added. If used within a paragraph it
+% marks the end of the current line as the desired breakpoint. You can
+% observe its effect on
+% the previous page where three lines of text have been artificially
+% forced into the second column (resulting in some white
+% space between paragraphs in the first column).
+%
+% \subsection{Floats inside a \mc{} environment}
+%
+% Within the \mc{} environment the usual star float commands are
+% available but their function is somewhat different as in the
+% two-column mode of standard \LaTeX. Stared floats, e.g.,
+% \texttt{figure*}, denote page wide floats that are handled in a similar
+% fashion as normal floats outside the \mc{} environment. However,
+% they will never show up on the page where they are encountered. In
+% other words, one can influence their placement by specifying a
+% combination of \texttt{t}, \texttt{b}, and/or \texttt{p} in their optional
+% argument, but \texttt{h} doesn't work because the first possible place
+% is the top of the next page. One should also note, that this means
+% that their placement behavior is determined by the values of
+% |\topfraction|, etc.\ rather than by |\dbl...|.
+%
+%
+% \subsection{Support for right-to-left typesetting}
+%
+% In right-to-left typesetting the order of the columns on the page
+% also need to be reversed, i.e., the first column has to appear on the far
+% right and the last column on the left. This is supported through the
+% commands |\RLmulticolcolumns| (switching to right-to-left typesetting)
+% and |\LRmulticolcolumns| (switching to left-to-right typesetting) the
+% latter being the default.
+%
+% \subsection{Warnings}
+%
+% Under certain circumstances the use of the \mc{} environment may
+% result in some
+% warnings from \TeX{} or \LaTeX{}. Here is a list
+% of the important ones and the possible cause:
+% \begin{description}
+%
+% \item[] {\hspace*{-\labelsep}\tt Underfull \string\hbox\space
+% (badness ...)}
+%
+% As the columns are often very narrow \TeX{} wasn't able to find a
+% good way to break the paragraph. Underfull denotes a loose line but
+% as long as the badness value is below $10000$ the result is probably
+% acceptable.
+%
+% \item[]
+% {\hspace*{-\labelsep}\tt Underfull \string\vbox\space ... while
+% \string\output\space is active}
+%
+% If a column contains a character with an unusual depth, for
+% example a `(', in the bottom line then this message may show up. It
+% usually has no significance as long as the value is not more than a
+% few points.
+%
+% \item[] {\hspace*{-\labelsep}\tt LaTeX Warning: I moved some lines
+% to the next page}
+%
+% As mentioned above, \mc{} sometimes screws up the footnote
+% numbering. As a precaution, whenever there is a footnote on a
+% page where \mc{} had to leave a remainder for the following
+% page this warning appears. Check the footnote numbering on this
+% page. If it turns out that it is wrong, you have to manually break
+% the page using |\newpage| or |\pagebreak[..]|.
+%
+% \item[] {\hspace*{-\labelsep}\tt Floats and marginpars not allowed
+% inside `multicols' environment!}
+%
+% This message appears if you try to use the |\marginpar| command or
+% an unstarred version of the \textsf{figure} or \textsf{table} environment.
+% Such floats will disappear!
+%
+% \item[] {\hspace*{-\labelsep}\tt Very deep columns!
+% Grid alignment might be broken}
+%
+% This message can only appear if the option \texttt{grid} was
+% chosen. In that case it will show up if a column has a very large
+% depth so that \mc{} is unable to back up to its baseline. This
+% is only relevant if one tries to produce a document where all
+% text lines are aligned at an invisible grid, something that
+% requires careful adjustment of many parameters and macros, e.g.,
+% heading definitions.
+%
+% \end{description}
+%
+%
+% \subsection{Tracing the output}
+%
+% To understand the reasoning behind the decisions \TeX{} makes when
+% processing a \mc{} environment, a tracing mechanism is provided.
+% If you set the counter `\texttt{tracingmulticols}'
+% to a positive \meta{number} you then
+% will get some tracing information on the terminal and in the
+% transcript file:
+% \begin{description}
+% \item[$\meta{number}=1$.] \TeX{} will now tell you, whenever it
+% enters or leaves a \mc{} environment, the number of columns it
+% is working on and its decision about starting a new page before
+% or after the environment.
+% \item[$\meta{number}=2$.]
+% In this case you also get information from the balancing routine:
+% the heights tried for the left and right-most columns,
+% information about shrinking if the |\raggedcolumns|
+% declaration is in force and the value of the `\textsf{unbalance}'
+% counter if positive.
+% \item[$\meta{number}= 3$.] Setting \meta{number}\pagebreak[2] to
+% this value will additionally trace the mark handling
+% algorithm. It will show what marks are found, what marks are
+% considered, etc. To fully understand this information you will
+% probably have to read carefully trough the implementation.
+% \item[$\meta{number}\geq 4$.] Setting \meta{number}\pagebreak[2] to
+% such a high value will additionally place an |\hrule| into your
+% output, separating the part of text which had already been
+% considered on the previous page from the rest. Clearly this
+% setting should {\em not\/} be used for the final output. It will
+% also activate even more debugging code for mark handling.
+% \end{description}
+%
+%
+% \end{multicols}
+%
+% \begin{multicols}{3}[\section{Prefaces to older versions}
+% \subsection{Preface to version 1.4}]
+% \hbadness=10000
+% Beside fixing some bugs as mentioned in the \textsf{multicol.bug} file
+% this new release enhances the \mc{} environment by allowing for
+% balancing in arbitrary contexts. It is now, for example, possible
+% to balance text within a \mc{} or a \textsf{minipage} as shown in
+% \ref{tab:newcmds} where a \textsf{multicols} environment within a
+% \textsf{quote} environment was used. It is now even possible to nest
+% \mc{} environments.
+%
+% The only restriction to such inner \mc{} environments (nested, or
+% within \TeX's internal vertical mode) is that such variants will
+% produce a box with the balanced material in it, so that they can
+% not be broken across pages or columns.
+%
+% Additionally I rewrote the algorithm for balancing so that it will
+% now produce slightly better results.
+%
+% I updated the source documentation but like to apologize in
+% advance for some `left over' parts that slipped through the
+% revision.
+%
+% A note to people who like to improve the balancing algorithm of
+% \mc{}: The balancing routine is now placed into a single macro
+% which is called |\balance@columns|. This means that one can easily
+% try different balancing routines by rewriting this macro. The
+% interface for it is explained in table \ref{tab:balance}. There are
+% several improvements possible, one can think of integrating the
+% |\badness| function of \TeX3, define a faster algorithm for finding
+% the right column height, etc. If somebody thinks he/she has an
+% enhancement I would be pleased to learn about it. But please obey
+% the copyright notice and don't change \textsf{multicol.dtx} directly!
+% \begin{table*}
+% \begin{quote}
+% \begin{multicols}{2}
+% \raggedcolumns
+% The macro |\balance@columns| that contains the code for balancing
+% gathered material is a macro without parameters. It assumes that
+% the material for balancing is stored in the box |\mult@box| which
+% is a |\vbox|. It also ``knows'' about all parameters set up by the
+% \mc{} environment, like |\col@number|, etc. It can also assume
+% that |\@colroom| is the still available space on the current page.
+%
+% When it finishes it must return the individual columns in boxes
+% suitable for further processing with |\page@sofar|. This means
+% that the left column should be stored in box register
+% |\mult@gfirstbox|, the next
+% in register |\mult@firstbox|${}+2$, \ldots,
+% only the last one as an exception in
+% register |\mult@grightbox|. Furthermore it has to set up
+% the two macros
+% |\kept@firstmark| and |\kept@botmark| to hold the values for the
+% first and bottom mark as found in the individual columns. There
+% are some helper functions defined in section \ref{sec:v14} which
+% may be used for this. Getting the marks right ``by hand'' is
+% non-trivial and it may pay off to first take a look at the
+% documentation and implementation of |\balance@columns| below
+% before trying anew.
+% \end{multicols}
+% \end{quote}
+% \vspace*{-3ex}
+% \vspace*{-0ex}
+% \caption{Interface description for \cs{balance@columns}}
+% \label{tab:balance}
+% \end{table*}
+% \end{multicols}
+%
+% \begin{multicols}{3}[\subsection{Preface to version 1.2}]
+% \hbadness=10000
+% After the article about the \mc{} environment was published in
+% \TUB\ 10\#3, I got numerous requests for these macros. However, I
+% also got a changed version of my style file, together with a
+% letter asking me if I would include the changes to get better
+% paragraphing results in the case of narrow lines. The main
+% differences to my original style option were additional parameters
+% (like |\multicoladjdemerits| to be used for |\adjdemerits|, etc.)
+% which would influence the line breaking algorithm.
+%
+% But actually resetting such parameters to zero or even worse to a
+% negative value won't give better line breaks inside the \mc{}
+% environment. \TeX{}s line breaking algorithm will only look at
+% those possible line breaks which can be reached without a badness
+% higher than the current value of |\tolerance| (or |\pretolerance|
+% in the first pass). If this isn't possible, then, as a last
+% resort, \TeX{} will produce overfull boxes. All those (and only
+% those) possible break points will be considered and finally the
+% sequence which results in the fewest demerits will be chosen. This
+% means that a value of $-1000$ for |\adjdemerits| instructs \TeX{}
+% to prefer visibly incompatible lines instead of producing better
+% line breaks.
+%
+% However, with \TeX{} 3.0 it is possible to get decent line breaks
+% even in small columns by setting |\emergencystretch| to an
+% appropriate value. I implemented a version which is capable of
+% running both in the old and the new \TeX{} (actually it will
+% simply ignore the new feature if it is not available). The
+% calculation of |\emergencystretch| is probably incorrect. I
+% made a few tests but of course one has to have much more experience
+% with the new possibilities to achieve the maximum quality.
+%
+% Version 1.1a had a nice `feature': the penalty for using the
+% forbidden floats was their ultimate removal from \LaTeX{}s
+% |\@freelist| so that after a few |\marginpar|s inside the \mc{}
+% environment floats where disabled forever. (Thanks to Chris
+% Rowley for pointing this out.) I removed this misbehavior and at
+% the same time decided to allow at least floats spanning all
+% columns, e.g., generated by the |figure*| environment. You can
+% see the new functionality in table~\ref{tab:newcmds} which was
+% inserted at this very point.
+% \begin{table*}
+% \small
+% \setlength{\multicolsep}{0pt}
+% \begin{quote}
+% \begin{multicols}{2}
+% |\setemergencystretch|: This is a hook for people who like
+% to play around. It is supposed to set the
+% |\emergencystretch| \meta{dimen} register provided in the
+% new \TeX{} 3.0. The first argument is the number of columns and
+% the second one is the current |\hsize|. At the moment the
+% default definition is $4\texttt{pt} \times |#1|$, i.e.\ the
+% |\hsize| isn't used at all. But maybe there are better
+% formulae.
+%
+% \setlength{\emergencystretch}{20pt} |\set@floatcmds|: This is
+% the hook for the experts who like to implement a full float
+% mechanism for the \mc{} environment. The |@| in the name
+% should signal that this might not be easy.
+% \end{multicols}
+% \end{quote}
+% \vspace*{-1ex}
+% \vspace*{-0ex}
+% \caption[]{The new commands of \textsf{multicol.sty} version 1.2.
+% Both commands might be removed if good solutions to these
+% open problems are found. I hope that these commands will
+% prevent that nearly identical style files derived from
+% this one are floating around.}
+% \label{tab:newcmds}
+% \end{table*}
+% However single column floats are still forbidden and I don't think
+% I will have time to tackle this problem in the near future. As an
+% advice for all who want to try: wait for \TeX{} 3.0. It has a few
+% features which will make life much easier in multi-column
+% surroundings. Nevertheless we are working here at the edge of
+% \TeX{}s capabilities, really perfect solutions would need a
+% different approach than it was done in \TeX{}s page builder.
+%
+% The text below is nearly unchanged, I only added documentation at
+% places where new code was added.
+% \end{multicols}
+%
+% \changes{v1.5l}{1996/01/13}{Try hard to explain unresolved reference
+% that happens if \cs{OnlyDescription} is used}
+%
+% \StopEventually{\PrintIndex \PrintChanges
+% \ifx\Finale\relax
+% \typeout{**********************************}
+% \typeout{* Info: Typesetting this document with
+% \protect\OnlyDescription\space will}
+% \typeout{* Info: result in one unresolved
+% reference to `sec:v14'.}
+% \typeout{* Info: --- tough, it's just not there in this case!}
+% \typeout{**********************************}
+% \fi
+% }
+%
+%
+% \begin{multicols}{2}[\section{The Implementation}
+% We are now switching to two-column output to show the
+% abilities of this environment (and bad layout decisions).
+% \subsection{The documentation driver file}
+% ][10\baselineskip]
+%
+% \hbadness=10000
+%
+%
+% The next bit of code contains the documentation driver file for
+% \TeX{}, i.e., the file that will produce the documentation you are
+% currently reading. It will be extracted from this file by the \texttt{docstrip} program.
+% Since this is the first code in this file one can produce the
+% documentation
+% simply by running \LaTeX{} on the \texttt{.dtx} file.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+% \end{macrocode}
+% We use the \texttt{balancingshow} option when loading \mc{} so
+% that full tracing is produced. This has to be done before the
+% \texttt{doc} package is loaded, since \texttt{doc} otherwise
+% requires \mc{} without any options.
+% \begin{macrocode}
+\usepackage{multicol}[1999/05/25]
+\usepackage{doc}
+% \end{macrocode}
+% First we set up the page layout suitable for
+% this article.
+% \begin{macrocode}
+\setlength{\textwidth}{39pc}
+\setlength{\textheight}{54pc}
+\setlength{\parindent}{1em}
+\setlength{\parskip}{0pt plus 1pt}
+\setlength{\oddsidemargin}{0pc}
+\setlength{\marginparwidth}{0pc}
+\setlength{\topmargin}{-2.5pc}
+\setlength{\headsep}{20pt}
+\setlength{\columnsep}{1.5pc}
+% \end{macrocode}
+% We want a rule between columns.
+% \begin{macrocode}
+\setlength\columnseprule{.4pt}
+% \end{macrocode}
+% We also want to ensure that a new \mc{} environment finds enough
+% space at the bottom of the page.
+% \begin{macrocode}
+\setlength\premulticols{6\baselineskip}
+% \end{macrocode}
+% When balancing columns we disregard solutions that
+% are too bad. Also, if the last column is too bad
+% we typeset it without stretch.
+% \begin{macrocode}
+\setcounter{columnbadness}{7000}
+\setcounter{finalcolumnbadness}{7000}
+% \end{macrocode}
+% The index is supposed to come out in four columns.
+% And we don't show macro names in the margin.
+% \begin{macrocode}
+\setcounter{IndexColumns}{4}
+\let\DescribeMacro\SpecialUsageIndex
+\let\DescribeEnv\SpecialEnvIndex
+\renewcommand\PrintMacroName[1]{}
+\CodelineIndex
+%\DisableCrossrefs % Partial index
+\RecordChanges % Change log
+% \end{macrocode}
+% Line numbers are very small for this article.
+% \begin{macrocode}
+\renewcommand{\theCodelineNo}
+ {\scriptsize\rm\arabic{CodelineNo}}
+\settowidth\MacroIndent{\scriptsize\rm 00\ }
+
+\begin{document}
+ \typeout
+ {****************************************
+ ^^J* Expect some Under- and overfull boxes.
+ ^^J****************************************}
+ \DocInput{multicol.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+%
+% \end{multicols}
+%
+% \begin{multicols}{2}[\subsection{Identification and
+% option processing}]
+%
+%
+% We start by identifying the package. Since it makes use of features
+% only available in \LaTeXe{} we ensure that this format is available.
+% (Now this is done earlier in the file.)
+% \begin{macrocode}
+%<*package>
+% \NeedsTeXFormat{LaTeX2e}
+% \ProvidesPackage{multicol}[..../../..
+% v... multicolumn formatting]
+% \end{macrocode}
+%
+%^^A \subsection{Option processing}
+%
+% Next we declare options supported by \mc{}. Two-column mode
+% and \mc{} do not work together so we warn about possible
+% problems. However, since you can revert to |\onecolumn|
+% in which case \mc{} does work, we don't make this an error.
+% \begin{macrocode}
+\DeclareOption{twocolumn}
+ {\PackageWarning{multicol}{May not work
+ with the twocolumn option}}
+% \end{macrocode}
+% Tracing is done using a counter. However
+% it is also possible to invoke the tracing
+% using the options declared below.
+% \begin{macrocode}
+\newcount\c@tracingmulticols
+\DeclareOption{errorshow}
+ {\c@tracingmulticols\z@}
+\DeclareOption{infoshow}
+ {\c@tracingmulticols\@ne}
+\DeclareOption{balancingshow}
+ {\c@tracingmulticols\tw@}
+\DeclareOption{markshow}
+ {\c@tracingmulticols\thr@@}
+\DeclareOption{debugshow}
+ {\c@tracingmulticols5\relax}
+% \end{macrocode}
+% The next option is intended for typesetting on a |\baselineskip|
+% grid. Right now it doesn't do anything other than warning if it
+% thinks that the grid got lost.
+% \changes{v1.6a}{2003/03/15}{New option grid}
+% \begin{macrocode}
+\let\mc@gridwarn\maxdimen
+\DeclareOption{grid}{\def\mc@gridwarn{\maxdepth}}
+% \end{macrocode}
+%
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+% Next option enables the |\docolaction| command. As this changes
+% the \texttt{.aux} file content this is not automatically enabled.
+% \begin{macrocode}
+\DeclareOption{colaction}{%
+ \def\mc@col@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status
+ {\ifmc@firstcol 1\else 2\fi}}%
+ \mc@firstcolfalse}%
+ \def\mc@lastcol@status@write{%
+ \protected@write\@auxout{}%
+ {\string\mc@col@status{3}}}%
+}
+\let\mc@col@status@write\relax
+\let\mc@lastcol@status@write\relax
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+%
+% \end{multicols}
+%
+% \begin{multicols}{2}[\subsection{Starting and
+% Ending the \mc{} Environment}]
+%
+% \begin{macro}{\multicols}
+% As mentioned before, the \mc{} environment has one mandatory
+% argument (the number of columns) and up to two optional ones. We
+% start by reading the number of columns into the |\col@number|
+% register.
+% \begin{macrocode}
+\def\multicols#1{\col@number#1\relax
+% \end{macrocode}
+% If the user forgot the argument, \TeX{} will complain about a
+% missing number at this point. The error recovery mechanism will
+% then use zero, which isn't a good choice in this case. So we
+% should now test whether everything is okay. The minimum is two
+% columns at the moment.
+% \changes{v1.3b}{1990/10/09}{Minimum of two columns}
+% \begin{macrocode}
+ \ifnum\col@number<\tw@
+ \PackageWarning{multicol}%
+ {Using `\number\col@number'
+ columns doesn't seem a good idea.^^J
+ I therefore use two columns instead}%
+ \col@number\tw@ \fi
+% \end{macrocode}
+% We have only enough box registers for ten columns, so we need to
+% check that the user hasn't asked for more.
+% \changes{v1.4k}{1992/06/27}{Maximum of 5 columns (temp)}
+% \changes{v1.5a}{1992/11/04}{Allow 10 columns again}
+% \begin{macrocode}
+ \ifnum\col@number>10
+ \PackageError{multicol}%
+ {Too many columns}%
+ {Current implementation doesn't
+ support more than 10 columns.%
+ \MessageBreak
+ I therefore use 10 columns instead}%
+ \col@number10 \fi
+% \end{macrocode}
+% Within the environment we need a special version of the
+% kernel |\@footnotetext| command since the original sets the
+% the |\hsize| to |\columnwidth| which is not correct in the
+% multicol environment. Here |\columnwidth| refers to the width of
+% the individual column and the footnote should be in |\textwidth|.
+% Since |\@footnotetext| has a different definition inside a
+% minipage environment we do not redefine it directly. Instead we
+% locally set |\columnwidth| to |\textwidth| and call the original
+% (current) definition stored in |\orig@footnotetext|.
+% \changes{v1.5p}{1997/12/14}{Redefinition of \cs{@footnotetext}
+% only within env pr/2689.}
+% \changes{v1.5r}{1998/08/17}{Use \cs{@footnotetext} but with
+% local change to \cs{columnwidth}.}
+% \changes{v1.5w}{1999/10/21}{Make \cs{@footnotetext} long to allow
+% multi-paragraph footnotes.}
+% If the \mc{} environment is nested inside another \mc{}
+% environment then the redefinition has already happened. So be
+% better test for this situation. Otherwise, we will get a \TeX{}
+% stack overflow as this would generate a self-referencing definition.
+% \changes{v1.6e}{2004/02/14}{Avoid self-referencing definition of
+% \cs{@footnotetext} (pr/3618)}.
+% \begin{macrocode}
+ \ifx\@footnotetext\mult@footnotetext\else
+ \let\orig@footnotetext\@footnotetext
+ \let\@footnotetext\mult@footnotetext
+ \fi
+% \end{macrocode}
+% Now we can safely look for the optional arguments.
+% \begin{macrocode}
+ \@ifnextchar[\mult@cols{\mult@cols[]}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\mult@footnotetext}
+%
+% \begin{macrocode}
+\long\def\mult@footnotetext#1{\begingroup
+ \columnwidth\textwidth
+ \orig@footnotetext{#1}\endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\mult@cols}
+% The |\mult@cols| macro grabs the first optional argument
+% (if any) and looks for the second one.
+% \begin{macrocode}
+\def\mult@cols[#1]{\@ifnextchar[%
+% \end{macrocode}
+% This argument should be a \meta{dimen} denoting the minimum free
+% space needed on the current page to start the environment. If the
+% user didn't supply one, we use |\premulticols| as a
+% default.
+% \begin{macrocode}
+ {\mult@@cols{#1}}%
+ {\mult@@cols{#1}[\premulticols]}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\mult@@cols}
+% After removing all arguments from the input we are able
+% to start with |\mult@@cols|.
+% \begin{macrocode}
+\def\mult@@cols#1[#2]{%
+% \end{macrocode}
+% First thing we do is to decide whether or not this is an
+% unbounded multicols environment, i.e. one that may split across
+% pages, or one that has to be typeset into a box. If we are in
+% \TeX's ``inner'' mode (e.g., inside a box already) then we have a
+% boxed version of multicols therefore we set the |@boxedmulticols|
+% switch to true. The \mc{} should start in vertical mode. If we
+% are not already there we now force it with |\par| since otherwise
+% the test for ``inner'' mode wouldn't show if we are in a box.
+% \changes{v1.4f}{1992/04/28}{\cs{par} added to allow for correct inner test}
+% \begin{macrocode}
+ \par
+ \ifinner \@boxedmulticolstrue
+% \end{macrocode}
+% Otherwise we check |\doublecol@number|. This counter is zero
+% outside a multicols environment but positive inside (this happens
+% a little later on). In the second case we need to process the
+% current multicols also in ``boxed mode'' and so change the switch
+% accordingly.
+% \begin{macrocode}
+ \else
+ \ifnum \doublecol@number>\z@
+ \@boxedmulticolstrue
+ \fi
+ \fi
+% \end{macrocode}
+% Then we look to see if statistics are requested:
+% \begin{macrocode}
+ \mult@info\z@
+ {Starting environment with
+ \the\col@number\space columns%
+% \end{macrocode}
+% In boxed mode we add some more info.
+% \changes{v1.4f}{1992/04/28}{\cs{on@line} added to tracing info}
+% \begin{macrocode}
+ \if@boxedmulticols\MessageBreak
+ (boxed mode)\fi
+ }%
+% \end{macrocode}
+% Then we measure the current page to see whether a useful portion
+% of the multicolumn environment can be typeset. This routine
+% might start a new page.
+% \changes{v1.4a}{1992/02/14}{Forgotten braces added}
+% \begin{macrocode}
+ \enough@room{#2}%
+% \end{macrocode}
+% Now we output the first argument and produce vertical space
+% above the columns. (Note that this argument corresponds to the
+% first optional argument of the \textsf{multicols} environment.)
+% For many releases this argument was typeset in a group to get
+% a similar effect as |\twocolumn[..]| where the argument is
+% also implicitly surrounded by braces. However, this conflicts
+% with local changes done by things like sectioning commands (which
+% account for the majority of commands used in that argument)
+% messing up vertical spacing etc.\ later in the document so that
+% from version v1.5q on this argument is again typeset at the outer
+% level.
+% \changes{v1.4e}{1992/03/16}{Typeset optional arg inside group}
+% \changes{v1.5q}{1998/01/19}{And removed the group again six years later}
+% \begin{macrocode}
+ #1\par\addvspace\multicolsep
+% \end{macrocode}
+% When the last line of a paragraph had a positive depth then this
+% depth normally taken into account by the baselineskip calculation
+% for the next line. However, the columns produced by a following
+% \texttt{multicol} are rigid and thus the distance from the
+% baseline of a previous text line to the first line in a
+% \texttt{multicol} would differ depending on the depth of the
+% previous line. To account for this we add a negative space unless
+% the depth is \texttt{-1000pt} which signals something special to
+% \TeX and is not supposed to be a real depth.
+% \changes{v1.5z1}{2003/02/17}{Add a kern to cancel potential depth of
+% previous line}
+% \begin{macrocode}
+ \ifdim \prevdepth = -\@m\p@
+ \else
+% \end{macrocode}
+% The actual generation of this corrective space is a little bit
+% more complicated as it doesn't make sense to always back up to
+% the previous baseline (in case an object with a very large depth
+% was placed there, e.g., a centered tabular). So we only back up
+% to the extend that we are within the |\baselineskip| grid. We
+% know that the box produced by \mc{} has |\topskip| at its top so
+% that also needs to be taken into account.
+% \changes{v1.6a}{2003/03/15}{Adjust spacing}
+% \begin{macrocode}
+ \@tempcnta\prevdepth
+ \@tempcntb\baselineskip
+ \divide\@tempcnta\@tempcntb
+ \advance\@tempcnta\@ne
+ \dimen@\prevdepth
+ \advance\dimen@ -\@tempcnta\baselineskip
+ \advance\dimen@ \topskip
+ \kern-\dimen@
+ \fi
+% \end{macrocode}
+% We start a new grouping level to hide all subsequent changes
+% (done in |\prepare@multicols| for example).
+% \begin{macrocode}
+ \begingroup
+ \prepare@multicols
+% \end{macrocode}
+% If we are in boxed mode we now open a box to typeset all material
+% from the multicols body into it, otherwise we simply go ahead.
+% \changes{v1.4g}{1992/05/07}{\cs{global} was probably wrong but at least
+% unnecessary}
+% \begin{macrocode}
+ \if@boxedmulticols
+ \setbox\mult@box\vbox\bgroup
+% \end{macrocode}
+%
+% \changes{v1.8c}{2013/11/03}{Add \cs{color@setgroup} to prevent color leak}
+% \begin{macrocode}
+ \color@setgroup
+% \end{macrocode}
+% \changes{v1.5?}{1994/?/?}{Penalty moved to later point}
+% We may have to reset some parameters at this point,
+% perhaps |\@parboxrestore|
+% would be the right action but I leave it for the moment.
+% \changes{v1.4l}{1992/08/17}{\cs{@totalleftmargin} now in
+% \cs{prepare@multicols}}
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% We finish by suppressing initial spaces.
+% \begin{macrocode}
+ \ignorespaces}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@boxedmulticols}
+% Here is the switch and the box for ``boxed'' multicols code.
+% \begin{macrocode}
+\newif\if@boxedmulticols
+\@boxedmulticolsfalse
+\newbox\mult@box
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\enough@room}
+% \changes{v1.0c}{1989/05/12}{Penalty 0 added to empty the contribution
+% list.}
+% The |\enough@room| macro used
+% above isn't perfect but works reasonably well in this context. We
+% measure the free space on the current page by subtracting
+% |\pagetotal| from |\pagegoal|. This isn't entirely
+% correct since it doesn't take the `shrinking' (i.e.\
+% |\pageshrink|) into account. The `recent contribution list'
+% might be nonempty so we start with |\par| and an explicit
+% |\penalty|.\footnote{See the documentation of
+% \cs{endmulticols} for further details.}
+% Actually, we use |\addpenalty| to ensure that a following
+% |\addvspace| will `see' the vertical space that might be
+% present.
+% The use of |\addpenalty| will have the effect that all items from
+% the recent contributions will be moved to the main vertical list
+% and the |\pagetotal| value will be updated correctly. However,
+% the penalty will be placed in front of any dangling glue item
+% with the result that the main vertical list may already be
+% overfull even if \TeX{} is not invoking the output routine.
+% \changes{v1.3b}{1990/10/09}{Do \cs{penalty} with \cs{addpenalty}}
+% \changes{v1.4e}{1992/03/16}{But ignore \cs{@nobreak} in \cs{addpenalty}}
+% \begin{macrocode}
+\def\enough@room#1{%
+% \end{macrocode}
+% Measuring makes only sense when we are not in ``boxed mode'' so
+% the routine does nothing if the switch is true.
+% \begin{macrocode}
+ \if@boxedmulticols\else
+ \par
+% \end{macrocode}
+% \label{mac:enoughroom}
+% To empty the contribution list the first release contained a
+% penalty zero but this had the result that |\addvspace| couldn't
+% detect preceding glue. So this was changed to |\addpenalty|. But
+% this turned out to be not enough as |\addpenalty| will not add a
+% penalty when |@nobreak| is true. Therefore we force this switch
+% locally to false. As a result there may be a break between
+% preceding text and the start of a multicols environment, but this
+% seems acceptable since there is the optional argument for exactly
+% this reason.
+% \begin{macrocode}
+ \bgroup\@nobreakfalse\addpenalty\z@\egroup
+ \page@free \pagegoal
+ \advance \page@free -\pagetotal
+% \end{macrocode}
+% To be able to output the value we need to assign it to a register
+% first since it might be a register (default) in which case we
+% need to use |\the| or it might be a plain value in which case
+% |\the| would be wrong.
+% \changes{v1.5e}{1994/05/26}{Assign arg to skip register to be able
+% to output value}
+% \begin{macrocode}
+ \@tempskipa#1\relax
+% \end{macrocode}
+% Now we test whether tracing information is required:
+% \begin{macrocode}
+ \mult@info\z@
+ {Current page:\MessageBreak
+ height=%
+ \the\pagegoal: used \the\pagetotal
+ \space -> free=\the\page@free
+ \MessageBreak
+ needed \the\@tempskipa
+ \space(for #1)}%
+% \end{macrocode}
+% Our last action is to force a page break if there isn't enough
+% room left.
+% \begin{macrocode}
+ \ifdim \page@free <#1\newpage \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\prepare@multicols}
+% When preparing for multicolumn output several things must
+% be done.
+% \begin{macrocode}
+\def\prepare@multicols{%
+% \end{macrocode}
+% We start saving the current |\@totalleftmargin| and then
+% resetting the |\parshape| in case we are inside some list
+% environment. The correct indentation for the \mc{} environment in
+% such a case will be produced by moving the result to the right by
+% |\multicol@leftmargin| later on. If we would use the value of of
+% |\@totalleftmargin| directly then lists inside the \mc{}
+% environment could cause a shift of the output.
+% \changes{v1.4l}{1992/08/17}{saved \cs{@totalleftmargin}}
+% \begin{macrocode}
+ \multicol@leftmargin\@totalleftmargin
+ \@totalleftmargin\z@
+ \parshape\z@
+% \end{macrocode}
+% We also set the register |\doublecol@number| for later use. This
+% register should contain $2\times |\col@number|$. This is also an
+% indicator that we are within a \mc{} environment as mentioned
+% above.
+% \changes{v1.5a}{1992/11/04}{Add offset to \cs{doublecolnumber}}
+% \begin{macrocode}
+ \doublecol@number\col@number
+ \multiply\doublecol@number\tw@
+ \advance\doublecol@number\mult@rightbox
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \if@boxedmulticols
+ \let\l@kept@firstmark\kept@firstmark
+ \let\l@kept@botmark\kept@botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+ \else
+% \end{macrocode}
+% We add an empty box to the main vertical list to ensure that we
+% catch any insertions (held over or inserted at the top of the
+% page). Otherwise it might happen that the |\eject| is discarded
+% without calling the output routine. Inside the output routine we
+% remove this box again. Again this code applies only if we are on
+% the main vertical list and not within a box.
+% However, it is not enough to turn off interline spacing, we also
+% have to clear |\topskip| before adding this box, since |\topskip|
+% is always inserted before the first box on a page which would
+% leave us with an extra space of |\topskip| if \mc{} start on a
+% fresh sheet.
+% \changes{v1.3c}{1991/03/03}{\cs{null} inserted and removed in output}
+% \changes{v1.4a}{1992/02/11}{Conditional code for boxed mode added.}
+% \changes{v1.4o}{1992/11/22}{\cs{topskip} locally zeroed.}
+% \begin{macrocode}
+ \nointerlineskip {\topskip\z@\null}%
+ \output{%
+ \global\setbox\partial@page\vbox
+ {%
+% \end{macrocode}
+% Now we have to make sure that we catch one special situation which
+% may result in loss of text! If the user has a huge amount of
+% vertical material within the first optional argument that is larger
+% then |\premulticols| and we are near the bottom of the page then it
+% can happen that not the |\eject| is triggering this special output
+% routine but rather the overfull main vertical list. In that case
+% we get another breakpoint through the |\eject| penalty. As a result
+% this special output routine would be called twice and the contents
+% of |\partial@page|, i.e.\ the material before the \mc{}
+% environment gets lost. There are several solutions to avoid this
+% problem, but for now we will simply detect this and inform the user
+% that he/she has to enlarge the |\premulticols| by using a suitable
+% value for the second argument.
+% \changes{v1.4a}{1992/02/11}{Checking for text losses.}
+% \begin{macrocode}
+%<*check>
+ \ifvoid\partial@page\else
+ \PackageError{multicol}%
+ {Error saving partial page}%
+ {The part of the page before
+ the multicols environment was
+ nearly full with^^Jthe result
+ that starting the environment
+ will produce an overfull
+ page. Some^^Jtext may be lost!
+ Please increase \premulticols
+ either generally or for this%
+ ^^Jenvironment by specifying a
+ suitable value in the second
+ optional argument to^^Jthe
+ multicols environment.}
+ \unvbox\partial@page
+ \box\last@line
+ \fi
+%</check>
+ \unvbox\@cclv
+ \global\setbox\last@line\lastbox
+ }%
+% \end{macrocode}
+% Finally we need to record the marks that are present within the
+% |\partial@page| so that we can construct correct first and bottom
+% marks later on. This is done by the following code.
+% \changes{v1.4a}{1992/02/14}{kept marks initiated}
+% \begin{macrocode}
+ \prep@keptmarks
+% \end{macrocode}
+% Finally we have to initialize |\kept@topmark| which should
+% ideally be initialized with the mark that is current on ``top''
+% of this page. Unfortunately we can't use |\topmark| because this
+% register will not always contain what its name promises because
+% \LaTeX{} sometimes calls the output routine for float
+% management.\footnote{During such a call the \cs{botmark}
+% gets globally copied to \cs{topmark} by the \TeX{}
+% program.} Therefore we use the second best solution by
+% initializing it with |\firstmark|. In fact, for our purpose this
+% doesn't matter as we use |\kept@topmark| only to initialize
+% |\firstmark| and |\botmark| of a following page if we don't find
+% any marks on the current one.
+% \changes{v1.4i}{1992/06/18}{\cs{kept@topmark} initialized.}
+% \begin{macrocode}
+ \global\let\kept@topmark\firstmark
+ }\eject
+% \end{macrocode}
+% The next thing to do is to assign a new value to |\vsize|.
+% \LaTeX{} maintains the free room on the page (i.e.\ the page
+% height without the space for already contributed floats) in the
+% register |\@colroom|. We must subtract the height of
+% |\partial@page| to put the actual free room into this
+% variable.
+% \begin{macrocode}
+ \advance\@colroom-\ht\partial@page
+% \end{macrocode}
+% Then we have to calculate the |\vsize| value to use during column
+% assembly. |\set@mult@vsize| takes an argument which allows to
+% make the setting local (|\relax|) or global (|\global|). The
+% latter variant is used inside the output routine below. At this
+% point here we have to make a local change to |\vsize| because we
+% want to get the original value for |\vsize| restored in case
+% this \mc{} environment ends on the same page where it has started.
+% \changes{v1.4p}{1992/11/26}{Use different \cs{vsize} setting}
+% \changes{v1.4p}{1992/11/26}{Code moved to \cs{set@mult@vsize}}
+% \begin{macrocode}
+ \set@mult@vsize\relax
+% \end{macrocode}
+% Now we switch to a new |\output| routine which will be used
+% to put the gathered column material together.
+% \begin{macrocode}
+ \output{\multi@column@out}%
+% \end{macrocode}
+% Finally we handle the footnote insertions. We have to multiply
+% the magnification factor and the extra skip by the number of
+% columns since each footnote reduces the space for every column
+% (remember that we have page-wide footnotes). If, on the other
+% hand, footnotes are typeset at the very end of the document, our
+% scheme still works since |\count\footins| is zero then, so it
+% will not change.
+% To allow even further customization the setting of the |\footins|
+% parameters is done in a separate macro.
+% \changes{v1.5?}{1994/?/?}{Use \cs{init@mult@footins}}
+% \begin{macrocode}
+ \init@mult@footins
+% \end{macrocode}
+% For the same reason (page-wide footnotes), the \meta{dimen}
+% register controlling the maximum space used for footnotes isn't
+% changed. Having done this, we must reinsert all the footnotes
+% which are already present (i.e.\ those encountered when the
+% material saved in |\partial@page| was first processed). This
+% will reduce the free space (i.e.\ |\pagetotal|) by the
+% appropriate amount since we have changed the magnification
+% factor, etc.\ above.
+% \begin{macrocode}
+ \reinsert@footnotes
+% \end{macrocode}
+% Inside \mc{} a |\clearpage| is fairly useless as we aren't supporting
+% floats. In fact, it can cause harm as it doesn't know about the
+% |\partial@page| and may therefore result in making columns too long.
+% So we change that to behave like |\newpage| but also check if there
+% are any deferred floats. If so, perhaps the user tried to place them through
+% that |\clearpage| (but that needs to be done before starting the \mc{}
+% environment.
+% \changes{v1.8q}{2017/04/11}{Make \cs{clearpage} behave like \cs{newpage} (pr/4511)}
+% \begin{macrocode}
+ \def\clearpage{%
+ \ifx\@deferlist\@empty\else
+ \PackageError{multicol}%
+ {Deferred floats not cleared}%
+ {A \string\clearpage\space inside multicols acts like
+ \string\newpage\space and doesn't clear floats.\MessageBreak
+ Move it before the multicols environment if you need it.}%
+ \fi
+ \newpage}%
+% \end{macrocode}
+% All the code above was only necessary for the unrestricted \mc{}
+% version, i.e.\ the one that allows page breaks. If we are within
+% a box there is no point in setting up special output routines or
+% |\vsize|, etc.
+% \begin{macrocode}
+ \fi
+% \end{macrocode}
+% But now we are coming to code that is necessary in all cases. We
+% assign new values to |\vbadness|, |\hbadness| and |\tolerance|
+% since it's rather hard for \TeX{} to produce `good' paragraphs
+% within narrow columns.
+% \changes{v1.2a}{1990/02/05}{\cs{vbadness} 10001 now.}
+% \begin{macrocode}
+ \vbadness\@Mi \hbadness5000
+ \tolerance\multicoltolerance
+% \end{macrocode}
+% Since nearly always the first pass will fail we ignore it
+% completely telling \TeX{} to hyphenate directly. In fact, we now
+% use another register to keep the value for the multicol
+% pre-tolerance, so that a designer may allow to use
+% |\pretolerance|.
+% \changes{v1.2a}{1990/02/05}{\cs{pretolerance} -1 because it nearly never
+% succeeds.}
+% \changes{v1.4e}{1992/03/20}{Using}
+% \begin{macrocode}
+ \pretolerance\multicolpretolerance
+% \end{macrocode}
+% For use with the new \TeX{} we set |\emergencystretch| to
+% $|\col@number| \times 4pt$. However this is only a guess
+% so at the moment this is done in a macro
+% |\setemergencystretch| which gets the current |\hsize|
+% and the number of columns as arguments. Therefore users are able
+% to figure out their own formula.
+% \changes{v1.2a}{1990/02/05}{\cs{setemergencystretch} added.}
+% \begin{macrocode}
+ \setemergencystretch\col@number\hsize
+% \end{macrocode}
+% Another hook to allow people adding their own extensions without
+% making a new package is |\set@floatcmds| which handles any
+% redefinitions of \LaTeX{}s internal float commands to work with
+% the \mc{} environment. At the moment it is only used to redefine
+% |\@dblfloat| and |\end@dblfloat|.
+% \changes{v1.2a}{1990/02/05}{\cs{set@floatcmds} added.}
+% \begin{macrocode}
+ \set@floatcmds
+% \end{macrocode}
+% Additionally, we advance |\baselineskip| by
+% |\multicolbaselineskip| to allow corrections for narrow
+% columns.
+% \begin{macrocode}
+ \advance\baselineskip\multicolbaselineskip
+% \end{macrocode}
+% \changes{v1.0e}{1989/06/21}{\cs{textwidth} changed to \cs{linewidth}.}
+% \changes{v1.0e}{1989/06/21}{So this file will
+% work with the `twocolumn' command.}
+% The |\hsize| of the columns is given by the formula:
+% \[
+% { |\linewidth| - (|\col@number|-1)
+% \times
+% |\columnsep|
+% \over
+% |\col@number|}
+% \]
+% The formula above has changed from release to release. We now
+% start with the current value of |\linewidth| so that the column
+% width is properly calculated when we are inside a minipage or a
+% list or some other environment.
+% This will be achieved with:
+% \begin{macrocode}
+ \hsize\linewidth \advance\hsize\columnsep
+ \advance\hsize-\col@number\columnsep
+ \divide\hsize\col@number
+% \end{macrocode}
+% We also set |\linewidth| and |\columnwidth| to |\hsize| In the past
+% |\columnwidth| was left unchanged. This is inconsistent,
+% but |\columnwidth| is used only by floats (which
+% aren't allowed in their current implementation) and by the
+% |\footnote| macro. Since we want page-wide
+% footnotes\footnote{I'm not sure that I really want page-wide
+% footnotes. But balancing of the last page can
+% only be achieved with this approach or with a
+% multi-path algorithm which is complicated and
+% slow. But it's a challenge to everybody to
+% prove me wrong! Another possibility is to
+% reimplement a small part of the {\it
+% fire\_up\/} procedure in \TeX{} (the program).
+% I think that this is the best solution if you
+% are interested in complex page makeup, but it
+% has the disadvantage that the resulting
+% program cannot be called \TeX{} thereafter.}
+% this simple trick saved us from rewriting the |\footnote|
+% macros. However, some applications referred to |\columnwidth| as
+% the ``width of the current column'' to typeset displays
+% (the \texttt{amsmath} package, for example) and to allow the use
+% of such applications together with \texttt{multicol} this is now
+% changed.
+%
+% Before we change |\linewidth| to the new value we record its old
+% value in some register called |\full@width|. This value is
+% used later on when we package all columns together.
+% \changes{v1.0e}{1989/06/21}{Setting of \cs{columnwidth} removed.}
+% \changes{v1.5o}{1997/11/16}{Setting of \cs{columnwidth} added again
+% pr/2664.}
+% \begin{macrocode}
+ \full@width\linewidth
+ \linewidth\hsize
+ \columnwidth\hsize
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\init@mult@footins}
+% This macro is used to set up the parameters associated
+% with footnote floats. It can be redefined by applications that
+% require different amount of spaces when typesetting footnotes.
+% \begin{macrocode}
+\def\init@mult@footins{%
+ \multiply\count\footins\col@number
+ \multiply\skip \footins\col@number
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\set@mult@vsize}
+%
+% Since we have to set |\col@umber| columns on one page,
+% each with a height of |\@colroom|, we have to assign
+% $
+% |\vsize| = |\col@number| \times |\@colroom|
+% $
+% in order to collect enough material before entering the
+% |\output| routine again. In fact we have to add another
+% $
+% (|\col@number|-1) \times (|\baselineskip|-|\topskip|)
+% $
+% if you think about it.
+% \changes{v1.4p}{1992/11/26}{Macro added.}
+% \begin{macrocode}
+\def\set@mult@vsize#1{%
+ \vsize\@colroom
+ \@tempdima\baselineskip
+ \advance\@tempdima-\topskip
+ \advance\vsize\@tempdima
+ \vsize\col@number\vsize
+ \advance\vsize-\@tempdima
+% \end{macrocode}
+% But this might not be enough since we use |\vsplit| later to
+% extract the columns from the gathered material. Therefore we add
+% some `extra lines,' one for each column plus a corrective action
+% depending on the value of the `\texttt{collectmore}' counter.
+% The final value is assigned globally if |#1| is |\global| because
+% we want to use this macro later inside the output routine too.
+% \changes{v1.6c}{2003/04/08}{Collect one line per column more}
+% \begin{macrocode}
+ \advance\vsize\col@number\baselineskip
+ #1\advance\vsize
+ \c@collectmore\baselineskip}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\multicol@leftmargin}
+% Here is the dimen register we need for saving away the outer
+% value of |\@totalleftmargin|.
+% \begin{macrocode}
+\newdimen\multicol@leftmargin
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@Mvi}
+% In versions prior to 1.8r the balancing at the end of the
+% environment was done by changing the output routine from
+% |\multi@column@out| to |\balance@column@out|. As it turned out
+% that this has a couple of issues when the last columns should not
+% be balanced after all (for example because they contained several
+% |\columnbreak| commands we now stay with one output routine for
+% the environment and only signal that we reached the end of the
+% environment by marking it with a special penalty that we can check
+% for later.
+% \changes{v1.8r}{2018/01/28}{Macro added}
+% \begin{macrocode}
+\mathchardef\@Mvi=10006 % 10005 is \columnbreak
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\endmulticols}
+% When the end of the \mc{} environment is sensed we have to
+% balance the gathered material. Depending on whether or not we are
+% inside a boxed multicol different things must happen. But first
+% we end the current paragraph with a |\par| command.
+% \begin{macrocode}
+\def\endmulticols{\par
+ \if@boxedmulticols
+% \end{macrocode}
+% In boxed mode we have to close the box in which we have gathered
+% all material for the columns. But before we do this we need to
+% remove any space at the end of the box as we don't want to use
+% this in balancing. Because of the |\color@endgroup| this can't be
+% done later in |\balance@columns| as the color command will hide
+% it.
+% \changes{v1.8c}{2013/11/03}{Add \cs{color@endgroup} to prevent color leak}
+% \changes{v1.8f}{2014/06/19}{Discard spaces before adding \cs{color@endgroup}}
+% \begin{macrocode}
+ \remove@discardable@items\color@endgroup\egroup
+% \end{macrocode}
+% Now we call |\balance@columns| the routine that balances material
+% stored in the box |\mult@box|.
+% \changes{v1.5?}{1994/?/?}{Splitting off zero box moved to
+% \cs{balance@columns}}
+% \begin{macrocode}
+ \balance@columns
+% \end{macrocode}
+% After balancing the result has to be returned by the command
+% |\page@sofar|. But before we do this we reinsert any marks found
+% in box |\mult@box|.
+% \begin{macrocode}
+ \return@nonemptymark{first}%
+ \kept@firstmark
+ \return@nonemptymark{bot}%
+ \kept@botmark
+ \page@sofar
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \global\let\kept@firstmark
+ \l@kept@firstmark
+ \global\let\kept@botmark
+ \l@kept@botmark
+%<*marktrace>
+ \mult@info\tw@
+ {Restore kept marks to\MessageBreak
+ first: \meaning\kept@firstmark
+ \MessageBreak bot\space\space:
+ \meaning\kept@botmark }%
+%</marktrace>
+% \end{macrocode}
+% This finishes the code for the ``boxed'' case.
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% If there was a |\columnbreak| on the very last line all material
+% will have been moved to the |\colbreak@box|. Thus the the galley
+% will be empty and no output routine gets called so that the text
+% is lost. To avoid this problem (though unlikely) we check if the
+% current galley is empty and the |\colbreak@box| contains text and
+% if so return that to the galley. If the galley is non-empty any
+% material in |\colbreak@box| is added in the output routine since
+% it needs to be put in front.
+% \changes{v1.6d}{2003/04/17}{Catch problem with \cs{columnbreak} in
+% last line}
+% \begin{macrocode}
+ \ifdim\pagegoal=\maxdimen
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \unvbox\colbreak@box\fi
+ \fi
+% \end{macrocode}
+% If we are in an unrestricted \mc{} environment we end the current
+% paragraph above with |\par| but this isn't sufficient since \TeX{}s
+% {\it page\_builder} will not totally empty the contribution
+% list.\footnote{This once caused a puzzling bug where some of the
+% material was balanced twice, resulting in some overprints. The
+% reason was the \cs{eject} which was placed at the end of
+% the contribution list. Then the {\it page\_builder} was called
+% (an explicit \cs{penalty} will empty the contribution
+% list), but the line with the \cs{eject} didn't fit onto
+% the current page. It was then reconsidered after the output
+% routine had ended, causing a second break after one line.}
+% Therefore we must also add an explicit |\penalty|. Now the
+% contribution list will be emptied and, if its material doesn't
+% all fit onto the current page then the output routine will be
+% called before we change it.
+% \changes{v1.3b}{1990/10/09}{Do \cs{penalty} with \cs{addpenalty}}
+% \changes{v1.4e}{1992/03/16}{But ignore \cs{@nobreak} in \cs{addpenalty}}
+% \changes{v1.5c}{1993/04/18}{Again use \cs{penalty}}
+% At this point we need to use |\penalty| not |\addpenalty| to
+% ensure that a) the recent contributions are emptied and b) that
+% the very last item on the main vertical list is a valid break
+% point so that \TeX{} breaks the page in case it is overfull.
+% \begin{macrocode}
+ \penalty\z@
+% \end{macrocode}
+% Now it's safe to call the output routine in order to balance
+% the columns. We do this by calling it with a special penalty.
+% \changes{v1.8r}{2018/01/28}{Use special penalty to signal end of environment}
+% \begin{macrocode}
+ \penalty-\@Mvi
+% \end{macrocode}
+% If the \mc{} environment body was completely empty or if a
+% multi-page \mc{} just ends at a page boundary we have the unusual
+% case that the |\eject| will have no effect (since the main
+% vertical list is empty)---thus no output routine is called at
+% all. As a result the material preceding the \mc{} (stored in
+% |\partial@page| will get lost if we don't put this back by hand.
+% \changes{v1.4m}{1992/09/04}{Check \cs{partial@page} being emptied}
+% \begin{macrocode}
+ \ifvbox\partial@page
+ \unvbox\partial@page\fi
+% \end{macrocode}
+% After the output routine has acted we restore
+% the kept marks to their initial value.
+% \begin{macrocode}
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+%<*marktrace>
+ \mult@info\tw@
+ {Make kept marks empty}%
+%</marktrace>
+ \fi
+% \end{macrocode}
+% The output routine above will take care of the |\vsize| and
+% reinsert the balanced columns, etc. But it can't reinsert the
+% |\footnotes| because we first have to restore the
+% |\footins| parameter since we are returning to one column
+% mode. This will be done in the next line of code; we simply close
+% the group started in |\multicols|.
+%
+% To fix an obscure bug which is the result of the current
+% definition of the |\begin| \ldots\ |\end| macros, we check that
+% we are still (logically speaking) in the \mc{} environment. If,
+% for example, we forget to close some environment inside the
+% \mc{} environment, the following |\endgroup| would be
+% incorrectly considered to be the closing of this environment.
+% \changes{v1.3c}{1991/03/14}{Check closing env.}
+% \begin{macrocode}
+ \@checkend{multicols}%
+ \endgroup
+% \end{macrocode}
+% We also set the `\textsf{unbalance}' counter to its default. This is
+% done globally since \LaTeX{} counters are always changed this
+% way.\footnote{Actually, we are still in a group started by the
+% \cs{begin} macro, so \cs{global} must be used
+% anyway.}
+% \begin{macrocode}
+ \global\c@unbalance\z@
+% \end{macrocode}
+% Now it's time to return any footnotes if we are in unrestricted
+% mode. In boxed mode footnotes are kept inside, but in that case
+% we have to write another column status into the \texttt{.aux}
+% file to support \cs{docolaction} in case we have nested
+% environments.
+% \changes{v1.8s}{2018/04/20}{Support for \cs{docolaction} (issue/39)}
+% \begin{macrocode}
+ \if@boxedmulticols
+ \mc@col@status@write
+ \else
+ \reinsert@footnotes
+% \end{macrocode}
+% We also take a look at the amount of free space on the current
+% page to see if it's time for a page break. The vertical space
+% added thereafter will vanish if |\enough@room| starts a new
+% page.
+%
+% But there is one catch. If the |\end{multicols}| is at the top of
+% which can happen if there is a break point just before it (such
+% as end ending environment) which was chosen. In that case we
+% would do the next page using the internal |\vsize| for multicol
+% collection which is a disaster. So we better catch this
+% case. Fortunately we can detect it by looking at |\pagegoal|.
+% \changes{v1.5x}{2000/05/05}{Detect and fix problem if a multicols
+% ends at the top of a page}
+% \begin{macrocode}
+ \ifdim \pagegoal=\maxdimen
+ \global\vsize\@colroom
+ \else
+ \enough@room\postmulticols
+ \fi
+ \fi
+ \addvspace\multicolsep
+% \end{macrocode}
+% There is one more thing to do: the balanced result of the
+% environment is supposed to have a |\prevdepth| of zero as we
+% backed up by its real prevdepth within |\page@sofar|. However if
+% the balancing happened in the output routine then \TeX{} reverts
+% to the |\prevdepth| that was current before the OR once the OR has
+% finished. In short |\prevdepth| is something you can't set
+% globally it is alway local to the current list being built. Thus
+% we need to set it back to zero here to avoid incorrect spacing.
+% \changes{v1.8h}{2014/09/12}{Set \cs{prevdepdth} for current vlist
+% when returning from multicols environment}
+% \begin{macrocode}
+ \prevdepth\z@
+% \end{macrocode}
+% If statistics are required we finally report that we have
+% finished everything.
+% \begin{macrocode}
+ \mult@info\z@
+ {Ending environment
+ \if@boxedmulticols
+ \space(boxed mode)\fi
+ }}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\c@unbalance}
+% \SpecialMainIndex{\c@collectmore}
+% \SpecialMainIndex{\col@number}
+% \SpecialMainIndex{\doublecol@number}
+% \SpecialMainIndex{\premulticols}
+% \SpecialMainIndex{\multicoltolerance}
+% \SpecialMainIndex{\multicolpretolerance}
+% \SpecialMainIndex{\page@free}
+% \SpecialMainIndex{\premulticols}
+% \SpecialMainIndex{\postmulticols}
+% \SpecialMainIndex{\multicolsep}
+% \SpecialMainIndex{\multicolbaselineskip}
+% \SpecialMainIndex{\partial@page}
+% Let us end this section by allocating all the registers used so
+% far.
+% \begin{macrocode}
+\newcount\c@unbalance
+\newcount\c@collectmore
+% \end{macrocode}
+% In the new \LaTeX{} release |\col@number| is already allocated by
+% the kernel, so we don't allocate it again.
+% \begin{macrocode}
+%\newcount\col@number
+\newcount\doublecol@number
+\newcount\multicoltolerance
+\newcount\multicolpretolerance
+\newdimen\full@width
+\newdimen\page@free
+\newdimen\premulticols
+\newdimen\postmulticols
+\newskip\multicolsep
+\newskip\multicolbaselineskip
+\newbox\partial@page
+\newbox\last@line
+% \end{macrocode}
+% And here are their default values:
+% \begin{macrocode}
+\c@unbalance = 0
+\c@collectmore = 0
+% \end{macrocode}
+% To allow checking whether some macro is used within the \mc{}
+% environment the counter |\col@number| gets a default of |1|
+% outside the the environment.
+% \changes{v1.3d}{1991/10/23}{\cs{col@number} set to one}
+% \changes{v1.8o}{2016/02/08}{\cs{col@number} already initialized in the
+% kernel, so not initializing it in the package
+% in case the document is in two-column (pr/4435)}
+% \begin{macrocode}
+%\col@number = 1
+\multicoltolerance = 9999
+\multicolpretolerance = -1
+\premulticols = 50pt
+\postmulticols= 20pt
+\multicolsep = 12pt plus 4pt minus 3pt
+\multicolbaselineskip=0pt
+% \end{macrocode}
+% \end{macro}
+%
+% \end{multicols}
+%
+% \begin{multicols}{2}[\subsection{The output routines}]
+%
+% We first start with some simple macros. When typesetting the page we
+% save the columns either in the box registers 0, 2, 4,\ldots\
+% (locally) or 1, 3, 5,\ldots\ (globally). This is \PlainTeX{} policy
+% to avoid an overflow of the save stack.
+%
+% \begin{macro}{\process@cols}
+% Therefore we define a |\process@cols| macro to help us in
+% using these registers in the output routines below. It has two
+% arguments: the first one is a number; the second one is the
+% processing information. It loops starting with |\count@=#1|
+% (|\count@| is a scratch register defined in \PlainTeX),
+% processes argument |#2|, adds two to |\count@|,
+% processes argument |#2| again, etc.\ until |\count@| is
+% higher than |\doublecol@number|. It might be easier to
+% understand it through an example, so we define it now and
+% explain its usage afterwards.
+% \begin{macrocode}
+\def\process@cols#1#2{\count@#1\relax
+ \loop
+%<*debug>
+ \typeout{Looking at box \the\count@}
+%</debug>
+ #2%
+ \advance\count@\tw@
+ \ifnum\count@<\doublecol@number
+ \repeat}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\page@sofar}
+% We now define |\page@sofar| to give an example of the
+% |\process@cols| macro. |\page@sofar| should output everything
+% prepared by the balancing routine |\balance@columns|.
+% \begin{macrocode}
+\def\page@sofar{%
+% \end{macrocode}
+% |\balance@columns| prepares its output in the even numbered
+% scratch box registers.
+% Now we output the columns gathered assuming that they are saved
+% in the box registers 2 (left column), 4 (second column), \ldots\
+% However, the last column (i.e.\ the right-most) should be saved in
+% box register 0.\footnote{You will see the reason for this numbering
+% when we look at the output routines
+% \cs{multi@column@out} and
+% \cs{balance@columns@out}.}
+% First we ensure that the columns have equal width. We use
+% |\process@cols| for this purpose, starting with
+% $|\count@|=|\mult@rightbox|$. Therefore |\count@| loops through
+% |\mult@rightbox|, $|\mult@rightbox| + 2$,\ldots
+% (to |\doublecol@number|).
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \begin{macrocode}
+ \process@cols\mult@rightbox
+% \end{macrocode}
+% We have to check if the box in question is void, because the
+% operation |\wd|\meta{number} on a void box will \emph{not} change
+% its dimension (sigh).
+% \changes{v1.5h}{1994/08/26}{Check for void boxes}
+% \changes{v1.5i}{1994/10/02}{But don't remove original code.}
+% \begin{macrocode}
+ {\ifvoid\count@
+ \setbox\count@\hbox to\hsize{}%
+ \else
+ \wd\count@\hsize
+ \fi}%
+% \end{macrocode}
+% Now we give some tracing information.
+% \changes{v1.4l}{1992/08/17}{use \cs{multicol@leftmargin} instead of
+% \cs{@totalleftmargin}}
+% \changes{v1.6b}{2003/03/15}{Different info display}
+% \begin{macrocode}
+ \count@\col@number \advance\count@\m@ne
+ \mult@info\z@
+ {Column spec: \the\full@width\space = indent
+ + columns + sep =\MessageBreak
+ \the\multicol@leftmargin\space
+ + \the\col@number\space
+ x \the\hsize\space
+ + \the\count@\space
+ x \the\columnsep
+ }%
+% \end{macrocode}
+% At this point we should always be in vertical mode.
+% \begin{macrocode}
+\ifvmode\else\errmessage{Multicol Error}\fi
+% \end{macrocode}
+% Now we put all columns together in an |\hbox| of width
+% |\full@width| (shifting it by |\multicol@leftmargin| to the right
+% so that it will be placed correctly if we are within a list
+% environment)
+% and separating the columns with a rule if desired.
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \changes{v1.5z}{2000/07/10}{Ensure that column rule has always
+% \cs{normalcolor}}
+% \changes{v1.6f}{2006/09/19}{Make the color of the rule a hook}
+% \changes{v1.4l}{1992/08/17}{use \cs{multicol@leftmargin} instead of
+% \cs{@totalleftmargin}}
+%
+% The box containing the columns has a large height and thus will
+% always result in using |\lineskip| if the normal |\baselineskip|
+% calculations are used. We therefore better cancel that process.
+% \changes{v1.5z1}{2003/02/17}{Suppress interline glue at this point}
+% \begin{macrocode}
+ \nointerlineskip
+% \end{macrocode}
+% As mentioned earlier we want to have the reference point of the
+% box we put on the page being at the baseline of the last line of
+% the columns but we also want to ensure that the box has no depth
+% so that any following skip is automatically starting from that
+% baseline.
+% We achieve this by recording the depths of all columns and then
+% finally backing up by the maximum. (perhaps a simpler method
+% would be to assemble the box in a register and set the depth of
+% that box to zero (not checked).
+%
+% We need a global scratch register for this; using standard \TeX{}
+% conventions we choose |\dimen2| and initialize it with the depth
+% of the character ``p'' since that is one of the depths that
+% compete for the maximum.
+% \changes{v1.6a}{2003/03/15}{Preparing for adjusting \cs{prevdepth}}
+% \begin{macrocode}
+ \setbox\z@\hbox{p}\global\dimen\tw@\dp\z@
+ \moveright\multicol@leftmargin
+ \hbox to\full@width{%
+% \end{macrocode}
+% If the document is written in a language that is typeset right-to-left
+% then, of course, the multicol columns should be also typeset
+% right-to-left. To support this we call |\mc@align@columns| which
+% with execute different code depending on the typesetting direction.
+% \changes{v1.7b}{2011/12/18}{RL language support fixed}
+% \begin{macrocode}
+ \mc@align@columns
+% \end{macrocode}
+% The depths of the columns depend on their last lines. To ensure
+% that we will always get a similar look as far as the rules are
+% concerned we force the depth to be at least the depth of a
+% letter~`p' (which is what we set |\dimen2| to above).
+% \begin{macrocode}
+ \rlap{\phantom p}%
+ }%
+% \end{macrocode}
+% The processed material might consist of a last line with a
+% descender in which case the |\prevdepth| will be
+% non-zero. However, this material is getting reformatted now so
+% that this value is likely to be wrong. We therefore normalize the
+% situation by pretending that the depth is zero. However, if |\page@sofar|
+% is being called inside the OR then setting |\prevdepth| here has
+% no long-lasting effect, we therefore have to repeat this once we
+% return to the main vertical list. Here we set it only for those
+% cases where the command is used within a list and then followed by
+% something else.
+% \changes{v1.8g}{2014/08/24}{Resetting \cs{prevdepth} in the right place}
+% \begin{macrocode}
+ \prevdepth\z@
+% \end{macrocode}
+% Now after typesetting the box we back up to its baseline by using
+% the value stored in |\dimen2| (which will hold the largest depth
+% found on any column).
+% \changes{v1.8g}{2003/03/15}{Now adjusting \cs{prevdepth}}
+% \begin{macrocode}
+ \kern-\dimen\tw@
+% \end{macrocode}
+% However, in case one of the columns was unusually deep \TeX{} may
+% have tried some corrective actions in which case backing up by
+% the saved value will not bring us back to the baseline. A good
+% indication for this is a depth of |\maxdepth| though it is not an
+% absolute proof. If the option \texttt{grid} is used
+% |\mc@gridwarn| will expand to this, otherwise to |\maxdimen| in
+% which case this warning will not show up.
+% \changes{v1.8g}{2014/08/24}{Warn if value is exceeded not when equal}
+% \begin{macrocode}
+ \ifdim\dimen\tw@ > \mc@gridwarn
+ \PackageWarning{multicol}%
+ {Very deep columns!\MessageBreak
+ Grid alignment might be broken}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\columnseprulecolor}
+% \changes{v1.6f}{2006/09/19}{Make the color of the rule a hook}
+% By default the vertical rule between columns will be in |\normalcolor|.
+% \begin{macrocode}
+\def\columnseprulecolor{\normalcolor}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reinsert@footnotes}
+% Before we tackle the bigger output routines we define just one
+% more macro which will help us to find our way through the
+% mysteries later. |\reinsert@footnotes| will do what its name
+% indicates: it reinserts the footnotes present in
+% |\footinbox| so that they will be reprocessed by \TeX{}'s
+% {\it page\_builder}.
+%
+% Instead of actually reinserting the footnotes we insert an empty
+% footnote. This will trigger insertion mechanism as well and since
+% the old footnotes are still in their box and we are on a fresh page
+% |\skip| |footins| should be correctly taken into account.
+% \changes{v1.3c}{1990/03/03}{\cs{unbox}ing avoided.}
+% \begin{macrocode}
+\def\reinsert@footnotes{\ifvoid\footins\else
+ \insert\footins{}\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\vfilmaxdepth}
+% This curious definition is used as the space at the bottom of a
+% column if we implement |\raggedcolumns|. Normally one only appends
+% |\vfill| in that case but this is actually wrong for columns that
+% are more or less full: by adding a glue at the bottom such a
+% column doesn't have any depth any more but without it the material
+% would be allowed a depth of |\maxdepth|. So we allow shrinking by
+% that amount. This only makes a difference if the box would
+% otherwise become overfull and shrinking never exceeds the
+% specified value, so we should be fine.
+% \changes{v1.8h}{2014/09/12}{Macro added (pr/4395)}
+% \changes{v1.8j}{2015/03/07}{Use only `0.0001fil' for stretching}
+% \begin{macrocode}
+\def\vfilmaxdepth{\vskip \z@ \@plus .0001fil
+ \@minus \maxdepth}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\multi@column@out}
+% Now we can't postpone the difficulties any longer. The
+% |\multi@column@out| routine will be called in two situations.
+% Either the page is full (i.e., we have collected enough material
+% to generate all the required columns) or a float or marginpar or
+% a |\clearpage| is
+% sensed. In the latter case the |\outputpenalty| is less
+% than $-10000$, otherwise the penalty which triggered the output
+% routine is higher. Therefore it's easy to distinguish both
+% cases: we simply test this register.
+% \changes{v1.5c}{1993/04/18}{Support \cs{clearpage}}
+% \begin{macrocode}
+\def\multi@column@out{%
+ \ifnum\outputpenalty <-\@M
+% \end{macrocode}
+% If this was a |\clearpage|, a float or a marginpar we call
+% |\speci@ls|
+% \begin{macrocode}
+ \speci@ls \else
+% \end{macrocode}
+% otherwise we construct the final page.
+% \changes{v1.5u}{1999/05/25}{Support \cs{columnbreak}}
+% \changes{v1.5v}{1999/07/18}{Added debug statements for
+% column break support}
+% For the next block of code see comments in section~\ref{sec:colbreak}.
+% \begin{macrocode}
+ \ifvoid\colbreak@box\else
+ \mult@info\@ne{Re-adding forced
+ break(s) for splitting}%
+ \setbox\@cclv\vbox{%
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \unvbox\@cclv}%
+ \fi
+% \end{macrocode}
+% Let us now consider the
+% normal case. We have to |\vsplit| the columns from the
+% accumulated material in box 255. Therefore we first assign
+% appropriate values to |\splittopskip| and |\splitmaxdepth|.
+% \begin{macrocode}
+ \splittopskip\topskip
+ \splitmaxdepth\maxdepth
+% \end{macrocode}
+% We also need to restrict |\boxmaxdepth| so that re-boxing is not
+% generating boxes with arbitrary depth.
+% \changes{v1.8j}{2015/03/07}{Set \cs{boxmaxdepth}}
+% \begin{macrocode}
+ \boxmaxdepth\maxdepth
+% \end{macrocode}
+% Then we calculate the current column height (in |\dimen@|).
+% Note that the height of |\partial@page| is already
+% subtracted from |\@colroom| so we can use its value as a
+% starter.
+% \begin{macrocode}
+ \dimen@\@colroom
+% \end{macrocode}
+% But we must also subtract the space occupied by footnotes on the
+% current page. Note that we first have to reset the skip register
+% to its normal value.
+% Again, the actual action is carried out in a utility macro, so that
+% other applications can modify it.
+% \changes{v1.5?}{1994/?/?}{Use \cs{leave@mult@footins}}
+% \begin{macrocode}
+ \divide\skip\footins\col@number
+ \ifvoid\footins \else
+ \leave@mult@footins
+ \fi
+% \end{macrocode}
+% And there is one more adjustment that we have to make: if the
+% user has issue a |\enlargethispage| command then the height the
+% |\@kludgeins| box will be the negation of the size by which the
+% page should be enlarged. If the star form of this command has
+% been used then we also need to shrink the resulting column.
+
+% That local change will be reverted at the end of the output
+% routine So for the next page the original state will be
+% reestablished. However, in theory there is a possibility to sneak
+% in a whole multicols environment into the running header
+% definition. If that happens then it will also be affected by this
+% change---too bad I think.
+% \changes{v1.8a}{2011/12/20}{Support for \cs{enlargethispage}}
+% \changes{v1.8v}{2018/12/27}{Removed dead code, the case where this
+% can go wrong is too obscure to worry about it (gh/101)}
+% \begin{macrocode}
+ \ifvbox \@kludgeins
+ \advance \dimen@ -\ht\@kludgeins
+% \end{macrocode}
+% The star form of |\enlargethispage| makes the width of the box
+% greater than zero (sneaky isn't it?).
+% \begin{macrocode}
+ \ifdim \wd\@kludgeins>\z@
+ \shr@nkingtrue
+ \fi
+ \fi
+% \end{macrocode}
+% Now we are able to |\vsplit| off all but the last column.
+% Recall that these columns should be saved in the box registers 2,
+% 4,\ldots\ (plus offset).
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \begin{macrocode}
+ \process@cols\mult@gfirstbox{%
+ \setbox\count@
+ \vsplit\@cclv to\dimen@
+% \end{macrocode}
+% After splitting we update the kept marks.
+% \begin{macrocode}
+ \set@keptmarks
+% \end{macrocode}
+% If |\raggedcolumns| is in force we add a |vfill| at the bottom by
+% unboxing the split box.
+% But we need to unbox anyway to ensure that at the end of the box
+% we do not have unwanted space. This can sneak in in certain
+% situations, for example, if two lists follow each other and we
+% break between them. While such space is usually zero it still has
+% an effect because it hides depth of the last line in the column
+% and that will result in incorrect placement.
+% \changes{v1.3c}{1990/03/03}{\cs{unbox}ing avoided.}
+% \changes{v1.8b}{2013/08/28}{And 20odd years later conclude that
+% this was wrong and unboxing is always needed.}
+% \changes{v1.8b}{2013/08/28}{Remove discardable items at the
+% end of split boxes}
+% \changes{v1.8h}{2014/09/12}{Use \cs{vfilmaxdepth}}
+% \changes{v1.8k}{2015/03/22}{\cs{remove@discardable@items} removed}
+% \begin{macrocode}
+ \setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@
+ \ifshr@nking\vfilmaxdepth\fi}%
+ }%
+% \end{macrocode}
+% Then the last column follows.
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \changes{v1.8b}{2013/08/28}{Remove discardable items at the
+% end of split boxes}
+% \changes{v1.8h}{2014/09/12}{Use \cs{vfilmaxdepth}}
+% \changes{v1.8k}{2015/03/22}{\cs{remove@discardable@items} removed}
+% \begin{macrocode}
+ \setbox\mult@rightbox
+ \vsplit\@cclv to\dimen@
+ \set@keptmarks
+ \setbox\mult@rightbox\vbox to\dimen@
+ {\unvbox\mult@rightbox
+ \ifshr@nking\vfilmaxdepth\fi}%
+% \end{macrocode}
+% Having done this we hope that box 255 is emptied. If not, we
+% reinsert its contents.
+% \changes{v1.8a}{2011/12/20}{Only re-add output penalty if it was
+% explicitly set}
+% \begin{macrocode}
+ \ifvoid\@cclv \else
+ \unvbox\@cclv
+ \ifnum\outputpenalty=\@M
+ \else
+ \penalty\outputpenalty
+ \fi
+% \end{macrocode}
+% In this case a footnote that happens to fall into the leftover
+% bit will be typeset on the wrong page. Therefore we warn the user
+% if the current page contains footnotes. The older versions of
+% \mc{} produced this warning regardless of whether or not
+% footnotes were present, resulting in many unnecessary warnings.
+% \changes{v1.3c}{1991/02/17}{Check if footnotes are actually present
+% before issuing a warning.}
+% \begin{macrocode}
+ \ifvoid\footins\else
+ \PackageWarning{multicol}%
+ {I moved some lines to
+ the next page.\MessageBreak
+ Footnotes on page
+ \thepage\space might be wrong}%
+ \fi
+% \end{macrocode}
+% If the `\textsf{tracingmulticols}' counter is 4 or higher we also
+% add a rule.
+% \begin{macrocode}
+ \ifnum \c@tracingmulticols>\thr@@
+ \hrule\allowbreak \fi
+ \fi
+% \end{macrocode}
+% To get a correct marks for the current page we have to (locally)
+% redefine |\firstmark| and |\botmark|.
+% If |\kept@firstmark| is non-empty then |\kept@botmark| must be
+% non-empty too so we can use their values. Otherwise we use the
+% value of |\kept@topmark| which was first initialized when we
+% gathered the |\partical@page| and later on was updated to the
+% |\botmark| for the preceding page.
+%
+% \changes{v1.4a}{1992/02/14}{\cs{botmark} set to \cs{splitbotmark}}
+% \begin{macrocode}
+ \ifx\@empty\kept@firstmark
+ \let\firstmark\kept@topmark
+ \let\botmark\kept@topmark
+ \else
+ \let\firstmark\kept@firstmark
+ \let\botmark\kept@botmark
+ \fi
+% \end{macrocode}
+% We also initialize |\topmark| with |\kept@topmark|. This will make
+% this mark okay for all middle pages of the \mc{} environment.
+% \changes{v1.5d}{1993/09/15}{reinit \cs{topmark}}
+% \begin{macrocode}
+ \let\topmark\kept@topmark
+%<*marktrace>
+ \mult@info\tw@
+ {Use kept top mark:\MessageBreak
+ \meaning\kept@topmark
+ \MessageBreak
+ Use kept first mark:\MessageBreak
+ \meaning\kept@firstmark
+ \MessageBreak
+ Use kept bot mark:\MessageBreak
+ \meaning\kept@botmark
+ \MessageBreak
+ Produce first mark:\MessageBreak
+ \meaning\firstmark
+ \MessageBreak
+ Produce bot mark:\MessageBreak
+ \meaning\botmark
+ \@gobbletwo}%
+%</marktrace>
+% \end{macrocode}
+% With a little more effort we could have done better. If we had,
+% for example, recorded the shrinkage of the material in
+% |\partial@page| it would be now possible to try higher
+% values for |\dimen@| (i.e.\ the column height) to overcome
+% the problem with the nonempty box 255. But this would make the
+% code even more complex so I skipped it in the current
+% implementation.
+%
+% Now we use \LaTeX{}'s standard output
+% mechanism.\footnote{This will produce a lot of overhead since both
+% output routines are held in memory. The correct
+% solution would be to redesign the whole output
+% routine used in \LaTeX.}
+% Admittedly this is a funny way to do it.
+%
+% Within the OR |\boxmaxdepth| needs to be unrestricted so we set it back
+% now as it was changed above.
+% \changes{v1.8p}{2016/04/07}{Reset \cs{boxmaxdepth}}
+% \begin{macrocode}
+ \boxmaxdepth\maxdimen
+ \setbox\@cclv\vbox{\unvbox\partial@page
+ \page@sofar}%
+% \end{macrocode}
+% The macro |\@makecol| adds all floats assigned for the current
+% page to this page. |\@outputpage| ships out the resulting box.
+% Note that it is just possible that such floats are present even
+% if we do not allow any inside a \mc{} environment.
+% \begin{macrocode}
+ \@makecol\@outputpage
+% \end{macrocode}
+% After the page is shipped out we have to prepare the kept marks
+% for the following page. |\kept@firstmark| and |\kept@botmark|
+% reinitialized by setting them to |\@empty|. The value of
+% |\botmark| is then assigned to |\kept@topmark|.
+% \changes{v1.4g}{1992/06/03}{Only change \cs{kept@topmark} if
+% \cs{kept@botmark} non-empty}
+% \changes{v1.4i}{1992/06/18}{Set \cs{kept@topmark} to \cs{botmark}}
+% \begin{macrocode}
+ \global\let\kept@topmark\botmark
+ \global\let\kept@firstmark\@empty
+ \global\let\kept@botmark\@empty
+%<*marktrace>
+ \mult@info\tw@
+ {(Re)Init top mark:\MessageBreak
+ \meaning\kept@topmark
+ \@gobbletwo}%
+%</marktrace>
+% \end{macrocode}
+% Now we reset |\@colroom| to |\@colht| which is \LaTeX's
+% saved value of |\textheight|.
+% We also have to reset the recorded position of the last
+% |\marginpar| as well as the recorded size of in-text floats
+% as we are now on a new page.
+% \changes{v1.8d}{2014/04/23}{Reset \cs{@mparbottom} after page finishes}
+% \changes{v1.8n}{2015/08/19}{Reset \cs{@textfloatsheight} after page finishes}
+% \begin{macrocode}
+ \global\@colroom\@colht
+ \global \@mparbottom \z@
+ \global \@textfloatsheight \z@
+% \end{macrocode}
+% Then we process deferred floats waiting for their chance to be
+% placed on the next page.
+% \begin{macrocode}
+ \process@deferreds
+ \@whilesw\if@fcolmade\fi{\@outputpage
+ \global\@colroom\@colht
+ \process@deferreds}%
+% \end{macrocode}
+% If the user is interested in statistics we inform him about the
+% amount of space reserved for floats.
+% \begin{macrocode}
+ \mult@info\@ne
+ {Colroom:\MessageBreak
+ \the\@colht\space
+ after float space removed
+ = \the\@colroom \@gobble}%
+% \end{macrocode}
+% Having done all this we must prepare to tackle the next page.
+% Therefore we assign a new value to |\vsize|. New, because
+% |\partial@page| is now empty and |\@colroom| might be
+% reduced by the space reserved for floats.
+% \changes{v1.4p}{1992/11/26}{Use different \cs{vsize} setting}
+% \begin{macrocode}
+ \set@mult@vsize \global
+% \end{macrocode}
+% The |\footins| skip register will be adjusted when the output
+% group is closed.
+% \changes{v1.3c}{1991/03/03}{Unnecessary code removed}
+% \begin{macrocode}
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\leave@mult@footins}
+% This macro is used to subtract the amount of space
+% occupied by footnotes for the current space from the
+% space available for the current column. The space current column
+% is stored in |\dimen@|. See above for the description of the default
+% action.
+% \changes{v1.5?}{1994/?/?}{Macro added}
+% \begin{macrocode}
+\def\leave@mult@footins{%
+ \advance\dimen@-\skip\footins
+ \advance\dimen@-\ht\footins
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\speci@ls}
+% We left out two macros: |\process@deferreds| and
+% |\speci@ls|.
+% \changes{v1.5c}{1993/04/18}{Support \cs{clearpage}}
+% \begin{macrocode}
+\def\speci@ls{%
+ \ifnum\outputpenalty <-\@Mi
+% \end{macrocode}
+% If the document ends in the middle of a multicols environment, e.g.,
+% if the user forgot the |\end{multicols}|, \TeX{} adds a very
+% negative penalty to the end of the galley which is intended to signal
+% the output routine that it is time to prepare for shipping out
+% everything remaining. Since inside multicols the output routine of
+% \LaTeX{} is disabled sometimes we better check for this case: if we
+% find a very negative penalty we produce an error message and run
+% the default output routine for this case.
+% \changes{v1.5s}{1998/09/10}{check for \cs{stop} penalty pr/2873}
+% \begin{macrocode}
+ \ifnum \outputpenalty<-\@MM
+ \PackageError{multicol}{Document end
+ inside multicols environment}\@ehd
+ \@specialoutput
+ \else
+% \end{macrocode}
+% \changes{v1.5u}{1999/05/25}{Support \cs{columnbreak}}
+% \changes{v1.5v}{1999/07/18}{Added debug statements for
+% column break support}
+% For the next block of code see comments in section~\ref{sec:colbreak}.
+% \begin{macrocode}
+ \ifnum\outputpenalty = -\@Mv
+ \mult@info\@ne{Forced column
+ break seen}%
+ \global\advance\vsize-\pagetotal
+ \global\setbox\colbreak@box
+ \vbox{%
+ \ifvoid\colbreak@box
+ \else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \fi
+% \end{macrocode}
+% As this is the place of a forced break we now remove vertical
+% white space just in front of it (or some of it at least) as it is
+% quite likely that the break is not exactly in the right place,
+% e.g., after a display environment (if LaTeX would break here by
+% its own it would break before the space following the display).
+%
+% Thus we rebox box 255 once (using |\maxdepth| and calling
+% |\remove@discardable@items| inside). The depth of 255 will then
+% give us the depth the box would have had if it would have been a
+% natural break. We then unbox 255 to get it into the
+% |\colbreak@box| and then back up by this depth. This will position
+% the bottom of the box at its natural baseline which is useful for
+% balancing later on.
+% \changes{v1.8k}{2015/03/21}{Remove discardable items just before a
+% forced break}
+% \begin{macrocode}
+ \boxmaxdepth\maxdepth
+ \setbox\@cclv\vbox{%
+ \unvbox\@cclv
+ \remove@discardable@items}%
+ \dimen@\dp\@cclv
+ \unvbox\@cclv
+ \kern-\dimen@
+ }%
+ \reinsert@footnotes
+ \else
+% \end{macrocode}
+% Another special case is reaching the end of the \mc{}
+% environment which is signaled by |-\@Mvi|.
+% \changes{v1.8r}{2018/01/28}{Handling end of env through special penalty}
+% \begin{macrocode}
+ \ifnum\outputpenalty = -\@Mvi
+ \mult@info\@ne{End penalty of multicols seen}%
+% \end{macrocode}
+% If we are at this point then have have to run the balancing code
+% (which was previously its own output routine). First we pretend
+% that we had a normal forced breakpoint and then call
+% |\balance@column@out|. The latter may be let to |\multi@column@out|
+% if we are inside \texttt{multicols*} in which case we would get a loop
+% if the |\outputpenalty| is not changed---this could be cleaned up
+% in a better way; basically it is like this, because of the older
+% code was using different ORs and I simply reused most of it.
+% \begin{macrocode}
+ \outputpenalty\@M % pretend we had a natural forced break
+ \balance@columns@out
+ \else
+% \end{macrocode}
+% If we encounter a float or a marginpar in the current
+% implementation we simply warn the user that this is not allowed.
+% Then we reinsert the page and its footnotes.
+% \begin{macrocode}
+ \PackageWarningNoLine{multicol}%
+ {Floats and marginpars not
+ allowed inside `multicols'
+ environment!}%
+ \unvbox\@cclv\reinsert@footnotes
+% \end{macrocode}
+% Additionally we empty the |\@currlist| to avoid later error
+% messages when the \LaTeX{} output routine is again in force.
+% But first we have to place the boxes back onto the
+% |\@freelist|. (|\@elt|s default is |\relax| so
+% this is possible with |\xdef|.)
+% \changes{v1.2a}{1990/02/05}{Float boxes freed.}
+% \begin{macrocode}
+ \xdef\@freelist{\@freelist\@currlist}%
+ \gdef\@currlist{}%
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% If the penalty is $-10001$ it will come from a |\clearpage| and
+% we will execute |\@doclearpage| to get rid of any deferred
+% floats.
+% \begin{macrocode}
+ \else \@doclearpage \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\process@deferreds}
+% |\process@deferreds| is a simplified version of \LaTeX{}'s
+% |\@startpage|. We first call the macro
+% |\@floatplacement| to save the current user parameters in
+% internal registers. Then we start a new group and save the
+% |\@deferlist| temporarily in the macro |\@tempb|.
+% \begin{macrocode}
+\def\process@deferreds{%
+ \@floatplacement
+ \@tryfcolumn\@deferlist
+ \if@fcolmade\else
+ \begingroup
+ \let\@tempb\@deferlist
+% \end{macrocode}
+% Our next action is to (globally) empty |\@deferlist| and
+% assign a new meaning to |\@elt|. Here |\@scolelt| is a
+% macro that looks at the boxes in a list to decide whether they
+% should be placed on the next page (i.e.\ on |\@toplist| or
+% |\@botlist|) or should wait for further processing.
+% \begin{macrocode}
+ \gdef\@deferlist{}%
+ \let\@elt\@scolelt
+% \end{macrocode}
+% Now we call |\@tempb| which has the form
+% \begin{center}
+% |\@elt|\meta{box register}|\@elt|^^A
+% \meta{box register}\ldots{}
+% \end{center}
+% So |\@elt| (i.e.\ |\@scolelt|) will distribute the
+% boxes to the three lists.
+% \begin{macrocode}
+ \@tempb \endgroup
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{ifshr@nking}
+% \begin{macro}{\raggedcolumns}
+% \begin{macro}{\flushcolumns}
+% \changes{v1.1a}{1989/09/20}{\cs{flushedcolumns} renamed to \cs{flushcolumns}.}
+% The |\raggedcolumns| and |\flushcolumns|
+% declarations are defined with the help of a new |\if...|
+% macro.
+% \begin{macrocode}
+\newif\ifshr@nking
+% \end{macrocode}
+% The actual definitions are simple: we just switch to \textsf{true}
+% or \textsf{false} depending on the desired action. To avoid extra
+% spaces in the output we enclose these changes in
+% |\@bsphack|\ldots{}\allowbreak|\@esphack|.
+% \begin{macrocode}
+\def\raggedcolumns{%
+ \@bsphack\shr@nkingtrue\@esphack}
+\def\flushcolumns{%
+ \@bsphack\shr@nkingfalse\@esphack}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\balance@columns@out}
+% Now for the last part of the show: the column balancing output
+% routine. Since this code is called with an explicit penalty
+% (|\eject|) there is no need to check for something special (eg
+% floats). We start by balancing the material gathered.
+% \begin{macrocode}
+\def\balance@columns@out{%
+% \end{macrocode}
+% For this we need to put the contents of box 255 into |\mult@box|.
+% \changes{v1.5u}{1999/05/25}{Support \cs{columnbreak}}
+% \changes{v1.5v}{1999/07/18}{Added debug statements for column break
+% support} For the next block of code see also comments in
+% section~\ref{sec:colbreak}. All forced breaks except the last are
+% inside |\colbreak@box| so all we have to do is to concatenate this
+% box with box |\@cclv| and put a penalty in between. Here we test if
+% |\colbreak@box| is void so that the message is only generated if
+% we really add forced breaks and the penalty.
+% \changes{v1.8k}{2015/03/21}{Use \cs{@Mv} and not \cs{break} in case
+% this forced break is not used on this page}
+% \begin{macrocode}
+ \setbox\mult@box\vbox{%
+ \ifvoid\colbreak@box\else
+ \unvbox\colbreak@box
+ \penalty-\@Mv
+ \mult@info\@ne{Re-adding
+ forced break(s) in balancing}%
+ \fi
+ \unvbox\@cclv
+% \end{macrocode}
+% The last column again is a forced break, so here we discard white
+% space as well as that is normally unwanted.
+% \changes{v1.8k}{2015/03/21}{Add \cs{remove@discardable@items} at the
+% end of the last column when balancing.}
+% \begin{macrocode}
+ \remove@discardable@items
+ }%
+ \balance@columns
+% \end{macrocode}
+% If during balancing the columns got too long the flag
+% |\iftoo@bad| is set to true.
+% \changes{v1.8a}{2011/12/20}{Balancing concept improved}
+% \begin{macrocode}
+ \iftoo@bad
+ \mult@info\@ne
+ {Balancing failed ...
+ cut a normal page}%
+% \end{macrocode}
+% In that case we put the material back in box 255 so that we can
+% cut a normal page. The curious set of
+% |\vskip|s we add is necessary to cancel out the |\splittopskip|
+% that got added for balancing.
+% \begin{macrocode}
+ \setbox\@cclv\vbox
+ {\vskip\topskip
+ \vskip-\splittopskip
+ \unvbox\mult@box
+% \end{macrocode}
+% We also have to re-add the end of environment penalty since after
+% this page we may want balance the remaining material.
+% \changes{v1.8r}{2018/01/28}{Re-add the final penalty}
+% \begin{macrocode}
+ \penalty-\@Mvi
+ }%
+% \end{macrocode}
+% We then call the standard multicol output routine which will
+% produce a normal page for us (remember we are still within the
+% OR so some part of the code in |\multi@column@out| is actually not
+% doing anything---perhaps this should be cleaned up at some point).
+% This also means that if there was an |\enlargethispage| present
+% it will apply to this page as |\multi@column@out| will look at
+% the status of |\@kludgeins|.
+% \begin{macrocode}
+ \multi@column@out
+% \end{macrocode}
+% Because balancing made the columns too long we are sure that there
+% will be some material remaining which was put back onto the main
+% vertical list by |\multi@column@out|. This will also put the
+% explicit |\eject| penalty back so the current
+% |\balance@columns@out| output routine will be called again (so we
+% better do not add another penalty or else the OR will be called
+% twice and we may get scrambled results).
+% \changes{v1.8k}{2015/03/21}{No additional penalty here}
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% If the balancing went ok, we are in the position
+% to apply |\page@sofar|. But first we have to set |\vsize| to a
+% value suitable for one column output.
+% \begin{macrocode}
+ \global\vsize\@colroom
+ \global\advance\vsize\ht\partial@page
+% \end{macrocode}
+% We also have to look at |\@kludgeins| and generate a new
+% |\insert| in case there was one present due to an
+% |\enlargethispage| command.
+% \changes{v1.8a}{2011/12/20}{Support for \cs{enlargethispage}}
+% \begin{macrocode}
+ \ifvbox\@kludgeins\insert\@kludgeins
+ {\unvbox\@kludgeins}\fi
+% \end{macrocode}
+% Then we |\unvbox| the |\partial@page| (which may be void if we
+% are not processing the first page of this \mc{} environment.
+% \begin{macrocode}
+ \unvbox\partial@page
+% \end{macrocode}
+% Then we return the first and bottom mark and the gathered
+% material to the main vertical list.
+% \begin{macrocode}
+ \return@nonemptymark{first}\kept@firstmark
+ \return@nonemptymark{bot}\kept@botmark
+ \page@sofar
+% \end{macrocode}
+% We need to add a penalty at this point which allows to break at
+% this point since calling the output routine may have removed the
+% only permissible break point thereby ``glueing'' any following
+% skip to the balanced box. In case there are any weird settings
+% for |\multicolsep| etc. this could produce funny results.
+% \changes{v1.5c}{1993/04/18}{added penalty at output routine exit}
+% \begin{macrocode}
+ \penalty\z@
+ \fi
+}
+% \end{macrocode}
+% As we already know, reinserting of footnotes will be done in the
+% macro |\endmulticols|.
+% \end{macro}
+%
+%
+% \begin{macro}{\balance@columns}
+% This macro now does the actual balancing.
+% \begin{macrocode}
+\def\balance@columns{%
+% \end{macrocode}
+% We start by setting the kept marks by updating them with any
+% marks from this box. This has to be done \emph{before} we add a
+% penalty of $-10000$ to the top of the box, otherwise only an
+% empty box will be considered.
+% \changes{v1.5h}{1994/08/26}{Get kept marks first}
+% \begin{macrocode}
+ \get@keptmarks\mult@box
+% \end{macrocode}
+% We then continue by resetting trying to remove any discardable
+% stuff at the end of |\mult@box|. This is rather experimental. We
+% also add a forced break point at the very beginning, so that we
+% can split the box to height zero later on, thereby adding a known
+% |\splittopskip| glue at the beginning.
+% \changes{v1.8k}{2015/03/21}{\cs{remove@discardable@items} removed}
+% \begin{macrocode}
+ \setbox\mult@box\vbox{%
+ \penalty-\@M
+ \unvbox\mult@box
+ }%
+% \end{macrocode}
+% Then follow values assignments to get the |\vsplit|ting right.
+% We use the natural part of |\topskip| as the natural part for
+% |\splittopskip| and allow for a bit of undershoot and overshoot
+% by adding some stretch and shrink.
+% \changes{v1.5?}{1994/?/?}{Allow columns to come out a bit long or short}
+% \begin{macrocode}
+ \@tempdima\topskip
+ \splittopskip\@tempdima
+ \@plus\multicolundershoot
+ \@minus\multicolovershoot
+ \splitmaxdepth\maxdepth
+% \end{macrocode}
+% We also have to set |\boxmaxdepth| which normally allows to
+% build boxes with arbitrary depth, but as we are building text
+% columns we really want to restrict the depth. This is necessary as
+% we sometimes rebox the boxes generated by |\vsplit| and then the
+% restriction posed by |\splitmaxdepth| gets lost.
+% \changes{v1.8h}{2014/09/12}{All column boxes should obey
+% \cs{maxdepth} (pr/4395)}
+% \begin{macrocode}
+ \boxmaxdepth\maxdepth
+% \end{macrocode}
+% The next step is a bit tricky: when \TeX{} assembles material in
+% a box, the first line isn't preceded by interline glue, i.e.
+% there is no parameter like |\boxtopskip| in \TeX{}. This means
+% that the baseline of the first line in our box is at some
+% unpredictable point depending on the height of the largest
+% character in this line. But of course we want all columns to
+% align properly at the baselines of their first lines. For this
+% reason we have opened |\mult@box| with a |\penalty| \textsf{-10000}.
+% This will now allow us to split off from |\mult@box| a tiny bit
+% (in fact nothing since the first possible break-point is the
+% first item in the box). The result is that |\splittopskip| is
+% inserted at the top of |\mult@box| which is exactly what we like
+% to achieve.
+% \changes{v1.5?}{1994/?/?}{Do splitting to zero here}
+% \begin{macrocode}
+ \setbox\@tempboxa\vsplit\mult@box to\z@
+% \end{macrocode}
+% Next we try to find a suitable starting point for the calculation
+% of the column height. It should be less than the height finally
+% chosen, but large enough to reach this final value in only a few
+% iterations. The formula which is now implemented will try to
+% start with the nearest value which is a multiple of
+% |\baselineskip|. The coding is slightly tricky in \TeX{} and
+% there are perhaps better ways \ldots
+% \changes{v1.4d}{1992/03/04}{New algorithm for start height}
+% \begin{macrocode}
+ \@tempdima\ht\mult@box
+ \advance\@tempdima\dp\mult@box
+ \divide\@tempdima\col@number
+% \end{macrocode}
+% The code above sets |\@tempdima| to the length of a column if we
+% simply divide the whole box into equal pieces. To get to the next
+% lower multiple of |\baselineskip| we convert this dimen to a
+% number (the number of scaled points) then divide this by
+% |\baselineskip| (also in scaled points) and then multiply this
+% result with |\baselineskip| assigning the result to |\dimen@|.
+% This makes |\dimen@| $\leq$ to |\@tempdimena|.
+% \begin{macrocode}
+ \count@\@tempdima
+ \divide\count@\baselineskip
+ \dimen@\count@\baselineskip
+% \end{macrocode}
+% Next step is to correct our result by taking into account the
+% difference between |\topskip| and |\baselineskip|. We start by
+% adding |\topskip|; if this makes the result too large then we
+% have to subtract one |\baselineskip|.
+% \begin{macrocode}
+ \advance\dimen@\topskip
+ \ifdim \dimen@ >\@tempdima
+ \advance\dimen@-\baselineskip
+ \fi
+% \end{macrocode}
+% As a further restriction we want to see a minimum number of
+% rows in the balanced result based on the setting of the counter
+% |minrows|. If the starting value is lower we adjust.
+% \changes{v1.8w}{2019/03/01}{Provide minrows counter for balancing}
+% \begin{macrocode}
+ \@tempdima\dimexpr
+ \topskip +\c@minrows\baselineskip-\baselineskip\relax
+ \ifnum\dimen@<\@tempdima
+ \mult@info\@ne
+ {Start value
+ \the\dimen@ \space ->
+ \the\@tempdima \space (corrected for minrows)}%
+ \dimen@\@tempdima
+ \fi
+% \end{macrocode}
+% At the user's request we start with a higher value (or lower, but
+% this usually only increases the number of tries).
+% \begin{macrocode}
+ \advance\dimen@\c@unbalance\baselineskip
+% \end{macrocode}
+% We type out statistics if we were asked to do so.
+% \changes{v1.4f}{1992/04/28}{\cs{on@line} added to tracing info}
+% \begin{macrocode}
+ \mult@info\@ne
+ {Balance columns\on@line:
+ \ifnum\c@unbalance=\z@\else
+ (off balance=\number\c@unbalance)\fi
+ \@gobbletwo}%
+% \end{macrocode}
+% But we don't allow nonsense values for a start.
+% \begin{macrocode}
+ \ifnum\dimen@<\topskip
+ \mult@info\@ne
+ {Start value
+ \the\dimen@ \space ->
+ \the\topskip \space (corrected)}%
+ \dimen@\topskip
+ \fi
+% \end{macrocode}
+% Now we try to find the final column height. We start by setting
+% |\vbadness| to infinity (i.e.\ $10000$) to suppress
+% underfull box reports while we are trying to find an acceptable
+% solution. We do not need to do it in a group since at the end of
+% the output routine everything will be restored. The setting of
+% the final columns will nearly always produce underfull boxes with
+% badness $10000$ so there is no point in warning the user about
+% it.
+% \changes{v1.2a}{1990/02/05}{Group around main loop removed.}
+% \begin{macrocode}
+ \vbadness\@M
+% \end{macrocode}
+% We also allow for overfull boxes while we trying to split the
+% columns. They can easily happen if we have objects with unusual depth.
+% \changes{v1.8h}{2014/09/12}{Do not report overfull}
+% \begin{macrocode}
+ \vfuzz \maxdimen
+% \end{macrocode}
+% The variable |\last@try| will hold the dimension used in the
+% previous trial splitting. We initialize it with a negative value.
+% \changes{v1.5?}{1994/?/?}{Initialize \cs{last@try}}
+% \begin{macrocode}
+ \last@try-\p@
+ \loop
+% \end{macrocode}
+% In order not to clutter up \TeX{}'s valuable main memory with
+% things that are no longer needed, we empty all globally used box
+% registers. This is necessary if we return to this point after an
+% unsuccessful trial. We use |\process@cols| for this purpose,
+% starting with |\mult@grightbox|. Note the extra braces around
+% this macro call. They are needed since \PlainTeX{}'s
+% |\loop|\ldots{}\allowbreak|\repeat| mechanism cannot be nested on
+% the same level of grouping.
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \begin{macrocode}
+ {\process@cols\mult@grightbox
+ {\global\setbox\count@
+ \box\voidb@x}}%
+% \end{macrocode}
+% The contents of box |\mult@box| are now copied globally to
+% box~|\mult@grightbox|. (This will be the right-most column, as
+% we shall see later.)
+% \begin{macrocode}
+ \global\setbox\mult@grightbox
+ \copy\mult@box
+% \end{macrocode}
+% We start with the assumption that the trial will be successful.
+% If we end up with a solution that is too bad we set
+% |too@bad| to \texttt{true}. We also assume that all forced breaks
+% (if any) will be used during balancing. If this is not the case
+% we record this in |forcedbreak@leftover|.
+% \changes{v1.5b}{1992/11/05}{New badness mechanism}
+% \changes{v1.8k}{2015/03/21}{Init \cs{ifforcedbreak@leftover}}
+% \begin{macrocode}
+%<*badness>
+ \too@badfalse
+ \forcedbreak@leftoverfalse
+%</badness>
+% \end{macrocode}
+% Using |\vsplit| we extract the other columns from box register
+% |\mult@grightbox|. This leaves box register |\mult@box|
+% untouched so that we can start over again if this trial was
+% unsuccessful.
+% \begin{macrocode}
+ {\process@cols\mult@firstbox{%
+ \global\setbox\count@
+ \vsplit\mult@grightbox to\dimen@
+% \end{macrocode}
+% After splitting we need to ensure that there isn't any space at
+% the bottom, so we rebox once more.
+% \changes{v1.8b}{2013/08/28}{Remove discardable items at the
+% end of split boxes}
+% \changes{v1.8k}{2015/03/21}{Do not use \cs{remove@discardable@items}
+% here}
+% \begin{macrocode}
+ \global\setbox\count@
+ \vbox to\dimen@
+ {\unvbox\count@}%
+% \end{macrocode}
+% After every split we check the badness of the resulting column,
+% normally the amount of extra white in the column.
+% \begin{macrocode}
+%<*badness>
+ \ifnum\c@tracingmulticols>\@ne
+ \@tempcnta\count@
+ \advance\@tempcnta-\mult@grightbox
+ \divide\@tempcnta \tw@
+ \message{^^JColumn
+ \number\@tempcnta\space
+ badness: \the\badness\space}%
+ \fi
+% \end{macrocode}
+% If this badness is larger than the allowed column badness
+% we reject this solution by setting |too@bad| to \texttt{true}.
+% \begin{macrocode}
+ \ifnum\badness>\c@columnbadness
+ \ifnum\c@tracingmulticols>\@ne
+ \message{too bad
+ (>\the\c@columnbadness)}%
+ \fi
+ \too@badtrue
+ \fi
+%</badness>
+ }}%
+% \end{macrocode}
+% There is one subtle point here: while all other constructed boxes
+% have a depth that is determined by |\splitmaxdepth| and/or
+% |\boxmaxdepth| the last box
+% will get a natural depth disregarding the original setting and
+% the value of |\splitmaxdepth| or |\boxmaxdepth|. This means that
+% we may end up with a very large depth in box |\mult@grightbox|
+% which would
+% make the result of the testing incorrect. So we change the value
+% by unboxing the box into itself.
+% \begin{macrocode}
+ \global\setbox\mult@grightbox
+ \vbox{\unvbox\mult@grightbox}%
+% \end{macrocode}
+% We also save a copy |\mult@firstbox| at its ``natural'' size
+% for later use.
+% \begin{macrocode}
+ \setbox\mult@nat@firstbox
+ \vbox{\unvcopy\mult@firstbox}%
+% \end{macrocode}
+% After |\process@cols| has done its job we have the following
+% situation:
+% \begin{center}
+% \begin{tabular}{r@{$\:\:\longleftarrow\:\:$}l}
+% box |\mult@rightbox| & all material \\
+% box |\mult@gfirstbox| & first column \\
+% box |\mult@gfirstbox|${}+2$ & second column \\
+% \multicolumn{1}{c}{$\vdots$} &
+% \multicolumn{1}{c}{$\vdots$} \\
+% box |\mult@grightbox| & last column
+% \end{tabular}
+% \end{center}
+% We report the height of the first column, in brackets
+% the natural size is given.
+% \changes{v1.5?}{1994/?/?}{Show natural size}
+% \begin{macrocode}
+ \ifnum\c@tracingmulticols>\@ne
+ \message{^^JFirst column
+ = \the\dimen@\space
+ (\the\ht\mult@nat@firstbox)}\fi
+% \end{macrocode}
+% If |\raggedcolumns| is in force older releases of this file also
+% shrank the first column to its natural height at this point.
+% This was done so that the first column doesn't run short compared
+% to later columns but it is actually producing incorrect results
+% (overprinting of text) in boundary cases, so since version v1.5q
+% |\raggedcolumns| means allows for all columns to run slightly short.
+% \changes{v1.5q}{1998/01/19}{Do not reset \cs{mult@firstbox} (pr2739)}
+% \begin{macrocode}
+% \ifshr@nking
+% \global\setbox\mult@firstbox
+% \copy\mult@nat@firstbox
+% \fi
+% \end{macrocode}
+% Then we give information about the last column.\footnote{With
+% \TeX{} version 3.141 it is now possible to use \LaTeX's
+% \cs{newlinechar} in the \cs{message} command, but
+% people with older \TeX{} versions will now get
+% \texttt{\string^\string^J} instead of a new line on the screen.}
+% \changes{v1.4a}{1992/02/12}{Changed to proper \cs{endlinechar} in\cs{message}}
+% \begin{macrocode}
+ \ifnum\c@tracingmulticols>\@ne
+ \message{<> last column =
+ \the\ht\mult@grightbox^^J}%
+% \end{macrocode}
+% Some tracing code that we don't compile into the production version
+% unless asked for. It will produce huge listings of the boxes
+% involved in balancing in the transcript file.
+% \changes{v1.6f}{2004/07/03}{need to use \cs{mult@grightbox} in the loop}
+% \begin{macrocode}
+%<*debug>
+ \ifnum\c@tracingmulticols>4
+ {\showoutput
+ \batchmode
+ \process@cols\mult@grightbox
+ {\showbox\count@}}%
+ \errorstopmode
+ \fi
+%</debug>
+ \fi
+% \end{macrocode}
+% We check whether our trial was successful. The test used is very
+% simple: we merely compare the first and the last column. Thus
+% the intermediate columns may be longer than the first if
+% |\raggedcolumns| is used. If the right-most column is
+% longer than the first then we start over with a larger value for
+% |\dimen@|.
+% \changes{v1.3c}{1991/03/03}{\cs{global}\cs{advance} left over from older code}
+% \begin{macrocode}
+ \ifdim\ht\mult@grightbox >\dimen@
+% \end{macrocode}
+% If the height of the last box is too large we mark this trial as
+% unsuccessful.
+% \changes{v1.5v}{1999/07/18}{Added tracing statements for
+% trial unsuccessful}
+% \begin{macrocode}
+%<*badness>
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: last
+ column too large!}%
+ \fi
+ \else
+% \end{macrocode}
+% \changes{v1.5v}{1999/07/18}{Check last column if it contains forced
+% break and reject trial if that is the case}
+%
+% To ensure that there isn't a forced break in the last column we
+% try to split off a box of size |\maxdimen| from |\mult@grightbox|
+% (or rather from a copy of it). This should result in a void box
+% after the split, unless there was a forced break somewhere within
+% the column in which case the material after the break would have
+% stayed in the box.
+% \begin{macrocode}
+ \setbox\@tempboxa
+ \copy\mult@grightbox
+ \setbox\z@\vsplit\@tempboxa to\maxdimen
+ \ifvoid\@tempboxa
+% \end{macrocode}
+% Thus if |\@tempboxa| is void we have a valid solution.
+% In this case we take a closer
+% look at the last column to decide if this column should be made
+% as long as all other columns or if it should be allowed to be
+% shorter.
+% For this we first have to rebox the column into a box of the
+% appropriate height. If tracing is enabled we then display the
+% badness for this box.
+% \begin{macrocode}
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{Final badness:
+ \the\badness}%
+ \fi
+% \end{macrocode}
+% We then compare this badness with the allowed badness for the final
+% column. If it does not exceed this value we use the box, otherwise
+% we rebox it once more and add some glue at the bottom.
+% \changes{v1.8h}{2014/09/12}{Use \cs{vfilmaxdepth}}
+% \changes{v1.8j}{2015/03/07}{Use \cs{vfil} in this case}
+% \begin{macrocode}
+ \ifnum\badness>\c@finalcolumnbadness
+ \global\setbox\mult@grightbox
+ \vbox to\dimen@
+ {\unvbox\mult@grightbox\vfil}%
+ \ifnum\c@tracingmulticols>\@ne
+ \message{ setting natural
+ (> \the\c@finalcolumnbadness)}%
+ \fi
+ \fi
+% \end{macrocode}
+% If |\@tempboxa| above was not void our trial was unsuccessful and
+% we report this fact and try again.
+% \changes{v1.6f}{2004/07/03}{\texttt{/colbreak} guard in the wrong position}
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% If we have unprocessed forced breaks we normally reiterate with a
+% larger column size to fit them in eventually. However, if there
+% are simply too many of them (e.g., 3 forced breaks but only 2
+% columns to balance) then this will never succeed and and we would
+% continue growing the columns until we hit the largest possible
+% column size. So in addition we check how big the column size is
+% compared to available room and if we exceed this by
+% |\maxbalancingoverflow| we give up and instead of balancing cut
+% another normal page. To be indicate this case we set
+% |forcedbreak@leftover| to true.
+% \changes{v1.8k}{2015/03/21}{Watch out for columns growing too far in
+% case of forced breaks}
+% \changes{v1.8l}{2015/03/25}{Added additional tracing if column overflows}
+% \begin{macrocode}
+ \@tempdima\@colroom
+ \advance\@tempdima \maxbalancingoverflow
+ \ifdim \dimen@ < \@tempdima
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Rejected: unprocessed
+ forced break(s) in last column!}%
+ \fi
+ \else
+ \forcedbreak@leftovertrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Failed: columns too large
+ with unprocessed forced break(s)!}%
+ \fi
+ \fi
+ \fi
+ \fi
+% \end{macrocode}
+% If the natural height of the first box is smaller than the
+% current trial size but is larger than the previous trial size it
+% is likely that we have missed a potentially better
+% solution. (This could have happened if for some reason our first
+% trial size was too high.) In that case we dismiss this trial and
+% restart using the natural height for the next trial.
+% \begin{macrocode}
+ \ifdim\ht\mult@nat@firstbox<\dimen@
+ \ifdim\ht\mult@nat@firstbox>\last@try
+ \too@badtrue
+ \ifnum\c@tracingmulticols>\@ne
+ \typeout{Retry: using natural
+ height of first column!}%
+ \fi
+ \dimen@\ht\mult@nat@firstbox
+ \last@try\dimen@
+ \advance\dimen@-\p@
+ \fi
+ \fi
+% \end{macrocode}
+% Finally the switch |too@bad| is tested. If it was made true
+% either earlier on or due to a rightmost column being too large
+% we try again with a slightly larger value for |\dimen@|.
+% \begin{macrocode}
+ \iftoo@bad
+%</badness>
+ \advance\dimen@\p@
+ \repeat
+% \end{macrocode}
+% If we come out of the loop with the switch |forcedbreak@leftover|
+% set to true then balancing has failed and we should cut a normal
+% page. We indicate this below with |\too@badtrue| when any of the
+% columns get too high, so we set this flag here too in order to
+% get the same processing logic.\footnote{Should get cleaned up as
+% we now have two different routes to reach this part of the
+% processing.}
+% \changes{v1.8k}{2015/03/21}{}
+% \begin{macrocode}
+ \ifforcedbreak@leftover
+ \too@badtrue
+ \else
+% \end{macrocode}
+% At that point |\dimen@| holds the height that was determined by
+% the balancing loop.
+% If that height for the columns turns out to be larger
+% than the available space (which is |\@colroom|) we squeeze the
+% columns into the space assuming that they will have enough
+% shrinkability to allow this.\footnote{This might be wrong, since
+% the shrinkability that accounts for the amount of material might
+% be present only in some columns. But it is better to try then to
+% give up directly.}
+% However, this squeezing should only be done if we are balancing
+% columns on the main galley and \emph{not} if we are building a
+% boxed multicol (in the latter case the current |\@colroom| is
+% irrelevant since the produced box might be moved anywhere at a
+% later stage).
+% \changes{v1.3c}{1991/03/03}{Limit column height to \cs{@colroom}}
+% \changes{v1.5q}{1998/01/19}{Removed setting \cs{dimen@} (pr2739)}
+% \changes{v1.5y}{2000/06/10}{Limit column height only in unrestricted
+% mode (pr/3212)}
+% \begin{macrocode}
+ \if@boxedmulticols\else
+ \ifdim\dimen@>\@colroom
+ \dimen@\@colroom
+ \fi
+ \fi
+% \end{macrocode}
+% Then we move the contents of the odd-numbered box registers to
+% the even-numbered ones, shrinking them if requested.
+% We have to use |\vbox| not |\vtop| (as it was done in
+% the first versions) since otherwise the resulting boxes will have
+% no height (\TB\/ page 81). This would mean that extra
+% |\topskip| is added when the boxes are returned to the
+% page-builder via |\page@sofar|.
+% \changes{v1.3a}{1990/05/20}{Changed \cs{vtop} to \cs{vbox}.}
+% \begin{macrocode}
+ \process@cols\mult@rightbox
+ {\@tempcnta\count@
+ \advance\@tempcnta\@ne
+% \end{macrocode}
+% when putting the final column together we want overfull
+% information:
+% \begin{macrocode}
+ \vfuzz\z@
+ \setbox\count@\vbox to\dimen@
+ {%
+% \end{macrocode}
+%
+% \changes{v1.8h}{2014/09/12}{Use \cs{vfilmaxdepth}}
+% \begin{macrocode}
+ \vskip \z@
+ \@plus-\multicolundershoot
+ \@minus-\multicolovershoot
+ \unvbox\@tempcnta
+ \ifshr@nking\vfilmaxdepth\fi
+ }%
+% \end{macrocode}
+% If the resulting box is overfull there was too much material to
+% fit into the available space. The question though is how much? If
+% it wasn't more than |\maxbalancingoverflow| we accept it still to
+% avoid getting very little material for the next page (which we
+% would then have difficulties to balance).
+% \changes{v1.8a}{2011/12/20}{Balancing concept improved}
+% \begin{macrocode}
+ \ifnum\badness>\@M
+ \vfuzz\maxdimen % no overfull warning
+ \setbox\@tempboxa \vbox to\dimen@
+ {\vskip-\maxbalancingoverflow
+ \unvcopy\count@}%
+ \ifnum\badness>\@M
+ \mult@info\@ne
+ {Balanced column more than
+ \the\maxbalancingoverflow\space
+ too large}%
+% \end{macrocode}
+% Fail the balancing attempt:
+% \begin{macrocode}
+ \too@badtrue
+ \else
+% \end{macrocode}
+% Otherwise report that there is a problem but within the accepted
+% boundary.
+% \begin{macrocode}
+ \mult@info\@ne
+ {Balanced column
+ too large, but less than
+ \the\maxbalancingoverflow}%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% Finally end the |\ifforcedbreak@leftover| conditional.
+% \changes{v1.8k}{2015/03/21}{Finish the new conditional}
+% \begin{macrocode}
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\maxbalancingoverflow}
+% Amount that balancing is allowed to overflow the available column
+% space. We default to 12pt which means about one line in most
+% layouts.
+% \changes{v1.8a}{2011/12/20}{\cs{maxbalancingoverflow} parameter added}
+% \begin{macrocode}
+\newdimen\maxbalancingoverflow
+\maxbalancingoverflow=12pt
+% \end{macrocode}
+% \end{macro}
+
+% \end{multicols}
+%
+% \begin{multicols}{2}[\subsection{The box allocations}]
+%
+% \begin{macro}{\mult@rightbox}
+% \begin{macro}{\mult@grightbox}
+% \begin{macro}{\mult@firstbox}
+% \begin{macro}{\mult@gfirstbox}
+% Early releases of these macros used the first box registers
+% 0, 2, 4,\ldots\ for global boxes and 1, 3, 5,\ldots\ for the
+% corresponding local boxes. (You might still find some traces
+% of this setup in the documentation, sigh.) This produced a problem
+% at the moment we had more than 5 columns because then officially
+% allocated boxes were overwritten by the algorithm.
+% The new release now uses private box registers
+% \begin{macrocode}
+\newbox\mult@rightbox
+\newbox\mult@grightbox
+\newbox\mult@gfirstbox
+\newbox\mult@firstbox
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa\newbox\@tempa
+\newbox\@tempa
+\let\@tempa\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \end{multicols}
+%
+%
+% \begin{multicols}{2}[\section{New macros and hacks for version 1.2}]
+%
+% \begin{macro}{\emergencystretch}
+% \begin{macro}{\setemergencystretch}
+% If we don't use \TeX{} 3.0 |\emergencystretch| is undefined
+% so in this case we simply add it as an unused \meta{dimen}
+% register.
+% \changes{v1.4j}{1992/06/25}{Setting of \cs{emergencystretch} on top
+% removed.}
+% \begin{macrocode}
+\@ifundefined{emergencystretch}
+ {\newdimen\emergencystretch}{}
+% \end{macrocode}
+% \changes{v1.2a}{1990/02/05}{Macro added.}
+% My tests showed that the following formula worked pretty well.
+% Nevertheless the |\setemergencystretch| macro also gets
+% |\hsize| as second argument to enable the user to try
+% different formulae.
+% \begin{macrocode}
+\def\setemergencystretch#1#2{%
+ \emergencystretch 4pt
+ \multiply\emergencystretch#1}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+
+
+% \begin{macro}{\set@floatcmds}
+% \changes{v1.2a}{1990/02/05}{Macro added.}
+% \changes{v1.5g}{1994/06/07}{Updated since floats have changed}
+% \changes{v1.5j}{1994/06/07}{Updated since floats have changed again}
+% \changes{v1.5l}{1995/10/19}{Added \cs{@largefloatcheck}}
+% \changes{v1.6g}{2006/02/23}{Added \cs{@minipagefalse}}
+% \changes{v1.6h}{2008/12/05}{Use \cs{@endfloatbox} to better support
+% the modifications done by the float package}
+% Even if this should be used as a hook we use a |@| in the
+% name since it is more for experts.
+% \begin{macrocode}
+\def\set@floatcmds{%
+ \let\@dblfloat\@dbflt
+ \def\end@dblfloat{\@endfloatbox
+ \@largefloatcheck
+ \outer@nobreak
+% \end{macrocode}
+% This is cheap (deferring the floats until after the current page)
+% but any other solution would go deep into \LaTeX's output
+% routine and I don't like to work on it until I know which parts
+% of the output routine have to be reimplemented anyway for
+% \LaTeX3.
+% \begin{macrocode}
+ \ifnum\@floatpenalty<\z@
+% \end{macrocode}
+% We have to add the float to the |\@deferlist| because we assume
+% that outside the \mc{} environment we are in one column mode.
+% This is not entirely correct, I already used the \mc{}
+% environment inside of \LaTeX{}s |\twocolumn| declaration but it
+% will do for most applications.
+% \begin{macrocode}
+ \@cons\@deferlist\@currbox
+ \fi
+ \ifnum\@floatpenalty=-\@Mii
+ \@Esphack
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \end{multicols}
+%
+% \begin{multicols}{2}[\subsection{Maintaining the mark registers}]
+% \label{sec:v14}
+%
+% This section contains the routines that set the marks so that they
+% will be handled correctly. They have been introduced with version~1.4.
+%
+% \begin{macro}{\kept@topmark}
+% \changes{v1.4h}{1992/06/04}{Init to double brace pair}
+% \begin{macro}{\kept@firstmark}
+% \begin{macro}{\kept@botmark}
+% First thing we do is to reserve three macro names to hold the
+% replacement text for \TeX's primitives |\firstmark|, |\botmark| and
+% |\topmark|. We initialize the first two to be empty and
+% |\kept@topmark| to contain two empty pair of braces. This is
+% necessary since |\kept@topmark| is supposed to contain the last
+% mark from a preceding page and in \LaTeX{} any ``real'' mark must
+% contain two parts representing left and right mark information.
+% \begin{macrocode}
+\def\kept@topmark{{}{}}
+\let\kept@firstmark\@empty
+\let\kept@botmark\@empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\return@nonemptymark}
+% Sometimes we want to return the value of a ``kept'' mark into a
+% |\mark| node on the main vertical list. This is done by the
+% function |\return@nonemptymark|. As the name suggests it only acts
+% if the replacement text of the kept mark is non-empty. This is done
+% to avoid adding an empty mark when no mark was actually present. If
+% we would nevertheless add such a mark it would be regarded as a
+% valid |\firstmark| later on.
+% \begin{macrocode}
+\def\return@nonemptymark#1#2{%
+ \ifx#2\@empty
+ \else
+% \end{macrocode}
+% For debugging purposes we take a look at the value of the kept mark
+% that we are about to return. This code will get stripped out for
+% production.
+% \begin{macrocode}
+%<*marktrace>
+ \mult@info\tw@
+ {Returned #1 mark:\MessageBreak
+ \meaning#2}%
+% \nobreak
+% \fi
+%</marktrace>
+% \end{macrocode}
+% Since the contents of the mark may be arbitrary \LaTeX{} code we
+% better make sure that it doesn't get expanded any further. (Some
+% expansion have been done already during the execution of
+% |\markright| or |\markboth|.) We therefore use the usual mechanism
+% of a toks register to prohibit expansion.\footnote{Due to the
+% current definition of \cs{markright} etc.\ it wouldn't
+% help to define the \cs{protect} command to prohibit
+% expansion as any \cs{protect} has already vanished due to
+% earlier expansions.}
+% \changes{v1.4n}{1992/09/10}{Make marks robust}
+% \changes{v1.5t}{1999/03/22}{re-add \cs{mark} command which was commented out
+% by mistake at some point in 1998 (pr/2978)}
+% \begin{macrocode}
+ \toks@\expandafter{#2}%
+ \mark{\the\toks@}%
+% \end{macrocode}
+% We don't want any breakpoint between such a returned mark and the
+% following material (which is usually just the box where the mark
+% came from).
+% \begin{macrocode}
+ \nobreak
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\get@keptmarks}
+% If we have some material in a box register we may want to get the
+% first and the last mark out of this box. This can be done with
+% |\get@keptmarks| which takes one argument: the box register number
+% or its nick name defined by |\newbox|.
+% \begin{macrocode}
+\def\get@keptmarks#1{%
+% \end{macrocode}
+% For debugging purposes we take a look at the current dimensions
+% of the box since in earlier versions of the code I made some
+% mistakes in this area.
+% \begin{macrocode}
+%<*debug>
+ \typeout{Mark box #1 before:
+ ht \the\ht#1, dp \the\dp#1}%
+%</debug>
+% \end{macrocode}
+% Now we open a new group and locally copy the box to itself. As a
+% result any operation, i.e.\ |\vsplit|, will only have a local
+% effect. Without this trick the box content would get lost up to
+% the level where the last assignment to the box register was done.
+% \begin{macrocode}
+ \begingroup
+ \vbadness\@M
+ \setbox#1\copy#1%
+% \end{macrocode}
+% Now we split the box to the maximal possible dimension. This
+% should split off the full contents of the box so that effectively
+% everything is split off. As a result |\splitfirstmark| and
+% |\splitbotmark| will contain the first and last mark in the box
+% respectively.
+% \begin{macrocode}
+ \setbox#1\vsplit#1to\maxdimen
+% \end{macrocode}
+% Therefore we can now set the kept marks which is a global
+% operation and afterwards close the group. This will restore the
+% original box contents.
+% \begin{macrocode}
+ \set@keptmarks
+ \endgroup
+% \end{macrocode}
+% For debugging we take again a look at the box dimension which
+% shouldn't have changed.
+% \begin{macrocode}
+%<*debug>
+ \typeout{Mark box #1 \space after:
+ ht \the\ht#1, dp \the\dp#1}%
+%</debug>
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\set@keptmarks}
+% The macro |\set@keptmarks| is responsible for setting
+% |\kept@firstmark| and |\kept@botmark|, by checking the current
+% values for |\splitfirstmark| and |\splitbotmark|.
+% \begin{macrocode}
+\def\set@keptmarks{%
+% \end{macrocode}
+% If |\kept@firstmark| is empty we assume that it isn't set. This
+% is strictly speaking not correct as we loose the ability to have
+% marks that are explicitly empty, but for standard \LaTeX{}
+% application it is sufficient. If it is non-empty we don't change
+% the value---within the output routines it will then be restored
+% to |\@empty|.
+% \begin{macrocode}
+ \ifx\kept@firstmark\@empty
+% \end{macrocode}
+% We now put the contents of |\splitfirstmark| into
+% |\kept@firstmark|. In the case that there wasn't any mark at all
+% |\kept@firstmark| will not change by that operation.
+% \begin{macrocode}
+ \expandafter\gdef\expandafter
+ \kept@firstmark
+ \expandafter{\splitfirstmark}%
+% \end{macrocode}
+% When debugging we show the assignment but only when something
+% actually happened.
+% \begin{macrocode}
+%<*marktrace>
+ \ifx\kept@firstmark\@empty\else
+ \mult@info\tw@
+ {Set kept first mark:\MessageBreak
+ \meaning\kept@firstmark%
+ \@gobbletwo}%
+ \fi
+%</marktrace>
+ \fi
+% \end{macrocode}
+% We always try to set the bottom mark to the |\splitbotmark| but
+% of course only when there has been a |\splitbotmark| at all.
+% Again, we assume that an empty |\splitbotmark| means that the
+% split off box part didn't contain any marks at all.
+% \begin{macrocode}
+ \expandafter\def\expandafter\@tempa
+ \expandafter{\splitbotmark}%
+ \ifx\@tempa\@empty\else
+ \global\let\kept@botmark\@tempa
+%<*marktrace>
+ \mult@info\tw@
+ {Set kept bot mark:\MessageBreak
+ \meaning\kept@botmark%
+ \@gobbletwo}%
+%</marktrace>
+ \fi}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\prep@keptmarks}
+% The |\prep@keptmarks| function is used to initialize the kept
+% marks from the contents of |\partial@page|, i.e.\ the box that
+% holds everything from the top of the current page prior to
+% starting the \mc{} environment. However, such a box is only
+% available if we are not producing a boxed \mc{}.
+% \begin{macrocode}
+\def\prep@keptmarks{%
+ \if@boxedmulticols \else
+ \get@keptmarks\partial@page
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\remove@discardable@items}
+% There are situations when we may have some space at the end of a
+% column and this macro here will attempt to get rid of it. The
+% typical \LaTeX{} sequence is a series of self-canceling glues so
+% if we remove them recursively we are usually fine.
+%
+% Special care is needed with handling |\vspace*| as that
+% corresponds to |\penalty10000|, |\vskip <skip>|, followed by
+% |\vskip 0pt|. If we see this sequence going backwards in the the
+% vertical list we assume that this is a ``desired'' space. We
+% therefore stop the recursion and reinsert the spaces.
+%
+% As the multicol code sometimes add an explicit penalty at the end
+% of a column we first attempt to remove it in case it is there.
+% \changes{v1.8m}{2015/03/31}{Another rewrite of
+% \cs{remove@discardable@items} hopefully okay now}
+% \begin{macrocode}
+\skip0=0pt
+\edef\the@zero@skip{\the\skip0}
+\def\remove@discardable@items{%
+ \unpenalty
+% \end{macrocode}
+% Save a previous skip (if there) and then remove it, we can't
+% really tell the difference between no skip an a skip of zero but
+% that's life.
+% \begin{macrocode}
+ \edef\@tempa{\the\lastskip}%
+%\typeout{s1=\@tempa}%
+ \unskip
+% \end{macrocode}
+% If it was a zero skip (or none) we save the next previous skip
+% (if any).
+% \begin{macrocode}
+ \ifx\@tempa\the@zero@skip
+ \edef\@tempb{\the\lastskip}%
+%\typeout{s2=\@tempb}%
+% \end{macrocode}
+% If this one again was zero (or more likely not there in the first
+% place) we stop.
+% \begin{macrocode}
+ \ifx\@tempb\the@zero@skip
+ \else
+% \end{macrocode}
+% Otherwise we remove this ``real'' skip. Then we look if it was
+% preceded by a penalty of 10000 (i.e., a |\nobreak|)
+% \begin{macrocode}
+ \unskip
+%\typeout{p=\lastpenalty}%
+ \ifnum \lastpenalty=\@M
+% \end{macrocode}
+% If so this was a |\vspace*| or something equivalent to
+% it. Therefore we reintroduce the skips and stop. Otherwise we
+% recurse.
+% \begin{macrocode}
+ \vskip\@tempb\vskip\@tempa\relax
+ \else
+ \remove@discardable@items
+ \fi
+ \fi
+ \else
+% \end{macrocode}
+% If the first skip was a non-zero skip we recurse as well.
+% \begin{macrocode}
+ \remove@discardable@items
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%<*badness>
+\newif\iftoo@bad
+\def\too@badtrue{\global\let\iftoo@bad\iftrue}
+\def\too@badfalse{\global\let\iftoo@bad\iffalse}
+% \end{macrocode}
+%
+% \changes{v1.8k}{2015/03/21}{The new switch}
+% \begin{macrocode}
+\newif\ifforcedbreak@leftover
+% \end{macrocode}
+%
+% \begin{macro}{\c@minrows}
+% \changes{v1.8w}{2019/03/01}{Provide minrows counter for balancing}
+% \begin{macrocode}
+\newcount\c@minrows
+\c@minrows=1
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\c@columnbadness}
+% \begin{macro}{\c@finalcolumnbadness}
+% \begin{macrocode}
+\newcount\c@columnbadness
+\c@columnbadness=10000
+\newcount\c@finalcolumnbadness
+\c@finalcolumnbadness=9999
+
+\newdimen\last@try
+
+% \end{macrocode}
+%
+% \changes{v1.5z1}{2003/02/17}{Change wrong default for
+% \cs{multicolovershoot} to zero (pr/3465).}
+% \begin{macrocode}
+\newdimen\multicolovershoot
+\newdimen\multicolundershoot
+\multicolovershoot=0pt
+\multicolundershoot=2pt
+\newbox\mult@nat@firstbox
+%</badness>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\mult@info}
+% A helper for producing info messages
+% \begin{macrocode}
+\def\mult@info#1#2{%
+ \ifnum\c@tracingmulticols>#1%
+ \GenericWarning
+ {(multicol)\@spaces\@spaces}%
+ {Package multicol: #2}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \end{multicols}
+%
+%
+% \begin{multicols}{2}[\section{Fixing the
+% \cs{columnwidth}}]
+%
+% \begin{macro}{\@footnotetext}
+% \changes{v1.5o}{1997/11/16}{Redefinition added pr/2664.}
+% \changes{v1.5r}{1998/08/17}{Use \cs{@footnotetext} but with
+% local change to \cs{columnwidth}.}
+% \begin{macro}{\mult@footnotetext}
+% \changes{v1.5r}{1998/08/17}{Macro removed again.}
+% If we store the current column width in |\columnwidth| we have
+% to redefine the internal |\@footnotetext| macro to use |\textwidth|
+% for the width of the footnotes rather than using the original
+% definition.
+%
+% Starting with version v1.5r this is now done in a way that the original
+% definition is still used, except that locally |\columnwidth| is set to
+% |\textwidth|.
+%
+% This solves two problems: first redefinitions of |\@footnotetext|
+% done by a class will correctly survive and second if multicols is
+% used inside a minipage environment the special definition of
+% |\@footnotetext| in that environment will be picked up and not the
+% one for the main galley (the latter would result in all footnotes
+% getting lost in that case).
+%
+% See the definition of the |\multicols| command further up for the exact
+% code.
+% \end{macro}
+% \end{macro}
+% \end{multicols}
+%
+%
+% \begin{multicols*}{2}[\section{Further extensions}]
+%
+% This section does contain code for extensions added to this package
+% over time. Not all of them may be active, some might sit dormant and
+% wait for being activated in some later release.
+%
+% \subsection{Not balancing the columns}
+%
+% This is fairly trivial to implement. we just have to disable the
+% balancing output routine and replace it by the one that ships out
+% the other pages.
+%
+% \begin{macro}{\multicols*}
+% \changes{v1.5q}{1998/01/19}{Macro added}
+% The code for this environment was suggested by Matthias Clasen.
+% \begin{macrocode}
+%<*nobalance>
+ \@namedef{multicols*}{%
+% \end{macrocode}
+% If we are not on the main galley, i.e., inside a box of some
+% sort, that approach will not work since we don't have a vertical
+% size for the box so we better warn that we balance anyway.
+% \begin{macrocode}
+ \ifinner
+ \PackageWarning{multicol}%
+ {multicols* inside a box does
+ not make sense.\MessageBreak
+ Going to balance anyway}%
+ \else
+% \end{macrocode}
+% If we aren't balancing we change the |\balance@columns@out| to
+% work like the normal output routine that cuts normal
+% pages. However, there is a catch: In case the last page we cut
+% (after seeing the end of the environment) is actually larger than
+% a page (for example, if it contains more |\columnbreak| commands
+% than columns) we end up with some leftover material that is
+% returned to the main galley, but now the environment end penalty
+% is missing. So we add another one here too. Of course that
+% shouldn't be done if there is really only a single final page,
+% but fortunately in that case we have just finished a page and any
+% penalty on the recent contributions will be discarded, thus the
+% extra one is harmless---puh.
+% \changes{v1.8t}{2018/06/26}{Re-add end penalty for
+% \texttt{multicols*} environment to guard against leftovers (git/53)}
+% \begin{macrocode}
+ \def\balance@columns@out
+ {\multi@column@out \penalty-\@Mvi }%
+ \fi
+ \begin{multicols}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\endmulticols*}
+% When ending the environment we simply end the inner
+% \texttt{multicols} environment, except that we better also stick
+% in some stretchable vertical glue so that the last column still
+% containing text is not vertically stretched out.
+%
+% We do this as follows: first we ensure that we are back in vertical mode
+% and then we cancel out |\lastskip| if it was
+% positive (in case of a negative glue we assume that it was
+% deliberate, for a deliberate positive glue one needs to use
+% |\vspace*|). We can't simply use |\remove@discardable@items| here
+% as this only works inside boxes but we are here on the main
+% vertical list.
+%
+% Then we back up by |\prevdepth| but not more than |\boxmaxdepth|
+% so that a baseline of the last box is now at the bottom. This way
+% the material will align properly in case something like |\vfill|
+% spreads it out after all.
+% Finally we append |\vfil| to put white space at the bottom of the
+% column, but we only do this if we aren't anyway doing |\raggedcolumns|.
+% \changes{v1.5q}{1998/01/19}{Macro added}
+% \changes{v1.8h}{2014/09/12}{Use \cs{vfilmaxdepth}}
+% \changes{v1.8i}{2014/10/28}{Add \cs{null} to hide the final fill and only add
+% vertical space if not doing \cs{raggedcolumns}}
+% \changes{v1.8j}{2015/03/07}{Redesign the whole approach.}
+% \changes{v1.8k}{2015/03/21}{And a bit more redesign because of the
+% change in \cs{remove@discardable@items}}
+% \changes{v1.8o}{2016/02/08}{Ensure we are back in vmode before using
+% \cs{prevdepth} (pr/4448)}
+% \begin{macrocode}
+\@namedef{endmulticols*}{%
+ \par
+ \ifdim\lastskip>\z@ \vskip-\lastskip \fi
+ \ifdim \prevdepth>\z@
+ \vskip-\ifdim\prevdepth>\boxmaxdepth
+ \boxmaxdepth
+ \else \prevdepth \fi
+ \fi
+ \ifshr@nking\else
+ \vfil
+ \fi
+ \end{multicols}}
+%</nobalance>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Manual column breaking} \label{sec:colbreak}
+%
+% The problem with manual page breaks within \mc{} is the fact that
+% during collection of material for all columns a page-forcing penalty
+% (i.e. -10000 or higher) would stop the collecting pass which is not
+% quite what is desired. On the other hand, using a penalty like -9999
+% would mean that there would be occasions where the |\vsplit|ing
+% operations within \mc{} would ignore that penalty and still choose a
+% different break point.
+%
+% For this reason the current implementation
+% uses a completely different approach. In a nutshell it extends the \LaTeX{}
+% output routine handling by introducing an additional penalty flag
+% (i.e., a penalty which is forcing but higher than -10000 so that the
+% output routine can look at this value and thus knows why it has been
+% called).
+%
+% Inside the output routine we test for this value and if it appears
+% we do two things: save the galley up to this point in a special box
+% for later use and reduce the |\vsize| by the height of the material
+% seen. This way the forcing penalty is now hidden in that box and we
+% can restart the collection process for the remaining
+% columns. (This is done in |\speci@ls| above.)
+%
+% In the output routines that do the |\vsplit|ting either for
+% balancing or for a full page we simply combine box~255 with the
+% saved box thus getting a single box for splitting which now
+% contains forcing breaks in the right positions.
+%
+%
+% \begin{macro}{\columnbreak}
+% \changes{v1.5u}{1999/05/25}{Macro added}
+% |\columnbreak| is modeled after |\pagebreak| except that we
+% generate a penalty -10005.
+% \begin{macrocode}
+\mathchardef\@Mv=10005
+\def\columnbreak{%
+% \end{macrocode}
+% We have to ensure that it is only used within a \mc{}
+% environment since if that penalty would be seen by the unmodified
+% \LaTeX{} output routine strange things would happen.
+% \begin{macrocode}
+ \ifnum\col@number<\tw@
+ \PackageError{multicol}%
+ {\noexpand\columnbreak outside multicols}%
+ {This command can only be used within
+ a multicols or multicols* environment.}%
+ \else
+ \ifvmode
+ \penalty -\@Mv\relax
+ \else
+ \@bsphack
+ \vadjust{\penalty -\@Mv\relax}%
+ \@esphack
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\colbreak@box}
+% \changes{v1.5u}{1999/05/25}{Macro added}
+% Need a box to collect the galley up to the column break.
+% \begin{macrocode}
+\newbox\colbreak@box
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Supporting right-to-left languages} \label{sec:RL}
+%
+%
+% \changes{v1.7a}{2010/10/24}{RL language support added}
+% \changes{v1.7b}{2011/12/18}{RL language support fixed}
+%
+% \begin{macro}{\LR@column@boxes}
+% |\LR@column@boxes| is called when we are assembling the columns for left
+% to right typesetting. When we start we are inside an |\hbox| of
+% full width.
+% Left to right typesetting is fairly easy, we basically output
+% each column box intermixed with vertical rules and proper
+% spacing. As this happens inside a box of a defined width the
+% rules and the columns automatically get into the right positions.
+% \begin{macrocode}
+\def\LR@column@boxes{%
+% \end{macrocode}
+% We loop through the columns with |\process@cols|
+% \begin{macrocode}
+ \process@cols\mult@gfirstbox{%
+% \end{macrocode}
+% If the depth of the current box is larger than the maximum found
+% so far in |\dimen2| we update that register for later use.
+% \changes{v1.6a}{2003/03/15}{Preparing for adjusting \cs{prevdepth}}
+% \begin{macrocode}
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+% \end{macrocode}
+% If the \texttt{colaction} option is given we write out status
+% information about the current column, otherwise the next command
+% does nothing.
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+% \begin{macrocode}
+ \mc@col@status@write
+% \end{macrocode}
+% The typeset box followed by the column rule material
+% \begin{macrocode}
+ \box\count@
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss}%
+% \end{macrocode}
+% As you will have noticed, we started with box register
+% |\mult@gfirstbox| (i.e.\
+% the left column). So this time |\count@| looped through 2,
+% 4,\ldots\ (plus the appropriate offset).
+% Finally we add box |\mult@rightbox| and we are done.
+% \changes{v1.5a}{1992/11/04}{New box mechanism}
+% \changes{v1.6a}{2003/03/15}{Preparing for adjusting \cs{prevdepth}}
+% Again we may have to update |\dimen\tw@|.
+% \begin{macrocode}
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+% \end{macrocode}
+% If the \texttt{colaction} option is given we write out status
+% information about the last column, otherwise the next command
+% does nothing.
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+% \begin{macrocode}
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\RL@column@boxes}
+% Assembling the boxes for right to left typesetting is far more
+% complicated. When I first tried to build a solution for this my
+% thinking was that all that is necessary to do is to reverse the
+% order of the columns. But such an approach produces a subtle bug:
+% If we work this way then the first column put on the page will be
+% the last column of the text to read. and this means that the
+% order in which \TeX{} executes write statements or assembles mark
+% material will not happen in the order of the textual flow. So if,
+% for example each column contains a section command then these
+% sections will appear in reverse order in the table of content.
+%
+% For this reason some amount of gymnastics is needed to add the
+% columns in their natural flow.
+% \begin{macrocode}
+\def\RL@column@boxes{%
+% \end{macrocode}
+% First step is to put all rules in the right place (without adding
+% the comes which are instead represented by a space of |\hsize|.
+% \begin{macrocode}
+ \process@cols\mult@gfirstbox{%
+ \hskip\hsize
+ \hss{\columnseprulecolor\vrule
+ \@width\columnseprule}\hss
+ }%
+ \hskip\hsize
+% \end{macrocode}
+% At this point in the code our typesetting reference point is at
+% the right end of the rightmost column (or rather where that column
+% should appear).
+%
+% We are now typesetting all columns by first backing up by their
+% width (which is |\hsize|) then typesetting the box and then
+% backing up again, but this time further, i.e., also across the
+% column separation. That will then enable us to typeset the next
+% column using the same approach until we are done with all but the
+% final column.
+% \begin{macrocode}
+ \process@cols\mult@gfirstbox{%
+ \ifdim\dp\count@>\dimen\tw@
+ \global\dimen\tw@\dp\count@ \fi
+ \hskip-\hsize
+% \end{macrocode}
+%
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+% \begin{macrocode}
+ \mc@col@status@write
+ \box\count@
+ \hskip-\hsize
+ \hskip-\columnsep
+ }%
+% \end{macrocode}
+% The approach for the final column is similar only that we do not
+% have to back up over any column gap.
+% \begin{macrocode}
+ \ifdim\dp\mult@rightbox>\dimen\tw@
+ \global\dimen\tw@\dp\mult@rightbox \fi
+ \hskip-\hsize
+% \end{macrocode}
+%
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+% \begin{macrocode}
+ \mc@lastcol@status@write
+ \box\mult@rightbox
+ \hskip-\hsize
+% \end{macrocode}
+% However we do have to move the reference point to its right
+% place: to make the rules appear at the expected places, we should
+% get the typesetting position to the far right again. As we at the
+% moment at the far left we skip to the far right like this:
+% \begin{macrocode}
+ \hskip\full@width
+ }
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\RLmulticolcolumns}
+% \begin{macro}{\LRmulticolcolumns}
+% \begin{macro}{\mc@align@columns}
+% Macros to switch between left-right and right-left typesetting. In LR
+% typesetting the |\LR@column@boxes| is used to combine
+% the columns. When typesetting right to left the |\RL@column@boxes|
+% is used instead.
+% \begin{macrocode}
+\newcommand\RLmulticolcolumns
+ {\let\mc@align@columns
+ \RL@column@boxes}
+\newcommand\LRmulticolcolumns
+ {\let\mc@align@columns
+ \LR@column@boxes}
+% \end{macrocode}
+% The default is left-to-right:
+% \begin{macrocode}
+\LRmulticolcolumns
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Supporting \texttt{\textbackslash docolaction}}
+%
+% \changes{v1.8e}{2014/04/23}{Support \cs{docolaction}}
+%
+% Whenever we want to do something that depends on the current
+% column we execute \verb=\docolaction=. This command takes one
+% optional and three mandatory arguments. The mandatory ones denote
+% what to do if this is a ``left'', ``middle'', or ``right'' column
+% and the optional one is simply there to say what to do if we don't
+% know (default is to use the ``left'' column action in that case).
+%
+% \begin{macro}{\mc@col@check@num}
+% We use one counter \verb=\mc@col@check@num= to generate us unique
+% label names. Each time we execute \verb=\docolaction= we increment
+% this counter to get a new name.
+% \begin{macrocode}
+\newcount\mc@col@check@num
+% \end{macrocode}
+% \end{macro}
+%
+% The generated ``labels'' are named
+%\begin{verbatim}
+%\mc@col-\the\mc@col@check@num
+%\end{verbatim}
+% and they hold as values the
+% numbers 1, 2, or 3 denoting the current column type.
+
+% \begin{macro}{\docolaction}
+%
+% The \verb=\docolaction= scans for a star and optional argument
+% and 3 mandatory ones, but we do this in chunks (not having xparse
+% available).
+%
+% \changes{v1.8u}{2018/11/09}{Support star with \cs{docolaction}}
+% \begin{macrocode}
+\newcommand\docolaction{%
+% \end{macrocode}
+% First check is the support is enabled.
+% \begin{macrocode}
+ \ifx\mc@col@status@write\relax
+ \PackageError{multicol}%
+ {Option 'colaction' not selected}%
+ {\string\docolaction\space
+ requires the use of the 'colaction'
+ option on the package}%
+ \fi
+% \end{macrocode}
+% Then prepare \verb=\mc@col@type=.
+% \begin{macrocode}
+ \global\advance\mc@col@check@num\@ne
+ \edef\mc@col@type{\expandafter\ifx
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname\relax
+ 0\else
+ \csname mc@col-\the\mc@col@check@num
+ \endcsname
+ \fi}%
+% \end{macrocode}
+% Finally check for a star, record this information and then call
+% \verb=\@docolaction= to do the rest.
+% \begin{macrocode}
+ \@ifstar
+ {\@docolactionstartrue \@docolaction}%
+ {\@docolactionstarfalse\@docolaction}%
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand\@docolaction[4][1]{%
+% \end{macrocode}
+%
+% How does the column number get associated with our label? We
+% do do this by writing another line into the aux file. Here are the
+% preparations.
+% \begin{macrocode}
+ \edef\@docolactioncheck{\write\@auxout
+ {\string\mc@set@col@status
+ {mc@col-\the\mc@col@check@num}%
+ {\mc@col@type}}}%
+% \end{macrocode}
+% Where we do the actual \verb=\write= depends on the whether or
+% not we gave seen a \texttt{*}. If yes, we do it first and then
+% execute the code argument, otherwise we execute that code first
+% and check at the point after that.
+% \begin{macrocode}
+ \if@docolactionstar \@docolactioncheck \fi
+% \end{macrocode}
+% We prefix with 0 so that an unknown label (that returns
+% \verb=\relax=) will result in case 0
+% \begin{macrocode}
+ \ifcase \mc@col@type\relax
+% \end{macrocode}
+% If column is unknown we use the default action or the action
+% denoted by the optional argument (so that arg can take the value
+% 1, 2, 3).
+% \begin{macrocode}
+ \ifcase #1\or #2\or#3\or#4\fi
+ \or
+% \end{macrocode}
+% Otherwise we know (or think we know) that this is a first, middle,
+% or last column:
+% \begin{macrocode}
+ #2% % 1 First col
+ \or
+ #3% % 2 any middle col
+ \or
+ #4% % 3 last col
+ \else
+ \ERRORwrongdefaultgiven
+ \fi
+% \end{macrocode}
+% \begin{macrocode}
+ \if@docolactionstar \else \@docolactioncheck \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Here is the if used above:
+% \begin{macrocode}
+\newif\if@docolactionstar
+% \end{macrocode}
+%
+% Because of extra data writing to the aux file the aux file will
+% now contain something like the following after the document is
+% processed the first time:
+%\begin{verbatim}
+%\relax
+%\mc@col@status{1}
+%\mc@set@col@status{lcol-1}{0}
+%\mc@col@status{2}
+%\mc@set@col@status{lcol-2}{0}
+%\mc@col@status{3}
+%\mc@set@col@status{lcol-3}{0}
+%\mc@col@status{1}
+%\mc@col@status{2}
+%\mc@col@status{3}
+%\mc@set@col@status{lcol-4}{0}
+%\end{verbatim}
+% The \verb=\mc@col@status= line denotes the column type and has been
+% written out just before corresponding the column box was placed
+% onto the page.
+% The\verb=\mc@set@col@status= lines have been written out as part
+% of shipping the column boxes out, e.g.,
+% \verb=\mc@set@col@status{lcol-1}{0}= was therefore somewhere within
+% the first column as it appears between \verb=\mc@col@status{1}=
+% and \verb=\mc@col@status{2}=
+% The second argument in that line is the value used in the previous
+% run (or zero if there was no previous run. We can use this to
+% determine if a rerun is necessary.
+%
+% Thus with this knowledge we can set things up to get the labels
+% working.
+%
+%
+% \begin{macro}{\mc@col@status}
+%
+% When the aux file is read in \verb=\mc@col@status= is used to set
+% \verb=\mc@curr@col@status=:
+% \begin{macrocode}
+\def\mc@col@status#1{%
+ \gdef\mc@curr@col@status{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\mc@set@col@status}
+%
+% And when \verb=\mc@set@col@status= is executed we can simply set
+% up the label by associating it with the \verb=\mc@curr@col@status=
+% and ignore the second argument:
+% \begin{macrocode}
+\def\mc@set@col@status#1#2{%
+ \global\expandafter\let\csname #1\endcsname
+ \mc@curr@col@status}
+% \end{macrocode}
+% The above definition is being used when the \texttt{.aux} file is
+% read in at the beginning. At the end we need a different
+% definition to test if another typesetting run is needed. There we
+% compare the value used in the current run (stored in the second
+% argument) with the value used on the next run. If those two values
+% differ we set \verb=@tempswa= to false which will trigger the
+% ``Label(s) may have changed'' warning.
+% \begin{macrocode}
+\AtEndDocument{\def\mc@set@col@status#1#2{%
+ \ifnum #2=\mc@curr@col@status\else
+ \@tempswatrue
+ \fi}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{mc@firstcol}
+% Finally, as part of determining in which column we are, we used a
+% switch inside |\mc@col@status@write| to determine if we are in the
+% first column or not.
+% \begin{macrocode}
+\newif\ifmc@firstcol
+\mc@firstcoltrue
+% \end{macrocode}
+% \end{macro}
+% \end{multicols*}
+%
+% \Finale
+%
+\endinput
+
+
diff --git a/macros/latex-dev/required/tools/multicol.ins b/macros/latex-dev/required/tools/multicol.ins
new file mode 100644
index 0000000000..9fd6cbe6e9
--- /dev/null
+++ b/macros/latex-dev/required/tools/multicol.ins
@@ -0,0 +1,77 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+
+\generateFile{multicol.sty}{t}{%
+ \from{multicol.dtx}{package,badness,check,marktrace,nobalance}}
+
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/multicol.pdf b/macros/latex-dev/required/tools/multicol.pdf
new file mode 100644
index 0000000000..e614cb3386
--- /dev/null
+++ b/macros/latex-dev/required/tools/multicol.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/rawfonts.dtx b/macros/latex-dev/required/tools/rawfonts.dtx
new file mode 100644
index 0000000000..0fd7dd5006
--- /dev/null
+++ b/macros/latex-dev/required/tools/rawfonts.dtx
@@ -0,0 +1,219 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \title{The \textsf{rawfonts} package}
+% \date{v0.01}
+% \author{Alan Jeffrey}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+% \section*{Overview}
+%
+% The |rawfonts| \LaTeXe{} package is used to provide emulation
+% of \LaTeX~2.09 documents which used low-level commands such as
+% |\tenrm|. If you say:
+% \begin{verbatim}
+% \usepackage{rawfonts}
+% \end{verbatim}
+% then over sixty fonts such as |\tenrm| will be loaded into \LaTeX.
+% This has a large overhead, for example this document uses:
+% \begin{verbatim}
+% 8221 words of font info for 30 fonts
+% \end{verbatim}
+% but when run with the |rawfonts| package it uses:
+% \begin{verbatim}
+% 19294 words of font info for 73 fonts
+% \end{verbatim}
+% That is |rawfonts| can cause your document to load twice as many
+% fonts. (This overhead is why \LaTeXe{} does not define |\tenrm| and
+% friends by default.)
+%
+% If you want to only load a small
+% number of fonts, you can use the |only|
+% option, for example to only load |\tenrm| and |\tensf|:
+% \begin{verbatim}
+% \usepackage[only,tenrm,tensf]{rawfonts}
+% \end{verbatim}
+% The |rawfonts| package is intended mainly for use with \LaTeX~2.09
+% documents, and you might want to have the package loaded every time
+% you use \LaTeXe{} in compatibility mode. In this case, you should add
+% the line:
+% \begin{verbatim}
+% \RequirePackage{rawfonts}
+% \end{verbatim}
+% to your |latex209.cfg| \LaTeX~2.09 compatibility configuration file.
+%
+% \StopEventually{}
+%
+% \section*{Implementation}
+%
+% The driver for the documentation you're now reading.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document}
+\DocInput{rawfonts.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+% This is a \LaTeXe{} package.
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rawfonts}
+ [1994/05/08 Low-level LaTeX 2.09 font compatibility]
+% \end{macrocode}
+% The |rawfonts| package uses the |somedefs| package.
+% \begin{macrocode}
+\RequirePackage{somedefs}
+% \end{macrocode}
+% By default, all the fonts are loaded, but the |only| option says
+% that only the ones specified as options should be.
+% \begin{macrocode}
+\UseAllDefinitions
+\DeclareOption{only}{\UseSomeDefinitions}
+\DeclareOption*{\UseDefinition{\CurrentOption}}
+\ProcessOptions
+% \end{macrocode}
+% The rest of the code loads fonts. Five point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\fivrm}{OT1}{cmr}{m}{n}{\@vpt}}
+\ProvidesDefinition{\DeclareFixedFont{\fivmi}{OML}{cmm}{m}{it}{\@vpt}}
+\ProvidesDefinition{\DeclareFixedFont{\fivsy}{OMS}{cmsy}{m}{n}{\@vpt}}
+\ProvidesDefinition{\DeclareFixedFont{\fivly}{U}{lasy}{m}{n}{\@vpt}}
+% \end{macrocode}
+% Six point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\sixrm}{OT1}{cmr}{m}{n}{\@vipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sixmi}{OML}{cmm}{m}{it}{\@vipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sixsy}{OMS}{cmsy}{m}{n}{\@vipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sixly}{U}{lasy}{m}{n}{\@vipt}}
+% \end{macrocode}
+% Seven point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\sevrm}{OT1}{cmr}{m}{n}{\@viipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sevmi}{OML}{cmm}{m}{it}{\@viipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sevsy}{OMS}{cmsy}{m}{n}{\@viipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sevit}{OT1}{cmr}{m}{it}{\@viipt}}
+\ProvidesDefinition{\DeclareFixedFont{\sevly}{U}{lasy}{m}{n}{\@viipt}}
+% \end{macrocode}
+% Eight point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\egtrm}{OT1}{cmr}{m}{n}{\@viiipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\egtmi}{OML}{cmm}{m}{it}{\@viiipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\egtsy}{OMS}{cmsy}{m}{n}{\@viiipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\egtit}{OT1}{cmr}{m}{it}{\@viiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\egtly}{U}{lasy}{m}{n}{\@viiipt}}
+% \end{macrocode}
+% Nine point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\ninrm}{OT1}{cmr}{m}{n}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\ninmi}{OML}{cmm}{m}{it}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\ninsy}{OMS}{cmsy}{m}{n}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\ninit}{OT1}{cmr}{m}{it}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\ninbf}{OT1}{cmr}{bx}{n}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\nintt}{OT1}{cmtt}{m}{n}{\@ixpt}}
+\ProvidesDefinition{\DeclareFixedFont{\ninly}{U}{lasy}{m}{n}{\@ixpt}}
+% \end{macrocode}
+% Ten point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\tenrm}{OT1}{cmr}{m}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tenmi}{OML}{cmm}{m}{it}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tensy}{OMS}{cmsy}{m}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tenit}{OT1}{cmr}{m}{it}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tensl}{OT1}{cmr}{m}{sl}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tenbf}{OT1}{cmr}{bx}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tentt}{OT1}{cmtt}{m}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tensf}{OT1}{cmss}{m}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tenly}{U}{lasy}{m}{n}{\@xpt}}
+\ProvidesDefinition{\DeclareFixedFont{\tenex}{OMX}{cmex}{m}{n}{\@xpt}}
+% \end{macrocode}
+% Eleven point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\elvrm}{OT1}{cmr}{m}{n}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvmi}{OML}{cmm}{m}{it}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvsy}{OMS}{cmsy}{m}{n}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvit}{OT1}{cmr}{m}{it}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvsl}{OT1}{cmr}{m}{sl}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvbf}{OT1}{cmr}{bx}{n}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvtt}{OT1}{cmtt}{m}{n}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvsf}{OT1}{cmss}{m}{n}{\@xipt}}
+\ProvidesDefinition{\DeclareFixedFont{\elvly}{U}{lasy}{m}{n}{\@xipt}}
+% \end{macrocode}
+% Twelve point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\twlrm}{OT1}{cmr}{m}{n}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlmi}{OML}{cmm}{m}{it}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlsy}{OMS}{cmsy}{m}{n}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlit}{OT1}{cmr}{m}{it}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlsl}{OT1}{cmr}{m}{sl}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlbf}{OT1}{cmr}{bx}{n}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twltt}{OT1}{cmtt}{m}{n}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlsf}{OT1}{cmss}{m}{n}{\@xiipt}}
+\ProvidesDefinition{\DeclareFixedFont{\twlly}{U}{lasy}{m}{n}{\@xiipt}}
+% \end{macrocode}
+% Fourteen point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\frtnrm}{OT1}{cmr}{m}{n}{\@xivpt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\frtnmi}{OML}{cmm}{m}{it}{\@xivpt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\frtnsy}{OMS}{cmsy}{m}{n}{\@xivpt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\frtnbf}{OT1}{cmr}{bx}{n}{\@xivpt}}
+\ProvidesDefinition{\DeclareFixedFont{\frtnly}{U}{lasy}{m}{n}{\@xivpt}}
+% \end{macrocode}
+% Seventeen point:
+% \begin{macrocode}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\svtnrm}{OT1}{cmr}{m}{n}{\@xviipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\svtnmi}{OML}{cmm}{m}{it}{\@xviipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\svtnsy}{OMS}{cmsy}{m}{n}{\@xviipt}}
+\ProvidesDefinition{%
+ \DeclareFixedFont{\svtnbf}{OT1}{cmr}{bx}{n}{\@xviipt}}
+\ProvidesDefinition{\DeclareFixedFont{\svtnly}{U}{lasy}{m}{n}{\@xviipt}}
+% \end{macrocode}
+% Twenty point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\twtyrm}{OT1}{cmr}{m}{n}{\@xxpt}}
+\ProvidesDefinition{\DeclareFixedFont{\twtymi}{OML}{cmm}{m}{it}{\@xxpt}}
+\ProvidesDefinition{\DeclareFixedFont{\twtysy}{OMS}{cmsy}{m}{n}{\@xxpt}}
+\ProvidesDefinition{\DeclareFixedFont{\twtyly}{U}{lasy}{m}{n}{\@xxpt}}
+% \end{macrocode}
+% Twenty-five point:
+% \begin{macrocode}
+\ProvidesDefinition{\DeclareFixedFont{\twfvrm}{OT1}{cmr}{m}{n}{\@xxvpt}}
+% \end{macrocode}
+% That's it.
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+% \endinput
diff --git a/macros/latex-dev/required/tools/rawfonts.pdf b/macros/latex-dev/required/tools/rawfonts.pdf
new file mode 100644
index 0000000000..316f3b8c76
--- /dev/null
+++ b/macros/latex-dev/required/tools/rawfonts.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/shellesc.dtx b/macros/latex-dev/required/tools/shellesc.dtx
new file mode 100644
index 0000000000..061ea4457c
--- /dev/null
+++ b/macros/latex-dev/required/tools/shellesc.dtx
@@ -0,0 +1,243 @@
+% \iffalse
+%% Source File: shellesc.dtx
+%% Copyright (C) 2015-2019
+%%
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file may be distributed under the terms of the LPPL.
+%% See README for details.
+%
+%<*dtx>
+ \ProvidesFile{shellesc.dtx}
+%</dtx>
+%<package>\ifx\ProvidesPackage\undefined
+%<package>\def\next#1#2[#3]{\wlog{#2 #3}}
+%<package>\ifx\PackageInfo\undefined\def\PackageInfo#1#2{\wlog{#1: #2}}\fi
+%<package>\ifx\PackageWarning\undefined\def\PackageWarning#1#2{\wlog{#1: #2}}\fi
+%<package>\expandafter\next\fi
+%<package>\ProvidesPackage{shellesc}
+%<driver> \ProvidesFile{shellesc.drv}
+% \fi
+% \ProvidesFile{shellesc.dtx}
+ [2016/06/07 v0.02b unified shell escape interface for LaTeX]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document}
+\DocInput{shellesc.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{shellesc.dtx}
+%
+% \title{The \textsf{shellesc} Package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{LaTeX3 project}
+% \date{\filedate}
+% \maketitle
+%
+% \changes{v0.1b}{2016/02/02}{Doc typo fixes (JB)}
+% \changes{v0.2a}{2016/06/07}{Improve use with plain TeX}
+% \section{Introduction}
+%
+%
+% For many years web2c based \TeX\ implementations have used the syntax
+% of the \verb|\write| command to access system commands by using a
+% special stream 18 (streams above 15 can not be allocated to files in
+% classical \TeX\ so stream 18 would otherwise just print to the
+% terminal).
+%
+% This is a useful extension that did not break the strict rules on
+% extensions in classical \TeX. This package provides a simple
+% macro level interface hiding the \verb|write18| implementation
+% so a command to remove a file on a unix-like system could be
+% specified using \verb|\ShellEscape{rm file.txt}| (or \verb|del| in
+% windows). Note that by default system access is not allowed and
+% latex will typically need to be called with the \verb|--shell-escape|
+% command line option.
+%
+% The package may be used with standard \texttt{latex} or
+% \texttt{pdflatex} or \texttt{xetex}, however it is mostly motivated by
+% \texttt{lualatex} as from Lua\TeX~0.87 onwards Lua\TeX\ does \emph{not}
+% support the \verb|\write18| syntax to access system commands: it has
+% 256 write streams and stream 18 can be associated to a file and
+% (without this package) has no special significance. This packge
+% defines the same \verb|\ShellEscape| syntax in Lua\LaTeX, but the
+% implementation is via Lua and the \verb|os.execute| function.
+%
+% \verb|\ShellEscape| in fact corresponds to \verb|\immediate\write18|
+% (or \verb|\directlua|). Very rarely you may need to delay a system
+% command until the current page is output (when page numbers are
+% known) for this classically you could use \verb|\write18| (or
+% (\verb|\latelua|). This package provides \verb|\DelayedShellEscape|
+% as a common syntax for this use.
+%
+% To aid porting existing documents to Lua\TeX~0.87 this package does
+% overload the \verb|\write| command so that
+% \verb|\write18{rm file.txt}|
+% will work with Lua\TeX. Note that the redefinition of \verb|\write|
+% can not detect whether \verb|\immediate| has been used,
+% \verb|\immediate| will work as normal when writing to file streams
+% or the terminal but the special case of stream 18 which is defined to
+% use \verb|os.execute| always uses \verb|\directlua| (so corresponds
+% to \verb|\immediate\write18|. In the rare situations that you need
+% non-immediate \verb|\write18| in a document being ported to current
+% Lua\TeX, you will need to change to use the
+% \verb|\DelayedShellEscape| command.
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Status Check}
+%
+%
+% \changes{v0.2a}{2016/06/07}{spelling in messages}
+% \begin{macrocode}
+\ifcase
+ \ifx\pdfshellescape\@undefined
+ \ifx\shellescape\@undefined
+ \ifx\directlua\@undefined
+ \z@
+ \else
+ \directlua{%
+ tex.sprint((status.shell_escape or os.execute()) .. " ")}
+ \fi
+ \else
+ \shellescape
+ \fi
+ \else
+ \pdfshellescape
+ \fi
+ \PackageWarning{shellesc}{Shell escape disabled}
+\or
+ \PackageInfo {shellesc}{Unrestricted shell escape enabled}
+\else
+ \PackageInfo {shellesc}{Restricted shell escape enabled}
+\fi
+% \end{macrocode}
+%
+% \subsection{The shellesc package interface}
+%
+% \begin{macro}{\ShellEscape}
+% Execute the supplied tokens as a system dependent command, assuming
+% such execution is allowed.
+% \begin{macrocode}
+\ifx\lastsavedimageresourcepages\@undefined
+ \protected\def\ShellEscape{\immediate\write18 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+ \protected\def\ShellEscape#1{%
+ \directlua{os.execute("\luaescapestring{#1}")}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DelayedShellEscape}
+% \changes{v0.1c}{2016/04/29}{Define \cs{DelayedShellEscape} not \cs{ShellEscape}(UF)}
+% Execute the supplied tokens as a system dependent command, when this
+% node is shipped out with the completed page, assuming
+% such execution is allowed.
+% \begin{macrocode}
+\ifx\lastsavedimageresourcepages\@undefined
+ \protected\def\DelayedShellEscape{\relax\write18 }
+% \end{macrocode}
+%
+% \begin{macrocode}
+\else
+ \protected\def\DelayedShellEscape#1{%
+ \latelua{os.execute("\luaescapestring{#1}")}}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{The write18 package interface}
+%
+% In web2c based engines other than Lua\TeX, |\write18| may be used
+% directly. The same was true in older LuaTeX, but from version 0.85
+% onwards that is not available.
+%
+% The above |shellesc| package interface is recommended for new code,
+% however for ease of porting existing documents and packages to newer
+% Lua\TeX\ releases, a |\write18| interface is provided here via a
+% call to Lua's |os.execute|.
+%
+% Note that as currently written this always does an \emph{immediate}
+% call to the system.
+%
+% |\immediate| is supported but ignored, |\immediate\write18| and
+% |\write18| both execute immediately. To use a delayed execution at
+% the next shipout, use the |\DelayedShellEscape| command defined
+% above.
+%
+% Note that it would be easy to make |\wriete18| defined here use
+% delayed execution, just use |\DelayedShellEscape| instead of
+% |ShellEscape| in the definition below. However detecting
+% |\immediate| is tricky so the choice here is to always use the
+% immediate form, which is overwhelmingly more commonly used with
+% |\write18|.
+%
+% Stop at this point if not a recent Lua\TeX.
+% \begin{macrocode}
+\ifx\lastsavedimageresourcepages\@undefined\expandafter\endinput\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\directlua{%
+% \end{macrocode}
+%
+% \begin{macrocode}
+shellesc = shellesc or {}
+% \end{macrocode}
+%
+% Lua function to use the token scanner to grab the following \TeX\
+% number, and then test if stream 18 is being used, and then insert an
+% appropriate \TeX\ command to handle the following brace group in
+% each case.
+% \begin{macrocode}
+local function write_or_execute()
+ local s = token.scan_int()
+ if (s==18) then
+ tex.sprint(\the\numexpr\catcodetable@atletter\relax,
+ "\string\\ShellEscape ")
+ else
+ tex.sprint(\the\numexpr\catcodetable@atletter\relax,
+ "\string\\shellesc@write " .. s)
+ end
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+shellesc.write_or_execute=write_or_execute
+% \end{macrocode}
+%
+% \begin{macrocode}
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\shellesc@write\write
+% \end{macrocode}
+%
+% \begin{macrocode}
+\protected\def\write{\directlua{shellesc.write_or_execute()}}
+% \end{macrocode}
+%
+%
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/required/tools/shellesc.pdf b/macros/latex-dev/required/tools/shellesc.pdf
new file mode 100644
index 0000000000..043016f2b9
--- /dev/null
+++ b/macros/latex-dev/required/tools/shellesc.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/showkeys.dtx b/macros/latex-dev/required/tools/showkeys.dtx
new file mode 100644
index 0000000000..6e2516856d
--- /dev/null
+++ b/macros/latex-dev/required/tools/showkeys.dtx
@@ -0,0 +1,905 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: showkeys.dtx Copyright (C) 1992-1997 David Carlisle
+%% File: showkeys.dtx Copyright (C) 2006-2019 David Carlisle, LaTeX3 Project
+%
+%<*dtx>
+ \ProvidesFile{showkeys.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{showkeys}
+%<driver> \ProvidesFile{showkeys.drv}
+% \fi
+% \ProvidesFile{showkeys.dtx}
+ [2014/10/28 v3.17 Show cite and label keys (DPC, MH)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage
+% [notcite,notref,color]
+ {showkeys}
+\setlength{\belowcaptionskip}{\baselineskip}
+\setlength{\abovecaptionskip}{0pt}
+\begin{document}
+\DocInput{showkeys.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{showkeys.dtx}
+% \title{The \textsf{showkeys} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle \and Morten H\o gholm}
+% \date{\filedate}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+%
+% \changes{v1.01}{1992/08/25}{Initial version}
+% \changes{v1.02}{1994/01/05}
+% {Fix incorrect initialisation (FGBDA19@CC1.KULEUVEN.AC.BE)}
+% \changes{v2.00}{1994/01/31}{new version for LaTeX2e}
+% \changes{v2.01}{1994/06/30}{Fix \cs{ProvidesPackage} usage.}
+% \changes{v3.00}{1994/09/07}
+% {Support harvard, varioref and natbib packages,}
+% \changes{v3.02}{1995/03/17}
+% {Support new AMS files}
+%
+% \section{Introduction}\label{sec:intro}
+%
+% |showkeys.sty| modifies the |\label|, |\ref|, |\pageref|, |\cite|, and
+% |\bibitem| commands so that the `internal' key is printed. The package
+% tries hard to position these labels so that the formatting of the rest
+% of the document is unchanged. |\label| and |\bibitem| cause the
+% key to appear in a box either in the margin, or in a \TeX\ box of zero
+% width, which may possibly over-print other text. The |\ref|,
+% |\pageref| and |\cite| commands print their arguments in small type,
+% raised just above the line, like this: \ref{sec:intro}.
+% This package works with the \textsf{fleqn} option, the packages
+% in the AMS-\LaTeX\ collection, and the \textsf{varioref},
+% \textsf{natbib} and \textsf{harvard} packages.
+%
+% \changes{v2.00}{1992/01/31}
+% {leqno or ams* may now be loaded after showkeys}
+%
+% \section{Package Options}\label{options}
+% Some people have commented that the printing of the |\ref| and
+% |\cite| keys is less useful than the printing of the |\label| keys
+% and so \textsf{showkeys} now supports two options that can be given
+% in the |\usepackage| command:
+% \begin{description}
+% \item[notref] to stop the redefinition of |\ref| and |\pageref|,
+% and related commands from the \textsf{varioref} package.
+% \item[notcite] to stop the redefinition of |\cite| and related
+% commands from the \textsf{harvard} and \textsf{natbib} packages.
+% \end{description}
+% So if the package is loaded with |\usepackage[notref]{showkeys}|
+% then |\ref| will have its standard definition, but |\label| will
+% print its key argument (usually in the margin).
+%
+% If you find the printed keys distracting, but don't want to use the
+% above options to stop them altogether you may use:
+% \begin{description}
+% \item[color] Print the keys in a distinguishing colour. The default
+% value is a light grey.
+% \end{description}
+% The colours may be changed by redefining the following two colours
+% after the package is loaded.
+% |refkey| (also used for |\cite|) and
+% |labelkey| (also used for |\bibitem|).
+% The defaults are:
+%\begin{verbatim}
+% \definecolor{refkey}{gray}{.75}
+% \definecolor{labelkey}{gray}{.75}
+%\end{verbatim}
+%
+% If this option is used the \textsf{color} package will be loaded.
+%
+% The package accepts two further options.
+% \begin{description}
+% \item[final] to suporess the action of this package, for `final'
+% versions.
+% \item[draft] the normal behaviour of this package.
+% \end{description}
+% Clearly there is not much point in entering the |final| option
+% directly in the |\usepackage| command, as just not loading this
+% package would have the same effect, and execute more quickly,
+% however the |final| option may be useful as it may be used once in
+% the |documentclass| command to affect any number of packages that
+% may be loaded. The |draft| option does not do anything, but is there
+% to honour an informal convention that packages have these options in
+% pairs.
+%
+% You can also control the appearance of the typeset label with the
+% command |\showkeyslabelformat|, which takes one argument. The default is
+% \begin{verbatim}
+% \providecommand*\showkeyslabelformat[1]{%
+% \fbox{\normalfont\small\ttfamily#1}}
+% \end{verbatim}
+% The command is called inside a group so you can put in local
+% modifications of |\fboxsep|, for instance, without them leaking to
+% the rest of the document.
+%
+%
+% \section{More Examples}\label{examples}
+% The only other similar package that I could find in the macro index,
+% \cite{DMJ:mi}, was |showlabels.sty|, \cite{GN:sl}. After the first
+% draft of this package was written, I found \cite{anon:sk} on my local
+% installation! I think the current package is more robust than
+% \cite{anon:sk}, but I thought that |showkeys| was rather a good name,
+% so I have stolen it for this file.
+%
+% \begin{enumerate}
+% \item \label{e^1}This has |\label| immediately after |\item|.
+% \item This has the |\label| at the end.\label{e^2}
+% \end{enumerate}
+%
+% \[
+% \mbox{A minipage :- }\left\{
+% \begin{minipage}{3in}
+% Within environments like this |minipage|, we cannot use
+% |\marginpar|\footnotemark,
+% so the appearance is slightly different. Here is that |enumerate|
+% environment again:
+%
+% \begin{enumerate}
+% \item \label{m&e^1}This has |\label| immediately after |\item|.
+% \item This has the |\label| at the end.\label{m&e^2}
+% \end{enumerate}
+% \end{minipage}
+% \right.
+% \]
+%
+% Displayed math (without |equation| counter).
+% \[0=0\label{disp}\]
+%
+% Some text referring to the maths on page~\pageref{disp}, and the
+% item~\ref{e^1}.\footnotetext{Actually \texttt{\string\marginpar} is
+% not used at all in this package now.}
+%
+% If |showkeys| thinks that the current environment is going to produce
+% an ``equation number'', then it does not show the label where the
+% |\label| command occurs, but tries to put it in the margin, as shown
+% with equation~\ref{eq:xx}.
+% The package `knows' about the standard |equation| and |eqnarray|
+% environments, and also all the numbered alignment environments offered
+% by the AMS\LaTeX\ package, |amsmath|.
+%
+% ^^A (|amstex.sty| must be loaded before |showkeys.sty|
+% ^^A for this to work.)
+% \changes{v2.00}{1992/01/31}
+% {leqno or ams* may now be loaded after showkeys}
+%
+% \begin{equation}
+% 1=1\label{eq:xx}
+% \end{equation}
+%
+% \begin{eqnarray}
+% 2&=&2\label{eqnar:a}\\
+% 3&=&3\nonumber\\
+% 4&=&4\label{eqnar:b}
+% \end{eqnarray}
+%
+%
+% \begin{figure}[ht]
+% Within a |figure| environment, the |\label| must not come before the
+% |\caption| command. If you place |\label| inside the argument of
+% |\caption| the label will be shown like this:
+%
+% \caption{Within the caption argument.\label{cap:a}}
+%
+% If you place |\label| immediately after the |\caption| command it will
+% be shown like this:
+%
+% \caption{Immediately after the caption argument.}\label{cap:b}
+%
+% If you place the |\label| command at some random point after the
+% |\caption| command, it may be shown like:
+%
+% \caption{In vertical mode not immediately after a box.}
+% \vspace{2pt}
+%
+% \label{cap:c}
+% \end{figure}
+%
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{GN:sl}
+% Gil Neiger, \emph{showlabels.sty},
+% Undated package, similar to this one, but shows labels
+% inline, affecting the formatting of the document.
+%
+% \bibitem{anon:sk}
+% Anonymous, \emph{showkeys.sty},
+% Package, dated 14 May 1988. Very similar to this one,
+% also uses |\marginpar| in outer vertical mode.
+%
+% \bibitem{DMJ:mi}
+% David M. Jones, \emph{\TeX\ Macro Index},
+% A catalogue of \TeX\ macros, including \LaTeX\ packages,
+% available from all good \TeX\ archives.
+%
+% \end{thebibliography}
+%
+% \StopEventually{}
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+%
+% First we handle the options. Normally all related commands are
+% defined to show their `keys'. But since v3.03 one can specify:
+%
+% \texttt{notref} to stop the redefinition of |\ref| (and |\pageref|,
+% and related commands from \textsf{varioref} package),
+%
+% \texttt{notcite} to stop the redefinition of |\cite| and related
+% commands from the \textsf{harvard} and \textsf{natbib} packages.
+%
+% \changes{v3.03}{1995/04/25}
+% {Add option handling.}
+% \begin{macrocode}
+\DeclareOption{notref}{\let\SK@ref\@empty}
+\DeclareOption{notcite}{\let\SK@cite\@empty}
+% \end{macrocode}
+%
+% \begin{macro}{\SK@refcolor}
+% \begin{macro}{\SK@labelcolor}
+% Colour commands. Normally no-op.
+% \begin{macrocode}
+\let\SK@refcolor\relax
+\let\SK@labelcolor\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \changes{v3.11}{1996/11/01}
+% {Colour support added, inspired by tools/2297}
+% |color| option loads the \textsf{color} package and defines the
+% colours. Delayed to the end of the package as package loading not
+% allowed in this option section.
+% \begin{macrocode}
+\DeclareOption{color}{\AtEndOfPackage{%
+ \RequirePackage{color}%
+ \definecolor{refkey}{gray}{.75}%
+ \definecolor{labelkey}{gray}{.75}%
+ \def\SK@refcolor{\color{refkey}}%
+ \def\SK@labelcolor{\color{labelkey}}}}
+% \end{macrocode}
+%
+% \changes{v3.04}{1995/10/30}
+% {final and draft options handling.}
+% \changes{v3.15}{2007/08/07}
+% {Fix \cs{showkeyslabelformat} for final option PR/3918.}
+% Allow |final| to be specified in the document class options
+% to suppress the loading of this package.
+% \begin{macrocode}
+\DeclareOption{final}{%
+ \providecommand*\showkeyslabelformat[1]{}%
+ \endinput}
+\DeclareOption{draft}{}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+% \changes{v2.00}{1992/01/31}
+% {\cmd{reset@font} is now standard}
+%
+% \begin{macro}{\SK@label}
+% \begin{macro}{\SK@bibitem}
+% \begin{macro}{\SK@lbibitem}
+% The saved original definitions
+% \begin{macrocode}
+\let\SK@label\label
+\let\SK@bibitem\@bibitem
+\let\SK@lbibitem\@lbibitem
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\label}
+% \changes{v3.09}{1996/08/30}
+% {Add extra group so brace hack works. Donald Arseneau tools/2147}
+% The new definition, print the argument, and then do the old
+% definition.
+% \begin{macrocode}
+\def\label#1{%
+ \@bsphack
+ \SK@\SK@@label{#1}%
+ \begingroup
+ \SK@label{#1}%
+ \endgroup
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bibitem}
+% \begin{macro}{\@lbibitem}
+% \changes{v3.02}{1995/03/17}
+% {New label code.}
+% For |\bibitem|, position the \textsf{showkeys} code as for a standard
+% list with |\item| and |\label|.
+% \begin{macrocode}
+\def\@bibitem#1{%
+ \SK@bibitem{#1}\SK@\SK@@label{#1}\ignorespaces}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@lbibitem[#1]#2{%
+ \SK@lbibitem[{#1}]{#2}\SK@\SK@@label{#2}\ignorespaces}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SK@}
+% \changes{v3.07}{1996/05/17}
+% {use \cs{protected@edef} for tools/2147}
+% Grab hold of |#2| via |\meaning| so characters like |&| and
+% |^| do not cause problems later, and pass the result on to the command
+% |#1|.
+% \begin{macrocode}
+\def\SK@#1#2{%
+ \protected@edef\@tempa{#2}%
+ \expandafter#1\meaning\@tempa\SK@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\showkeyslabelformat}
+% \changes{v3.13}{2006/01/09}{Added command}
+% \begin{macrocode}
+\providecommand*\showkeyslabelformat[1]{%
+ \fbox{\normalfont\small\ttfamily#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SK@@label}
+% \changes{v3.13}{2006/01/09}{Do not hardwire label format}
+% Strip off the initial segment of the |\meaning| output, and then put
+% the rest either in a |\marginpar| or in a box of size 0pt,
+% hopefully not disturbing the surrounding text.
+% \begin{macrocode}
+\def\SK@@label#1>#2\SK@{%
+% \end{macrocode}
+% Need to work globally as in some cases like alignments, and |fleqn|,
+% the counter will be printed in a different group to the |\label|
+% command.
+% \begin{macrocode}
+ \gdef\SK@lab{\smash{\SK@labelcolor\showkeyslabelformat{#2}}}%
+ \ifvmode
+ \if@inlabel
+% \end{macrocode}
+% \changes{v3.02}{1995/03/17}
+% {New code for `in label' case.}
+% If the |\label| is straight after |\item| (|\bibitem| is handled by
+% this case as well) then the item label has not been added to the page
+% yet. It is hanging around in the box |\@labels| waiting for the
+% paragraph to start. So just need to attach the label to this box.
+% \begin{macrocode}
+ \global\setbox\@labels\hbox{%
+ \llap{\SK@lab\SK@lab@relax
+ \kern\@totalleftmargin\kern\marginparsep}%
+ \box\@labels}%
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% \changes{v3.10}{1996/09/06}
+% {Save prevdepth and restore later}
+% If we insert a box into the main vertical list, do not want to
+% change |\prevdepth| as that would affect vertical spacing in the
+% document. (The box itself should not cause any difference in break
+% points as there is a node there anyway coming from the |\write| to
+% the aux file.
+% \begin{macrocode}
+ \dimen@\prevdepth
+ \nointerlineskip
+% \end{macrocode}
+% The inner vertical mode cases are mainly designed to do the right
+% thing with float captions, but seem to work OK in other cases as well.
+% \begin{macrocode}
+ \ifinner
+ \skip@\lastskip\unskip
+% \end{macrocode}
+% In inner vertical mode, attach the label to the right of the
+% immediately preceding box, if it is a box before the current point.
+% Otherwise just put it in a box of zero dimensions, with no interline
+% skip. (This may slightly move the surrounding text (but perhaps not
+% now that |\prevdepth| is restored.)
+% \changes{v3.00}{1994/09/07}
+% {Back up over a previous skip because of the new
+% \cs{belowcaptionskip}}
+% \changes{v3.04}{1995/10/30}
+% {\cs{advance} added, to total two successive skips.}
+% \changes{v3.04}{1995/10/30}
+% {\cs{nointerlineskip} called before \cs{ifvoid} test, not just
+% void case}
+% \changes{v3.04}{1995/10/30}
+% {\cs{marginparskip} added in inner vmode case}
+% \begin{macrocode}
+ \advance\skip@\lastskip\unskip
+ \setbox\z@\lastbox
+% \end{macrocode}
+% \changes{v3.10}{1996/09/06}
+% {Inner vertical mode case, put it in the margin.}
+% \changes{v3.14}{2006/09/25}
+% {The label put in the margin shouldn't make box 255 wider (PR/3884).}
+% \begin{macrocode}
+ \ifvoid\z@
+ \llap{\SK@lab\SK@lab@relax\kern\marginparsep}%
+ \else
+ \hbox{\box\z@\rlap{\kern\marginparsep\SK@labx}}%
+ \fi
+ \vskip\skip@
+ \else
+% \end{macrocode}
+% In outer vertical mode, previously used a |\vadjust| at the start of
+% the next paragraph (and before that used |\marginpar|). These
+% methods sometimes cause extra space, eg if paragraph starts with a
+% math display, so now just insert the box directly, taking care not
+% to change |\prevdepth|.
+% \changes{v3.02}{1995/03/17}
+% {Use \cs{vadjust} instead of \cs{marginpar}}
+% \changes{v3.10}{1996/09/06}
+% {Insert the box directly}
+% \begin{macrocode}
+ \llap{\SK@lab\SK@lab@relax\kern\marginparsep}%
+ \fi
+% \end{macrocode}
+% Restore |\prevdepth|.
+% \begin{macrocode}
+ \prevdepth\dimen@
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \fi
+ \else
+% \end{macrocode}
+% If we are in an numbered equation-style environment, do nothing as the
+% code to print the number will also print the label, otherwise just
+% stick the label at the current point, in a box of zero dimensions.
+% \changes{v3.02}{1995/03/17}
+% {Add \cs{ifmmode} test}
+% \begin{macrocode}
+ \csname SK@\@currenvir\endcsname
+ \ifSK@equation\else
+ \ifmmode
+ \SK@labx
+ \else
+% \end{macrocode}
+% Inner horizontal mode. Not much we can do, just stick it here.
+% \changes{v3.03}{1995/04/25}
+% {Fix inner horizontal mode case (broken in 3.02)}
+% \begin{macrocode}
+ \ifinner
+ \rlap\SK@lab
+ \else
+% \end{macrocode}
+% In outer horizontal mode use |\vadjust| to get to the margin.
+% \changes{v3.02}{1995/03/17}
+% {Use \cs{vadjust} in horizontal mode}
+% \begin{macrocode}
+ \vadjust{\llap{\SK@lab\kern\marginparsep}}%
+ \fi
+ \SK@lab@relax
+ \fi
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tagform@}
+% \changes{v2.00}{1992/01/31}
+% {Defer tests to begin document}
+% \changes{v3.02}{1995/03/17}
+% {Support new AMS files}
+% \begin{macro}{\@eqnnum}
+% \changes{v3.13}{2006/01/09}
+% {Change to also work correctly for \texttt{leqno} option.}
+% \begin{macro}{\maketag@@@}
+% \changes{v3.13}{2006/01/09}
+% {Support for \cs{tag*} tools/3693.}
+% Firstly we grab |\@eqnnum|.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \let\SK@eqnnum\@eqnnum
+% \end{macrocode}
+% Then check for \textsf{amsmath} where we grab the internal commands
+% |\tagform@| and |\maketag@@@|. Redefine them and redefine |\@eqnnum|
+% as well.
+% \begin{macrocode}
+ \@ifpackageloaded{amsmath}{%
+ \let\SK@tagform@\tagform@
+ \let\SK@maketag@@@\maketag@@@
+ \iftagsleft@
+ \def\tagform@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \llap{\SK@lab\kern\marginparsep}%
+ \SK@lab@relax\SK@tagform@{#1}}%
+ \def\maketag@@@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \llap{\SK@lab\kern\marginparsep}\SK@lab@relax
+ \SK@maketag@@@{#1}%
+ }%
+ \def\@eqnnum{%
+ \llap{\SK@lab\kern\displaywidth\kern\marginparsep}%
+ \SK@lab@relax\SK@eqnnum}%
+ \else
+% \end{macrocode}
+% Almost the same for tags on the right, except we use |\rlap| and
+% typeset it after the tag.
+% \begin{macrocode}
+ \def\tagform@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+% \end{macrocode}
+% \changes{v3.08}{1996/07/10}{Missing percent added. /2215}
+% \begin{macrocode}
+ \SK@tagform@{#1}%
+ \rlap{\kern\marginparsep\SK@lab}\SK@lab@relax}%
+ \def\maketag@@@#1{%
+ \ifx\df@label\@empty
+ \SK@lab@relax
+ \else
+ \expandafter\SK@@label\meaning\df@label\SK@
+ \fi
+ \SK@maketag@@@{#1}%
+ \rlap{\kern\marginparsep\SK@lab}\SK@lab@relax
+ }%
+ \def\@eqnnum{\SK@eqnnum\rlap{\kern\marginparsep\SK@lab}%
+ \SK@lab@relax}%
+ \fi
+ }%
+% \end{macrocode}
+% If \textsf{amsmath} wasn't loaded we check explicitly if the
+% \texttt{leqno} option was used in |\documentclass| and redefine
+% accordingly.
+% \begin{macrocode}
+ {%
+ \@ifundefined{ver@leqno.clo}{%
+ \def\@eqnnum{\SK@eqnnum\rlap{\kern\marginparsep\SK@lab}%
+ \SK@lab@relax}%
+ }{%
+ \def\@eqnnum{%
+ \llap{\SK@lab\kern\displaywidth\kern\marginparsep}%
+ \SK@lab@relax\SK@eqnnum}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SK@labx}
+% Print the label, and then globally reset the print command to
+% |\relax|.
+% \begin{macrocode}
+\def\SK@labx{\rlap\SK@lab\global\let\SK@lab\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SK@lab@relax}
+% Clear the label.
+% \changes{v1.02}{1994/01/05}{Execute to initialise correctly}
+% \begin{macrocode}
+\def\SK@lab@relax{\global\let\SK@lab\relax}\SK@lab@relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SK@equation}
+% \begin{macro}{\SK@eqnarray}
+% The following environments print an equation number, so |\label|
+% should not print its argument at the point where it appears.
+% Note this will fail to show the label if you are in an |eqnarray|
+% environment, and use |\label| together with |\nonumber| This might
+% just about make sense if you are going to use |\pageref|, but that is
+% too bad\ldots
+% \begin{macrocode}
+\newif\ifSK@equation
+\let\SK@equation\SK@equationtrue
+\let\SK@eqnarray\SK@equationtrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\eqnarray}
+% \changes{v3.09}{1996/08/30}
+% {Fix eqnarray AMS incompatibility. tools/2252}
+% When the AMS packages are loaded |showkeys| assumes environments
+% work `The AMS way' However |eqnarray| (unlike |equation|) is not
+% redefined, so here we need to remove some of the AMS hacks.
+% \begin{macrocode}
+\toks@\expandafter{\eqnarray}
+\edef\eqnarray{\let\noexpand\tagform@\noexpand\SK@tagform@\the\toks@}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SK@align}
+% \begin{macro}{\SK@alignat}
+% \begin{macro}{\SK@xalignat}
+% \begin{macro}{\SK@xxalignat}
+% \begin{macro}{\SK@gather}
+% \begin{macro}{\SK@multline}
+% \begin{macro}{\SK@flalign}
+% \changes{v3.02}{1995/03/17}
+% {Add \cs{SK@flalign}}
+% The AMS environments
+% \begin{macrocode}
+\let\SK@align\SK@equationtrue
+\let\SK@alignat\SK@equationtrue
+\let\SK@xalignat\SK@equationtrue
+\let\SK@xxalignat\SK@equationtrue
+\let\SK@gather\SK@equationtrue
+\let\SK@multline\SK@equationtrue
+\let\SK@flalign\SK@equationtrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SK@align*}
+% \begin{macro}{\SK@alignat*}
+% \begin{macro}{\SK@flalign*}
+% \begin{macro}{\SK@gather*}
+% \begin{macro}{\SK@multline*}
+% \begin{macro}{\SK@equation*}
+% \changes{v3.13}{2006/01/09}
+% {Add the starred AMS environments for tools/3697.}
+% Starred versions of the AMS environments.
+% \begin{macrocode}
+\expandafter\let\csname SK@align*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@alignat*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@flalign*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@gather*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@multline*\endcsname\SK@equationtrue
+\expandafter\let\csname SK@equation*\endcsname\SK@equationtrue
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\SK@def}
+% \changes{v3.05}{1995/11/09}
+% {Macro added}
+% This macro redefines a command |#1|. The new definition can make use
+% of the old definition as |\SK@|\emph{old name}. If |#1| is really a
+% |\protect|'ed command with the real definition in a `\emph{space}'
+% command then the `space' version is used as the old definition.
+% Need to test this for each command as some package may have changed
+% the status of a command to being `protected'.
+% The new definition is made as if with |\DeclareRobustCommand|, but
+% with |\def| syntax for the argument specification.
+% \begin{macrocode}
+\def\SK@def#1{%
+ \edef\@tempa{\expandafter\@gobble\string#1}%
+ \@ifundefined{\@tempa\space}%
+ {\expandafter\let\csname SK@\@tempa\endcsname#1}%
+ {\expandafter\let\csname SK@\@tempa\expandafter\endcsname
+ \csname\@tempa\space\endcsname}%
+ \expandafter\def\expandafter#1\expandafter{%
+ \expandafter\protect\csname\@tempa\space\endcsname}%
+ \expandafter\def\csname\@tempa\space\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% The next section redefines |\ref| and |\pageref| (unless the
+% \texttt{notref} option was given).
+% \begin{macrocode}
+\ifx\SK@ref\@empty
+% \end{macrocode}
+% Even if \texttt{notref} option is used, need to fudge the
+% \textsf{varioref} commands as they use |\label| internally.
+% \changes{v3.04}{1995/10/30}
+% {improve varioref support in notref option case, for
+% tools/1744}
+% \changes{v3.13}{2006/01/09}{Updated varioref support, for latex/3373}
+% \changes{v3.15}{2006/06/19}
+% {Prevent loss of brackets}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{varioref}{%
+ \SK@def\@@vpageref#1[#2]#3{{%
+ \let\label\SK@label
+ \SK@@@vpageref{#1}[{#2}]{#3}}}%
+ \def\vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \ref{#1}%
+ {\let\label\SK@label
+ \vpageref[\unskip]{#1}}}%
+ }{}}
+\else
+% \end{macrocode}
+%
+% \begin{macro}{\ref}
+% \begin{macro}{\pageref}
+% Save the redefinition to |\begin{document}| so that this package can
+% work with packages that redefine |\cite|. Tested with harvard and
+% natbib packages. Also add code at this point to support varioref.
+% \changes{v3.00}{1994/09/07}
+% {Delay \cs{ref} redefinition.}
+% \changes{v3.03}{1995/04/25}
+% {Make redefinition conditional on notref option}
+% \changes{v3.15}{2006/06/19}
+% {Prevent loss of brackets}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \SK@def\ref#1{\SK@\SK@@ref{#1}\SK@ref{#1}}%
+ \SK@def\pageref#1{\SK@\SK@@ref{#1}\SK@pageref{#1}}%
+% \end{macrocode}
+% varioref support.
+% \begin{macrocode}
+ \@ifpackageloaded{varioref}{%
+ \SK@def\@@vpageref#1[#2]#3{{%
+ \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
+ \leavevmode\unskip\SK@\SK@@ref{#3}\SK@@@vpageref{#1}[{#2}]{#3}}}%
+ \def\vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \ref{#1}%
+ \let\label\SK@label\let\ref\SK@ref\let\pageref\SK@pageref
+ \vpageref[\unskip]{#1}}%
+ }{}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Now redefine |\cite| unless \texttt{notcite} option given.
+% \begin{macrocode}
+\ifx\SK@cite\@empty
+% \end{macrocode}
+% \changes{v3.06}{1995/11/22}
+% {Fix \cs{harvarditem} support}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifx\HAR@checkdef\@undefined\else
+ \expandafter\let\expandafter
+ \SK@HAR@bi\csname\string\harvarditem\endcsname
+ \expandafter\def\csname\string\harvarditem\endcsname[#1]#2#3#4{%
+ \SK@HAR@bi[{#1}]{#2}{#3}{#4}\SK@\SK@@label{#4}}%
+ \fi}
+\else
+% \end{macrocode}
+%
+% \begin{macro}{\cite}
+% \changes{v3.00}{1994/09/07}
+% {Delay \cs{cite} redefinition.}
+% \changes{v3.03}{1995/04/25}
+% {Make redefinition conditional on notcite option}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \ifx\HAR@checkdef\@undefined
+% \end{macrocode}
+% Standard (non-harvard) support, including extra cite commands from
+% \textsf{natbib} and \textsf{cite}.
+% \changes{v3.01}{1994/09/09}
+% {Add \cs{citefullauthor}}
+% \changes{v3.12}{1997/06/12}
+% {Support cite package. tools/2490}
+% \changes{v3.17}{2014/04/24}
+% {redefine \cs{@citex} rather than \cs{cite} for tools/4162}
+%
+% If \textsf{cite} or \textsf{overcite} is being used, redefine |\citen|
+% rather than |\cite| so as not to spoil the space and punctuation
+% calculations done by those packages.
+% \begin{macrocode}
+ \ifx\citen\@undefined
+ \SK@def\@citex[#1]#2{\SK@citex[{#1}]{#2}}%
+ \else
+ \SK@def\citen#1{\SK@\SK@@ref{#1}\SK@citen{#1}}%
+ \fi
+ \SK@def\citeauthor#1{\SK@\SK@@ref{#1}\SK@citeauthor{#1}}%
+ \SK@def\citefullauthor#1{\SK@\SK@@ref{#1}\SK@citefullauthor{#1}}%
+ \SK@def\citeyear#1{\SK@\SK@@ref{#1}\SK@citeyear{#1}}%
+ \else
+% \end{macrocode}
+% In the \textsf{harvard} style do \emph{not} redefine individual cite
+% commands. Just redefine one internal command that is used in all the
+% citation forms.
+% \begin{macrocode}
+ \SK@def\HAR@checkdef#1#2{%
+ \expandafter\SK@\expandafter\SK@@ref\expandafter{#1}%
+ \SK@HAR@checkdef{#1}{#2}}%
+ \expandafter\let\expandafter
+ \SK@HAR@bi\csname\string\harvarditem\endcsname
+% \end{macrocode}
+% \changes{v3.06}{1995/11/22}
+% {Fix \cs{harvarditem} support}
+% \begin{macrocode}
+ \expandafter\def\csname\string\harvarditem\endcsname[#1]#2#3#4{%
+ \SK@HAR@bi[{#1}]{#2}{#3}{#4}\SK@\SK@@label{#4}}%
+ \fi}
+% \end{macrocode}
+%
+% \changes{v3.17}{2014/04/24}
+% {Change name, redefine \cs{@citex} rather than \cs{cite} for tools/4162}
+% \begin{macrocode}
+\def\SK@citex[#1]#2{%
+ \SK@\SK@@ref{#2}\SK@@citex[{#1}]{#2}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SK@@ref}
+% This is much simpler than the printing of the label, as we know
+% that we can be in horizontal mode.
+% Note extra group for colour safety.
+% \changes{v3.14}{2006/09/25}
+% {Add fix for pdf\TeX.}
+% \changes{v3.16}{2011/11/24}
+% {revert change made at v3.14 because of tools/4173}
+% \begin{macrocode}
+\def\SK@@ref#1>#2\SK@{%
+ \leavevmode\vbox to\z@{{%
+ \vss
+ \SK@refcolor
+ \rlap{\vrule\raise .75em%
+ \hbox{\underbar{\normalfont\footnotesize\ttfamily#2}}}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
diff --git a/macros/latex-dev/required/tools/showkeys.pdf b/macros/latex-dev/required/tools/showkeys.pdf
new file mode 100644
index 0000000000..6b2817a982
--- /dev/null
+++ b/macros/latex-dev/required/tools/showkeys.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/somedefs.dtx b/macros/latex-dev/required/tools/somedefs.dtx
new file mode 100644
index 0000000000..f73a45b787
--- /dev/null
+++ b/macros/latex-dev/required/tools/somedefs.dtx
@@ -0,0 +1,172 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \title{The \textsf{somedefs} toolkit package}
+% \date{long time ago in a different century\ldots}
+% \author{Alan Jeffrey}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+% \changes{v0.03}{1994/06/01}{Use new style error commands. DPC}
+% \changes{v0.02}{1994/05/10}{Added a \cmd\relax, to stop arguments to
+% \cmd\newcommand\ being unbraced by \cmd\ProvidesCommand. Added
+% an error message for commands which are requested but never
+% defined. Spotted by DPC.}
+%
+% \section*{Overview}
+%
+% This is an example `programmers toolkit' package, for use by package
+% writers. It allows package writers to provide options which switch
+% definitions on and off. For example, a package |fred| might define a
+% large number of commands, including |\foo| and |\baz|, so:
+% \begin{verbatim}
+% \usepackage{fred}
+% \end{verbatim}
+% would use a lot of memory, even if |\foo| and |\baz| were the only
+% commands needed. However, if the author of |fred| used the |somedefs|
+% package, then the user would be able to say:
+% \begin{verbatim}
+% \usepackage[only,foo,baz]{fred}
+% \end{verbatim}
+% and only the commands |\foo| and |\baz| would be defined.
+%
+% To use the |somedefs| package in your own packages or classes, you
+% say:
+% \begin{verbatim}
+% \RequirePackage{somedefs}
+% \end{verbatim}
+% You can then use four new commands:
+% \begin{flushleft}\begin{itemize}
+% \item |\UseAllDefinitions| which says that all the commands in the
+% file should be defined.
+% \item |\UseSomeDefinitions| which says that only the commands
+% specified by |\UseDefinition| should be defined.
+% \item |\UseDefinition{|\meta{name}|}| which says that the command
+% |\name| should be defined.
+% \item |\ProvidesDefinition{|\meta{definition}|}| which provides one
+% definition, of the form |\definingcommand{\command}...|
+% \end{itemize}\end{flushleft}
+% For example, the package |fred| could say:
+% \begin{verbatim}
+% \RequirePackage{somedefs}
+% \UseAllDefinitions
+% \DeclareOption{only}{\UseSomeDefinitions}
+% \DeclareOption*{\UseDefinition{\CurrentOption}}
+% \ProcessOptions
+% \ProvidesDefinition{\newcommand{\foo}{...}}
+% \ProvidesDefinition{\newcommand{\baz}{...}}
+% \end{verbatim}
+% One of the commands |\UseAllDefinitions| or |\UseSomeDefinitions|
+% should always be used. You may have some commands which need other
+% commands, in which case you have to declare the options by hand. For
+% example, if the command |\bar| needs the command |\foo|, you could
+% say:
+% \begin{verbatim}
+% \DeclareOption{bar}{\UseDefinition{bar}\UseDefinition{foo}}
+% \end{verbatim}
+% For a longer example of the use of the |somedefs| package, look at the
+% |rawfonts| package.
+%
+% \StopEventually{}
+%
+% \section*{Implementation}
+%
+% The driver for the documentation you're now reading.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\begin{document}
+\DocInput{somedefs.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+% This is a \LaTeXe{} package.
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{somedefs}[1994/06/01 v0.03 Toolkit for optional definitions]
+% \end{macrocode}
+% \begin{macro}{\UseSomeDefinitions}
+% \begin{macro}{\UseAllDefinitions}
+% \begin{macro}{\UseDefinition}
+% \begin{macro}{\ProvidesDefinition}
+% \begin{macro}{\@providesdefinition}
+% \begin{macro}{\@provides@definition}
+% \begin{macro}{\@unprovided@definition}
+% The package works by having |\UseDefinition{|\meta{name}|}| define
+% |\name| to be |\@unprovided@definition|.
+% If |\UseSomeDefinitions| has been called,
+% then |\ProvidesDefinition| looks to see if |\name|
+% is |\@unprovided@definition|. If
+% |\UseAllDefinitions| has been called, then |\ProvidesDefinition|
+% does nothing. If neither has been called, then
+% |\ProvidesDefinition| produces an error message.
+% \begin{macrocode}
+\def\UseSomeDefinitions{%
+ \let\ProvidesDefinition\@providesdefinition
+}
+\def\UseAllDefinitions{%
+ \let\ProvidesDefinition\@firstofone
+}
+\def\UseDefinition#1{%
+ \expandafter\let\csname#1\endcsname\@unprovided@definition
+}
+\def\ProvidesDefinition#1{%
+ \PackageError{somedefs}%
+ {No \noexpand\UseSomeDefinitions or \string\UseAllDefinitions}%
+ {The package which used the `somedefs' package has an error.}%
+}
+\def\@providesdefinition#1{\@provides@definition#1\relax
+ \@provides@definition}
+\def\@provides@definition#1#2#3\@provides@definition{%
+ \ifx#2\@unprovided@definition
+ #1#2#3%
+ \fi
+}
+\def\@unprovided@definition{%
+ \PackageError{somedefs}%
+ {Package `somedefs' error: this command was never defined}%
+ {You have requested a command which does not exist.}%
+}
+\@onlypreamble\UseSomeDefinitions
+\@onlypreamble\UseAllDefinitions
+\@onlypreamble\UseDefinition
+\@onlypreamble\ProvidesDefinition
+\@onlypreamble\@providesdefinition
+\@onlypreamble\@provides@definition
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% That's it!
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+% \endinput
diff --git a/macros/latex-dev/required/tools/somedefs.pdf b/macros/latex-dev/required/tools/somedefs.pdf
new file mode 100644
index 0000000000..b701b5a16e
--- /dev/null
+++ b/macros/latex-dev/required/tools/somedefs.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tabularx.dtx b/macros/latex-dev/required/tools/tabularx.dtx
new file mode 100644
index 0000000000..ff8f3cec9a
--- /dev/null
+++ b/macros/latex-dev/required/tools/tabularx.dtx
@@ -0,0 +1,968 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: tabularx.dtx Copyright (C) 1991-1999 2012 2014 2016 2017 David Carlisle
+%
+%<*dtx>
+ \ProvidesFile{tabularx.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{tabularx}
+%<driver> \ProvidesFile{tabularx.drv}
+% \fi
+% \ProvidesFile{tabularx.dtx}
+ [2016/02/03 v2.11b `tabularx' package (DPC)]
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[infoshow]{tabularx}
+\begin{document}
+ \DocInput{tabularx.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \changes{v1.00}{1992/01/30}{Initial version.}
+% \changes{v1.01}{1992/07/07}{Re-issue for the new doc and docstrip.}
+% \changes{v1.02}{1992/07/17}{Added some support for \cmd\verb}
+% \changes{v1.03}{1992/08/17}
+% {Added \cs{ifnum0}!=`\{\cs{fi}\} brackets after report by
+% Andreas Maassen}
+% \changes{v1.04}{1992/09/02}
+% {fixed \cmd\verb, and support footnotes.}
+% \changes{v1.05}{1992/11/06}
+% {preserve all LaTeX counters}
+% \changes{v1.06}{1993/08/02}
+% {(Martin Schroeder) Support the optional [t] or [b] argument.
+% Also now works with delarray.sty.}
+% \changes{v1.07}{1993/08/27}
+% {Modifications to make this style compatible with calc.sty.}
+% \changes{v2.00}{1994/03/14}
+% {Update to LaTeX2e}
+% \changes{v2.01}{1994/05/22}
+% {New Tracing format.}
+%
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+%
+% \GetFileInfo{tabularx.dtx}
+% \title{The \textsf{tabularx} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle}
+% \date{\filedate}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+% \DeleteShortVerb{\|}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% A new environment, {\ttfamily tabularx}, is defined, which takes the
+% same arguments as {\ttfamily tabular*}, but modifies the widths of
+% certain columns, rather than the inter column space, to set a table
+% with the requested total width. The columns that may stretch are
+% marked with the new token {\ttfamily X} in the preamble argument.
+%
+% This package requires the {\ttfamily array} package.
+% \end{abstract}
+%
+% \section{Introduction}
+% This package implements a version of the {\ttfamily tabular}
+% environment in which the widths of certain columns are calculated so
+% that the table is a specified width. Requests for such an
+% environment seem to occur quite regularly in {\ttfamily
+% comp.text.tex}.
+%
+% \DescribeEnv{tabularx}
+% "\begin{tabularx}{"\meta{width}"}["\meta{pos}"]{"\meta{preamble}"}"\\
+% The arguments of "tabularx" are essentially the same as those of
+% the standard "tabular*" environment. However rather than adding space
+% between the columns to achieve the desired width, it adjusts the
+% widths of some of the columns. The columns which are affected by the
+% {\ttfamily tabularx} environment should be denoted with the letter
+% {\ttfamily X} in the preamble argument. The {\ttfamily X} column
+% specification will be converted to "p{"\meta{some value}"}" once the
+% correct column width has been calculated.
+%
+% \section{Examples}
+%
+% The following table is set with
+% "\begin{tabularx}{250pt}{|c|X|c|X|} ...".
+%
+% \begin{center}
+% \begin{tabularx}{250pt}{|c|X|c|X|}
+% \hline
+% \multicolumn{2}{|c|}{Multicolumn entry!}&
+% THREE&
+% FOUR\\
+% \hline
+% one&
+% \raggedright\arraybackslash The width of this column depends on the
+% width of the table.\footnote
+% {You can now use {\ttfamily \bslash footnote} inside {\ttfamily
+% tabularx}!}&
+% three&
+% \raggedright\arraybackslash Column four will act in the same way as
+% column two, with the same width.\\
+% \hline
+% \end{tabularx}
+% \end{center}
+% If we change the first line to "\begin{tabularx}{300pt}{|c|X|c|X|}" we
+% get:
+% \begin{center}
+% \begin{tabularx}{300pt}{|c|X|c|X|}
+% \hline
+% \multicolumn{2}{|c|}{Multicolumn entry!}&
+% THREE&
+% FOUR\\
+% \hline
+% one&
+% \raggedright\arraybackslash The width of this column depends on the
+% width of the table.&
+% three&
+% \raggedright\arraybackslash Column four will act in the same way as
+% column two, with the same width.\\
+% \hline
+% \end{tabularx}
+% \end{center}
+%
+% \edef\mytt{\expandafter\noexpand\csname
+% mdseries\endcsname\noexpand\ttfamily}
+% \section{Differences between {\mytt tabularx} and {\mytt tabular*}}
+% These two environments take the same arguments, to produce a table of
+% a specified width. The main differences between them are:
+% \begin{itemize}
+% \item {\ttfamily tabularx} modifies the widths of the \emph{columns},
+% whereas {\ttfamily tabular*} modifies the widths of the inter-column
+% \emph{spaces}.
+% \item {\ttfamily tabular} and {\ttfamily tabular*} environments may be
+% nested with no restriction, however if one {\ttfamily tabularx}
+% environment occurs inside another, then the inner one {\em must\/} be
+% enclosed by "{ }".
+% \item The body of the {\ttfamily tabularx} environment is in fact the
+% argument to a command, and so certain constructions which are not
+% allowed in command arguments (like "\verb") may not be used.\footnote
+% {Since Version 1.02, {\ttfamily\bslash verb and \ttfamily\bslash
+% verb*} may be used, but they may treat spaces incorrectly, and the
+% argument can not contain an unmatched {\ttfamily\char`\{} or
+% {\ttfamily\char`\}}, or a {\ttfamily\char`\%} character.}
+% \item {\ttfamily tabular*} uses a primitive capability of \TeX\ to
+% modify the inter column space of an alignment. {\ttfamily tabularx}
+% has to set the table several times as it searches for the best column
+% widths, and is therefore much slower. Also the fact that the body is
+% expanded several times may break certain \TeX\ constructs.
+% \end{itemize}
+%
+% \section{Customising the behaviour of {\mytt tabularx}}
+%
+% \subsection{Terminal output}
+% \DescribeMacro{\tracingtabularx}
+% If this declaration is made, say in the document preamble, then all
+% following {\ttfamily tabularx} environments will print information
+% about column widths as they repeatedly re-set the tables to find the
+% correct widths.
+%
+% As an alternative to using the "\tracingtabularx" declaration, either
+% of the options "infoshow" or "debugshow" may be given, either in the
+% "\usepackage" command that loads "tabularx", or as a global option
+% in the "\documentclass" command.
+%
+% \subsection{The environment used to typeset the {\mytt X} columns}
+% By default the {\ttfamily X} specification is turned into
+% "p{"\meta{some value}"}". Such narrow columns often
+% require a special format, this may be achieved using the ">" syntax
+% of {\ttfamily array.sty}. So for example you may give a specification
+% of ">{\small}X". Another format which is useful in narrow columns is
+% ragged right, however \LaTeX's "\raggedright" macro redefines
+% "\\" in a way which conflicts with its use in a tabular or array
+% environments.
+%\DescribeMacro{\arraybackslash}
+% For this reason this package introduces the command "\arraybackslash",
+% this may be used after a "\raggedright", "\raggedleft" or
+% "\centering" declaration. Thus a {\ttfamily tabularx} preamble may
+% specify\\
+% ">{\raggedright\arraybackslash}X".
+%
+% \DescribeMacro{\newcolumntype}
+% These preamble specifications may of course be saved using the
+% command, "\newcolumntype", defined in {\ttfamily array.sty}. Thus we
+% may say\\
+% "\newcolumntype{Y}{>{\small\raggedright\arraybackslash}X}"\\
+% and then use {\ttfamily Y} in the {\ttfamily tabularx} preamble
+% argument.
+%
+% \DescribeMacro{\tabularxcolumn}
+% The {\ttfamily X} columns are set using the {\ttfamily p} column which
+% corresponds to "\parbox[t]". You may want them set using, say, the
+% {\ttfamily m} column, which corresponds to "\parbox[c]". It is not
+% possible to change the column type using the ">" syntax, so another
+% system is provided. "\tabularxcolumn" should be defined to be a macro
+% with one argument, which expands to the {\ttfamily tabular} preamble
+% specification that you want to correspond to {\ttfamily X}. The
+% argument will be replaced by the calculated width of a column.
+%
+% The default is "\newcommand{\tabularxcolumn}[1]{p{#1}}". So we may
+% change this with a command such as:\\
+% "\renewcommand{\tabularxcolumn}[1]{>{\small}m{#1}}"
+%
+% \subsection{Column widths}
+% Normally all {\ttfamily X} columns in a single table are set to the
+% same width, however it is possible to make {\ttfamily tabularx} set
+% them to different widths.
+% A preamble argument of
+% "{>{\hsize=.5\hsize\linewidth=\hsize}X"\\
+% " >{\hsize=1.5\hsize\linewidth=\hsize}X}"\\
+% specifies two columns, the second will be three times as wide as the
+% first. However if you want to play games like this you should follow
+% the following two rules.
+% \begin{itemize}
+% \item Make sure that the sum of the widths of all the {\ttfamily X}
+% columns is unchanged. (In the above example, the new widths still add
+% up to twice the default width, the same as two standard {\ttfamily X}
+% columns.)
+% \item Do not use "\multicolumn" entries which cross any {\ttfamily X}
+% column.
+% \end{itemize}
+% As with most rules, these may be broken if you know what you are
+% doing.
+%
+% \subsection{If the algorithm fails\ldots}
+% It may be that the widths of the `normal' columns of the table
+% already total more than the requested total
+% width. \textsf{tabularx} refuses to set the
+% \texttt{X} columns to a negative width, so in this case you get a
+% warning ``X Columns too narrow (table too wide)''.
+%
+% The \texttt{X} columns will in this case be set to a width of 1em
+% and so the table itself will be wider than the requested total width
+% given in the argument to the environment.
+% This behaviour of the package can be customised slightly
+% as noted in the documentation of the code section.
+%
+% \StopEventually{}
+%
+% \section{The Macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \changes{v2.00}{1994/02/07}
+% {New Option Handling}
+% \begin{macrocode}
+\DeclareOption{infoshow}{\AtEndOfPackage\tracingtabularx}
+\DeclareOption{debugshow}{\AtEndOfPackage\tracingtabularx}
+\ProcessOptions
+% \end{macrocode}
+%
+% This requires {\ttfamily array.sty}.
+% \changes{v2.00}{1994/02/07}
+% {Use LaTeX2e's \cmd{\RequirePackage} to load array}
+% \begin{macrocode}
+\RequirePackage{array}[1994/02/03]
+% \end{macrocode}
+%
+% First some registers etc.\ that we need.
+% \begin{macrocode}
+\newdimen\TX@col@width
+\newdimen\TX@old@table
+\newdimen\TX@old@col
+\newdimen\TX@target
+\newdimen\TX@delta
+\newcount\TX@cols
+\newif\ifTX@
+% \end{macrocode}
+%
+% Now a trick to get the body of an environment into a token register,
+% without doing any expansion. This does not do any real checking of
+% nested environments, so if you should need to nest one {\ttfamily
+% tabularx} inside another, the inner one must be surrounded by "{ }".
+%
+% \begin{macro}{\tabularx}
+% Prior to v1.06, this macro took two arguments, which were saved in
+% separate registers before the table body was saved by "\TX@get@body".
+% Unfortunately this disables the "[t]" optional argument. Now just save
+% the width specification separately, then clear the token register
+% "\toks@".
+% Finally call "\TX@get@body" to begin saving the body of the table.
+% The "{\ifnum0=`}\fi" was added at v1.03, to allow "tabularx" to appear
+% inside a "\halign".^^A
+% \setbox0=\hbox{\footnotesize"\iffalse{\fi\ifnum0=`}\fi"}^^A
+% \setbox2=\hbox{\footnotesize"\ifnum0=`{}\fi"}^^A
+% \footnote{This adds an extra level of grouping,
+% which is not really needed. Instead, I could use \box0\ here, and
+% \box2\ below, however the code here would then have to be moved after
+% the first line, because of the footnote to page 386 of the \TeX{}Book,
+% and I do not think I should be writing code that is so obscure as to
+% be documented in a footnote in an appendix called ``Dirty Tricks''!}
+%
+% This mechanism of grabbing an environment body does have the
+% disadvantage (shared with the AMS alignment environments) that you
+% can not make extension environments by code such as
+%\begin{verbatim}
+%\newenvironment{foo}{\begin{tabularx}{XX}}{\end{tabularx}}
+%\end{verbatim}
+% as the code is looking for a literal string "\end{tabularx}" to stop
+% scanning. Since version 2.02, one may avoid this problem by using
+% "\tabularx" and "\endtabularx" directly in the definition:
+%\begin{verbatim}
+%\newenvironment{foo}{\tabularx{XX}}{\endtabularx}
+%\end{verbatim}
+% The scanner now looks for the end of the current environment ("foo" in
+% this example.) There are some restrictions on this usage, the
+% principal one being that "\endtabularx" must not be inside any "{ }" pairs
+% ao that the code before "\endtabularx" may be extracted and added to the table body
+% (prior to version 2.09 "\endtabularx" had to be
+% the \emph{first} token of the `end code' of the environment).
+% \begin{macrocode}
+\def\tabularx#1{%
+% \end{macrocode}
+% \changes{v2.02}{1995/03/20}
+% {New local setting of \cs{TX@}}
+% \changes{v4.09}{1998/05/13}
+% {Use \cs{setlength}, so that calc extensions apply. tools/2793}
+% Allow "\tabularx" "\endtabularx" (but not "\begin{tabularx}"
+% "\end{tabularx}") to be used in "\newenvironment" definitions.
+% \begin{macrocode}
+\edef\TX@{\@currenvir}%
+ {\ifnum0=`}\fi
+% \end{macrocode}
+% "\relax" added at v1.05 so that non-expandable length tokens, like
+% "\textwidth" do not generate an extra space, and an overfull box.
+% "\relax" removed again at v4.09 in favour of "\setlength" so if you
+% use the calc package you can use a width of "(\textwidth-12pt)/2".
+% \begin{macrocode}
+ \setlength\TX@target{#1}%
+ \TX@typeout{Target width: #1 = \the\TX@target.}%
+ \toks@{}\TX@get@body}
+% \end{macrocode}
+% \end{macro}
+%
+
+% \begin{macro}{\endtabularx}
+% This does not do very much\ldots
+% \changes{v2.02}{1995/03/20}
+% {Macro added}
+% \begin{macrocode}
+\let\endtabularx\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@get@body}
+% Place all tokens as far as the first "\end" into a token register.
+% Then call "\TX@find@end" to see if we are at "\end{tabularx}".
+% \begin{macrocode}
+\long\def\TX@get@body#1\end
+ {\toks@\expandafter{\the\toks@#1}\TX@find@end}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@find@end}
+% If we are at "\end{tabularx}", call "\TX@endtabularx", otherwise
+% add "\end{...}" to the register, and call "\TX@get@body" again.
+% \begin{macrocode}
+\def\TX@find@end#1{%
+ \def\@tempa{#1}%
+ \ifx\@tempa\TX@\expandafter\TX@endtabularx
+ \else\toks@\expandafter
+ {\the\toks@\end{#1}}\expandafter\TX@get@body\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@find@endtabularxa}
+% \changes{v2.09}{2014/04/22}{macro added}
+% \changes{v2.10}{2014/05/13}{macro modified to test for missing \cs{endtabularx}}
+% \changes{v2.11}{2016/01/03}{Fix to previous change to guard against empty arg 2. (Ulrike Fischer)}
+% split up the end code, and extract the part that lives in the table body.
+% \begin{macrocode}
+\long\def\TX@find@endtabularxa
+ #1\endtabularx#2\endtabularx#3\TX@find@endtabularxa{%
+ \ifx\TX@#2\relax\else
+ \toks@\expandafter{\the\toks@#1}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\TX@find@endtabularxb}
+% \changes{v2.09}{2014/04/22}{macro added}
+% \changes{v2.10}{2014/05/13}{macro modified to test for missing \cs{endtabularx}}
+% split up the end code, and extract the part that lives outside the table body.
+% \begin{macrocode}
+\long\def\TX@find@endtabularxb
+ #1\endtabularx#2\endtabularx#3\TX@find@endtabularxb{%
+ \ifx\TX@#2%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@find@endtabularxbb}
+% \changes{v2.10}{2014/05/13}{macro added}
+% Helper to avoid needing 15 consecutive "expandafter"
+% \begin{macrocode}
+\def\TX@find@endtabularxbb{%
+ \expandafter\expandafter\expandafter
+ \TX@find@endtabularxb
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@}
+% The string {\ttfamily tabularx} as a macro for testing with "\ifx".
+% \begin{macrocode}
+\def\TX@{tabularx}
+% \end{macrocode}
+% \end{macro}
+%
+% Now that all the parts of the table specification are stored in
+% registers, we can begin the work of setting the table.
+%
+% The algorithm for finding the correct column widths is as follows.
+% Firstly set the table with each {\ttfamily X} column the width of the
+% final table. Assuming that there is at least one {\ttfamily X} column,
+% this will produce a table that is too wide. Divide the excess width by
+% the number of {\ttfamily X} columns, and reduce the column width by
+% this amount. Reset the table. If the table is not now the correct
+% width, a "\multicolumn" entry must be `hiding' one of the {\ttfamily
+% X} columns, and so there is one less {\ttfamily X} column affecting
+% the width of the table. So we reduce by 1 the number of X columns and
+% repeat the process.
+%
+% \begin{macro}{\TX@endtabularx}
+% Although I have tried to make {\ttfamily tabularx} look like an
+% environment, it is in fact a command, all the work is done by this
+% macro.
+% \begin{macrocode}
+\def\TX@endtabularx{%
+% \end{macrocode}
+% \changes{v2.09}{2014/04/22}{call to \cs{TX@find@endtabularxa} added}
+% \changes{v2.10}{2014/05/13}{macro modified to test for missing \cs{endtabularx}}
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter
+ \TX@find@endtabularxa\csname end\TX@\endcsname
+ \endtabularx\TX@\endtabularx\TX@find@endtabularxa
+% \end{macrocode}
+% Define the {\ttfamily X} column, with an internal version of the
+% "\newcolumntype" command. The "\expandafter" commands enable
+% "\NC@newcol" to get the {\em expansion} of\\
+% "\tabularxcolumn{\TX@col@width}" as its
+% argument. This will be the definition of an {\ttfamily X} column, as
+% discussed in section 4.
+% \begin{macrocode}
+ \expandafter\TX@newcol\expandafter{\tabularxcolumn{\TX@col@width}}%
+% \end{macrocode}
+% Initialise the column width, and the number of {\ttfamily X} columns.
+% The number of {\ttfamily X} columns is set to one, which means that
+% the initial count will be one too high, but this value is decremented
+% before it is used in the main loop.
+%
+% Since v1.02, switch the definition of "\verb".
+% \begin{macrocode}
+ \let\verb\TX@verb
+% \end{macrocode}
+% Since v1.05, save the values of all \LaTeX\ counters, the list
+% "\cl@@ckpt" contains the names of all the \LaTeX\ counters that have
+% been defined so far. We expand "\setcounter" at this point, as it
+% results in fewer tokens being stored in "\TX@ckpt", but the actual
+% resetting of the counters occurs when "\TX@ckpt" is expanded after
+% each trial run.
+% Actually since v1.07, use something equivalent to the expansion of the
+% original definition of "\setcounter", so that "tabularx" works in
+% conjunction with "calc.sty".
+% \begin{macrocode}
+ \def\@elt##1{\global\value{##1}\the\value{##1}\relax}%
+ \edef\TX@ckpt{\cl@@ckpt}%
+ \let\@elt\relax
+ \TX@old@table\maxdimen
+ \TX@col@width\TX@target
+ \global\TX@cols\@ne
+% \end{macrocode}
+% Typeout some headings (unless this is disabled).
+% \begin{macrocode}
+ \TX@typeout@
+ {\@spaces Table Width\@spaces Column Width\@spaces X Columns}%
+% \end{macrocode}%
+% First attempt. Modify the {\ttfamily X} definition to count {\ttfamily
+% X} columns.
+% \begin{macrocode}
+ \TX@trial{\def\NC@rewrite@X{%
+ \global\advance\TX@cols\@ne\NC@find p{\TX@col@width}}}%
+% \end{macrocode}
+% Repeatedly decrease column width until table is the correct width,
+% or stops shrinking, or the columns become two narrow.
+% If there are no multicolumn entries, this will only take one attempt.
+% \begin{macrocode}
+ \loop
+ \TX@arith
+ \ifTX@
+ \TX@trial{}%
+ \repeat
+% \end{macrocode}
+% One last time, with warnings back on (see appendix D)
+% use {\ttfamily tabular*} to put it in a box of the right size, in case
+% the algorithm failed to find the correct size.
+%
+% Since v1.04, locally make "\footnotetext" save its argument in a token
+% register.
+% Since v1.06, "\toks@" contains the preamble specification,
+% and possible optional argument, as well as the table body.
+% \begin{macrocode}
+ {\let\@footnotetext\TX@ftntext\let\@xfootnotenext\TX@xftntext
+ \csname tabular*\expandafter\endcsname\expandafter\TX@target
+ \the\toks@
+ \csname endtabular*\endcsname}%
+% \end{macrocode}
+% Now the alignment is finished, and the "}" has restored the original
+% meaning of "\@footnotetext" expand the register "\TX@ftn" which will
+% execute a series of\\
+% "\footnotetext["\meta{num}"]{"\meta{note}"}"\\
+% commands. We need to be careful about clearing the register as we may
+% be inside a nested {\ttfamily tabularx}.
+% \begin{macrocode}
+ \global\TX@ftn\expandafter{\expandafter}\the\TX@ftn
+% \end{macrocode}
+% Now finish off the {\ttfamily tabularx} environment. Note that we need
+% "\end{tabularx}" here as the "\end{tabularx}" in the user's
+% file is never expanded. Now use "\TX@" rather than "tabularx".
+% \changes{v2.02}{1995/03/20}
+% {Close the environment \cs{TX@} rather than `tabularx'}
+%
+% We also need to finish off the group started by "{\ifnum0=`}\fi" in
+% the macro "\tabularx".
+% \begin{macrocode}
+ \ifnum0=`{\fi}%
+% \end{macrocode}
+% \changes{v2.09}{2014/04/22}{call to \cs{TX@find@endtabularxb} added}
+% \changes{v2.10}{2014/05/13}{macro modified to test for missing \cs{endtabularx}}
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter
+ \TX@find@endtabularxbb
+ \expandafter\end\expandafter{\TX@}%
+ \endtabularx\TX@\endtabularx\TX@find@endtabularxb
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\TX@arith}
+% Calculate the column width for the next try, setting the flag
+% "\ifTX@" to false if the loop should be aborted.
+% \begin{macrocode}
+\def\TX@arith{%
+ \TX@false
+% \end{macrocode}
+% \changes{v2.08}{2012/02/06}{Avoid exceeding maxdimen during trials}
+% \begin{macrocode}
+ \@tempdimb\maxdimen
+ \divide\@tempdimb\TX@cols
+ \ifdim\TX@col@width>\@tempdimb
+ \TX@typeout@{Don't exceed \maxdimen}%
+ \wd\@tempboxa\maxdimen
+ \fi
+ \ifdim\TX@old@table=\wd\@tempboxa
+% \end{macrocode}
+% If we have reduced the column width, but the table width has not
+% changed, we stop the loop, and output the table (which will cause an
+% over-full alignment) with the previous value of "\TX@col@width".
+% \begin{macrocode}
+ \TX@col@width\TX@old@col
+ \TX@typeout@{Reached minimum width, backing up.}%
+ \else
+% \end{macrocode}
+% Otherwise calculate the amount by which the current table is too wide.
+% \begin{macrocode}
+ \dimen@\wd\@tempboxa
+ \advance\dimen@ -\TX@target
+ \ifdim\dimen@<\TX@delta
+% \end{macrocode}
+% If this amount is less than "\TX@delta", stop. ("\TX@delta"
+% should be non-zero otherwise we may miss the target due to rounding
+% error.)
+% \begin{macrocode}
+ \TX@typeout@{Reached target.}%
+ \else
+% \end{macrocode}
+% Reduce the number of effective {\ttfamily X} columns by one. (Checking
+% that we do not get 0, as this would produce an error later.) Then
+% divide excess width by the number of effective columns, and calculate
+% the new column width. Temporarily store this value (times $-1$) in
+% "\dimen@".
+% \begin{macrocode}
+ \ifnum\TX@cols>\@ne
+ \advance\TX@cols\m@ne
+ \fi
+ \divide\dimen@\TX@cols
+ \advance\dimen@ -\TX@col@width
+ \ifdim \dimen@ >\z@
+% \end{macrocode}
+% If the new width would be too narrow, abort the loop. At the moment
+% too narrow, means less than 0\,pt!
+%
+% Prior to v2.03, if the loop was aborted here, the X columns were left
+% with the width of the previous run, but this may make the table far
+% too wide as initial guesses are always too big. Now force to
+% "\TX@error@width" which defaults to be 1em. If you want to
+% get the old behaviour stick\\
+% "\renewcommand\TX@error@width{\TX@col@width}"\\
+% in a package file loaded after \textsf{tabularx}.
+% \changes{v2.03}{1997/02/20}{Improve warning message and force to 1em.}
+% \begin{macrocode}
+ \PackageWarning{tabularx}%
+ {X Columns too narrow (table too wide)\MessageBreak}%
+ \TX@col@width\TX@error@width\relax
+ \else
+% \end{macrocode}
+% Otherwise save the old settings, and set the new column width. Set the
+% flag to true so that the table will be set, and the loop will be
+% executed again.
+% \begin{macrocode}
+ \TX@old@col\TX@col@width
+ \TX@old@table\wd\@tempboxa
+ \TX@col@width-\dimen@
+ \TX@true
+ \fi
+ \fi
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@error@width}
+% \changes{v2.03}{1997/02/20}{macro added.}
+% \changes{v2.04}{1997/02/26}{spurious brace removed.}
+% If the calculated width is negative, use this instead.
+% \begin{macrocode}
+\def\TX@error@width{1em}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@delta}
+% Accept a table that is within "\hfuzz" of the correct width.
+% \begin{macrocode}
+\TX@delta\hfuzz
+% \end{macrocode}
+% \end{macro}
+%
+% Initialise the {\ttfamily X} column. The definition can be empty here,
+% as it is set for each {\ttfamily tabularx} environment.
+% \begin{macrocode}
+\newcolumntype{X}{}
+% \end{macrocode}
+%
+% \begin{macro}{\tabularxcolumn}
+% The default definition of {\ttfamily X} is "p{#1}".
+% \begin{macrocode}
+\def\tabularxcolumn#1{p{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@newcol}
+% A little macro just used to cut down the number of "\expandafter"
+% commands needed.
+% \begin{macrocode}
+\def\TX@newcol{\newcol@{X}[0]}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@trial}
+% Make a test run.
+% \begin{macrocode}
+\def\TX@trial#1{%
+ \setbox\@tempboxa\hbox{%
+% \end{macrocode}
+% Any extra commands. This is used on the first run to count the number
+% of {\ttfamily X} columns.
+% \begin{macrocode}
+ #1\relax
+% \end{macrocode}
+% Since v1.04, make "\footnotetext" gobble its arguments. Also locally
+% clear "\TX@vwarn" so that the warning is generated by the {\ttfamily
+% final} run, and does not appear in the middle of the table if
+% "\tracingtabularx".
+% \begin{macrocode}
+ \let\@footnotetext\TX@trial@ftn
+ \let\TX@vwarn\@empty
+% \end{macrocode}
+% Do not nest {\ttfamily tabularx} environments during trial runs. This
+% would waste time, and the global setting of "\TX@cols" would break the
+% algorithm.
+% \begin{macrocode}
+ \expandafter\let\expandafter\tabularx\csname tabular*\endcsname
+ \expandafter\let\expandafter\endtabularx\csname endtabular*\endcsname
+% \end{macrocode}
+% Added at v1.05: disable "\write"s during a trial run. This trick is
+% from the \TeX{}Book.\footnote{Actually the \TeX{}Book trick does
+% not work correctly, so changed for v2.05.}
+% \changes{v2.05}{1997/09/18}
+% {New \cs{write} trick. tools/2607}
+% \changes{v2.07}{1999/01/07}
+% {Newer \cs{write} trick. tools/2792}
+% \begin{macrocode}
+ \def\write{\begingroup
+ \def\let{\afterassignment\endgroup\toks@}%
+ \afterassignment\let\count@}%
+% \end{macrocode}
+% Turn off warnings (see appendix D). Also prevent them being turned
+% back on by setting the parameter names to be registers.
+% \begin{macrocode}
+ \hbadness\@M
+ \hfuzz\maxdimen
+ \let\hbadness\@tempcnta
+ \let\hfuzz\@tempdima
+% \end{macrocode}
+% Make the table, and finish the hbox.
+% Since v1.06, "\toks@" contains the preamble specification,
+% and possible optional argument, as well as the table body.
+% \begin{macrocode}
+ \expandafter\tabular\the\toks@
+ \endtabular}%
+% \end{macrocode}
+% Since v1.05 reset all \LaTeX\ counters, by executing "\TX@ckpt".
+% \begin{macrocode}
+ \TX@ckpt
+% \end{macrocode}
+% Print some statistics.
+% Added "\TX@align" in v1.05, to line up the columns.
+% \begin{macrocode}
+ \TX@typeout@{\@spaces
+ \expandafter\TX@align
+ \the\wd\@tempboxa\space\space\space\space\space\@@
+ \expandafter\TX@align
+ \the\TX@col@width\space\space\space\space\space\@@
+ \@spaces\the\TX@cols}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@align}
+% Macro added at v1.05, to improve the printing of the tracing info.
+% \begin{macrocode}
+\def\TX@align#1.#2#3#4#5#6#7#8#9\@@{%
+ \ifnum#1<10 \space\fi
+ \ifnum#1<100 \space\fi
+ \ifnum#1<\@m\space\fi
+ \ifnum#1<\@M\space\fi
+ #1.#2#3#4#5#6#7#8\space\space}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\arraybackslash}
+% "\\" hack.
+% \changes{v2.08}{2012/02/06}{Don't define this if already defined by newer array package and use tabularnewline now this is in 2e.}
+% \begin{macrocode}
+\ifx\arraybackslash\@undefined
+\def\arraybackslash{\let\\\tabularnewline}
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tracingtabularx}
+% Print statistics on column and table widths.
+% \begin{macrocode}
+\def\tracingtabularx{%
+ \def\TX@typeout{\PackageWarningNoLine{tabularx}}%
+ \def\TX@typeout@##1{\typeout{(tabularx) ##1}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@typeout}
+% The default is to be to be quiet
+% \begin{macrocode}
+\let\TX@typeout\@gobble
+\let\TX@typeout@\@gobble
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@ftn}
+% A token register for saving footnote texts.
+% \begin{macrocode}
+\newtoks\TX@ftn
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@ftntext}
+% \begin{macro}{\TX@xftntext}
+% Inside the alignment just save up the footnote text in a token
+% register.
+% \begin{macrocode}
+\long\def\TX@ftntext#1{%
+ \edef\@tempa{\the\TX@ftn\noexpand\footnotetext
+ [\the\csname c@\@mpfn\endcsname]}%
+ \global\TX@ftn\expandafter{\@tempa{#1}}}%
+\long\def\TX@xftntext[#1]#2{%
+ \global\TX@ftn\expandafter{\the\TX@ftn\footnotetext[#1]{#2}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\TX@trial@ftn}
+% On trial runs, gobble footnote texts.
+% \begin{macrocode}
+\long\def\TX@trial@ftn#1{}
+% \end{macrocode}
+% \end{macro}
+%
+% This last section was added at Version 1.02. Previous versions
+% documented the fact that "\verb" did not work inside {\ttfamily
+% tabularx}, but that did not stop people using it! This usually put
+% \LaTeX\ into an irrecoverable error position, with error messages that
+% did not mention the cause of the error. The `poor man's "\verb"' (and
+% "\verb*") defined here is based on page 382 of the \TeX{}Book. As
+% explained there, doing verbatim this way means that spaces are not
+% treated correctly, and so "\verb*" may well be useless, however I
+% consider this section of code to be error-recovery, rather than a real
+% implementation of verbatim.
+%
+% The mechanism is quite general, and any macro which wants to allow a
+% form of "\verb" to be used within its argument may
+% "\let\verb=\TX@verb". (Making sure to restore the real definition
+% later!)
+%
+% "\verb" and "\verb*" are subject to the following restrictions:
+% \begin{enumerate}
+% \item Spaces in the argument are not read verbatim, but may be skipped
+% according to \TeX's usual rules.
+% \item Spaces will be added to the output after control words, even if
+% they were not present in the input.
+% \item Unless the argument is a single space, any trailing space,
+% whether in the original argument, or added as in (2),
+% will be omitted.
+% \item The argument must not end with "\", so "\verb|\|" is not
+% allowed, however, because of (3), "\verb|\ |" produces
+% "\".
+% \item The argument must be balanced with respect to "{" and "}". So
+% "\verb|{|" is not allowed.
+% \item A comment character like "%" will not appear verbatim. It will
+% act as usual, commenting out the rest of the input line!
+% \item The combinations "?`" and "!`" will appear as
+% {\ttfamily?`} and {\ttfamily!`} if the {\ttfamily cmtt} font is
+% being used.
+% \end{enumerate}
+%
+% \begin{macro}{\TX@verb}
+% The internal definition of "\verb". Spaces will be replaced by "~", so
+% for the star-form, "\let" "~" be \verb*| |, which we obtain as
+% "\uppercase{*}". Use "{\ifnum0=`}\fi" rather than "\bgroup" to allow
+% "&" to appear in the argument.
+% \begin{macrocode}
+{\uccode`\*=`\ %
+\uppercase{\gdef\TX@verb{%
+ \leavevmode\null\TX@vwarn
+ {\ifnum0=`}\fi\ttfamily\let\\\ignorespaces
+ \@ifstar{\let~*\TX@vb}{\TX@vb}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@vb}
+% Get the `almost verbatim' text using "\meaning". The `"!"' is added to
+% the front of the user supplied text, to ensure that the whole argument
+% does not consist of a single "{ }" group. \TeX\ would strip the outer
+% braces from such a group. The `"!"' will be removed later.
+%
+% Originally I followed Knuth, and had "\def\@tempa{##1}", however this
+% did not allow "#" to appear in the argument. So in v1.04, I changed
+% this to to use a token register, and "\edef". This allows "#" appear,
+% but makes each one appear twice!, so later we loop through, replacing
+% "##" by "#".
+% \begin{macrocode}
+\def\TX@vb#1{\def\@tempa##1#1{\toks@{##1}\edef\@tempa{\the\toks@}%
+ \expandafter\TX@v\meaning\@tempa\\ \\\ifnum0=`{\fi}}\@tempa!}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@v}
+% Strip the initial segment of the "\meaning", including the `"!"'
+% added earlier.
+% \begin{macrocode}
+\def\TX@v#1!{\afterassignment\TX@vfirst\let\@tempa= }
+% \end{macrocode}
+% \end{macro}
+%
+% As explained above we are going to replace "##" pairs by "#". To do
+% this we need non-special "#" tokens. Make "*" into a parameter
+% token so that we can define macros with arguments. The normal meanings
+% will be restored by the "\endgroup" later.
+% \begin{macrocode}
+\begingroup
+\catcode`\*=\catcode`\#
+\catcode`\#=12
+% \end{macrocode}
+%
+% \begin{macro}{\TX@vfirst}
+% As a special case, prevent the first character from being dropped.
+% This makes "\verb*| |" produce \verb*| |. Then call "\TX@v@".
+% This is slightly tricky since v1.04, as I have to ensure that an
+% actual "#" rather than a command "\let" to "#" is passed on if the
+% first character is "#".
+% \begin{macrocode}
+\gdef\TX@vfirst{%
+ \if\@tempa#%
+ \def\@tempb{\TX@v@#}%
+ \else
+ \let\@tempb\TX@v@
+ \if\@tempa\space~\else\@tempa\fi
+ \fi
+ \@tempb}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@v@}
+% Loop through the "\meaning", replacing all spaces by "~". If the last
+% character is a space it is dropped, so that "\verb*|\LaTeX|" produces
+% "\LaTeX" not \verb*|\LaTeX |. The rewritten tokens are then further
+% processed to replace "##" pairs.
+% \begin{macrocode}
+\gdef\TX@v@*1 *2{%
+ \TX@v@hash*1##\relax\if*2\\\else~\expandafter\TX@v@\fi*2}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\TX@v@hash}
+% The inner loop, replacing "##" by "#".
+% \begin{macrocode}
+\gdef\TX@v@hash*1##*2{*1\ifx*2\relax\else#\expandafter\TX@v@hash\fi*2}
+% \end{macrocode}
+% \end{macro}
+%
+% As promised, we now restore the normal meanings of "#" and "*".
+% \begin{macrocode}
+\endgroup
+% \end{macrocode}
+%
+% \begin{macro}{\TX@vwarn}
+% Warn the user the first time this "\verb" is used.
+% \begin{macrocode}
+\def\TX@vwarn{%
+ \@warning{\noexpand\verb may be unreliable inside tabularx}%
+ \global\let\TX@vwarn\@empty}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+\endinput
diff --git a/macros/latex-dev/required/tools/tabularx.ins b/macros/latex-dev/required/tools/tabularx.ins
new file mode 100644
index 0000000000..06308d7735
--- /dev/null
+++ b/macros/latex-dev/required/tools/tabularx.ins
@@ -0,0 +1,74 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+\generate{\file{tabularx.sty}{\from{tabularx.dtx}{package}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/tabularx.pdf b/macros/latex-dev/required/tools/tabularx.pdf
new file mode 100644
index 0000000000..83d15b9119
--- /dev/null
+++ b/macros/latex-dev/required/tools/tabularx.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/theorem.dtx b/macros/latex-dev/required/tools/theorem.dtx
new file mode 100644
index 0000000000..6f745d016e
--- /dev/null
+++ b/macros/latex-dev/required/tools/theorem.dtx
@@ -0,0 +1,1144 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%
+%%
+%
+%
+\def\FMithmInfo{2014/10/28 v2.2c Theorem extension package (FMi)}
+%
+% \ProvidesFile{theorem.dtx}[\FMithmInfo]
+%\iffalse % this is a METACOMMENT !
+%%
+%% Package `theorem' to use with LaTeX2e
+%% Copyright (C) 1989-1995 Frank Mittelbach, all rights reserved.
+%<+package>\@ifundefined{theorem@style}{}{\endinput}
+%<+package>\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+%<+package>\ProvidesPackage{theorem}
+%<+package> [\FMithmInfo]
+%
+% \fi
+%
+% \changes{v1.0}{87/05/07}{First draft.}
+% \changes{v1.0a}{87/05/07}{`thistheoremstyle' added.}
+% \changes{v1.1a}{87/07/29}{New concept: redefine the internal
+% \protect\LaTeX{} commands `@xnthm' etc.}
+% \changes{v1.1b}{87/07/31}{`theoremfont' used to specify font.}
+% \changes{v1.2a}{88/01/08}{`@endtheorem' now globally defined.}
+% \changes{v1.2b}{88/01/11}{`newtheorem' only allowed in the preamble.}
+% \changes{v1.3a}{88/02/14}{`theoremfont' now a toks register.}
+%
+% \changes{v2.0a}{88/11/16}{New implementation and new documentation.}
+% \changes{v2.0a}{88/11/16}{No layout changes but internal modifications
+% old substyles won't work.}
+% \changes{v2.0b}{89/01/30}{`global' used for all definitions.}
+% \changes{v2.0c}{89/06/15}{Documentation translated to English.
+% Thanks to LLL and Nina}
+% \changes{v2.1a}{90/02/15}{Support for new font selection.}
+% \changes{v2.2a}{94/02/03}{Cleanup for LaTeX2e}
+%
+% \DoNotIndex{\@endparenv,\@ifdefinable,\@ifnextchar,\@ifundefined}
+% \DoNotIndex{\@namedef,\@nameuse,\@spaces,\@tempa,\@warning}
+% \DoNotIndex{\ }
+% \DoNotIndex{\begingroup,\bfseries}
+% \DoNotIndex{\csname}
+% \DoNotIndex{\def,\do,\docdate}
+% \DoNotIndex{\endcsname,\endgroup,\endinput,\endtrivlist,\expandafter}
+% \DoNotIndex{\filedate,\fileversion}
+% \DoNotIndex{\gdef,\global}
+% \DoNotIndex{\hbox,\hskip}
+% \DoNotIndex{\ignorespaces,\input,\itshape,\item}
+% \DoNotIndex{\labelsep,\let,\llap}
+% \DoNotIndex{\makeatletter}
+% \DoNotIndex{\noexpand}
+% \DoNotIndex{\refstepcounter,\relax,\rlap}
+% \DoNotIndex{\setlength,\slshape,\space,\string,\strut}
+% \DoNotIndex{\the,\trivlist,\typeout}
+% \DoNotIndex{\vbox}
+% \DoNotIndex{\xdef}
+%
+% \def\deflabel#1{\ttfamily #1\hfill}
+% \def\deflist#1{\begin{list}{}{\settowidth\labelwidth{\ttfamily #1}%
+% \setlength\leftmargin\labelwidth
+% \addtolength\leftmargin\labelsep
+% \let\makelabel\deflabel}}
+% \def\enddeflist{\end{list}}
+% \def\envfont{\normalfont\ttfamily}
+%
+% \MakeShortVerb{\|}
+%
+% \newcommand{\TUB}{{\sl TUGboat\/}}
+%
+% \GetFileInfo{theorem.dtx}
+% \title{An Extension of the
+% \LaTeX{} theorem environment\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{Frank Mittelbach}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% \begin{abstract}
+% The macros described in this paper yield an extension of the
+% \LaTeX{} theorem mechanism. It is designed is to satisfy the
+% different requirements of various journals. Thus, the
+% layout of the ``theorems'' can be manipulated by determining a
+% ``style''. This article describes not only the use, but
+% also the definition, of the necessary macros.
+% \end{abstract}
+%
+% \section*{Preface to version 2.2}
+%
+% For \LaTeXe{} this package did not need any fundamental changes. I
+% only modified the messages generated so that theorem layout styles
+% will show up with the |\listfiles| command and cleaned the section
+% on the New Font Selection Scheme since this is now included in
+% \LaTeX.
+%
+% \section*{Preface to version 2.1}
+%
+% This version is identical to 2.0g described in \TUB\ 10\#3 except
+% for some internal defaults which are now set depending on the used
+% font selection scheme.
+%
+% This was done to avoid unpleasant surprises if the new font selection
+% scheme is in force. For further details see
+% section~\ref{sec:newfonts} and \cite{bk:GMS94}.
+%
+% \section{Introduction}
+%
+% For our purposes here, ``theorems'' are labelled enunciations,
+% often set off from the main text by extra space and a font change.
+% Theorems, corollaries, conjectures, definitions, and remarks
+% are all instances of ``theorems''. The ``header'' of these structures
+% is composed of a label (such as \textsc{Theorem} or \textsc{Remark})
+% and a number which serializes an item in the sequence of items
+% with the same label.
+%
+% Shortly after the introduction of \LaTeX{} at the Fachbereich
+% Mathematik in Mainz, the desire to manipulate the layout of
+% ``theorems'' arose. In Mainz, the following two conventions came
+% into general use:
+% \begin{enumerate}
+% \item The number of the theorem is shown in the margin.
+% \item There is a line break at
+% the end of the theorem header.
+% \end{enumerate}
+%
+% Additionally, some journals require different formats which depend on
+% the ``sort of theorem'': e.g.\ often remarks and definitions are set
+% in |\upshape|, while |\itshape| is employed for main theorems.
+%
+% Confronted with these requirements, a theorem environment was
+% developed in Mainz which allows separate determination of the
+% layout of the ``theorems sets'', comparable to |\pagestyle|.
+%
+%
+% \section{The user interface}
+% \subsection{Defining new theorem sets}
+%
+% \DescribeMacro\newtheorem
+% As in the original \LaTeX{} version, the command |\newtheorem|
+% defines a new ``theorem set'' or ``theorem-like structure''.
+% Two required arguments name the new environment and give the text
+% to be typeset with each instance of the new ``set'', while
+% an optional argument determines how
+% the ``set'' is enumerated:
+% \begin{description}
+% \item[\ttfamily \bslash newtheorem\{foo\}\{bar\}]
+% The theorem set {\envfont foo} (whose name is \texttt{bar})
+% uses its own counter.
+% \item[\ttfamily \bslash newtheorem\{foo2\}{[foo]}\{bar2\}]
+% The theorem set {\envfont foo2} (printed name \texttt{bar2})
+% uses the same counter as the theorem set \texttt{foo}.
+% \item[\ttfamily \bslash newtheorem\{foo3\}\{bar3\}{[section]}]
+% The theorem set {\envfont foo3} (printed name \texttt{bar3}) is
+% enumerated within the counter \texttt{section}, i.e.\ with every
+% new |\section| the enumeration begins again with 1, and
+% the enumeration is composed from the section-number and the
+% theorem counter itself.
+% \end{description}
+%
+% \DescribeMacro\theoremstyle
+% Additionally, the command |\theoremstyle| can define the layout
+% of various, or all, theorem sets. It should be noted that any
+% theorem set defined by |\newtheorem| is typeset in the
+% |\theoremstyle| that is current at the time of the definition.
+% Thus, the following
+% \begin{verbatim}
+% \theoremstyle{break} \newtheorem{Cor}{Corollary}
+% \theoremstyle{plain} \newtheorem{Exa}{Example}[section]
+%\end{verbatim} ^^A No blank at line start
+% leads to the result that the set {\envfont Cor} is formatted in the
+% style \texttt{break}, while the set {\envfont Exa} and all the
+% following ones are formatted in the style \texttt{plain}, unless
+% another |\theoremstyle| follows. Since the definitions installed by
+% |\newtheorem| are global, one also can limit |\theoremstyle| locally
+% by grouping braces.
+%
+% \DescribeMacro\theorembodyfont
+% The choice of the font for the theorem body is completely
+% independent of the chosen |\theoremstyle|; this has proven to
+% be very advantageous. For example,
+% \begin{verbatim}
+% {\theorembodyfont{\upshape} \newtheorem{Rem}{Remark}}
+%\end{verbatim}
+% defines a theorem set {\envfont Rem}, which will be set in
+% |\upshape| in the current layout (which in our example is
+% \texttt{plain}). As with |\theoremstyle|, the |\theorembodyfont|
+% chosen is that current at the time of |\newtheorem|. If
+% |\theorembodyfont| is not specified or one defines
+% |\theorembodyfont{}|, then the font used will be that defined by the
+% |\theoremstyle|.
+%
+% \DescribeMacro\theoremheaderfont It is also possible to customize
+% the font used for the theorem headers. This is, however, a global
+% declaration, and therefore there should be at most one
+% |\theoremheaderfont| declaration in the preamble.\footnote{If it is
+% actually necessary to have different header fonts, one has to define
+% new theorem styles (substituting the desired font) or specify the
+% information directly in the \texttt{\bslash newtheorem} declaration
+% (the unclean variant).}
+%
+% \DescribeMacro\theorempreskipamount
+% \DescribeMacro\theorempostskipamount Two additional parameters
+% affect the vertical space around the theorem environments:
+% |\theorempreskipamount| and |\theorempostskipamount| define,
+% respectively, the spacing before and after such an environment.
+% These parameters apply for all theorem sets and can be manipulated
+% with the ordinary length macros. They are rubber lengths,
+% (`\textsf{skips}'), and therefore can contain \texttt{plus} and
+% \texttt{minus} parts.
+%
+% Since the definition of theorem sets should---most sensibly---be
+% placed in the preamble, we only allow installation there.
+% It is therefore possible to release the memory used here after
+% |\begin{document}|, in order to make room for other
+% applications.
+%
+%
+% \subsection{Existing theorem styles}
+%
+% The following theorem styles exist to date:
+% \begin{deflist}{marginbreak}
+% \item[plain]
+% This theorem style emulates the original \LaTeX{} definition,
+% except that additionally the parameters
+% |\theorem...skipamount| are used.
+% \item[break]
+% In this style, the theorem header is followed by a line
+% break.
+% \item[marginbreak]
+% The theorem number is set in the margin, and there is a line
+% break as in \texttt{break}.
+% \item[changebreak]
+% Like \texttt{break}, but with header number and text
+% interchanged.
+% \item[change]
+% Header number and text are interchanged, without a line break.
+% \item[margin]
+% The number is set in the left margin, without a line break.
+% \end{deflist}
+% All styles (except \texttt{plain}) select |\slshape| as the default
+% |\theorembodyfont|.
+%
+%
+% \subsection{Examples}
+%
+% Given the above theorem sets {\envfont Cor}, {\envfont Exa}
+% and {\envfont Rem},
+% suppose that the preamble also contains the declarations:
+% \begin{verbatim}
+% \theoremstyle{marginbreak} \newtheorem{Lem}[Cor]{Lemma}
+% \theoremstyle{change}
+% \theorembodyfont{\itshape} \newtheorem{Def}[Cor]{Definition}
+%
+% \theoremheaderfont{\scshape}
+%\end{verbatim}
+% Then the following are some typical examples of the typeset output
+% resulting from their use.
+%
+% \begin{Cor}
+% This is a sentence typeset in the theorem environment {\envfont
+% Cor}.
+% \end{Cor}
+%
+% \begin{Exa}
+% This is a sentence typeset in the theorem environment {\envfont
+% Exa}.
+% \end{Exa}
+%
+% \begin{Rem}
+% This is a sentence typeset in the theorem environment {\envfont
+% Rem}.
+% \end{Rem}
+%
+% \begin{Lem}[Ben User]
+% This is a sentence typeset in the theorem environment {\envfont
+% Lem}.
+% \end{Lem}
+%
+% \begin{Def}[Very impressive Definition]
+% This is a sentence typeset in the theorem environment {\envfont
+% Def}.
+% \end{Def}
+%
+% The last two examples show the effect of the optional argument to
+% a theorem environment (it is the text typeset in parentheses).
+%
+%
+% \section{Special Considerations}
+% \label{sec:newfonts}
+%
+% Theoremheader and body are implemented as a unit. This means that
+% the |\theoremheaderfont| will inherit characteristics of the
+% |\theorembodyfont| in \LaTeXe. Thus, if for example
+% |\theorembodyfont| is |\itshape| and |\theoremheaderfont|
+% is |\bfseries| the font selected for the header will have the
+% characteristics `bold extended italic'. If this is not desired one
+% should set the |\theoremheaderfont| to something like
+% \begin{verbatim}
+% \theoremheaderfont{\normalfont\bfseries}
+%\end{verbatim}
+% i.e.\ supplying all necessary font information explicitly.
+%
+%
+%
+% \section{Acknowledgements}
+%
+% The publication of this set of macros was only possible with the
+% help of Christina Busse (translating the manuscript into English),
+% Joachim Pense (playing the r\^ole of typist), Chris Rowley
+% (looking everything over) and many others providing useful
+% suggestions.
+%
+% \StopEventually{%
+% \begin{thebibliography}{9}
+% \bibitem{bk:GMS94} \textsc{M.~Goossens}, \textsc{F.~Mittelbach}
+% and \textsc{A.~Samarin}.
+% \newblock The \LaTeX{} Companion.
+% \newblock
+% Addison-Wesley, Reading, Massachusetts, 1994.
+% \bibitem{latex:source} \textsc{Lamport, Leslie.} \newblock
+% \texttt{latex.tex}, version 2.09, date
+% Feb. 1990.
+% \end{thebibliography}
+% \PrintIndex
+% \PrintChanges}
+%
+%
+% \section{The documentation driver file}
+%
+% The next bit of code contains the documentation driver file for
+% \TeX{}, i.e., the file that will produce the documentation you are
+% currently reading. It will be extracted from this file by the
+% \texttt{docstrip} program. Since it is the first code in the file
+% one can alternatively process this file directly with \LaTeXe{} to
+% obtain the documentation.
+%
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+
+\usepackage{theorem}
+
+%<+driver>% The next few lines define theorem sets which are used
+%<+driver>% in the example section of the documentation.
+
+\theoremstyle{break} \newtheorem{Cor}{Corollary}
+\theoremstyle{plain} \newtheorem{Exa}{Example}[section]
+{\theorembodyfont{\upshape}\newtheorem{Rem}{Remark}}
+\theoremstyle{marginbreak} \newtheorem{Lem}[Cor]{Lemma}
+\theoremstyle{change}
+\theorembodyfont{\itshape} \newtheorem{Def}[Cor]{Definition}
+
+\theoremheaderfont{\scshape}
+
+\RecordChanges
+
+\begin{document}
+ \DocInput{theorem.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+% \section{Definition of the Macros}
+%
+% If the file has been loaded before, we abort immediately. If not the
+% package announces itself (this is actually done at the very top if
+% the file---the way it is done isn't good style so don't copy it).
+% \changes{v2.0e}{89/07/19}{Spaces removed from `typeout'.}
+% \changes{v2.2b}{95/11/19}{Announce moved to top of file}
+% \begin{macrocode}
+%<*package>
+%\@ifundefined{theorem@style}{}{\endinput}
+%\def\FMithmInfo{1995/11/19 v2.2b Theorem extension package (FMi)}
+%\ProvidesPackage{theorem}[\FMithmInfo]
+% \end{macrocode}
+%
+%
+% \subsection{Definition of theorem styles and fonts}
+%
+% All the definitions in this file are done globally to allow
+% inputting this file inside a group.
+%
+% \begin{macro}{\theoremstyle}
+% Before a theorem style can be installed, the chosen style must be
+% known. For that reason, we must test to see that
+% |\th@|\meta{style} is known or, more precisely, that it is
+% different from |\relax|. If the style is not known then
+% |\th@plain| is used.
+% \begin{macrocode}
+\gdef\theoremstyle#1{%
+ \@ifundefined{th@#1}{\@warning
+ {Unknown theoremstyle `#1'. Using `plain'}%
+ \theorem@style{plain}}%
+% \end{macrocode}
+% We save the theorem style to be used in the token register
+% |\theorem@style|.
+% \begin{macrocode}
+ {\theorem@style{#1}}%
+% \end{macrocode}
+% Now we ``evaluate'' the theorem style: this means, we call the
+% macro |\th@|\meta{style} which will activate the relevant
+% definitions which are contained in a separate file. This is done
+% in a group to suppress changes to the current font. This could
+% otherwise pose problems together with the new font selection
+% scheme\footnote{When I printed the original article using the new
+% font selection scheme I ended with a document with slanted
+% typefaces (text headings and all) simply because one of the
+% theorem styles used \texttt{\bslash sl} at toplevel.} if the
+% |\th@|\meta{style} is evaluated a second time.
+% \changes{v2.1a}{90/02/15}{Group added around `th@..}
+% \changes{v2.1a}{90/02/15}{Reseting of `..@begintheorem removed.}
+% \begin{macrocode}
+ \begingroup
+ \csname th@\the\theorem@style \endcsname
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@begintheorem}
+% \changes{v2.1a}{90/02/15}{Relaxed at toplevel.}
+% \begin{macro}{\@opargbegintheorem}
+% \changes{v2.1a}{90/02/15}{Relaxed at toplevel.}
+% We reset |\@begintheorem| and |\@opargbegintheorem| to
+% |\relax| since these commands are no longer necessary at
+% toplevel. This will save a few tokens.
+% \begin{macrocode}
+\global\let\@begintheorem\relax
+\global\let\@opargbegintheorem\relax
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\theorem@style}
+% Obviously the \textsf{token} register used above has to be
+% allocated. To assure the utmost compatibility with the
+% original \LaTeX{} definition, we set the default theorem style to
+% \texttt{plain}, which implements the usual \LaTeX{} convention.
+% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.}
+% \begin{macrocode}
+\newtoks\theorem@style
+\global\theorem@style{plain}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theorembodyfont}
+% \begin{macro}{\theorem@bodyfont}
+% If the |\theorembodyfont| is set by the user then it should not
+% interact with the default font set in the theorem style. When the
+% new font selection is in force this may happen if, for example,
+% the default is |\itshape| and the new |\theorembodyfont| is
+% |\sffamily|. So we add a |\reset@font| command in front of the
+% user definition.
+% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.}
+% \changes{v2.0g}{89/09/19}{`theoremfont to `theorembodyfont.}
+% \changes{v2.1c}{92/06/22}{`reset@font added and logic changed.}
+% \changes{v2.1d}{92/10/28}{Reset to empty if arg is empty}
+% \begin{macrocode}
+\gdef\theorembodyfont#1{%
+% \end{macrocode}
+% We check if the argument supplied is empty and if so put nothing
+% into the |\theorem@bodyfont| token register to allow for
+% |\theorembodyfont{}| as a mean of using the default of the
+% current |\theoremstyle|.
+% \begin{macrocode}
+ \def\@tempa{#1}%
+ \ifx\@tempa\@empty
+ \theorem@bodyfont{}%
+ \else
+ \theorem@bodyfont{\reset@font#1}%
+ \fi
+ }
+\newtoks\theorem@bodyfont
+\global\theorem@bodyfont{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\theoremheaderfont}
+% \changes{v2.0g}{89/09/19}{Macro added.}
+% The font for the theorem headers is handled differently because
+% this definition applies to all theorem styles.
+% \begin{macrocode}
+\gdef\theoremheaderfont#1{\gdef\theorem@headerfont{#1}%
+% \end{macrocode}
+% After using the macro once it is redefined to produce an error
+% message.
+% \begin{macrocode}
+ \gdef\theoremheaderfont##1{%
+ \typeout{\string\theoremheaderfont\space should be used
+ only once.}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\theorem@headerfont}
+% \changes{v2.0g}{89/09/19}{Macro added.}
+% To set the |\theorem@headerfont| default we first test if
+% the new fontselection scheme is in force.
+% \changes{v2.1a}{90/02/15}{Support for new font selection.}
+% \begin{macrocode}
+\ifx\upshape\undefined
+% \end{macrocode}
+% If not we define it to expand into |\bfseries|. We don't use
+% |\let| just in case a following style option redefines this
+% macro.
+% \begin{macrocode}
+\gdef\theorem@headerfont{\bfseries}
+% \end{macrocode}
+% Otherwise we reset the current shape before calling |\bfseries|.
+% \begin{macrocode}
+\else \gdef\theorem@headerfont{\normalfont\bfseries}\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\th@plain}
+% \begin{macro}{\th@break}
+% \begin{macro}{\th@marginbreak}
+% \begin{macro}{\th@changebreak}
+% \begin{macro}{\th@change}
+% \begin{macro}{\th@margin}
+% The different styles are defined in macros such as
+% |\th@plain|. Since memory space is precious in
+% ``non-Big-versions'', we have to avoid offering too many unused
+% definitions. Therefore we define these styles in separate files
+% that can be loaded on demand. Thus the commands themselves only
+% load these files. We use |\@input@| a \LaTeXe{} internal command
+% that ensures that the file will be listed with |\listfiles|
+% \changes{v2.2a}{94/02/02}{Use `@input@ to load theorem layout files}
+% \begin{macrocode}
+\gdef\th@plain{\@input@{thp.sty}}
+\gdef\th@break{\@input@{thb.sty}}
+\gdef\th@marginbreak{\@input@{thmb.sty}}
+\gdef\th@changebreak{\@input@{thcb.sty}}
+\gdef\th@change{\@input@{thc.sty}}
+\gdef\th@margin{\@input@{thm.sty}}
+% \end{macrocode}
+% This list will be expanded when new styles become
+% available. For testing, just append new theorem substyles
+% as document options.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Definition of a new theorem set}
+%
+% As already pointed out, a new theorem environment can be defined in
+% three different ways:
+% \begin{verbatim}
+% \newtheorem{Lem}{Lemma}
+% \newtheorem{Lem}{Lemma}[section]
+% \newtheorem{Lem}[Theorem]{Lemma}
+%\end{verbatim}
+% The function of the macro |\newtheorem| is to recognize these cases
+% and then to branch into one of the three macros |\@ynthm|, |\@xnthm|
+% or |\@othm|. This mechanism is adopted unchanged from
+% \cite{latex:source}; the essential point here is that, for example,
+% in the second case, the arguments \texttt{Lem}, \texttt{Lemma} and
+% \texttt{section} are passed over to the macro |\@xnthm|.
+%
+% We inspect this case first because the others present fewer problems,
+% and thus are easily derived from this one.
+%
+% \begin{macro}{\@xnthm}
+% For our example arguments, the macro |\@xnthm| must fulfill
+% the following:
+% \begin{itemize}
+% \item
+% Define a new \LaTeX-counter `Lem'
+% \item
+% reset this counter within a |\section|
+% \item
+% define the macro |\theLem|
+% \item
+% define the environment macros |\Lem| and
+% |\endLem| using the current
+% |\theoremstyle| and |\theorem@bodyfont|.
+% \end{itemize}
+% Obviously, all this should happen only if the first argument
+% of |\@xnthm| (i.e.\ \texttt{Lem} in our example) is chosen so
+% as not to conflict with any previously defined commands or
+% environments. This test is performed by the \LaTeX{} macro
+% |\@ifdefinable|.
+% \begin{macrocode}
+\gdef\@xnthm#1#2[#3]{\expandafter\@ifdefinable\csname #1\endcsname
+% \end{macrocode}
+% Therefore, the first argument of |\@ifdefinable| is the
+% expansion (in the example, |\Lem|) of
+% |\csname||#1\endcsname|. The second argument is
+% executed only if the test has been completed successfully.
+% \begin{macrocode}
+ {%
+% \end{macrocode}
+% Now we define the new counter. The names of the \LaTeX{}
+% macros employed should speak for themselves:
+% \changes{v2.2b}{1995/10/07}{Use \cs{@newctr}}
+% \changes{v2.2c}{1995/11/23}{Use \cs{@newctr} properly.}
+% \begin{macrocode}
+ \@definecounter{#1}\@newctr{#1}[#3]%
+% \end{macrocode}
+% Using |\@newctr| will give a proper error message if the counter
+% in |#3| is not defined.
+% In defining `|\theLem|' we must generate the desired macro
+% name by use of |\expandafter| and |\csname|.
+% \begin{macrocode}
+ \expandafter\xdef\csname the#1\endcsname
+% \end{macrocode}
+% An |\xdef| is used in order to make the definition global,
+% and to ensure that it contains the replacement texts of
+% |\@thmcountersep| and |\@thmcounter|.\footnote{These
+% two macros can be defined by the document style. Their default
+% values produce a `\texttt{.}' as separation and an arabic
+% representation of the number.} However, not everything should be
+% expanded. For example, it saves space to use |\thesection|
+% instead of its---at times---lengthy expansion.
+% \begin{macrocode}
+ {\expandafter \noexpand \csname the#3\endcsname
+ \@thmcountersep \@thmcounter{#1}}%
+% \end{macrocode}
+% Thus with the defaults of \LaTeX{}, |\theLem| would be
+% replaced by the command sequence |\thesection.\arabic{Lem}|.
+%
+% We will now look at the definition of the macro which is executed
+% at the beginning of the actual environment (in our example this
+% macro is |\Lem|). It should be noted that we use an
+% ``|\expandafter| trick'' to expand only certain parts of the
+% replacement text at the time of the definition.
+% \begin{macrocode}
+ \def\@tempa{\global\@namedef{#1}}%
+ \expandafter \@tempa \expandafter{%
+% \end{macrocode}
+% First, the macro that contains the current definitions of
+% |\@begintheorem| and |\@opargtheorem| should be called
+% up. The name of this macro---as is already known---has the form
+% |\th@|\meta{theorem\ style}; therefore, it must be called by
+% \begin{macrocode}
+ \csname th@\the \theorem@style
+% \end{macrocode}
+% In addition the default theorem font should be changeable, i.e.\
+% we have to insert the contents of |\theorem@bodyfont|. For
+% that reason, we expand even further, beyond |\endcsname|,
+% and thus insert the contents of the \textsf{token} register
+% |\theorem@bodyfont| in the replacement text.
+% \begin{macrocode}
+ \expandafter \endcsname \the \theorem@bodyfont
+% \end{macrocode}
+% Now it is time to call the macro |\@thm| which takes over
+% the further processing. It has two arguments: the current
+% counter name (in our example, \texttt{Lem}), and the text of the
+% label (in our example, \texttt{Lemma}).
+% \begin{macrocode}
+ \@thm{#1}{#2}}%
+% \end{macrocode}
+% With this, the `sub-definition' is complete. The macro
+% |\@endtheorem| ends a theorem environment and is, so far, nothing
+% but an |\endtrivlist|. (Hence it is defined globally, and not
+% within the theorem styles.\footnote{This has to be changed as
+% soon as theorem styles that change \texttt{\bslash @endtheorem}
+% exist. In such a case, all existing styles must be changed as
+% well since they will have to reset the macro.}) Therefore, we can
+% set it equivalent to the macro that ends the theorem set (in our
+% example, |\endLem|). However, if some day theorem styles exist
+% that do change |\@endtheorem|, we would have to use the
+% commented-out line instead.
+% \begin{macrocode}
+ \global \expandafter \let \csname end#1\endcsname \@endtheorem
+% \global\@namedef{end#1}{\@endtheorem}%
+% \end{macrocode}
+% With these commands all the required definitions are employed,
+% unless the test |\@ifdefinable| has failed. Therefore, we
+% end the second argument of this macro and with it the definition
+% of |\@xnthm|.
+% \begin{macrocode}
+ }}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ynthm}
+% The definition of |\@ynthm| is completely analogous. In
+% this case the new counter that is defined is not reset within
+% another counter; thus the definition of |\the...|
+% is simplified:
+% \begin{macrocode}
+\gdef\@ynthm#1#2{\expandafter\@ifdefinable\csname #1\endcsname
+ {\@definecounter{#1}%
+ \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}%
+% \end{macrocode}
+% The rest of the definition corresponds literally to that of
+% |\@xnthm|:
+% \begin{macrocode}
+ \def\@tempa{\global\@namedef{#1}}\expandafter \@tempa
+ \expandafter{\csname th@\the \theorem@style \expandafter
+ \endcsname \the\theorem@bodyfont \@thm{#1}{#2}}%
+ \global \expandafter \let \csname end#1\endcsname \@endtheorem}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@othm}
+% The definition of |\@othm| does not contain anything new.
+% \begin{macrocode}
+\gdef\@othm#1[#2]#3{%
+% \end{macrocode}
+% \changes{v2.2b}{95/10/07}{Build in check for counter defined}
+% We do not define a new counter but instead use one that has
+% already been defined. Thus the only definition we need is that
+% of this pseudo-counter (i.e.\ |\the|\meta{env.\ name}).
+% First we check if |#2| corresponds to a known counter name.
+% \begin{macrocode}
+ \expandafter\ifx\csname c@#2\endcsname\relax
+ \@nocounterr{#2}%
+ \else
+ \expandafter\@ifdefinable\csname #1\endcsname
+ {\expandafter \xdef \csname the#1\endcsname
+ {\expandafter \noexpand \csname the#2\endcsname}%
+% \end{macrocode}
+% All other parts of the definition can be adopted from
+% |\@xnthm|. We have to remember, though, that in this case
+% the name of the current counter and the theorem label have moved
+% to the second and third arguments.
+% \begin{macrocode}
+ \def\@tempa{\global\@namedef{#1}}\expandafter \@tempa
+ \expandafter{\csname th@\the \theorem@style \expandafter
+ \endcsname \the\theorem@bodyfont \@thm{#2}{#3}}%
+ \global \expandafter \let \csname end#1\endcsname \@endtheorem}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Macros that are employed in a {\envfont theorem}
+% environment}
+%
+% \begin{macro}{\@thm}
+% The macro |\@thm| has to increase the current counter. Then,
+% depending on whether the environment has (or does not have) an
+% optional argument, it has to branch into either |\@begintheorem|
+% or |\@opargtheorem|.
+% \begin{macrocode}
+\gdef\@thm#1#2{\refstepcounter{#1}%
+% \end{macrocode}
+% Now we start a {\envfont trivlist} environment, and give
+% |\@topsep| and |\@topsepadd| the values of the \textsf{skip}
+% registers |\theorempreskipamount| and |\theorempostskipamount|.
+% The value in |\@topsep| is the vertical space that is inserted by
+% the first (and only) |\item| in our |\trivlist| whilst
+% |\@topsepadd| is inserted by |\@endparenv| at the end of that
+% {\envfont trivlist} environment. By using these registers, we
+% obtain the desired space around a {\envfont theorem} environment.
+% \begin{macrocode}
+ \trivlist
+ \@topsep \theorempreskipamount % used by first \item
+ \@topsepadd \theorempostskipamount % used by \@endparenv
+% \end{macrocode}
+% Now we have to test whether an optional argument has been given.
+% \changes{v2.0d}{89/07/18}{Forgotten percent added.}
+% \begin{macrocode}
+ \@ifnextchar [%
+% \end{macrocode}
+% If there is an optional argument, we will call |\@ythm|, and
+% move the arguments read back into the input stream.
+% \begin{macrocode}
+ {\@ythm{#1}{#2}}%
+% \end{macrocode}
+% If not, we call |\@begintheorem|. Its first argument is the
+% name of the theorem set (hence the second argument of
+% |\@thm|). Its second argument is the macro that produces the
+% current number.
+% \begin{macrocode}
+ {\@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xthm}
+% \begin{macro}{\@ythm}
+% Both these macros were originally called by |\@thm|. We do
+% not need |\@xthm| anymore, hence we reset it to
+% |\relax|. The definition of |\@ythm| has not changed at
+% all from its definition in \LaTeX. In order to make the macros
+% easier to understand, we will
+% nevertheless present it (commented out).
+% \begin{macrocode}
+\global\let\@xthm\relax
+% \def\@ythm#1#2[#3]{\@opargbegintheorem{#2}{\csname
+% the#1\endcsname}{#3}\ignorespaces}
+%</package>
+% \end{macrocode}
+% The primitive |\ignorespaces| in |\@ythm| and
+% |\@thm| is needed to remove the spaces between the
+% |\begin{...}| and the actual text.
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Definition of the theorem substyles}
+%
+% As already pointed out, the theorem substyles, defined below, are
+% only loaded when necessary. Note that all these substyles, except
+% \texttt{plain}, have |\slshape| as the default body font.
+%
+% \subsubsection{The \texttt{plain} style}
+%
+% \label{dok:th@plain} As the following macros use |@|, we have
+% to locally set the |\catcode| of this symbol to ``letter''.
+% This happens within a group, so that we do not have to worry about
+% which |\catcode| that symbol had before.
+% \begin{macrocode}
+%<*thp>
+\begingroup \makeatletter
+% \end{macrocode}
+% Since we are now within a group, we must make all definitions
+% globally. First we make sure that \texttt{theorem.sty} is loaded.
+% This will allow us to use this file as a document style option
+% without having to call \texttt{theorem} itself as an option. At the
+% same time, we assure that at least version 2 is loaded, since
+% |\theorem@style| was not defined in earlier versions.
+% \begin{macrocode}
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thp.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+%
+% \begin{macro}{\th@plain}
+% \begin{macro}{\@begintheorem}
+% \begin{macro}{\@opargbegintheorem}
+% |\theoremstyle{plain}| corresponds to the original
+% definition, except that the distances to the surrounding text are
+% determined by the parameters |\theorempreskipamount| and
+% |\theorempostskipamount|.
+% First we set the default body font.
+% \begin{macrocode}
+\gdef\th@plain{\normalfont\itshape
+% \end{macrocode}
+% Then we define |\@begintheorem| and
+% |\@opargbegintheorem|. These two macros define how the
+% header of a theorem is typeset. |\@opargbegintheorem| will
+% be called if a \textsf{theorem} environment with an optional
+% argument is encountered; otherwise, the header is constructed by
+% calling |\@begintheorem|. If one of these macros is
+% executed, we are within a \textsf{trivlist} environment started by
+% |\@thm|. So the theorem header is produced with an
+% |\item| command.
+%
+% Instead of specifying the header font directly, all standard
+% theorem styles use the |\theorem@headerfont| macro to allow
+% customization. The extra space (|\labelsep|) is necessary
+% because of problems in the \textsf{trivlist} environment.
+% \begin{macrocode}
+ \def\@begintheorem##1##2{%
+ \item[\hskip\labelsep \theorem@headerfont ##1\ ##2]}%
+% \end{macrocode}
+% The definition of |\@opargbegintheorem| is completely
+% analogous. The only difference is the fact that there exists a
+% third argument (which is the optional parameter of the
+% environment and contains additional information about the
+% theorem). Customarily we enclose it in parentheses.
+% \begin{macrocode}
+\def\@opargbegintheorem##1##2##3{%
+ \item[\hskip\labelsep \theorem@headerfont ##1\ ##2\ (##3)]}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \noindent
+% We conclude with an |\endgroup| to restore the
+% |\catcode| of |@|.
+% \begin{macrocode}
+\endgroup
+%</thp>
+% \end{macrocode}
+%
+%
+% \subsubsection{The \texttt{break} style}
+%
+% This style option is stored in the file |thb.sty|.
+% For the next two lines see the documentation for |\th@plain| on
+% page~\pageref{dok:th@plain}.
+% \begin{macrocode}
+%<*thb>
+\begingroup \makeatletter
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thb.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+% \begin{macro}{\th@break}
+% |\theoremstyle{break}| produces a line break after the name
+% of the theorem. The font is |\slshape|. Hence, we define
+% |\th@break| as follows:
+% \begin{macrocode}
+\gdef\th@break{\normalfont\slshape
+ \def\@begintheorem##1##2{\item[%
+% \end{macrocode}
+% We run into the following problem: it is not possible to create
+% the header with |\item[|\meta{title}|]| and then start
+% a new line by, for example, |\mbox{}\\|. Such a definition
+% will fail whenever a list environment follows immediately. With
+% the above construction, the |\mbox{}| causes the switch
+% |@inlabel| (cf.\ definition of |\list| and
+% |\trivlist| in \cite{latex:source}) to be set to \texttt{false}
+% and so the following list will insert additional vertical
+% space (|\topskip|). This is quite annoying. Therefore, we
+% create the line break within the |\item|. In order to ensure
+% that the text will begin at the proper position in the following
+% line, we simply pretend that the label does not take any
+% room.\footnote{This will lead to problems whenever very high
+% symbols occurring in the line tower into the
+% heading. So, something else has to be done here sometime.}
+% \begin{macrocode}
+ \rlap{\vbox{\hbox{\hskip \labelsep\theorem@headerfont ##1\ ##2}%
+ \hbox{\strut}}}]}%
+% \end{macrocode}
+% Again, the definition of |\@opargbegintheorem| is
+% completely analogous.
+% \begin{macrocode}
+\def\@opargbegintheorem##1##2##3{%
+ \item[\rlap{\vbox{\hbox{\hskip \labelsep \theorem@headerfont
+ ##1\ ##2\ (##3)}%
+ \hbox{\strut}}}]}}
+\endgroup
+%</thb>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{The \texttt{changebreak} style}
+%
+% \begin{macrocode}
+% This style option is stored in the file |thcb.sty|.
+% \begin{macrocode}
+%<*thcb>
+\begingroup \makeatletter
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thcb.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+% \begin{macro}{\th@changebreak}
+% The \texttt{change-break} theorem style is like \texttt{break}
+% but with interchange of theorem name and theorem number. Thus we
+% define |\th@changebreak| as follows:
+% \begin{macrocode}
+\gdef\th@changebreak{\normalfont\slshape
+ \def\@begintheorem##1##2{\item
+ [\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont ##2\ ##1}%
+ \hbox{\strut}}}]}%
+\def\@opargbegintheorem##1##2##3{%
+ \item[\rlap{\vbox{\hbox{\hskip\labelsep \theorem@headerfont
+ ##2\ ##1\ (##3)}%
+ \hbox{\strut}}}]}}
+\endgroup
+%</thcb>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{The \texttt{change} style}
+%
+% This style option is stored in the file |thc.sty|.
+% \begin{macrocode}
+%<*thc>
+\begingroup \makeatletter
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thc.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+% \begin{macro}{\th@change}
+% The \texttt{change} theorem style corresponds to the
+% \texttt{change break} style without a linebreak after the header.
+% To say it in another way, it's the same as the \texttt{plain}
+% style but with number and name interchanged and |\slshape| as the
+% default font.
+% \begin{macrocode}
+\gdef\th@change{\normalfont\slshape
+ \def\@begintheorem##1##2{\item
+ [\hskip\labelsep \theorem@headerfont ##2\ ##1]}%
+\def\@opargbegintheorem##1##2##3{%
+ \item[\hskip\labelsep \theorem@headerfont ##2\ ##1\ (##3)]}}
+\endgroup
+%</thc>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{The \texttt{marginbreak} style}
+%
+% This style option is the one used most often at Mainz. It is saved
+% in the file |thmb.sty|.
+% \begin{macrocode}
+%<*thmb>
+\begingroup \makeatletter
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thmb.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+% \begin{macro}{\th@marginbreak}
+% The \texttt{margin break} style is nearly the same as the
+% \texttt{change break} style. The only difference is the placement
+% of the theorem number. We use |\llap| to place it in the left
+% margin.
+%
+% In this style |\labelsep| denotes the separation between the
+% number and the text.
+% \begin{macrocode}
+\gdef\th@marginbreak{\normalfont\slshape
+ \def\@begintheorem##1##2{\item
+ [\rlap{\vbox{\theorem@headerfont
+ \hbox{\llap{##2}\hskip\labelsep ##1}%
+ \hbox{\strut}}}]}%
+\def\@opargbegintheorem##1##2##3{%
+ \item[\rlap{\vbox{\theorem@headerfont
+ \hbox{\llap{##2}\hskip\labelsep ##1\ (##3)}%
+ \hbox{\strut}}}]}}
+\endgroup
+%</thmb>
+% \end{macrocode}
+% \changes{v2.1c}{90/02/17}{`endgroup outside macrocode env.}
+% \end{macro}
+%
+%
+%
+% \subsubsection{The \texttt{margin} style}
+%
+% This style option is stored in the file |thm.sty|.
+% \begin{macrocode}
+%<*thm>
+\begingroup \makeatletter
+\@ifundefined{theorem@style}{\input{theorem.sty}}{}
+\ProvidesFile{thm.sty}
+ [\FMithmInfo]
+% \end{macrocode}
+%
+% \begin{macro}{\th@margin}
+% Again this is only a variant of the theorem styles described
+% above without any new ideas.
+% \begin{macrocode}
+\gdef\th@margin{\normalfont\slshape
+ \def\@begintheorem##1##2{\item
+ [\theorem@headerfont \llap{##2}\hskip\labelsep ##1]}%
+\def\@opargbegintheorem##1##2##3{%
+ \item[\theorem@headerfont \llap{##2}\hskip\labelsep ##1\ (##3)]}}
+\endgroup
+%</thm>
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Final Definitions}
+%
+% \begin{macro}{\theorempreskipamount}
+% \begin{macro}{\theorempostskipamount}
+% The \textsf{skip} parameters that regulate the vertical empty space
+% before and after the {\envfont theorem} environment have
+% to be allocated as well.
+% \changes{v2.0f}{89/07/20}{Unnecessary `global' removed.}
+% \begin{macrocode}
+%<*package>
+\newskip\theorempreskipamount
+\newskip\theorempostskipamount
+% \end{macrocode}
+% Since we have used the same values for all theorem sets, we now can
+% assign them.
+% \begin{macrocode}
+\global\setlength\theorempreskipamount{12pt plus 5pt minus 3pt}
+\global\setlength\theorempostskipamount{8pt plus 3pt minus 1.5pt}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\@endtheorem}
+% The same holds for the macro |\@endtheorem|, which ends a
+% {\envfont theorem} environment. Since it is the same for all
+% theorem sets, it is removed from the macros |\th@|\meta{style}.
+% It simply ends the {\envfont trivlist} environment, which was
+% begun in |\@thm|.
+% \begin{macrocode}
+\global\let\@endtheorem=\endtrivlist
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@preamblecmds}
+% All macros defined above are to be used only in the preamble.
+% Therefore, we insert them in |\@preamblecmds| which will disable
+% them at begin document. This is done by the internal \LaTeXe{}
+% command |\@onlypreamble|.
+% \changes{v2.0g}{89/09/19}{`theoremheaderfont and `theorembodyfont
+% added.}
+% \changes{v2.2a}{94/02/03}{Use \LaTeXe{} interface}
+% \begin{macrocode}
+\@onlypreamble\@xnthm
+\@onlypreamble\@ynthm
+\@onlypreamble\@othm
+\@onlypreamble\newtheorem
+\@onlypreamble\theoremstyle
+\@onlypreamble\theorembodyfont
+\@onlypreamble\theoremheaderfont
+% \end{macrocode}
+% \end{macro}
+%
+% Finally we declare the \texttt{plain} theorem style to be the default.
+% \changes{v2.1b}{90/06/04}{Fixed missing `item by declaring default
+% style.}
+% \begin{macrocode}
+\theoremstyle{plain}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+
+\endinput
diff --git a/macros/latex-dev/required/tools/theorem.pdf b/macros/latex-dev/required/tools/theorem.pdf
new file mode 100644
index 0000000000..0d14dda327
--- /dev/null
+++ b/macros/latex-dev/required/tools/theorem.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tools-overview.pdf b/macros/latex-dev/required/tools/tools-overview.pdf
new file mode 100644
index 0000000000..9e651744df
--- /dev/null
+++ b/macros/latex-dev/required/tools/tools-overview.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/tools-overview.tex b/macros/latex-dev/required/tools/tools-overview.tex
new file mode 100644
index 0000000000..6a00580302
--- /dev/null
+++ b/macros/latex-dev/required/tools/tools-overview.tex
@@ -0,0 +1,217 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{tools-overview.tex}[2015/03/31 v1.0 Tools overview]
+
+% Copyright (C) 2006-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% Copyright (c) 2006-2014 Heiko Oberdiek
+% (c) 2015-2019 The LaTeX3 Project
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% This file is derived from `tools.tex' and `tools-overview.cls'
+% from the `latex-tds' bundle maintained by Heiko Oberdiek.
+%
+\documentclass[a4paper,12pt]{article}
+
+% page layout
+\usepackage[
+ ignoreall,
+ hmargin=1in,
+ vmargin={.75in,1in},
+]{geometry}
+
+\pagestyle{empty}
+
+\usepackage{calc}[2005/08/06]
+
+\usepackage{hyperref}
+\hypersetup{
+ colorlinks,
+ filecolor=blue,
+ pdftitle={LaTeX's Tools Bundle},
+ pdfsubject={Overview},
+ pdfauthor={Heiko Oberdiek},
+ pdfcreator={Project `latex-tds'},
+}
+\title{Contents of \LaTeX's Tools Bundle}
+
+\makeatletter
+
+\let\TO@document\document
+\let\TO@enddocument\enddocument
+
+\def\document{%
+ \TO@document
+ \maketitle
+ \toks@={}%
+ \setlength{\maxlen}{0pt}%
+}
+\newlength{\maxlen}
+\def\enddocument{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{\maxlen + \labelsep}%
+ \setlength{\labelwidth}{\maxlen}%
+ \setlength{\partopsep}{0pt}%
+ }%
+ \the\toks@
+ \end{list}%
+ \TO@enddocument
+}
+\newcommand{\entry}[2]{%
+ \outline{#1}%
+ \toks@\expandafter{%
+ \the\toks@
+ \item[%
+ \href{file:#1.pdf}{\printpackage{#1}}%
+ \hfill
+ ]%
+ #2%
+ }%
+ \setlength{\maxlen}{%
+ \maxof{\maxlen}{\widthof{\printpackage{#1}}}%
+ }%
+ \global\maxlen\maxlen
+}
+\newcommand*{\printpackage}[1]{%
+ \textbf{\large #1:}%
+}
+\newcommand*{\outline}[1]{%
+ \pdfoutline
+ attr {/C[0 0 1]}
+ user {%
+ <<%
+ /S/GoToR%
+ /F(#1.pdf)%
+ /NewWindow true%
+ /D[0/XYZ null null null]%
+ >>%
+ }%
+ {[#1]}\relax
+}
+\renewcommand*{\maketitle}{%
+ \begingroup
+ \par
+ \centering
+ \bfseries
+ \LARGE
+ \@title
+ \par
+ \endgroup
+ \vspace{2em}%
+}
+
+\providecommand*{\cs}[1]{%
+ \texttt{\textbackslash#1}%
+}
+
+\makeatother
+
+\begin{document}
+\entry{afterpage}{%
+ Place text after the current page.
+}%
+\entry{array}{%
+ Extended versions of the environments array, tabular and tabular*.
+}%
+\entry{bm}{%
+ Access bold math symbols.
+}%
+\entry{calc}{%
+ Infix arithmetic expresions. Contributed to the distribution by
+ Kresten Krab Thorup and Frank Jensen.
+}%
+\entry{dcolumn}{%
+ Alignment on \emph{decimal points} in tabular entries. Requires array.
+}%
+\entry{delarray}{%
+ Adds \emph{large delimiters} around arrays. Requires array.
+}%
+\entry{enumerate}{%
+ Extended version of the enumerate environment.
+}%
+\entry{fileerr}{%
+ Suite of small files which may be used to control \TeX{}'s
+ missing file error loop.
+}%
+\entry{fontsmpl}{%
+ Package and test file for producing \emph{font samples}
+}%
+\entry{ftnright}{%
+ Place footnotes in the right hand column in two-column mode.
+}%
+\entry{hhline}{%
+ Finer control over horizontal rules in tables. Requires array.
+}%
+\entry{indentfirst}{%
+ Indent the first paragraph of sections etc.
+}%
+\entry{layout}{%
+ Produces an overview of the layout of the current document.
+}%
+\entry{longtable}{%
+ Multipage tables. (Does not require array, but uses the extended
+ features if both are loaded.)
+}%
+\entry{multicol}{%
+ Typeset text in columns, with the length of the final columns
+ \emph{balanced}.
+}%
+\entry{rawfonts}{%
+ Preload fonts under the old internal font names of \LaTeX{}2.09.
+ Not recomended for new packages, but may help when updating old
+ files.
+}%
+\entry{shellesc}{%
+ Unified interface to ``shell escape'' i.e., access to system commands
+ based on \texttt{\string\write18} or \texttt{os.execute} depending
+ on the system in use.
+}%
+\entry{showkeys}{%
+ Draft mode showing the \emph{keys} used by \cs{label}, \cs{ref}, \cs{cite} etc.
+}%
+\entry{somedefs}{%
+ Selective handling of package options. (Used in rawfonts.sty.)
+}%
+\entry{tabularx}{%
+ Defines tabularx environment (similar to tabular*) but modifies
+ column widths, not inter-column space, to achieve a desired
+ table width.
+}%
+\entry{theorem}{%
+ Flexible definition of \emph{theorem-like} environments.
+}%
+\entry{trace}{%
+ The package helps to suppress and to control the amount of tracing
+ output (\cs{tracingall}) by taming calc and making NFSS less noisy.
+}%
+\entry{varioref}{%
+ \emph{Smart} handling of page references.
+}%
+\entry{verbatim}{%
+ Flexible version of verbatim environment.
+}%
+\entry{xr}{%
+ eXternall References. Extend \cs{ref} to access \cs{label} commands in
+ other documents.
+}%
+\entry{xspace}{%
+ Smart space command that avoids the common mistake of missing
+ spaces after command names.
+}%
+
+\end{document}
diff --git a/macros/latex-dev/required/tools/tools.ins b/macros/latex-dev/required/tools/tools.ins
new file mode 100644
index 0000000000..12625e8166
--- /dev/null
+++ b/macros/latex-dev/required/tools/tools.ins
@@ -0,0 +1,217 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\def\SimplePackage#1{%
+ \generate{\file{#1.sty}{\from{#1.dtx}{package}}}}
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+% Array files
+%%%%%%%%%%%%%
+\generate{\file{array.sty}{\from{array.dtx}{package,ncols}}}
+
+\SimplePackage{delarray}
+
+\batchinput{tabularx.ins}
+
+\SimplePackage{dcolumn}
+
+\SimplePackage{hhline}
+
+\batchinput{longtable.ins}
+
+% Multicolumn
+%%%%%%%%%%%%%
+\batchinput{multicol.ins}
+
+% Bold Math Symbols
+%%%%%%%%%%%%%%%%%%%
+\batchinput{bm.ins}
+
+% Footnote Right
+%%%%%%%%%%%%%%%
+\SimplePackage{ftnright}
+
+% Theorem files
+%%%%%%%%%%%%%%%
+\generate{%
+ \file{theorem.sty}{\from{theorem.dtx}{package}}
+ \file{thb.sty}{\from{theorem.dtx}{thb}}
+ \file{thcb.sty}{\from{theorem.dtx}{thcb}}
+ \file{thc.sty}{\from{theorem.dtx}{thc}}
+ \file{thp.sty}{\from{theorem.dtx}{thp}}
+ \file{thmb.sty}{\from{theorem.dtx}{thmb}}
+ \file{thm.sty}{\from{theorem.dtx}{thm}}}
+
+% Verbatim
+%%%%%%%%%%
+\generate{%
+ \file{verbatim.sty}{\from{verbatim.dtx}{package}}
+ \file{verbtest.tex}{\from{verbatim.dtx}{testdriver}}}
+
+% Smart Page references
+%%%%%%%%%%%%%%%%%%%%%%%
+\batchinput{varioref.ins}
+
+% External references
+%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{xr}
+
+% Smart Space command
+%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{xspace}
+
+% Show \label \ref keys
+%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{showkeys}
+
+% Load fonts under old names
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{rawfonts}
+
+% Selective Option handling
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{somedefs}
+
+
+% Font sample
+%%%%%%%%%%%%%
+\generate{%
+ \file{fontsmpl.sty}{\from{fontsmpl.dtx}{package}}
+ \file{fontsmpl.tex}{\from{fontsmpl.dtx}{document}}}
+
+% After Page Package
+%%%%%%%%%%%%%%%%%%%%
+\batchinput{afterpage.ins}
+
+% Enumerate Package
+%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{enumerate}
+
+
+% Indent first paragraphs
+%%%%%%%%%%%%%%%%%%%
+\SimplePackage{indentfirst}
+
+
+% Show the layout of a document class
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{layout}
+
+
+% Infix Arithmetic
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{calc}
+
+% Debugging
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{trace}
+
+% Shell Escape
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\SimplePackage{shellesc}
+
+% File-Error files
+%%%%%%%%%%%%%%%%%%
+\generate{%
+ \file{h.tex}{\from{fileerr.dtx}{help}}
+ \file{s.tex}{\from{fileerr.dtx}{scroll}}
+ \file{e.tex}{\from{fileerr.dtx}{edit}}
+ \file{q.tex}{\from{fileerr.dtx}{batch}}
+ \file{r.tex}{\from{fileerr.dtx}{run}}
+ \file{x.tex}{\from{fileerr.dtx}{exit}}}
+
+
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* All the files with extension `.sty' and `.tex'}
+\Msg{* Note there also may be a file .tex which is `invisible'}
+\Msg{* on some operating systems.}
+\Msg{*}
+\Msg{* To produce the documentation run the .dtx files through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing}
+\Msg{***********************************************************}
+
+
+\Msg{}
+\Msg{* Finally trying to make a file `.tex'.}
+\Msg{* (Placed at the end of this run, as this}
+\Msg{* may fail on some operating systems.)}
+
+\let\oldopenout\openout
+\def\openout{\batchmode\immediate\oldopenout}
+
+\generate{\file{.tex}{\from{fileerr.dtx}{return}}}
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/trace.dtx b/macros/latex-dev/required/tools/trace.dtx
new file mode 100644
index 0000000000..e808fdd431
--- /dev/null
+++ b/macros/latex-dev/required/tools/trace.dtx
@@ -0,0 +1,733 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%%
+%% (C) Copyright (C) 1999-2019 Frank Mittelbach
+%% All rights reserved.
+%%
+%<*dtx>
+ \ProvidesFile{trace.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{trace}
+%<driver>\ProvidesFile{trace.drv}
+% \fi
+% \ProvidesFile{trace.dtx}
+ [2018/10/13 v1.1e trace LaTeX code]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{doc}
+\setcounter{StandardModuleDepth}{1}
+
+\usepackage{shortvrb}
+\MakeShortVerb\|
+
+\DeclareRobustCommand\eTeX{\ensuremath{\varepsilon}-\kern-.125em\TeX}
+
+\begin{document}
+\DocInput{trace.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \GetFileInfo{trace.dtx}
+%
+% \title{The \textsf{trace} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{Frank Mittelbach}
+% \date{\filedate}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+%
+% \section{Introduction}
+%
+% When writing new macros one often finds that they do not work as
+% expected (at least I do :-). If this happens and one can't
+% immediately figure out why there is a problem one has to start doing
+% some serious debugging. \TeX{} offers a lot of bells and whistles to
+% control what is being traced but often enough I find myself applying
+% the crude command |\tracingall| which essentially means ``give me
+% whatever tracing information is available''.
+%
+% In fact I normally use \eTeX{} in such a case, since that \TeX{}
+% extension offers me a number of additional tracing possibilities
+% which I find extremely helpful. The most important ones are
+% |\tracingassigns|, which will show you changes to register values
+% and changes to control sequences when they happen, and
+% |\tracinggroups|, which will tell you what groups are entered
+% or left (very useful if your grouping got out of sync).
+%
+% So what I really write is
+%\begin{verbatim}
+% \tracingassigns=1\tracinggroups=1\tracingall
+%\end{verbatim}
+% That in itself is already a nuisance (since it is a mouthful) but
+% there is a worse catch: when using |\tracingall| you do get a awful
+% lot of information and some of it is really useless.
+%
+% For example, if \LaTeX{} has to load a new font it enters some
+% internal routines of NFSS which scan font definition tables etc.
+% And 99.9\% of the time you are not at all interested in that part of the
+% processing but in the two lines before and the five lines
+% after. However, you have to scan through a few hundred lines of
+% output to find the lines you need.
+%
+% Another example is the \texttt{calc} package. A simple statement
+% like |\setlength| |\linewidth| |{1cm}| inside your macro will result
+% in
+%
+% \renewcommand\MacroFont{\fontencoding\encodingdefault
+% \fontfamily\ttdefault
+% \fontseries\mddefault
+% \fontshape\updefault
+% \footnotesize}%
+%\begin{verbatim}
+% \setlength ->\protect \setlength
+% {\relax}
+%
+% \setlength ->\calc@assign@skip
+%
+% \calc@assign@skip ->\calc@assign@generic \calc@Askip \calc@Bskip
+%
+% \calc@assign@generic #1#2#3#4->\let \calc@A #1\let \calc@B #2\expandafter \calc
+% @open \expandafter (#4!\global \calc@A \calc@B \endgroup #3\calc@B
+% #1<-\calc@Askip
+% #2<-\calc@Bskip
+% #3<-\linewidth
+% #4<-1cm
+% {\let}
+% {\let}
+% {\expandafter}
+% {\expandafter}
+%
+% \calc@open (->\begingroup \aftergroup \calc@initB \begingroup \aftergroup \calc
+% @initB \calc@pre@scan
+% {\begingroup}
+% {\aftergroup}
+% {\begingroup}
+% {\aftergroup}
+%
+% \calc@pre@scan #1->\ifx (#1\expandafter \calc@open \else \ifx \widthof #1\expan
+% dafter \expandafter \expandafter \calc@textsize \else \calc@numeric \fi \fi #1
+% #1<-1
+% {\ifx}
+% {false}
+% {\ifx}
+% {false}
+%
+% \calc@numeric ->\afterassignment \calc@post@scan \global \calc@A
+% {\afterassignment}
+% {\global}
+% {\fi}
+% {\fi}
+%
+% \calc@post@scan #1->\ifx #1!\let \calc@next \endgroup \else \ifx #1+\let \calc@
+% next \calc@add \else \ifx #1-\let \calc@next \calc@subtract \else \ifx #1*\let
+% \calc@next \calc@multiplyx \else \ifx #1/\let \calc@next \calc@dividex \else \i
+% fx #1)\let \calc@next \calc@close \else \calc@error #1\fi \fi \fi \fi \fi \fi \
+% calc@next
+% #1<-!
+% {\ifx}
+% {true}
+% {\let}
+% {\else}
+% {\endgroup}
+% {restoring \calc@next=undefined}
+%
+% \calc@initB ->\calc@B \calc@A
+% {\skip44}
+% {\global}
+% {\endgroup}
+% {restoring \skip44=0.0pt}
+%
+% \calc@initB ->\calc@B \calc@A
+% {\skip44}
+% {\dimen27}
+%\end{verbatim}
+%
+% \noindent Do you still remember what I was talking about?
+%
+% No? We're trying to find a problem in macro code without having to scan
+% too many uninteresting lines. To make this possible we have to
+% redefine a number of key commands to turn tracing off temporarily in
+% the hope that this will reduce the amount of noise during the
+% trace. For example, if we change one of the \texttt{calc} internals
+% slightly, the above tracing output can be reduced to:
+%
+%\begin{verbatim}
+% \setlength ->\protect \setlength
+% {\relax}
+%
+% \setlength ->\calc@assign@skip
+%
+% \calc@assign@skip ->\calc@assign@generic \calc@Askip \calc@Bskip
+%
+% \calc@assign@generic #1#2#3#4->\let \calc@A #1\let \calc@B #2\expandafter \calc
+% @open \expandafter (#4!\global \calc@A \calc@B \endgroup #3\calc@B
+% #1<-\calc@Askip
+% #2<-\calc@Bskip
+% #3<-\linewidth
+% #4<-1cm
+% {\let}
+% {\let}
+% {\expandafter}
+% {\expandafter}
+%
+% \calc@open (->\begingroup \conditionally@traceoff \aftergroup \calc@initB \begi
+% ngroup \aftergroup \calc@initB \calc@pre@scan
+% {\begingroup}
+%
+% \conditionally@traceoff ->\tracingrestores \z@ \tracingcommands \z@ \tracingpag
+% es \z@ \tracingmacros \z@ \tracingparagraphs \z@
+% {\tracingrestores}
+% {\tracingcommands}
+% {restoring \tracingrestores=1}
+%
+% \calc@initB ->\calc@B \calc@A
+% {\skip44}
+% {\dimen27}
+%\end{verbatim}
+%
+% \noindent\label{conttraceoffexample}
+% Still a lot of noise but definitely preferable to the
+% original case.
+%
+% I redefined those internals that I found most annoyingly
+% noisy. There are probably many others that could be treated in a
+% similar fashion, so if you think you found one worth adding please
+% drop me a short note.
+%
+% \[ * \quad * \quad * \]
+%
+% \DescribeMacro\traceon
+% \DescribeMacro\traceoff
+% The package defines the two macros |\traceon| and |\traceoff| to
+% unconditionally turn tracing on or off, respectively. |\traceon| is
+% like |\tracingall| but additionally adds |\tracingassigns| and
+% |\tracinggroups| if the \eTeX{} program (in extended mode) is
+% used. And |\traceoff| will turn tracing off again, a command which
+% is already badly missing in plain \TeX{}, since it is often not
+% desirable to restrict the tracing using extra groups in the
+% document.
+%
+% \DescribeMacro\conditionally@traceon
+% \DescribeMacro\conditionally@traceoff
+% There are also two internal macros that turn tracing on and off, but
+% only if the user requested tracing in the first place. These are the
+% ones that are used internally within the code below.
+%
+% Since the package overwrites some internals of other packages you
+% should load it as the last package in your preamble using
+% |\usepackage{trace}|.
+%
+% The package offers the option \texttt{logonly} that suppresses
+% terminal output during tracing (unless |\tracingall| is used). This
+% is useful if the \TeX{} implementation used gets rather slow when
+% writing a lot of information to the terminal.
+%
+% It also offers the option \texttt{full} in which case |\traceon|
+% will trace all parts of the code, i.e., essentially work like
+% |\tracingall|.
+%
+% \section{A sample file}
+%
+% The following small test file shows the benefits of the
+% \texttt{trace} package. If one uncomments the line loading the
+% package, the amount of tracing data will be drastically reduced.
+% Without the \texttt{trace} package we get 6594 lines in the log
+% file; adding the package will reduce this to 1618 lines.
+%
+%\begin{verbatim}
+% \documentclass{article}
+% \usepackage{calc}
+% %\usepackage{trace} % uncomment to see difference
+%
+% \begin{document}
+% \ifx\traceon\undefined \tracingall \else \traceon \fi
+%
+% \setlength\linewidth{1cm}
+%
+% $foo=\bar a$
+%
+% \small \texttt{\$} \stop
+%\end{verbatim}
+%
+% \StopEventually{}
+%
+% \section{Implementation}
+%
+% \renewcommand\MacroFont{\fontencoding\encodingdefault
+% \fontfamily\ttdefault
+% \fontseries\mddefault
+% \fontshape\updefault
+% \small}
+%
+% This package is for use with \LaTeX{} (though something similar
+% could be produced for other formats).
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}[1998/12/01]
+% \end{macrocode}
+%
+% The package has a option that suppresses tracing on the
+% terminal, i.e., if used will not set |\tracingonline| to
+% one. This has been added in version 1.1a since some \TeX{}
+% implementations get rather slow when outputting to a terminal.
+% \begin{macrocode}
+\DeclareOption{logonly}
+ {\let\tracingonline@p\z@}
+% \end{macrocode}
+% The default is showing the tracing information on the terminal.
+% \begin{macrocode}
+\let\tracingonline@p\@ne
+% \end{macrocode}
+%
+% If the option |full| is selected then all code should be traced,
+% i.e., the commands |\conditionally@traceoff| and
+% |\conditionally@traceon| should do nothing. We set them to
+% |\@empty| not |\relax| since the latter might produce a math ord
+% in certain circumstances. We also have to make sure that
+% |\traceon| (as defined further down) is not redefining
+% |\conditionally@traceoff| again. To make this all work these
+% redefinitions have to wait until the end of the package.
+% \changes{v1.1c}{2003/04/30}{Option ``full'' added}
+% \begin{macrocode}
+\DeclareOption{full}
+ {\AtEndOfPackage{\let\conditionally@traceoff\@empty
+ \let\conditionally@traceon\@empty
+ \let\traceon\tr@ce@n
+ }}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\ProcessOptions\relax
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{\if@tracing}
+% We need a switch to determine if we want any tracing at
+% all. Otherwise, if we use |\traceoff|\ldots|\traceon|
+% internally, we would unconditionally turn on tracing even when no
+% tracing was asked for in the first place.
+% \begin{macrocode}
+\newif\if@tracing
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\traceon}
+% This macro ensures that |\conditionally@traceoff| is actually
+% turning off switches (since |\tracinall| might have disabled it)
+% and then calls |\tr@ce@n| to setup tracing.
+% \begin{macrocode}
+\def\traceon{\let\conditionally@traceoff\unconditionally@traceoff
+ \tr@ce@n}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\tr@ce@n}
+% \changes{v1.1c}{2003/04/30}{Macro added}
+% \begin{macro}{\conditionally@traceoff}
+% As stated in the introduction, the amount of tracing being done
+% should depend on the formatter we use. Initially first test if we are
+% running with \eTeX{} in extended mode. In the latter case the command
+% |\tracinggroups| is defined.
+% But for a number of years now \LaTeX{} only works with \eTeX{} so
+% we drop that part of the code. For now I leave it in the file
+% together with its documentation, but commented out.
+% \begin{macrocode}
+%\ifx\tracinggroups\undefined
+% \end{macrocode}
+%
+% If we are using standard \TeX{} then |\tr@ce@n| is more or less
+% another name for |\tracingall|. The only differences are that we
+% set the above |@tracing| switch to true and reorder the
+% assignments within it somewhat so that it will output no tracing
+% information about itself. In contrast, |\tracingall| itself produces
+%
+%\begingroup
+% \renewcommand\MacroFont{\fontencoding\encodingdefault
+% \fontfamily\ttdefault
+% \fontseries\mddefault
+% \fontshape\updefault
+% \footnotesize}%
+%\begin{verbatim}
+% {vertical mode: \tracingstats}
+% {\tracingpages}
+% {\tracinglostchars}
+% {\tracingmacros}
+% {\tracingparagraphs}
+% {\tracingrestores}
+% {\errorcontextlines}
+%
+% \showoutput ->\tracingoutput \@ne \showboxbreadth \maxdimen \showboxdepth \maxd
+% imen \errorstopmode \showoverfull
+% {\tracingoutput}
+% {\showboxbreadth}
+% {\showboxdepth}
+% {\errorstopmode}
+%
+% \showoverfull ->\tracingonline \@ne
+% {\tracingonline}
+%\end{verbatim}
+%\endgroup
+%
+% \noindent Which is quite a lot given that none of it is of any
+% help to the task at hand. In contrast |\tr@ce@n| will produce
+% nothing whatsoever since the noise generating switches are set at
+% the very end.
+% \begin{macrocode}
+% \def\tr@ce@n{%
+% \end{macrocode}
+% We start by setting the |@tracing| switch to signal that tracing
+% is asked for. This is then followed by setting the various
+% tracing primitives of \TeX.
+% \begin{macrocode}
+% \@tracingtrue
+% \tracingstats\tw@
+% \tracingpages\@ne
+% \tracinglostchars\@ne
+% \tracingparagraphs\@ne
+% \errorcontextlines\maxdimen
+% \tracingoutput\@ne
+% \showboxbreadth\maxdimen
+% \showboxdepth\maxdimen
+% \errorstopmode
+% \tracingmacros\tw@
+% \tracingrestores\@ne
+% \tracingcommands\tw@
+% \end{macrocode}
+% The setting of |\tracingonline| depends on the option
+% \texttt{logonly}:
+% \begin{macrocode}
+% \tracingonline\tracingonline@p
+% }
+% \end{macrocode}
+%
+% Now what should |\conditionally@traceoff| do in this case? Should
+% it revert all settings changed by |\tr@ce@n|? It should not, since
+% our goal is to shorten the trace output, thus setting all of the
+% uninteresting values back makes the output unnecessarily
+% longer. Therefore we restrict ourselves to those |\tracing...|
+% internals that really contribute to listings like the above.
+%
+% And one additional point is worth mentioning. The order in which
+% we turn the tracing internals off has effects on the output we
+% see. So what needs to be turned off first? Either
+% |\tracingrestores| or |\tracingcommands|; it makes no difference
+% which, as long as they both come first. This is because those two
+% are the only tracing switches that produce output while tracing
+% the command |\conditionally@traceoff| itself (see example on
+% page~\pageref{conttraceoffexample}).
+%
+% In principle we would need to test the |@tracing| switch to see
+% if there is anything to turn off; after all, this is the
+% conditional trace off. However this would lead to
+% extra output if we are currently tracing so we skip the test and
+% instead accept that in case we are not doing any tracing we
+% unnecessarily set the tracing primitives back to zero (i.e., the
+% value they already have).
+% \changes{v1.1c}{2003/04/30}{Turn off \cs{tracingoutput}}
+% \begin{macrocode}
+% \def\conditionally@traceoff{%
+% \tracingrestores\z@
+% \tracingcommands\z@
+% \tracingpages\z@
+% \tracingmacros\z@
+% \tracingparagraphs\z@
+% \tracingoutput\z@
+% \showboxbreadth\m@ne
+% \showboxdepth\m@ne
+% \end{macrocode}
+%
+% As remarked above there are more tracing switches set by
+% |\tr@ce@n|, however there is no point in resetting
+% |\tracinglostchars| so we leave it alone.
+% \changes{v1.1c}{2003/04/30}{Reset \cs{tracingstats} to one}
+% \begin{macrocode}
+% \tracingstats\@ne
+%% \tracinglostchars\z@
+% \end{macrocode}
+% Since this is the command that only conditionally turns off
+% tracing we do not touch the |@tracing| switch. This way a
+% |\conditionally@traceon| will be able to turn the tracing on
+% again.
+% \begin{macrocode}
+% }
+% \end{macrocode}
+%
+% That covers the case for the standard \TeX{} program. If
+% |\tracingsgroups| was defined we assume that we are running with
+% \eTeX{} in extended mode.
+% \begin{macrocode}
+%\else
+% \end{macrocode}
+%
+% In that case |\tr@ce@n| does more than |\tracingall|: it also
+% turns on tracing of assignments and tracing of
+% grouping.\footnote{These are my personal preference settings;
+% \eTeX{} does in fact offer some more tracing switches and perhaps
+% one or or more of them should be added here as well.}
+% To keep tracing at a minimum |\tracingassigns| should be turned
+% on last (in fact like before we disassemble |\tracingall|
+% and reorder it partially).
+% \begin{macrocode}
+ \def\tr@ce@n{%
+ \@tracingtrue
+ \tracingstats\tw@
+ \tracingpages\@ne
+ \tracinglostchars\@ne
+ \tracingparagraphs\@ne
+ \errorcontextlines\maxdimen
+% \end{macrocode}
+% We only change |\tracingoutput| if it hasn't already been enabled by
+% |\showoutput|. If that's not the case, we set it to 2 so that we
+% can distingush the two cases.
+% \changes{v1.1e}{2018/10/13}{Only reset \cs{tracingoutput} if not
+% set by \cs{showoutput} earlier}
+% \begin{macrocode}
+ \ifnum\tracingoutput=\@ne
+ \else
+ \tracingoutput\tw@
+ \showboxbreadth\maxdimen
+ \showboxdepth\maxdimen
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \errorstopmode
+ \tracingmacros\tw@
+ \tracinggroups\@ne
+ \tracingrestores\@ne
+ \tracingcommands\tw@
+ \tracingassigns\@ne
+ \tracingonline\tracingonline@p
+ }
+% \end{macrocode}
+%
+% When turning tracing off again we now also have to turn off those
+% additional tracing switches. But what to turn off in what order?
+% Since |\tracingassigns| is quite noisy (two lines of output per
+% assignment) and the whole command expansion consists of
+% assignments, we had best start with this switch and follow it again
+% by |\tracingrestores| and |\tracingcommands|. The rest can be in
+% any order, it doesn't make a difference.
+%
+% With the same reasoning as before we omit testing for the
+% |@tracing| switch and always set the primitives back to zero.
+% \changes{v1.1c}{2003/04/30}{Turn off \cs{tracingoutput}}
+% \changes{v1.1c}{2003/04/30}{Reset \cs{tracingstats} to one}
+% \begin{macrocode}
+ \def\conditionally@traceoff{%
+ \tracingassigns\z@
+ \tracingrestores\z@
+ \tracingcommands\z@
+ \tracingpages\z@
+ \tracingmacros\z@
+% \end{macrocode}
+% If |\tracingoutput| is 2 it was set above, if it is 1 it was set
+% by |\showoutput| and we leave it alone and if it is 0 there is
+% nothing to do as well.
+% \changes{v1.1e}{2018/10/13}{Only reset \cs{tracingoutput} if not
+% set by \cs{showoutput} earlier}
+% \begin{macrocode}
+ \ifnum\tracingoutput=\tw@
+ \tracingoutput\z@
+ \showboxbreadth\m@ne
+ \showboxdepth\m@ne
+ \fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+ \tracingstats\@ne
+ \tracingparagraphs\z@
+ \tracinggroups\z@
+ }
+% \end{macrocode}
+%
+% This concludes the part that depends on the formatter being
+% used.
+% \begin{macrocode}
+%\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\unconditionally@traceoff}
+% \changes{v1.1c}{2003/04/30}{Macro added}
+% A saved version of whatever |\conditionally@traceoff| was defined
+% to be. We need this since the latter might get disabled by
+% |\tracingall| or by the \texttt{full} option.
+% \begin{macrocode}
+\let\unconditionally@traceoff\conditionally@traceoff
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\tracingall}
+% \changes{v1.1c}{2003/04/30}{Macro added}
+% We redefine |\tracingall| to trace the same stuff than |\tr@ce@n| (i.e.,
+% more when \eTeX{} is being used) and ensure that everything gets
+% traced by disabling |\conditionally@traceoff|. And, of course,
+% |\tracingall| should always report on the terminal.
+% \begin{macrocode}
+\def\tracingall{\let\conditionally@traceoff\@empty
+ \let\tracingonline@p\@ne
+ \tr@ce@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\traceoff}
+% \begin{macro}{\conditionally@traceon}
+% Above we have defined |\conditionally@traceoff| and |\traceon| so
+% now we have to define their counterparts.
+%
+% To stop tracing unconditionally we call
+% |\unconditionally@traceoff| and then reset the |@tracing| switch
+% to false.
+% \begin{macrocode}
+\def\traceoff{\unconditionally@traceoff \@tracingfalse}
+% \end{macrocode}
+%
+% Now the |\conditionally@traceon| command will look at the
+% |@tracing| switch and if it is true it will call |\traceon| to
+% restart tracing (note that the latter command unnecessarily sets
+% the switch to true as well). The reason for the |\expandafter| is
+% to get rid of the |\fi| primitive which would otherwise show up in
+% the tracing output (and perhaps puzzle somebody).
+% \begin{macrocode}
+\def\conditionally@traceon{\if@tracing \expandafter \traceon \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% The rest of the package now consists of redefinitions of certain
+% commands to make use of |\conditionally@traceoff|.
+%
+% \subsection{Taming \texttt{calc}}
+%
+% \begin{macro}{\calc@open}
+% Near the start of parsing a calc expression the macro |\calc@open|
+% is called. Since it already involves a group it is perfectly
+% suitable for our task---we don't even have to restart the tracing as
+% this is done automatically for us.
+% \begin{macrocode}
+\def\calc@open({\begingroup
+ \conditionally@traceoff
+ \aftergroup\calc@initB
+ \begingroup\aftergroup\calc@initB
+ \calc@pre@scan}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Making NFSS less noisy}
+%
+% \begin{macro}{\define@newfont}
+% Whenever NFSS determines that the font currently asked for is not
+% already loaded, it will start looking through font definition
+% files and then load the font. This results in a very large number
+% of tracing lines which are not normally of interest (unless there
+% is a bug in that area---something we hope should have been found
+% by now). Again the code already contains its own group so we only
+% have to turn the tracing off.
+% \begin{macrocode}
+\def\define@newfont{%
+ \begingroup
+ \conditionally@traceoff
+ \let\typeout\@font@info
+ \escapechar\m@ne
+ \expandafter\expandafter\expandafter
+ \split@name\expandafter\string\font@name\@nil
+ \try@load@fontshape % try always
+ \expandafter\ifx
+ \csname\curr@fontshape\endcsname \relax
+ \wrong@fontshape\else
+ \extract@font\fi
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\frozen@everymath}
+% \begin{macro}{\frozen@everydisplay}
+% At the beginning of every math formula NFSS will check whether or
+% not the math fonts are properly set up and if not will load
+% whatever is needed. So we surround that part of the code
+% with |\conditionally@traceoff| and |\conditionally@traceon|
+% thereby avoiding all this uninteresting output.
+% \begin{macrocode}
+\frozen@everymath =
+ {\conditionally@traceoff \check@mathfonts \conditionally@traceon
+ \the\everymath}
+\frozen@everydisplay =
+ {\conditionally@traceoff \check@mathfonts \conditionally@traceon
+ \the\everydisplay}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \section{Checking for italic corrections}
+%
+% \begin{macro}{\maybe@ic@}
+% When executing |\textit| or its friends, \LaTeX{} looks ahead to
+% determine whether or not to add an italic correction at the
+% end. This involves looping through the |\nocorrlist| which
+% outputs a lot of tracing lines we are normally not interested
+% in. So we disable tracing for this part of the processing.
+% \changes{v1.1d}{2014/04/21}{Use \cs{ifmaybe@ic} not
+% \cs{if@tempswa} as the kernel does (pr/4200)}
+% \begin{macrocode}
+\def \maybe@ic@ {%
+ \ifdim \fontdimen\@ne\font>\z@
+ \else
+ \conditionally@traceoff
+ \maybe@ictrue
+ \expandafter\@tfor\expandafter\reserved@a\expandafter:\expandafter=%
+ \nocorrlist
+ \do \t@st@ic
+ \ifmaybe@ic \sw@slant \fi
+ \conditionally@traceon
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+% \Finale
+%
+% \endinput
diff --git a/macros/latex-dev/required/tools/trace.pdf b/macros/latex-dev/required/tools/trace.pdf
new file mode 100644
index 0000000000..5eb99c3e24
--- /dev/null
+++ b/macros/latex-dev/required/tools/trace.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/varioref-2016-02-16.sty b/macros/latex-dev/required/tools/varioref-2016-02-16.sty
new file mode 100644
index 0000000000..78aa06db6b
--- /dev/null
+++ b/macros/latex-dev/required/tools/varioref-2016-02-16.sty
@@ -0,0 +1,779 @@
+%%
+%% This is file `varioref.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% varioref.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at https://latex-project.org/bugs/
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2017
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% Package varioref to use with LaTeX2e
+%% Copyright (C) 1992-2016 Frank Mittelbach, all rights reserved.
+%%
+%% For additions or updates to the language options please contact
+%% the author at
+%%
+%% frank.mittelbach@latex-project.org
+%%
+%% In case of bugs, please use "latexbug.tex" (category tools) to report them.
+%%
+\NeedsTeXFormat{LaTeX2e}[1995/05/16]
+\ProvidesPackage{varioref}
+ [2016/02/16 v1.5c package for extended references (FMi)]
+%%
+
+
+\def\vref@addto#1#2{%
+ #2%
+ \@temptokena{#2}%
+ \ifx#1\undefined
+ \edef#1{\the\@temptokena}%
+ \else
+ \toks@\expandafter{#1}%
+ \edef#1{\the\toks@\the\@temptokena}%
+ \fi
+ \@temptokena{}\toks@\@temptokena
+}
+\@onlypreamble\vref@addto
+\def\vref@excuse#1{%
+ \PackageWarningNoLine{varioref}{Sorry, language `#1'
+ not supported%
+ \MessageBreak
+ in this version.
+ English strings used by default.
+ \MessageBreak
+ Please modify \protect\reftext... commands manually.%
+ \MessageBreak\MessageBreak
+ If you can suggest translations for
+ this language,%
+ \MessageBreak
+ please mail them
+ to the author of this package}}
+\@onlypreamble\vref@excuse
+\def\vref@stringwarning#1{%
+ \PackageWarningNoLine{varioref}{Sorry, there is no proper
+ translation for the string\MessageBreak
+ produced by \protect#1\on@line.\MessageBreak
+ English string used instead.\MessageBreak
+ \MessageBreak
+ If you can suggest translations for
+ the current\MessageBreak
+ language, please mail them
+ to the author of this\MessageBreak package}}
+\DeclareOption{afrikaans}
+ {\vref@addto\extrasafrikaans{%
+ \def\reftextfaceafter {op die \reftextvario{regterbladsy}%
+ {bladsy langsaan}}%
+ \def\reftextfacebefore{op die \reftextvario{linkerbladsy}%
+ {bladsy langsaan}}%
+ \def\reftextafter {op die \reftextvario{volgende bladsy}%
+ {bladsy hierna}}%
+ \def\reftextbefore {op die \reftextvario{vorige bladsy}%
+ {bladsy hiervoor}}%
+ \def\reftextcurrent {op \reftextvario{hierdie}%
+ {die huidige} bladsy}%
+ \def\reftextfaraway#1{op bladsy~\pageref{#1}}%
+ \def\reftextpagerange#1#2{op bladsye~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} tot~\ref{#2}}%
+ }}
+\DeclareOption{american}
+ {\vref@addto\extrasamerican{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+\DeclareOption{austrian}
+ {\vref@addto\extrasaustrian{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+\DeclareOption{naustrian}
+ {\vref@addto\extrasnaustrian{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+\DeclareOption{basque}
+ {\vref@addto\extrasbasque{%
+ \def\reftextfaceafter {hurrengo orrialdean}%
+ \def\reftextfacebefore{aurreko orrialdean}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {uneko orrialdean}%
+ \def\reftextfaraway#1{~\pageref{#1}. orrialdean}%
+ \def\reftextpagerange#1#2{~\pageref{#1}--\pageref{#2} orrialdeetan}%
+ \def\reftextlabelrange#1#2{\ref{#1}.etik \ref{#2}.eraino}%
+ }}
+\DeclareOption{bahasam}
+ {\vref@addto\extrasbahasam{%
+ \def\reftextfaceafter {pada muka surat \reftextvario{bertentangan}{berikutnya}}%
+ \def\reftextfacebefore{pada muka surat \reftextvario{bertentangan}{sebelumnya} }%
+ \def\reftextafter {pada muka surat berikutnya}%
+ \def\reftextbefore {pada muka surat sebelumnya}%
+ \def\reftextcurrent {pada muka surat ini}%
+ \def\reftextfaraway#1{pada muka surat~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pada muka surat~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+\DeclareOption{brazil}
+ {\vref@addto\extrasbrazil{%
+ \def\reftextfaceafter {na \reftextvario{p\'agina oposta}{pr\'oxima
+ p\'agina}}%
+ \def\reftextfacebefore{na p\'agina \reftextvario{oposta}{anterior}}%
+ \def\reftextafter {na \reftextvario{p\'agina seguinte}{pr\'oxima
+ p\'agina}}%
+ \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
+ \def\reftextcurrent {\reftextvario{nesta p\'agina}{na p\'agina
+ corrente}}%
+ \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{breton}
+ {\vref@excuse{breton}%
+ \vref@addto\extrasbreton{%
+ \def\reftextfaceafter {war ar bajenn \reftextvario{a-dal}{da heul}}%
+ \def\reftextfacebefore{war ar bajenn \reftextvario{a-dal}{a-raok}}%
+ \def\reftextafter {war ar bajenn da heul}%
+ \def\reftextbefore {war ar bajenn a-raok}%
+ \def\reftextcurrent {war ar \reftextvario{bajenn-ma\~n}%
+ {bajenn war-wel}}%
+ \def\reftextfaraway#1{war ar bajenn~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange
+ on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
+ \ref{#1} to~\ref{#2}}%
+ }}
+\DeclareOption{bulgarian}%
+ {\vref@addto\extrasbulgarian{%
+ \def\reftextfaceafter{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextfacebefore{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextafter{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}%
+ {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextbefore{\cyrn\cyra\
+ \reftextvario{\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrp\cyrr\cyre\cyrd\cyri\cyrsh\cyrn\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextcurrent{\cyrn\cyra\
+ \reftextvario{\cyrt\cyra\cyrz\cyri}%
+ {\cyrt\cyre\cyrk\cyru\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra
+ ~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyri
+ ~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \cyrd\cyro~\ref{#2}}%
+ }}
+\DeclareOption{catalan}
+ {\vref@addto\extrascatalan{%
+ \def\reftextfaceafter {a la p\`agina seg\"uent}%
+ \def\reftextfacebefore{a la p\`agina anterior}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {en aquesta p\`agina}%
+ \def\reftextfaraway#1{a la p\`agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{a les
+ p\`agines~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{croatian}
+ {\vref@addto\extrascroatian{%
+ \def\reftextfaceafter {na sljede\'coj stranici}%
+ \def\reftextfacebefore{na prethodnoj stranici}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {na ovoj stranici}%
+ \def\reftextfaraway#1{na stranici~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stranicama~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} do~\ref{#2}}%
+ }}
+\DeclareOption{czech}
+ {%\vref@excuse{czech}%
+ \vref@addto\extrasczech{%
+ \def\reftextfaceafter {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
+ \def\reftextfacebefore{na p\v{r}ed\-choz\'\i\ stran\v{e}}%
+ \def\reftextafter {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
+ \def\reftextbefore {na p\v{r}ed\-choz\'\i\ stran\v{e}}%
+ \def\reftextcurrent {na t\'eto stran\v{e}}%
+ \def\reftextfaraway#1{na stran\v{e}~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}\--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a\v{z}~\ref{#2}}%
+ }}
+\DeclareOption{danish}
+ {\vref@addto\extrasdanish{%
+ \def\reftextfaceafter {p\aa{} \reftextvario{modst\aa ende}%
+ {n\ae ste} side}%
+ \def\reftextfacebefore{p\aa{} \reftextvario{modst\aa ende}%
+ {forrige} side}%
+ \def\reftextafter {p\aa{} \reftextvario{den f\o lgende}%
+ {n\ae ste} side}%
+ \def\reftextbefore {p\aa{} \reftextvario{forrige side}
+ {foreg\aa ende side}}%
+ \def\reftextcurrent {p\aa{} denne side}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+\DeclareOption{dutch}
+ {\vref@addto\extrasdutch{%
+ \def\refpagename{pagina}%
+ \def\reftextfaceafter {op de \reftextvario{rechter \refpagename}%
+ {\refpagename\ hiernaast}}%
+ \def\reftextfacebefore{op de \reftextvario{linker \refpagename}%
+ {\refpagename\ hiernaast}}%
+ \def\reftextafter {op de \reftextvario{volgende \refpagename}%
+ {\refpagename\ hierna}}%
+ \def\reftextbefore {op de \reftextvario{vorige \refpagename}%
+ {\refpagename\ hiervoor}}%
+ \def\reftextcurrent {op deze \refpagename}%
+ \def\reftextfaraway#1{op \refpagename~\pageref{#1}}%
+ \def\reftextpagerange#1#2{op pagina's~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+\DeclareOption{english}
+ {\vref@addto\extrasenglish{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+\DeclareOption{esperanto}
+ {\vref@addto\extrasesperanto{%
+ \def\reftextfaceafter{en la
+ \reftextvario{flanka}{sekva} pa\^go}%
+ \def\reftextfacebefore{en la
+ \reftextvario{flanka}{anta\u ua} pa\^go}%
+ \def\reftextafter{en la sekva pa\^go}%
+ \def\reftextbefore{en la anta\u ua pa\^go}%
+ \def\reftextcurrent{\reftextvario{\^ci-pa\^ge}%
+ {en \^ci tiu pa\^go}}%
+ \def\reftextfaraway#1{en pa\^go~\pageref{#1}}%
+ \def\reftextpagerange#1#2{en pa\^goj~\pageref{#1} \^gis \pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \^gis~\ref{#2}}%
+ }}
+\DeclareOption{finnish}
+ {\vref@addto\extrasfinnish{%
+ \def\reftextfaceafter {\reftextvario{viereisell\"a}%
+ {seuraavalla} sivulla}%
+ \def\reftextfacebefore{\reftextvario{viereisell\"a}%
+ {edellisell\"a} sivulla}%
+ \def\reftextafter {seuraavalla sivulla}%
+ \def\reftextbefore {edellisell\"a sivulla}%
+ \def\reftextcurrent {t\"all\"a sivulla}%
+ \def\reftextfaraway#1{sivulla~\pageref{#1}}%
+ \def\reftextpagerange#1#2{sivuilla~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+\DeclareOption{french}
+ {\vref@addto\extrasfrench{%
+ \def\reftextfaceafter {page \reftextvario{ci-contre}{suivante}}%
+ \def\reftextfacebefore{page \reftextvario{ci-contre}%
+ {pr\'ec\'edente}}%
+ \def\reftextafter {page suivante}%
+ \def\reftextbefore {page pr\'ec\'edente}%
+ \def\reftextcurrent {de la pr\'esente page}%
+ \def\reftextfaraway#1{page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \`a~\ref{#2}}%
+ }}
+\DeclareOption{galician}
+ {\vref@addto\extrasgalician{%
+ \def\reftextfaceafter {na p\'axina oposta}%
+ \def\reftextfacebefore\reftextfaceafter
+ \def\reftextafter {na p\'axina seguinte}%
+ \def\reftextbefore {na p\'axina anterior}%
+ \def\reftextcurrent {nesta p\'axina}%
+ \def\reftextfaraway#1{na p\'axina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{%
+ nas p\'axinas~\pageref{#1}-\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{german}
+ {\vref@addto\extrasgerman{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+\DeclareOption{ngerman}
+ {\vref@addto\extrasngerman{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+\DeclareOption{greek}
+ {\vref@addto\extrasgreek{%
+ \def\reftextfaceafter {sthn \reftextvario{paro'usa}%
+ {ep'omenh} sel'ida}%
+ \def\reftextfacebefore{sthn \reftextvario{paro'usa}{prohgo'umenh}
+ sel'ida}%
+ \def\reftextafter {sthn ep'omenh sel'ida}%
+ \def\reftextbefore {sthn prohgo'umenh sel'ida}%
+ \def\reftextcurrent {s'' aut'h th sel'ida}%
+ \def\reftextfaraway#1{sth sel'ida\nobreakspace\pageref{#1}}%
+ \def\reftextpagerange#1#2{stis sel'ides\nobreakspace
+ \pageref{#1}---\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} ws\nobreakspace\ref{#2}}%
+ }}
+\DeclareOption{icelandic}
+ {\vref@addto\extrasicelandic{%
+ \def\reftextfaceafter {\'{a} \reftextvario{n{\ae}stu}%
+ {n{\ae}stu} s\'{i}{\dh}u}%
+ \def\reftextfacebefore{\'{a} \reftextvario{fyrri}%
+ {fyrri} s\'{i}{\dh}u}%
+ \def\reftextafter {\'{a} \reftextvario{n{\ae}stu}%
+ {n{\ae}stu} s\'{i}{\dh}u}%
+ \def\reftextbefore {\'{a} \reftextvario{fyrri}{fyrri} s\'{i}{\dh}u}%
+ \def\reftextcurrent {\'{a} \reftextvario{{\th}essari}%
+ {{\th}essari} s\'{i}{\dh}u}%
+ \def\reftextfaraway#1{\'{a} s\'{i}{\dh}u~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\'{a} s\'{i}{\dh}um~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+\DeclareOption{italian}
+ {\vref@addto\extrasitalian{%
+ \def\reftextfaceafter {\reftextvario{a fronte}%
+ {nella pagina successiva}}%
+ \def\reftextfacebefore{\reftextvario{a fronte}%
+ {nella pagina precedente}}%
+ \def\reftextafter {nella pagina \reftextvario{seguente}%
+ {successiva}}%
+ \def\reftextbefore {nella pagina precedente}%
+ \def\reftextcurrent {in questa pagina}%
+ \def\reftextfaraway#1{a pagina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nelle pagine~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{da~\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{magyar}
+ {\vref@addto\extrasmagyar{%
+ \def\reftextafter {a k\"o\-vet\-kez\H{o} ol\-da\-lon}%
+ \def\reftextbefore{az el\H{o}\-z\H{o} ol\-da\-lon}%
+ \def\reftextfaceafter {\reftextvario{a t\'ul\-ol\-da\-lon}%
+ {a k\"o\-vet\-kez\H{o} ol\-da\-lon}}%
+ \def\reftextfacebefore{\reftextvario{a t\'ul\-ol\-da\-lon}%
+ {az el\H{o}\-z\H{o} ol\-da\-lon}}%
+ \def\reftextcurrent {ezen az ol\-da\-lon}%
+ \def\reftextfaraway#1{\aza{\pageref{#1}} \pageref{#1}.~ol\-da\-lon}%
+ \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange
+ on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
+ \ref{#1} to~\ref{#2}}%
+ }%
+ \AtBeginDocument{\providecommand\aza[1]{a/az%
+ \PackageError{varioref}{%
+ Proper definition for command \noexpand\aza missing}%
+ {You need to (re)define the command \noexpand\aza that
+ takes one argument (a number or a \noexpand\pageref command)
+ and produces the string `a' or `az' depending on the argument
+ value. It should also accept an optional argument (default `l')
+ to denote whether or not the string should be lowercase or
+ uppercase.}}}%
+ }
+\DeclareOption{norsk}
+ {\vref@addto\extrasnorsk{%
+ \def\reftextfaceafter {p\aa{} neste side}%
+ \def\reftextfacebefore{p\aa{} forrige side}%
+ \def\reftextafter {p\aa{} neste side}%
+ \def\reftextbefore {p\aa{} forrige side}%
+ \def\reftextcurrent {p\aa{} denne siden}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+\DeclareOption{nynorsk}
+ {\vref@addto\extrasnynorsk{%
+ \def\reftextfaceafter {p\aa{} neste side}%
+ \def\reftextfacebefore{p\aa{} f\o{}rre side}%
+ \def\reftextafter {p\aa{} neste side}%
+ \def\reftextbefore {p\aa{} f\o{}rre side}%
+ \def\reftextcurrent {p\aa{} denne sida}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+\DeclareOption{polish}
+ {\vref@addto\extraspolish{%
+ \def\reftextfaceafter {na \reftextvario{s\aob{}siedniej}%
+ {nast\eob{}pnej} stronie}%
+ \def\reftextfacebefore{na \reftextvario{s\aob{}siedniej}%
+ {poprzedniej} stronie}%
+ \def\reftextafter {na nast\eob{}pnej stronie}%
+ \def\reftextbefore {na poprzedniej stronie}%
+ \def\reftextcurrent {na \reftextvario{tej
+ samej}{bie\zkb{}\aob{}cej} stronie}%
+ \def\reftextfaraway#1{na stronie~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stronach~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ }}
+\DeclareOption{portuges}
+ {\vref@addto\extrasportuges{%
+ \def\reftextfaceafter {na \reftextvario{p\'agina ao lado}{pr\'oxima
+ p\'agina}}%
+ \def\reftextfacebefore{na p\'agina \reftextvario{ao lado}{anterior}}%
+ \def\reftextafter {na \reftextvario{p\'agina seguinte}{pr\'oxima
+ p\'agina}}%
+ \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
+ \def\reftextcurrent {nesta p\'agina}%
+ \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{romanian}
+ {\vref@addto\extrasromanian{%
+ \def\reftextfaceafter {pe pagina \reftextvario{opus\u{a}}{urm\u{a}toarei}}%
+ \def\reftextfacebefore{pe pagina \reftextvario{opus\u{a}}{precedentei}}%
+ \def\reftextafter {\reftextvario{pe pagina urm\u{a}toare}%
+ {pe urm\u{a}toarea pagin\u{a}}}%
+ \def\reftextbefore {pe pagina \reftextvario{precedent\u{a}}%
+ {precedentei}}%
+ \def\reftextcurrent {pe aceast\u{a} pagin\u{a}}%
+ \def\reftextfaraway#1{pe pagina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pe paginile~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} la~\ref{#2}}%
+ }}
+\DeclareOption{russian}
+ {\vref@addto\extrasrussian{%
+ \def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
+ {\cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch\cyre\cyrishrt}\ \cyrs\cyrt
+ \cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
+ {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}\
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextafter{\cyrn\cyra\ \cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch
+ \cyre\cyrishrt\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextbefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyre\cyrd
+ \cyrsh\cyre\cyrs\cyrt\cyrv\cyru\cyryu\cyrshch\cyre\cyrishrt}%
+ {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}%
+ \ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrerev\cyrt\cyro
+ \cyrishrt}{\cyrd\cyra\cyrn\cyrn\cyro\cyrishrt}\ \cyrs\cyrt\cyrr
+ \cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn
+ \cyri\cyrc\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\cyrs~\ref{#1}\ \cyrp\cyro~\ref{#2}}%
+ }}
+\DeclareOption{slovak}
+ {\vref@addto\extrasslovak{%
+ \def\reftextfaceafter {na \reftextvario{proti\v lahlej}%
+ {nasleduj\'ucej} strane}%
+ \def\reftextfacebefore{na \reftextvario{proti\v lahlej}%
+ {predch\'adzaj\'ucej} strane}%
+ \def\reftextafter {na \reftextvario{nasleduj\'ucej}%
+ {\v dal\v sej} strane}%
+ \def\reftextbefore {na \reftextvario{predch\'adzaj\'ucej}%
+ {predo\v slej} strane}%
+ \def\reftextcurrent {na tejto strane}%
+ \def\reftextfaraway#1{na strane~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a\v z~\ref{#2}}%
+ }}
+\DeclareOption{slovene}
+ {\vref@addto\extrasslovene{%
+ \def\reftextfaceafter {na naslednji strani}%
+ \def\reftextfacebefore{na prej\v{s}nji strani}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {na \reftextvario{tej}{trenutni} strani}%
+ \def\reftextfaraway#1{na strani~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na straneh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ }}
+\DeclareOption{spanish}
+ {\vref@addto\extrasspanish{%
+ \def\reftextfaceafter {en la p\'agina siguiente}%
+ \def\reftextfacebefore{en la p\'agina anterior}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {en esta p\'agina}%
+ \def\reftextfaraway#1{en la p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{en las p\'aginas~\pageref{#1}%
+ -\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+\DeclareOption{swedish}
+ {\vref@addto\extrasswedish{%
+ \def\reftextfaceafter {p\aa\ \reftextvario{motst\aa ende}%
+ {n\"{a}sta} sida}%
+ \def\reftextfacebefore{p\aa\ \reftextvario{motst\aa ende}%
+ {f\"{o}reg\aa ende} sida}%
+ \def\reftextafter {p\aa\ \reftextvario{f\"{o}ljande}%
+ {n\"{a}sta} sida}%
+ \def\reftextbefore {p\aa\ f\"{o}reg\aa ende sida}%
+ \def\reftextcurrent {p\aa\ denna sida}%
+ \def\reftextfaraway#1{p\aa\ sidan~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa\
+ sidorna~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} till~\ref{#2}}%
+ }}
+\DeclareOption{turkish}
+ {\vref@excuse{turkish}%
+ \vref@addto\extrasturkish{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+\DeclareOption{ukrainian}
+ {\vref@addto\extrasukrainian{%
+ \def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
+ {\cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt
+ \cyro\cyrr\cyri\cyrn\cyrc\cyrii}%
+ \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
+ {\cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd\cyrn\cyrii\cyrishrt}\
+ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextafter{\cyrn\cyra\ \cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn
+ \cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextbefore{\cyrn\cyra\ \cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd
+ \cyrn\cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrc\cyrii\cyrishrt}%
+ {\cyrd\cyra\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn
+ \cyrc\cyrii}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyro\cyrr\cyrii
+ \cyrn\cyrk\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\cyrz~\ref{#1}\ \cyrd\cyro~\ref{#2}}%
+ }}
+\DeclareOption{francais}{%
+ \typeout{Please use `french' instead of `francais'}%
+ \ExecuteOptions{french}}
+\DeclareOption{germanb}{%
+ \typeout{Please use `german' instead of `germanb'}%
+ \ExecuteOptions{german}}
+\DeclareOption{draft}{\AtEndOfPackage\vrefwarning}
+\DeclareOption{final}{\AtEndOfPackage\vrefshowerrors} % the default
+\ExecuteOptions{english,final}
+\ProcessOptions*
+\newcounter{vrcnt}
+\DeclareRobustCommand\vpageref{\@ifstar
+ {\let\vref@space\relax\vp@geref}%
+ {\let\vref@space\space\vp@geref}}
+\def\vp@geref{\@ifnextchar[%
+ \@vpageref{\@vpageref[\reftextcurrent]}%
+}
+\let\vref@space\space
+\def\@vpageref[#1]{\@ifnextchar[%
+ {\@@vpageref{#1}}{\@@vpageref{#1}[\unskip\vref@space]}}
+\def\@@vpageref#1[#2]#3{%
+ \leavevmode\unskip
+ \global\advance\c@vrcnt\@ne
+ \vref@pagenum\@tempa{\the\c@vrcnt @vr}%
+ \vref@pagenum\@tempb{\the\c@vrcnt @xvr}%
+ \vref@label{\the\c@vrcnt @xvr}%
+ \ifx\@tempa\@tempb
+ \let\vref@may@loop\relax
+ \else
+ \edef\vref@may@loop{%
+ \noexpand\vref@err{\noexpand\vref or \noexpand\vpageref
+ at page boundary
+ \@tempb-\@tempa\space (may loop)%
+ }%
+ }%
+ \fi
+ \vrefpagenum\thevpagerefnum{#3}%
+ \vref@space
+ \ifx\@tempa\thevpagerefnum
+ \def\@tempc{#1}%
+ \ifx\@tempc\@empty
+ \unskip
+ \else
+ #1%
+ \fi
+ \else
+ #2%
+ \is@pos@number\thevpagerefnum
+ {%
+ \is@pos@number\@tempa
+ {\@tempcnta\@tempa
+ \advance\@tempcnta\@ne
+ }%
+ {\@tempcnta\maxdimen}%
+ \ifnum \thevpagerefnum =\@tempcnta
+ \ifodd\@tempcnta
+ \if@twoside
+ \reftextfaceafter
+ \else
+ \reftextafter
+ \fi
+ \else
+ \reftextafter
+ \fi
+ \else
+ \advance\@tempcnta-2
+ \ifnum \thevpagerefnum =\@tempcnta
+ \ifodd\@tempcnta
+ \reftextbefore
+ \else
+ \if@twoside
+ \reftextfacebefore
+ \else
+ \reftextbefore
+ \fi
+ \fi
+ \else
+ \let\vref@may@loop\relax % added
+ \reftextfaraway{#3}%
+ \fi
+ \fi
+ }%
+ {%
+ \let\vref@may@loop\relax %added
+ \reftextfaraway{#3}}%
+ \fi
+ \vref@label{\the\c@vrcnt @vr}%
+ \vref@may@loop
+}
+\def\vref@label#1{\@bsphack
+ \protected@write\@auxout{}%
+ {\string\newlabel{#1}{{}{\thepage}}}%
+ \@esphack}
+\let\thevpagerefnum\@empty
+\def\vrefwarning{\def\vref@err{\PackageWarning{varioref}}}
+\def\vrefshowerrors{\def\vref@err##1{\PackageError{varioref}{##1}%
+ {Please check the pages in question. You might need to replace
+ the \string\vref\MessageBreak
+ or \noexpand\vpageref by a normal \noexpand\(page)ref to
+ stop LaTeX running forever.}}}
+\DeclareRobustCommand\vref{\@ifstar
+ {\let\vref@space\relax\vr@f}%
+ {\let\vref@space\nobreakspace\vr@f}}
+\def\vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \ref{#1}%
+ \vpageref[\unskip]{#1}}
+\def\is@pos@number#1{\is@pos@num0#1\space\@nil}
+\def\is@pos@num{\afterassignment\is@pos@num@ \count@}
+\def\is@pos@num@#1\@nil{%
+ \ifx\@nil#1\@nil
+ \expandafter\@firstoftwo \else
+ \expandafter\@secondoftwo \fi}
+\def\reftextvario#1#2{\ifodd\c@vrcnt #1\else#2\fi}
+\def\fullref#1{\ref{#1} \reftextfaraway{#1}}
+\def\vref@pagenum#1#2{%
+ \@ifundefined{r@#2}{\@namedef{r@#2}{{??}{??}}}{}%
+ \expandafter\expandafter\expandafter\vref@@pagenum
+ \csname r@#2\endcsname{}{}\@nil#1%
+}
+\def\vref@@pagenum#1#2#3\@nil#4{%
+ \def#4{#2}%
+}
+\def\vrefpagenum#1#2{%
+ \@ifundefined{r@#2}%
+ {\G@refundefinedtrue
+ \@latex@warning{Reference `#2' on page \thepage \space
+ undefined}}{}%
+ \vref@pagenum{#1}{#2}}
+\newcommand\@svpagerefrange[3][\reftextcurrent]{%
+ \vrefpagenum\@tempa{#2}%
+ \vrefpagenum\@tempb{#3}%
+ \ifx\@tempa\@tempb
+ \vpageref*[{#1}]{#2}%
+ \else
+ \reftextpagerange{#2}{#3}%
+ \fi
+}
+\newcommand\@vpagerefrange[3][\reftextcurrent]{%
+ \vrefpagenum\@tempa{#2}%
+ \vrefpagenum\@tempb{#3}%
+ \ifx\@tempa\@tempb
+ \vpageref[{#1}]{#2}%
+ \else
+ \reftextpagerange{#2}{#3}%
+ \fi
+}
+\newcommand\vpagerefrange{\@ifstar\@svpagerefrange\@vpagerefrange}
+\newcommand\vrefrange[3][\reftextcurrent]
+ {\reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+\def\refstepcounter#1{\stepcounter{#1}%
+ \protected@edef\@currentlabel
+ {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}%
+}
+\def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
+\DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
+ \expandafter\MakeUppercase\@tempa}
+\DeclareRobustCommand\Vref{\@ifstar
+ {\let\vref@space\relax\Vr@f}%
+ {\let\vref@space\nobreakspace\Vr@f}}
+\def\Vr@f#1{%
+ \leavevmode\unskip\vref@space
+ \Ref{#1}%
+ \vpageref[\unskip]{#1}}
+\endinput
+%%
+%% End of file `varioref.sty'.
diff --git a/macros/latex-dev/required/tools/varioref.dtx b/macros/latex-dev/required/tools/varioref.dtx
new file mode 100644
index 0000000000..049bd0d55e
--- /dev/null
+++ b/macros/latex-dev/required/tools/varioref.dtx
@@ -0,0 +1,2447 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% Package varioref to use with LaTeX2e
+%% Copyright (C) 1992-2019 Frank Mittelbach, all rights reserved.
+%%
+%% For additions or updates to the language options please contact
+%% the author at
+%%
+%% frank.mittelbach@latex-project.org
+%%
+%% or open an issue at https://github.com/latex3/latex2e.
+%%
+%
+%<package>\NeedsTeXFormat{LaTeX2e}[1995/05/16]
+%<package>\providecommand\DeclareRelease[3]{}
+%<package>\providecommand\DeclareCurrentRelease[2]{}
+%<package>
+%<package>\DeclareRelease{}{2016-02-16}{varioref-2016-02-16.sty}
+%<package>\DeclareCurrentRelease{}{2019-10-01}
+%<package>
+%<package>\ProvidesPackage{varioref}
+%<package> [2019/09/08 v1.6b package for extended references (FMi)]
+% \fi
+%
+%%
+%
+%
+% \changes{v1.0a}{1993/12/06}{Upgrade to LaTeX2e}
+% \changes{v1.0g}{1994/05/27}{Use \cmd\DeclareRobustCommand}
+% \changes{v1.5c}{2016/02/09}{Revamped some of the documentation to better
+% explain how varioref could be used in a multi-lingual context}
+% \changes{v1.6a}{2019/08/25}{\cs{labelformat} and \cs{Ref} now available in the kernel
+% so removed from this package but only in new kernel}
+%
+%
+% \newcommand\NewIn[1]{\marginpar{\fbox{\fbox{\sffamily\tabular{l}New
+% in\\#1\endtabular}}}}
+% \newcommand\ChangedIn[1]{\marginpar{\fbox{\fbox{\sffamily\tabular{l}Changed
+% in\\#1\endtabular}}}}
+%
+% \providecommand\pkg[1]{\texttt{#1}}
+% \providecommand\option[1]{\texttt{#1}}
+% \providecommand\meta[1]{$\langle§\textit{#1}$\rangle$}
+%
+%
+% \makeatletter
+% \def\allowtofu{^^A
+%\def\UTFviii@undefined@err##1{^^A
+% \PackageWarning{inputenc}{Unicode character \expandafter
+% \UTFviii@splitcsname\string##1\relax
+% \MessageBreak
+% not set up for use with LaTeX}^^A
+% \raisebox{.8pt}{\fboxsep1pt\kern.1pt\fbox{$\cdot$}\kern.1pt}^^A
+% }}
+% \makeatother
+%
+% \title{The \pkg{varioref} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{Frank Mittelbach}
+% \date{\filedate}
+%
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+%
+% \begin{abstract}
+% This package defines the commands |\vref|, |\vpageref|,
+% |\vrefrange|, and |\vpagerefrange| for
+% \LaTeXe. |\vref| is similar to |\ref| but adds an additional
+% page reference, like `on the facing page' or `on page 27' whenever
+% the corresponding |\label| is not on the same page. The command
+% |\vpageref| is a variation to |\pageref| with a similar
+% functionality. The |\v...range| commands take two labels as arguments
+% and produce strings which depend on whether or not these labels
+% fall onto a single page or on different pages.
+% Generated strings are customizable so that these
+% commands are usable with various languages.
+% \end{abstract}
+%
+%
+% \columnsep=2\columnsep
+% \begin{multicols}{2}
+% \tableofcontents
+% \end{multicols}
+%
+% \section{Introduction}
+%
+% In many cases it is helpful when referring to a figure or table to
+% put both a |\ref| and a |\pageref| command into the document
+% especially when there are one or more pages between the reference
+% and the object. Therefore some people use a command like
+% \begin{verbatim}
+% \newcommand{\fullref}[1]{\ref{#1} on page~\pageref{#1}}
+%\end{verbatim}
+% which reduces the number of key strokes, necessary to make such a
+% complete reference. But since one never knows where the referenced
+% object finally falls, using such a device may result in a page
+% reference to the current page which is disturbing and therefore
+% should be avoided.
+%
+%
+%
+% \section{Loading the package}
+%
+%
+% The suggested way of loading the package these days is by
+% \emph{always} using
+% the package option \option{nospace},
+% \NewIn{2019}
+% i.e.,
+% \begin{verbatim}
+% \usepackage[nospace]{varioref}
+%\end{verbatim}
+% See below for an explanation of why this is needed. There are some
+% other options that you may want to use additionally; they are
+% explained \vpageref{options}.
+%
+%
+%
+% \section{The user interface}
+%
+%\DescribeMacro\vref The implementation of |\vref| below produces only
+% a |\ref| when reference and |\label| are on the same page. It will
+% additionally produce one of the strings `on the facing page', `on
+% the preceding page', or `on the following page', if label and
+% reference differ by one and it will produce both |\ref| and
+% |\pageref| when the difference is larger. The word `facing' is used
+% when label and reference both fall onto a double spread. However,
+% if a special page numbering scheme is used instead of the usual
+% arabic numbering (e.g., |\pagenumbering{roman}|) then there will be
+% no distinction between one or many pages off.
+%
+%\DescribeMacro\vpageref Sometimes one wants to refer only to page
+% number and again such a reference should normally be suppressed if
+% we are referring to the current page. For this purpose the package
+% defines the |\vpageref| command. It will produce the same strings as
+% |\vref| except that it doesn't start with the |\ref|. A further
+% difference is that
+% it will produce the string that is saved in |\reftextcurrent| if
+% label and reference fall onto the same page (and no optional
+% argument is used). By defining
+% |\reftextcurrent| to produce ``on this page'' or something similar,
+% we can avoid that
+% \begin{verbatim}
+% ... see the example \vpageref{ex:foo} which shows ...
+%\end{verbatim}
+% comes out as ``\ldots~see the example which shows~\ldots'', which
+% could be misleading.
+%
+% A space in front of |\vpageref| it will be ignored if
+% the command doesn't produce any text at all.
+%
+% But in fact |\vpageref| allows even more control. If has two
+% optional arguments. With the first one, one can specify the text
+% that should be used if label and reference fall on the same page.
+% This is very helpful if both are near to each other, so that they
+% may or may not be separated by a page break. In such a case we
+% usually know (!) whether the reference is before or after the label
+% so that we can say something like
+% \begin{verbatim}
+% ... see the example \vpageref[above]{ex:foo} which shows ...
+%\end{verbatim}
+% which will then come out as ``\ldots~see the example above which
+% shows~\ldots'' if we are still on the same page, but as ``\ldots~see
+% the example on the page before which shows~\ldots'' (or something
+% similar depending on the settings of the |\reftext..before|
+% commands) when there was a page break in the meantime. One warning
+% however, if you use |\vpageref| with the optional argument to refer
+% to a figure or table, keep in mind that depending on the float
+% placement parameters the float may show up on top of the current
+% page and therefore before the reference even if it came after it in
+% the source file.
+%
+% But maybe you prefer to say ``\ldots~see the above example'' if
+% example and reference fall onto the same page, i.e., reverse the
+% word order. In fact, in some languages the word order automatically
+% changes in that case. To allow for this variation the second
+% optional argument can be used. It specifies the text preceding the
+% generated reference if object and reference do not fall onto the
+% same page. Thus one would write
+% \begin{verbatim}
+% ... see the \vpageref[above example][example]{ex:foo}
+% which shows ...
+%\end{verbatim}
+% to achieve the desired effect.
+%
+%
+% \DescribeMacro\vrefrange
+% This command is similar to |\vref| but it
+% takes two mandatory arguments denoting a range to refer to (e.g., a
+% sequences of figures or a sequence of equations, etc.). So if
+% |fig:a| is your first figure in the sequence and |fig:c| your last
+% you can write
+%\begin{verbatim}
+% ... see figures \vrefrange{fig:a}{fig:c} ...
+%\end{verbatim}
+% which would then be formatted as
+% \begin{quote}
+% \ldots\ see figures 3.4 to 3.6 on pages 23--24 \ldots
+% \end{quote}
+% or, if they happen to all fall onto the next page, as
+% \begin{quote}
+% \ldots\ see figures 3.4 to 3.6 on the following page \ldots
+% \end{quote}
+% i.e., the command is deciding what to say depending on where the two
+% labels are placed in relation to each other; it is essentially
+% implemented using |\vpagerefrange| described below.
+% The optional argument the command may take is the text to use in case
+% both labels are placed on the current page.
+%
+%
+% \DescribeMacro\vpagerefrange This command is similar to |\vpageref|
+% but takes two mandatory arguments which are two labels denoting a
+% range. If both labels fall onto the same page, the command acts
+% exactly like |\vpageref| (with a single label), otherwise it produces
+% something like ``on pages~15--18'' (see customization possibilities
+% below). The optional argument it may take is the text to use in case
+% both labels are placed on the current page.
+
+% \DescribeMacro\vrefpagenum This macro is provided to allow the user
+% to write their own small commands which implement functions similar
+% to those provided by the two previous commands. It takes two
+% arguments: the second is a label (i.e., as used in |\label| or
+% |\ref|) and the first is an arbitrary command name (make sure you
+% use our own) that receives the page number related to this label.
+% So if you have two (or more) labels you could retrieve their page
+% numbers, compare them and then decide what to print. For example,
+% the following not very serious definition (also using the
+% \pkg{ifthen} package)
+%\begin{verbatim}
+% \newcommand\amusingversion[2]{the definition%
+% \vrefpagenum\firstnum{#1}%
+% \vrefpagenum\secondnum{#2}%
+% \ifthenelse{\equal\firstnum\secondnum}%
+% {s of \ref{#1} and \ref{#2} \vpageref{#1}}%
+% { of \ref{#1} \vpageref{#1} and of \ref{#2} \vpageref{#2}}%
+% }
+%
+% ...\amusingversion{foo}{bar}
+%\end{verbatim}
+% will print something like
+% \begin{quote}
+% \ldots the definitions of 3 and 4 on the previous page
+% \end{quote}
+% in the case both labels are on the same page but something like
+% \begin{quote}
+% \ldots the definition of 3 on the next page and of 4 on page~13
+% \end{quote}
+% in case they are on different pages.
+%
+% \DescribeMacro\vpagerefcompare
+% \NewIn{2019}
+% For this kind of application the package also provides
+% |\vpagerefcompare| as a command that takes four argument: two labels for
+% comparison and a \meta{true} and \meta{false} argument. One of them
+% is executed depending on whether the two labels are on the same page
+% or on different pages. With its help the above definition could be
+% shortened to
+%\begin{verbatim}
+% \newcommand\amusingversion[2]{the definition%
+% \vpagerefcompare{#1}{#2}%
+% {s of \ref{#1} and \ref{#2} \vpageref{#1}}%
+% { of \ref{#1} \vpageref{#1} and of \ref{#2} \vpageref{#2}}%
+% }
+%\end{verbatim}
+% and you don't have to load the \pkg{ifthen} package any longer to
+% make it work.
+%
+% \DescribeMacro\vpagerefnearby
+% \NewIn{2019}
+% Another command for conditional processing is |\vpagerefnearby|. It
+% takes three arguments: a label and a \meta{true} and \meta{false}
+% argument. It compares the page reference to the label with the
+% current page number and if both are arabic number and only differ by
+% $\pm1$ the \meta{true} argument is executed otherwise the
+% \meta{false} argument. In other words it tells you if a |\vpageref|
+% to the label would result in a textual reference to the previous,
+% current or next page.\footnote{There is also a
+% \cs{vpagerefcomparenearby} but this is only meant for package
+% writers, so it is only documented in the implementation section.}
+
+%
+%
+% If you don't use the \texttt{nospace} option the user commands
+% |\vref|, |\vpageref|, and |\vpagerefrange| all work by first
+% removing any space on their left and then inserting some space of
+% their own (|\vref|, for example, a nonbreakable space). That seemed
+% like a good idea back then, but it has the disadvantage that you
+% can't use these macros in situations where you definitely do not
+% want any space before the generated text. E.g., in situations like
+% |(\vref{foo} ...)| you end up with a space after the open
+% parenthesis.
+%
+% \DescribeMacro{\vref*}
+% \DescribeMacro{\vpageref*}
+% \DescribeMacro{\vpagerefrange*}
+% Since it was too late to change the default in 2001 I added star
+% versions of the macros which do not add any space before the
+% generated text (they do nevertheless remove space at the left).
+%
+% However, that too has problems (one is that \pkg{hyperref}
+% \ChangedIn{2019}
+% introduced the star forms as a means to generating references
+% without hyperlinks (which is clearly the more important
+% application).
+% So these days I recommend to always call the package with the option
+% \option{nospace} which prevents \pkg{varioref} from messing with the
+% space in front. Of course you are then responsible to always add it
+% when necessary, but that does make the source more readable so it is
+% a good thing. This also has the advantage that the star forms are
+% now unnecessary again and can be used in the way implemeented by
+% \pkg{hyperref} if both packages are used together.
+%
+% In fact it would be much nicer to make that the
+% default but the package has been used by many people for so many
+% years that changing the default would break way to many older documents.
+%
+%
+% \DescribeMacro\labelformat
+% A reference via |\ref| produces by default the data associated with
+% the corresponding |\label| command (typically a number); any
+% additional formatting has to be provided by the user. With
+% |\labelformat| it is possible to declare scuch formatting for each
+% ``reference'' counter, e.g.,
+%\begin{verbatim}
+% \labelformat{section}{section~#1}
+% \labelformat{equation}{equation~(#1)}}
+%\end{verbatim}
+%
+%
+% \DescribeMacro\Vref
+% \DescribeMacro\Ref
+% A side effect of using |\labelformat| is that, depending on the
+% defined formatting, it becomes impossible to use |\ref| at the
+% beginning of a sentence (if its replacement text starts with a
+% lowercase letter).
+% \ChangedIn{2019}
+% For that reason \pkg{varioref} provided the commands |\Ref| and
+% |\Vref|. They behave like |\ref| and |\vref| except that they
+% uppercase the first token of the generated string. These days
+% |\labelformat| and |\Ref| are already provided by the \LaTeX{}
+% kernel; only |\Vref| is still defined within the \pkg{varioref}
+% package.
+%
+% To make |\Ref| or |\Vref| work properly the very first token in the
+% second argument of |\labelformat| has to be a simple \textsc{ascii}
+% or UTF-8 letter, otherwise the capitalization will fail or worse,
+% you will end up with some error messages. If you actually need
+% something more complicated in this place (e.g., an accented letter
+% not written as a UTF-8 character) you have to explicitly surround it
+% with braces, to identify the part that needs to be capitalized. For
+% example, for figure references in the Hungarian language you might
+% want to write |\labelformat{figure}{{\'a}bra~\thefigure}| or use
+% |\labelformat{figure}{ábra~\thefigure}| which avoids the brace
+% problem.
+%
+% \DescribeMacro\thevpagerefnum
+% If you like to have |\vref| suppress the page number on pages where
+% label and reference fall onto the same page, but prefer reference to
+% page numbers otherwise then |\thevpagerefnum| can be used. This macro
+% hold the current page ``number'' when |\vpageref| and friends are
+% executed. Thus, by defining, for example
+%\begin{verbatim}
+%\renewcommand\reftextfaceafter {on page~\thevpagerefnum}
+%\renewcommand\reftextfacebefore{on page~\thevpagerefnum}
+%\renewcommand\reftextafter {on page~\thevpagerefnum}
+%\renewcommand\reftextbefore {on page~\thevpagerefnum}
+%\end{verbatim}
+% textual references can be suppressed.
+%
+% \section{Multi-lingual usage}
+%
+% The package works well together with the babel system if it is
+% loaded \textit{after} the babel package, e.g., a document in English
+% (default), French and German text could load the packages as
+% follows:
+%\begin{verbatim}
+% \usepackage[ngerman,french,english]{babel,varioref}
+%\end{verbatim}
+% (or in two separate lines if you prefer one |\usepackage| line per
+% package). Depending on the current babel language |\vref| and
+% friends would then generate strings in different languages. If the
+% language options are given as global options to the document class
+% then it is enough to use
+%\begin{verbatim}
+% \usepackage{babel,varioref}
+%\end{verbatim}
+% to achieve the same effect.
+%
+% If more than one language is specified with \pkg{varioref} then
+% it will start using the last language selected. Switching of
+% languages is managed through Babel; nevertheless all languages of
+% interest need to be specified when \pkg{varioref} is loaded so
+% that it can integrate their strings into the Babel system.
+%
+%
+% \section{Customization}
+%
+% The package supports all options defined by the babel package to
+% translate the fixed strings into other languages than English.
+% (Some languages need updating, however---help is appreciated.) It
+% also supports languages currently not in babel (those can only be
+% used standalone, obviously); check the section on options later~on.
+%
+%
+% \pagebreak[3]
+%
+% You can also modify some or all of the strings by redefining the
+% following commands after the package has been loaded.
+%\DescribeMacro\reftextbefore
+%\DescribeMacro\reftextfacebefore
+%\DescribeMacro\reftextafter
+%\DescribeMacro\reftextfaceafter Backward references use
+% |\reftextbefore| if the label is on the preceding page but invisible
+% and |\reftextfacebefore| if it is one the facing page (i.e., if the
+% current page number is odd). Similarly |\reftextafter| is used
+% when the label comes on the next page but one has to turn the page
+% and |\reftextfaceafter| if it is on the following but facing page.
+%
+% In fact, |\reftextface...| is used only if the user or the document
+% class specified two-sided printing.
+%
+%\DescribeMacro\reftextfaraway Finally we have |\reftextfaraway| which
+% is used whenever label and reference differ by more than one or when
+% they aren't numeric. This macro is a bit different because it takes
+% one argument, the symbolic reference string so that one cane make
+% use of |\pageref| in its replacement text.
+%
+%
+%\DescribeMacro\reftextvario To allow a bit random variation in the
+% generated strings one can use the command |\reftextvario| inside the
+% string macros. It takes two arguments and selects one or the other
+% for printing depending on the number of already seens |\vref| or
+% |\vpageref| commands. As an example see the definitions of
+% |\reftextbefore| etc.\ \vpageref[below]{reftextbefore}.
+%
+% The commands |\vrefrange| and |\vpagerefrange| produce their text
+% \NewIn{1998}
+% using two macros described below. By redefining them one can modify
+% the results to accommodate special requirements.
+%
+%
+% They both take two mandatory arguments denoting the first and the
+% last label of the range.
+%
+%
+% \DescribeMacro\reftextpagerange This macro produces text that
+% describes the page range of the two labels, e.g., the default
+% for English is ``|on pages~\pageref{#1}--\pageref{#2}}|''.
+%
+%
+% \DescribeMacro\reftextlabelrange This macro produces text that
+% describes the range of figures, tables, or whatever the labels refer
+% to, the default for English is ``|\ref{#1} to~\ref{#2}|''.
+%
+% \subsection{\ldots\ if Babel is used}
+%
+% \begin{itshape} If babel is being used then the above commands need to be
+% changed using the Babel mechanism, e.g.,
+%\begin{verbatim}
+% \addto\extrasngerman{%
+% \renewcommand\reftextfaceafter {auf der n\"achsten Seite}%
+% ... }
+%\end{verbatim}
+% Otherwise babel will reintroduce its own defaults whenever the language is
+% changed (which happens in particular during |\begin{document}| where the
+% main language is selected).
+% \end{itshape}
+%
+%
+%
+%
+% \section{Options} \label{options}
+%
+% As mentioned above the package supports all standard options offered
+% by the Babel system to customize the strings produced, it may also
+% have a few not supported by babel, for a full list look
+% in section\vref{sec:impoptions}. In addition it offers the option
+% \texttt{draft} to turn error messages into warnings during
+% development. The default \texttt{final} produces error message when
+% a generated string falls onto a page boundary (see next section).
+%
+% Newly introduced in 2019 are the options \option{space} (default)
+% and \option{nospace}. While the former is the default to allow
+% \NewIn{2019}
+% documents written in the last twenty years to continue to work
+% correctly, I nowadays, suggest that you always use the package with
+% the option \option{nospace}. This will stop \pkg{varioref} from
+% meddling with the spaces preceding commands and thus make the star
+% forms |\vref*| and |\vpageref*| unnecessary.
+%
+% This means that the star forms can then be used as defined by
+% \pkg{hyperref} for suppressing a hyperlink when both packages are
+% used together (which is a rather typical scenario these days).
+%
+%
+% \section{A few warnings}
+%
+% Defining commands like the ones described above poses some
+% interesting problems. Suppose, for example, that a generated text
+% like `on the next page' gets broken across pages. If this happens it
+% is very difficult to find an acceptable solution and in fact can
+% even result in a document that will always change from one state to
+% another (i.e., inserting one string, finding that this is wrong,
+% inserting another string on the next run which makes the first
+% string correct again, inserting \ldots). The current implementation
+% of \pkg{varioref} therefore issues an error message whenever the
+% generated text is broken across page boundaries, e.g.,
+% \begin{quote}
+% table 5 on the current \meta{page break} page
+% \end{quote}
+% would would result in an error, which needs to be resolved by the
+% user by replacing the |\vref| command with an ordinary |\ref| just
+% before the final run. This is not
+% completely satisfactory but in such case no solution really is.
+% \DescribeMacro\vrefwarning
+% During document preparation, while one is still changing the text,
+% such error messages can be turned into warnings by placing a
+% |\vrefwarning| command in the preamble. This is equivalent to
+% specifying ``draft'' as an option to the package.
+% \DescribeMacro\vrefshowerrors
+% |\vrefshowerrors| ensures that varioref stops when detecting a
+% possible loop. This is the default and equivalent to specifying
+% ``final'' as an option.
+%
+% At the end final a warning: every use of |\vref| will internally
+% generate two macro names to keep track of the string positions
+% within the document. As a result you may run out of name space or
+% main memory\footnote{Not really that likely these days, but one
+% never knows \ldots. In any case \TeX{} will process your document a
+% tiny bit faster.} if you make heavy use of this macro on a small
+% \TeX{} installation.
+%\DescribeMacro\fullref For this reason the primitive command
+% |\fullref| is also provided. This command can be used whenever you
+% know for sure that label and reference can't fall onto nearby pages.
+%
+% \StopEventually{\PrintIndex\PrintChanges}
+%
+%
+% \section{The documentation driver file}
+%
+% The next bit of code contains the documentation driver file for
+% \TeX{}, i.e., the file that will produce the documentation you are
+% currently reading. It will be extracted from this file by the
+% \pkg{docstrip} program.
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{multicol,varioref}
+\GetFileInfo{varioref.sty}
+\setlength\hfuzz{1pt} % ignore slight overfulls
+\EnableCrossrefs
+%\DisableCrossrefs % Say \DisableCrossrefs if index is ready
+
+\RecordChanges % Gather update information
+%\OnlyDescription % comment out for implementation details
+\begin{document}
+ \DocInput{varioref.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+%
+% \section{The implementation}
+%
+% The main implementation idea is to generate an internal label
+% command for every |\vpageref| and compare the page reference of this
+% label with the page reference of the user-requested label. Since
+% this means one additional macro name for each use of |\vpageref| or
+% |vref| (which is implemented in terms of |\vpageref|) the memory
+% requirements of this package may be high in terms of main and macro
+% name memory. Since the information held in the internal labels is
+% used only once one could envision a different scheme if suitable
+% primitives for this kind of ``one place information'' would be
+% provided by \LaTeX. This type of data structure is planned for
+% \LaTeX3 but for the moment we have to live with the memory
+% restrictions.
+%
+% We start by checking if this file was already loaded. If not we
+% identify the current version. This is actually done at the top
+% of the file, so we comment it out here
+% \changes{v0.1h}{1993/08/15}{Small documentation changes}
+% \begin{macrocode}
+%<*package>
+%\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+%\ProvidesPackage{varioref}[\filedate\space\fileversion\space
+% LaTeX2e package for extended references (FMi)]
+% \end{macrocode}
+%
+%
+% \begin{macro}{\vref@addto}
+% \changes{v1.0b}{1994/01/31}{Avoid using babel `addto}
+% \changes{v1.0b}{1994/01/31}{The babel commands are starting
+% with extras}
+% To support the use of babel we want to add the additional strings
+% to the |\extras|\meta{language} commands. Since |\addto| in the
+% current implementation of babel has a bug that does not allow to
+% use arguments containing hashmarks we do this by hand.
+% \begin{macrocode}
+\def\vref@addto#1#2{%
+ #2%
+ \@temptokena{#2}%
+ \ifx#1\undefined
+ \edef#1{\the\@temptokena}%
+ \else
+ \toks@\expandafter{#1}%
+ \edef#1{\the\toks@\the\@temptokena}%
+ \fi
+ \@temptokena{}\toks@\@temptokena
+}
+\@onlypreamble\vref@addto
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Options}\label{sec:impoptions}
+%
+% \begin{macro}{\vref@excuse}
+% Excuse that we don't know the strings for a certain language.
+% \changes{v1.0q}{1995/04/06}{Use `PackageWarning}
+% \begin{macrocode}
+\def\vref@excuse#1{%
+ \PackageWarningNoLine{varioref}{Sorry, language `#1'
+ not supported%
+ \MessageBreak
+ in this version.
+ English strings used by default.
+ \MessageBreak
+ Please modify \protect\reftext... commands manually.%
+ \MessageBreak\MessageBreak
+ If you can suggest translations for
+ this language,%
+ \MessageBreak
+ please mail them
+ to the author of this package}}
+\@onlypreamble\vref@excuse
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vref@stringwarning}
+% And we sometimes just don't know some strings~\ldots
+% \changes{v1.2a}{1998/08/01}{Macro added}
+% \begin{macrocode}
+\def\vref@stringwarning#1{%
+ \PackageWarningNoLine{varioref}{Sorry, there is no proper
+ translation for the string\MessageBreak
+ produced by \protect#1\on@line.\MessageBreak
+ English string used instead.\MessageBreak
+ \MessageBreak
+ If you can suggest translations for
+ the current\MessageBreak
+ language, please mail them
+ to the author of this\MessageBreak package}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\reftextfaceafter}
+% \begin{macro}{\reftextfacebefore}
+% \begin{macro}{\reftextafter}
+% \begin{macro}{\reftextbefore}
+% \begin{macro}{\reftextcurrent}
+% \label{reftextbefore} The options do set the macros that
+% generate the textual strings. Note, that they do not start with a
+% space, the space is already added in the main macro below.
+% \changes{v1.2a}{1998/08/22}{Added american defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextbefore}}
+%
+% Afrikaans option contributed by Danie Els
+% (\texttt{dnjels@sun.ac.za}).
+% \changes{v1.4g}{2003/03/29}{Added afrikaans option}
+% \begin{macrocode}
+\DeclareOption{afrikaans}
+ {\vref@addto\extrasafrikaans{%
+ \def\reftextfaceafter {op die \reftextvario{regterbladsy}%
+ {bladsy langsaan}}%
+ \def\reftextfacebefore{op die \reftextvario{linkerbladsy}%
+ {bladsy langsaan}}%
+ \def\reftextafter {op die \reftextvario{volgende bladsy}%
+ {bladsy hierna}}%
+ \def\reftextbefore {op die \reftextvario{vorige bladsy}%
+ {bladsy hiervoor}}%
+ \def\reftextcurrent {op \reftextvario{hierdie}%
+ {die huidige} bladsy}%
+ \def\reftextfaraway#1{op bladsy~\pageref{#1}}%
+ \def\reftextpagerange#1#2{op bladsye~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} tot~\ref{#2}}%
+ }}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\DeclareOption{american}
+ {\vref@addto\extrasamerican{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Arabic option text was contributed by Ihab Samir Mattar
+% (\texttt{dr\_kremlin@hotmail.com}). As our standard documentation
+% workflow uses pdf\TeX{} the Arabic letters can't be displayed
+% easily, so you will see missing glyphs below. To see the real
+% letters you have to look at the source or package file.
+% \changes{v1.6b}{2019/09/8}{Option arabic added}
+% \begin{allowtofu}
+% \begin{macrocode}
+\DeclareOption{arabic}
+ {\vref@addto\extrasarabic{%
+ \def\reftextfaceafter {بالصÙحة \reftextvario{المقابلة}{اللاحقة}}%
+ \def\reftextfacebefore{بالصÙحة \reftextvario{المقابلة}{المÙنْصَرÙÙ…ÙŽØ©ÙŒ}}%
+ \def\reftextafter {بالصÙحة \reftextvario{اللاحقة}{التالية}}%
+ \def\reftextbefore {بالصÙحة \reftextvario{السابقة}{المÙنْصَرÙÙ…ÙŽØ©ÙŒ}}%
+ \def\reftextcurrent {ب\reftextvario{الصÙحة الحالية}{هذه الصÙحة}}%
+ \def\reftextfaraway#1{بالصÙحة رقم~\pageref{#1}}%
+ \def\reftextpagerange#1#2{بالصÙحات~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} حتى~\ref{#2}}%
+ }}
+% \end{macrocode}
+% \end{allowtofu}
+% \changes{v1.2a}{1998/11/27}{Added austrian defaults (identical to german)}
+% The austrian defaults are the same as the german ones.
+% \begin{macrocode}
+\DeclareOption{austrian}
+ {\vref@addto\extrasaustrian{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+% \end{macrocode}
+% \changes{v1.2d}{2000/01/11}{Added naustrian defaults (identical to german)}
+% The naustrian defaults are the same but needed for ``Neue Rechtschreibung''.
+% \begin{macrocode}
+\DeclareOption{naustrian}
+ {\vref@addto\extrasnaustrian{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for basque defaults was contributed by
+% I\~naki Larra\~naga Murgoitio (aka dooteo)
+% (|<dooteo@euskalgnu.org>|).
+% \changes{v1.4k}{2005/04/09}{Basque defaults added.}
+% \begin{macrocode}
+\DeclareOption{basque}
+ {\vref@addto\extrasbasque{%
+ \def\reftextfaceafter {hurrengo orrialdean}%
+ \def\reftextfacebefore{aurreko orrialdean}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {uneko orrialdean}%
+ \def\reftextfaraway#1{~\pageref{#1}. orrialdean}%
+ \def\reftextpagerange#1#2{~\pageref{#1}--\pageref{#2} orrialdeetan}%
+ \def\reftextlabelrange#1#2{\ref{#1}.etik \ref{#2}.eraino}%
+ }}
+% \end{macrocode}
+% Text for the Bahasa Malaysia defaults was contributed by
+% Bob Margolis 2005-12-02.
+%
+% Notes: pada muka surat translates as ``on the page'' though BM has no
+% definite (or indefinite) article; adjectives and other modifiers follow
+% the noun (clause); bertentangan is ``opposite'' in the sense of
+% ``facing''; berikutnya is ``next'' (in this context - actually
+% next-to-this, literally); berikutnya also translates as ``following
+% this'' sebelumnya is ``preceding''; also ``previous'' ``ini'' translates,
+% literally, as ``this'' but is also used in the sense of current page.
+% \changes{v1.4o}{2005/12/02}{Bahasa Malaysia defaults added.}
+% \begin{macrocode}
+\DeclareOption{bahasam}
+ {\vref@addto\extrasbahasam{%
+ \def\reftextfaceafter {pada muka surat \reftextvario{bertentangan}{berikutnya}}%
+ \def\reftextfacebefore{pada muka surat \reftextvario{bertentangan}{sebelumnya} }%
+ \def\reftextafter {pada muka surat berikutnya}%
+ \def\reftextbefore {pada muka surat sebelumnya}%
+ \def\reftextcurrent {pada muka surat ini}%
+ \def\reftextfaraway#1{pada muka surat~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pada muka surat~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for brazil defaults was contributed by
+% Alcino Dall Igna Junior\\
+% (|adij@di.ufpe.br|).
+% \changes{v1.0g}{1994/05/18}{Brazil defaults added.}
+% \changes{v1.4o}{2005/11/07}{Added a few more brazil strings}
+% \changes{v1.4r}{2007/05/26}{Misspelling of \cs{extrasbrazil}}
+% \begin{macrocode}
+\DeclareOption{brazil}
+ {\vref@addto\extrasbrazil{%
+ \def\reftextfaceafter {na \reftextvario{p\'agina oposta}{pr\'oxima
+ p\'agina}}%
+ \def\reftextfacebefore{na p\'agina \reftextvario{oposta}{anterior}}%
+ \def\reftextafter {na \reftextvario{p\'agina seguinte}{pr\'oxima
+ p\'agina}}%
+ \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
+ \def\reftextcurrent {\reftextvario{nesta p\'agina}{na p\'agina
+ corrente}}%
+ \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for Breton defaults was contributed by
+% Christian ROLLAND\\
+% (|Christian.Rolland@univ-brest.fr|).
+% \changes{v1.0o}{1994/09/27}{Added defaults for breton}
+% \begin{macrocode}
+\DeclareOption{breton}
+ {\vref@excuse{breton}%
+ \vref@addto\extrasbreton{%
+ \def\reftextfaceafter {war ar bajenn \reftextvario{a-dal}{da heul}}%
+ \def\reftextfacebefore{war ar bajenn \reftextvario{a-dal}{a-raok}}%
+ \def\reftextafter {war ar bajenn da heul}%
+ \def\reftextbefore {war ar bajenn a-raok}%
+ \def\reftextcurrent {war ar \reftextvario{bajenn-ma\~n}%
+ {bajenn war-wel}}%
+ \def\reftextfaraway#1{war ar bajenn~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange
+ on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
+ \ref{#1} to~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for Bulgarian defaults was contributed by
+% Georgi Boshnakov\\ (|georgi.boshnakov@gmail.com|).
+% \changes{v1.4q}{2006/05/23}{Added defaults for bulgarian}
+% \begin{macrocode}
+\DeclareOption{bulgarian}%
+ {\vref@addto\extrasbulgarian{%
+ \def\reftextfaceafter{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextfacebefore{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrery\cyrs\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextafter{\cyrn\cyra\
+ \reftextvario{\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}%
+ {\cyrs\cyrl\cyre\cyrd\cyrv\cyra\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextbefore{\cyrn\cyra\
+ \reftextvario{\cyrp\cyrr\cyre\cyrd\cyrn\cyra\cyrt\cyra}%
+ {\cyrp\cyrr\cyre\cyrd\cyri\cyrsh\cyrn\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextcurrent{\cyrn\cyra\
+ \reftextvario{\cyrt\cyra\cyrz\cyri}%
+ {\cyrt\cyre\cyrk\cyru\cyrshch\cyra\cyrt\cyra}
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyra
+ ~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyri
+ ~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \cyrd\cyro~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for catalan defaults was contributed by Robert Fuster\\
+% (\verb=rfuster@mat.upv.es=).
+% \changes{v1.1c}{1997/06/12}{Added defaults for catalan}
+% \changes{v1.2g}{2000/08/22}{Updated defaults for catalan}
+% \begin{macrocode}
+\DeclareOption{catalan}
+ {\vref@addto\extrascatalan{%
+ \def\reftextfaceafter {a la p\`agina seg\"uent}%
+ \def\reftextfacebefore{a la p\`agina anterior}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {en aquesta p\`agina}%
+ \def\reftextfaraway#1{a la p\`agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{a les
+ p\`agines~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for croatian defaults was contributed by \v{S}ime Ungar
+% (\verb=ungar@math.hr=).
+% \changes{v1.4p}{2006/05/13}{Added defaults for croatian}
+% \begin{macrocode}
+\DeclareOption{croatian}
+ {\vref@addto\extrascroatian{%
+ \def\reftextfaceafter {na sljede\'coj stranici}%
+ \def\reftextfacebefore{na prethodnoj stranici}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {na ovoj stranici}%
+ \def\reftextfaraway#1{na stranici~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stranicama~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} do~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Defaults for the Czech option provided by Milan Vancura
+% \verb=<milan@suse.cz>=.
+% \changes{v1.2e}{2000/04/04}{Added czech defaults}
+% \begin{macrocode}
+\DeclareOption{czech}
+ {%\vref@excuse{czech}%
+ \vref@addto\extrasczech{%
+ \def\reftextfaceafter {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
+ \def\reftextfacebefore{na p\v{r}ed\-choz\'\i\ stran\v{e}}%
+ \def\reftextafter {na n\'a\-sle\-du\-j\'\i c\'\i\ stran\v{e}}%
+ \def\reftextbefore {na p\v{r}ed\-choz\'\i\ stran\v{e}}%
+ \def\reftextcurrent {na t\'eto stran\v{e}}%
+ \def\reftextfaraway#1{na stran\v{e}~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}\--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a\v{z}~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Defaults for Danish provided by Torsten Martinsen
+% (\verb=tmar91@kom.auc.dk=). Further defaults by Ole Laursen
+% (\verb=olau@hardworking.dk=).
+% \changes{v1.0n}{1994/09/25}{Added Danish defaults}
+% \changes{v1.2h}{2000/12/30}{Updates to Danish defaults}
+% \begin{macrocode}
+\DeclareOption{danish}
+ {\vref@addto\extrasdanish{%
+ \def\reftextfaceafter {p\aa{} \reftextvario{modst\aa ende}%
+ {n\ae ste} side}%
+ \def\reftextfacebefore{p\aa{} \reftextvario{modst\aa ende}%
+ {forrige} side}%
+ \def\reftextafter {p\aa{} \reftextvario{den f\o lgende}%
+ {n\ae ste} side}%
+ \def\reftextbefore {p\aa{} \reftextvario{forrige side}
+ {foreg\aa ende side}}%
+ \def\reftextcurrent {p\aa{} denne side}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Default string for dutch have been contributed by Frank Poppe
+% (\verb=POPPE@SWOV.NL=).
+% This option currently supports one additional string macro
+% |\refpagename| so that you can easily change to |bladzijde|
+% instead of |pagina| if you prefer this word for ``page''.
+% However, I will not guarantee that this will survive future
+% versions of this package, so use it on your own risk (you can
+% always update the full strings to be on the safe side).
+% \changes{v1.0l}{1994/07/07}{Added dutch defaults}
+% \changes{v1.2a}{1998/08/22}{Added dutch defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \begin{macrocode}
+\DeclareOption{dutch}
+ {\vref@addto\extrasdutch{%
+ \def\refpagename{pagina}%
+ \def\reftextfaceafter {op de \reftextvario{rechter \refpagename}%
+ {\refpagename\ hiernaast}}%
+ \def\reftextfacebefore{op de \reftextvario{linker \refpagename}%
+ {\refpagename\ hiernaast}}%
+ \def\reftextafter {op de \reftextvario{volgende \refpagename}%
+ {\refpagename\ hierna}}%
+ \def\reftextbefore {op de \reftextvario{vorige \refpagename}%
+ {\refpagename\ hiervoor}}%
+ \def\reftextcurrent {op deze \refpagename}%
+ \def\reftextfaraway#1{op \refpagename~\pageref{#1}}%
+% \end{macrocode}
+% Concerning the next defaults I received the following comment by
+% Frederik Fouvry \texttt{<fouvry@coli.uni-sb.de>}:
+% ``In the Dutch options (where I can exert a proper language
+% judgement ;-), `t/m' is not used in formal (scientific) texts. I
+% would either use `--' or `tot en met' (the abbreviation written
+% out). ''
+% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextlabelrange}}
+% \changes{v1.4m}{2005/06/09}{Fixed \cs{reftextlabelrange} (pr/3791)}
+% \begin{macrocode}
+ \def\reftextpagerange#1#2{op pagina's~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+% \end{macrocode}
+% \changes{v1.2a}{1998/08/22}{Added english defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \changes{v1.4d}{2002/11/11}{Changed default for \cs{reftextbefore}}
+% \begin{macrocode}
+\DeclareOption{english}
+ {\vref@addto\extrasenglish{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+% \end{macrocode}
+%
+% The esperanto strings were suggested by Albert Reiner
+% (\verb=areiner@tph.tuwien.ac.at=).
+% \changes{v1.4x}{2010/08/04}{Defaults for esperanto added}
+% \begin{macrocode}
+\DeclareOption{esperanto}
+ {\vref@addto\extrasesperanto{%
+ \def\reftextfaceafter{en la
+ \reftextvario{flanka}{sekva} pa\^go}%
+ \def\reftextfacebefore{en la
+ \reftextvario{flanka}{anta\u ua} pa\^go}%
+ \def\reftextafter{en la sekva pa\^go}%
+ \def\reftextbefore{en la anta\u ua pa\^go}%
+ \def\reftextcurrent{\reftextvario{\^ci-pa\^ge}%
+ {en \^ci tiu pa\^go}}%
+ \def\reftextfaraway#1{en pa\^go~\pageref{#1}}%
+ \def\reftextpagerange#1#2{en pa\^goj~\pageref{#1} \^gis \pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \^gis~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The finnish strings were suggested by Matti Rintala
+% (\verb=bitti@cs.tut.fi=) and Hillevi Gavel
+% \verb=Hillevi.Gavel@mdh.se=.
+% \changes{v1.0m}{1994/09/23}{Added finnish strings}
+% \changes{v1.4o}{2005/11/07}{Added a few more finnish strings}
+% \begin{macrocode}
+\DeclareOption{finnish}
+ {\vref@addto\extrasfinnish{%
+ \def\reftextfaceafter {\reftextvario{viereisell\"a}%
+ {seuraavalla} sivulla}%
+ \def\reftextfacebefore{\reftextvario{viereisell\"a}%
+ {edellisell\"a} sivulla}%
+ \def\reftextafter {seuraavalla sivulla}%
+ \def\reftextbefore {edellisell\"a sivulla}%
+ \def\reftextcurrent {t\"all\"a sivulla}%
+ \def\reftextfaraway#1{sivulla~\pageref{#1}}%
+ \def\reftextpagerange#1#2{sivuilla~\pageref{#1}--\pageref{#2}}%
+% \end{macrocode}
+% Can't combine numbers with the necessary suffix well.
+% \begin{macrocode}
+ \def\reftextlabelrange#1#2{\ref{#1}--\ref{#2}}%
+ }}
+% \end{macrocode}
+% French defaults are provided by Daniel Flippo
+% (\verb=Daniel.Flipo@univ-lille1.fr=).
+% \changes{v1.0j}{1994/06/21}{Added french defaults}
+% \changes{v1.2a}{1998/08/22}{Added french defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \begin{macrocode}
+\DeclareOption{french}
+ {\vref@addto\extrasfrench{%
+ \def\reftextfaceafter {page \reftextvario{ci-contre}{suivante}}%
+ \def\reftextfacebefore{page \reftextvario{ci-contre}%
+ {pr\'ec\'edente}}%
+ \def\reftextafter {page suivante}%
+ \def\reftextbefore {page pr\'ec\'edente}%
+ \def\reftextcurrent {de la pr\'esente page}%
+ \def\reftextfaraway#1{page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} \`a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Galician defaults are provided by Matthias Moebius\\
+% (\texttt{Matthias.Moebius@uni-konstanz.de}).
+% \changes{v1.1f}{1998/04/25}{Added galician defaults}
+% \changes{v1.4o}{2005/11/10}{Added further galician defaults}
+% \changes{v1.4o}{2005/11/26}{Some further corrections}
+% \changes{v1.5b}{2015/09/22}{Fixed blunder from 2005 -
+% galician option clearly never used}
+% \begin{macrocode}
+\DeclareOption{galician}
+ {\vref@addto\extrasgalician{%
+ \def\reftextfaceafter {na p\'axina oposta}%
+ \def\reftextfacebefore\reftextfaceafter
+ \def\reftextafter {na p\'axina seguinte}%
+ \def\reftextbefore {na p\'axina anterior}%
+ \def\reftextcurrent {nesta p\'axina}%
+ \def\reftextfaraway#1{na p\'axina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{%
+ nas p\'axinas~\pageref{#1}-\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% There are no good variants for German (I think and still think but
+% this is a matter of taste :-).
+% \changes{v1.0b}{1994/01/31}{Replace in incorrect `def by `let}
+% The following definitions were recently suggested to me but since
+% the original are in for a long time i don't want to change them
+% now since that could make a lot of documents change their formatting.
+% If you fancy them, add a redefinition of the corresponding macro(s)
+% to the preamble of your document.
+%\begin{verbatim}
+% \def\reftextfaceafter {auf der \reftextvario
+% {gegen\"uberliegenden}{anderen} Seite}%
+% \def\reftextfacebefore {auf der \reftextvario
+% {gegen\"uberliegenden}{anderen} Seite}%
+% \def\reftextafter {auf der \reftextvario
+% {n\"achsten}{folgenden} Seite}%
+% \def\reftextbefore {auf der \reftextvario
+% {vorigen}{vorhergehenden} Seite}%
+% \def\reftextcurrent {\reftextvario
+% {auf dieser}{diese} Seite}%
+%\end{verbatim}
+% \changes{v1.4n}{2005/07/24}{Small change}
+% \begin{macrocode}
+\DeclareOption{german}
+ {\vref@addto\extrasgerman{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+% \end{macrocode}
+% \changes{v1.2d}{2000/01/11}{Added ngerman defaults (identical to german)}
+% \changes{v1.4n}{2005/07/24}{Small change}
+% The ngerman defaults are the same but needed for ``Neue Rechtschreibung''
+% (i.e., a different set of hyphenation patterns).
+% \begin{macrocode}
+\DeclareOption{ngerman}
+ {\vref@addto\extrasngerman{%
+ \def\reftextfaceafter {auf der n\"achsten Seite}%
+ \def\reftextfacebefore{auf der vorherigen Seite}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {auf dieser Seite}%
+ \def\reftextfaraway#1{auf Seite~\pageref{#1}}%
+ \def\reftextpagerange#1#2{auf den Seiten~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} bis~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Defaults for greek suggested by Apostolos Syropoulos\\
+% (\verb=apostolo@obelix.ee.duth.gr=).
+% \changes{v1.2a}{1998/08/22}{Added defaults for greek}
+% \begin{macrocode}
+\DeclareOption{greek}
+ {\vref@addto\extrasgreek{%
+ \def\reftextfaceafter {sthn \reftextvario{paro'usa}%
+ {ep'omenh} sel'ida}%
+ \def\reftextfacebefore{sthn \reftextvario{paro'usa}{prohgo'umenh}
+ sel'ida}%
+ \def\reftextafter {sthn ep'omenh sel'ida}%
+ \def\reftextbefore {sthn prohgo'umenh sel'ida}%
+ \def\reftextcurrent {s'' aut'h th sel'ida}%
+ \def\reftextfaraway#1{sth sel'ida\nobreakspace\pageref{#1}}%
+ \def\reftextpagerange#1#2{stis sel'ides\nobreakspace
+ \pageref{#1}---\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} ws\nobreakspace\ref{#2}}%
+ }}
+% \end{macrocode}
+% Icelandic defaults suggested by Thorhallur Sverrisson
+% (\verb=thorhs@basis.is=).
+% \changes{v1.4t}{2007/09/07}{Added defaults for icelandic}
+% \begin{macrocode}
+\DeclareOption{icelandic}
+ {\vref@addto\extrasicelandic{%
+ \def\reftextfaceafter {\'{a} \reftextvario{n{\ae}stu}%
+ {n{\ae}stu} s\'{i}{\dh}u}%
+ \def\reftextfacebefore{\'{a} \reftextvario{fyrri}%
+ {fyrri} s\'{i}{\dh}u}%
+ \def\reftextafter {\'{a} \reftextvario{n{\ae}stu}%
+ {n{\ae}stu} s\'{i}{\dh}u}%
+ \def\reftextbefore {\'{a} \reftextvario{fyrri}{fyrri} s\'{i}{\dh}u}%
+ \def\reftextcurrent {\'{a} \reftextvario{{\th}essari}%
+ {{\th}essari} s\'{i}{\dh}u}%
+ \def\reftextfaraway#1{\'{a} s\'{i}{\dh}u~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\'{a} s\'{i}{\dh}um~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Defaults for Italian suggested by Giovanni Pensa
+% (\verb=pensa@dsi.unimi.it=) with i{\TeX}nici.
+% \changes{v1.1b}{1995/10/19}{Added defaults for Italian}
+% \changes{v1.2a}{1998/08/22}{Removed incorrect warning}
+% \changes{v1.4k}{2004/10/30}{Added missing defaults supplied by Lapo Mori}
+% \changes{v1.4n}{2005/07/24}{Small change}
+% \changes{v1.4u}{2009/03/21}{Correction for \cs{reftextfaraway} suggested
+% by Lorenzo Pantieri}
+% \begin{macrocode}
+\DeclareOption{italian}
+ {\vref@addto\extrasitalian{%
+ \def\reftextfaceafter {\reftextvario{a fronte}%
+ {nella pagina successiva}}%
+ \def\reftextfacebefore{\reftextvario{a fronte}%
+ {nella pagina precedente}}%
+ \def\reftextafter {nella pagina \reftextvario{seguente}%
+ {successiva}}%
+ \def\reftextbefore {nella pagina precedente}%
+ \def\reftextcurrent {in questa pagina}%
+ \def\reftextfaraway#1{a pagina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nelle pagine~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{da~\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Defaults for Hungarian by Jeff Goldberg
+% (\verb=jeffrey@goldmark.org=).
+% There is a problem with the use of the definite article
+% \textit{a} or \textit{az} in Hungarian before expansions
+% of |\vref| or |\ref|. The problem is that the word
+% should be \textit{az} if the number following would begin with
+% a vowel if spelled out, and \textit{a} if the number would begin
+% with a consonant.
+%
+% The option assumes that there is a command |\aza| defined which
+% helps resolving this problem.\footnote{This information is actually quite
+% old but unfortunately never made it into varioref. In case any work
+% has been undertaken to resolve this please inform the author about it.}
+% \changes{v1.2a}{1998/08/22}{Added defaults for magyar}
+% \changes{v1.4j}{2005/01/22}{Defined \cs{reftextfaceafter} and
+% \cs{reftextfacebefore} instead of \cs{reftextafter} and \cs{reftextbefore}}
+% \begin{macrocode}
+\DeclareOption{magyar}
+ {\vref@addto\extrasmagyar{%
+ \def\reftextafter {a k\"o\-vet\-kez\H{o} ol\-da\-lon}%
+ \def\reftextbefore{az el\H{o}\-z\H{o} ol\-da\-lon}%
+ \def\reftextfaceafter {\reftextvario{a t\'ul\-ol\-da\-lon}%
+ {a k\"o\-vet\-kez\H{o} ol\-da\-lon}}%
+ \def\reftextfacebefore{\reftextvario{a t\'ul\-ol\-da\-lon}%
+ {az el\H{o}\-z\H{o} ol\-da\-lon}}%
+ \def\reftextcurrent {ezen az ol\-da\-lon}%
+% \end{macrocode}
+% The following suggested patch has not been added yet (pending changes
+% in babel system).
+%\begin{verbatim}
+% \def\reftextfaraway#1{a~\csname @@magyar@az@lowxu\endcsname
+% {\pageref{#1}}.~ol\-da\-lon}%
+% \def\reftextpagerange#1#2{a~\csname @@magyar@az@lowxu\endcsname
+% {\pageref{#1}}%
+% --\pageref{#2}.~ol\-da\-la\-kon}%
+% \def\reftextlabelrange#1#2{{}\csname @@magyar@told\endcsname\ref{#1}+tol
+% \ref{#2}-ig}% Dat: `{}' is here for anti-\capitalize
+%\end{verbatim}
+% \begin{macrocode}
+ \def\reftextfaraway#1{\aza{\pageref{#1}} \pageref{#1}.~ol\-da\-lon}%
+ \def\reftextpagerange#1#2{\vref@stringwarning\reftextpagerange
+ on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\vref@stringwarning\reflabelpagerange
+ \ref{#1} to~\ref{#2}}%
+ }%
+% \end{macrocode}
+% The |\AtBeginDocument| needs to be executed when the option is
+% processed and not inside the babel interface.
+% \changes{v1.4i}{2004/02/27}{Moved \cs{AtBeginDocument}}
+% \begin{macrocode}
+ \AtBeginDocument{\providecommand\aza[1]{a/az%
+ \PackageError{varioref}{%
+ Proper definition for command \noexpand\aza missing}%
+ {You need to (re)define the command \noexpand\aza that
+ takes one argument (a number or a \noexpand\pageref command)
+ and produces the string `a' or `az' depending on the argument
+ value. It should also accept an optional argument (default `l')
+ to denote whether or not the string should be lowercase or
+ uppercase.}}}%
+ }
+% \end{macrocode}
+% The Norwegian and `nynorsk' translations have been provided by
+% Dag F Langmyhr \verb=<dag@ifi.uio.no>= and Karl Ove Hufthammer
+% \verb=<huftis@bigfoot.com>=.
+% \changes{v1.0q}{1995/04/06}{Added defaults for norsk}
+% \changes{v1.0q}{1995/04/06}{Added defaults for nynorsk}
+% \changes{v1.2a}{1998/08/22}{Updated defaults for norsk}
+% \changes{v1.2a}{1998/08/22}{Updated defaults for nynorsk}
+% \changes{v1.2a}{1998/08/22}{Added norsk defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \changes{v1.2a}{1998/08/22}{Added nynorsk defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \changes{v1.2i}{2001/01/12}{Updated nynorsk defaults}
+% \begin{macrocode}
+\DeclareOption{norsk}
+ {\vref@addto\extrasnorsk{%
+ \def\reftextfaceafter {p\aa{} neste side}%
+ \def\reftextfacebefore{p\aa{} forrige side}%
+ \def\reftextafter {p\aa{} neste side}%
+ \def\reftextbefore {p\aa{} forrige side}%
+ \def\reftextcurrent {p\aa{} denne siden}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+\DeclareOption{nynorsk}
+ {\vref@addto\extrasnynorsk{%
+ \def\reftextfaceafter {p\aa{} neste side}%
+ \def\reftextfacebefore{p\aa{} f\o{}rre side}%
+ \def\reftextafter {p\aa{} neste side}%
+ \def\reftextbefore {p\aa{} f\o{}rre side}%
+ \def\reftextcurrent {p\aa{} denne sida}%
+ \def\reftextfaraway#1{p\aa{} side~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa{} side~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} til~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The polish translations have been provided by
+% Tomasz Michniewski \\
+% \verb=<tomekm@ias.wat.waw.pl>=.
+% The use of the command \verb=\eob= and \verb=aob= etc.\
+% requires appropriate definitions as provided, for example, by
+% the babel system. This should probably be handled differently
+% but it would require modifications in babel's language support.
+% \changes{v1.1d}{1997/12/06}{Added defaults for polish}
+% \changes{v1.2a}{1998/08/22}{Added polish defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \changes{v1.4n}{2005/09/14}{Changed default for \cs{reftextfaraway}}
+% \begin{macrocode}
+\DeclareOption{polish}
+ {\vref@addto\extraspolish{%
+ \def\reftextfaceafter {na \reftextvario{s\aob{}siedniej}%
+ {nast\eob{}pnej} stronie}%
+ \def\reftextfacebefore{na \reftextvario{s\aob{}siedniej}%
+ {poprzedniej} stronie}%
+ \def\reftextafter {na nast\eob{}pnej stronie}%
+ \def\reftextbefore {na poprzedniej stronie}%
+ \def\reftextcurrent {na \reftextvario{tej
+ samej}{bie\zkb{}\aob{}cej} stronie}%
+ \def\reftextfaraway#1{na stronie~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stronach~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The portuguese default text has been provided by
+% Jos\'e Carlos Oliveira Santos \verb=jcsantos@fc.up.pt=.
+% \changes{v1.2b}{1999/11/25}{Added portuguese defaults}
+% \changes{v1.2c}{1999/12/02}{Added more portuguese defaults}
+% \changes{v1.4r}{2007/05/26}{Misspelling of \cs{extrasportuges}}
+% \begin{macrocode}
+\DeclareOption{portuges}
+ {\vref@addto\extrasportuges{%
+ \def\reftextfaceafter {na \reftextvario{p\'agina ao lado}{pr\'oxima
+ p\'agina}}%
+ \def\reftextfacebefore{na p\'agina \reftextvario{ao lado}{anterior}}%
+ \def\reftextafter {na \reftextvario{p\'agina seguinte}{pr\'oxima
+ p\'agina}}%
+ \def\reftextbefore{na p\'agina \reftextvario{anterior}{precedente}}%
+ \def\reftextcurrent {nesta p\'agina}%
+ \def\reftextfaraway#1{na p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{nas p\'aginas~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Updates to the default text for Romanian have been suggested by Florin Oprina
+% (\verb=<florin.oprina@gmail.com>=).
+% \changes{v1.4v}{2009/06/13}{Incorrect text in \cs{reftextafter} (pr/4070)}
+% \changes{v1.5a}{2014/07/03}{Correct text in \cs{reftextbefore}}
+% \begin{macrocode}
+\DeclareOption{romanian}
+ {\vref@addto\extrasromanian{%
+ \def\reftextfaceafter {pe pagina \reftextvario{opus\u{a}}{urm\u{a}toarei}}%
+ \def\reftextfacebefore{pe pagina \reftextvario{opus\u{a}}{precedentei}}%
+ \def\reftextafter {\reftextvario{pe pagina urm\u{a}toare}%
+ {pe urm\u{a}toarea pagin\u{a}}}%
+ \def\reftextbefore {pe pagina \reftextvario{precedent\u{a}}%
+ {precedentei}}%
+ \def\reftextcurrent {pe aceast\u{a} pagin\u{a}}%
+ \def\reftextfaraway#1{pe pagina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{pe paginile~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} la~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The text for russian was taken from the book in Russian by
+% I.~A.~Kotelnikov and P.~Z.~Chebotaev, and adapted
+% to the encoding-independent form by Vladimir Volovich
+% (\verb=vvv@vsu.ru=).
+% \changes{v1.2a}{1998/11/23}{Added russian strings}
+% \changes{v1.2a}{1998/11/24}{Added defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \begin{macrocode}
+\DeclareOption{russian}
+ {\vref@addto\extrasrussian{%
+ \def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
+ {\cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch\cyre\cyrishrt}\ \cyrs\cyrt
+ \cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrv\cyro\cyrp\cyro\cyrl\cyro\cyrzh\cyrn\cyro\cyrishrt}%
+ {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}\
+ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextafter{\cyrn\cyra\ \cyrs\cyrl\cyre\cyrd\cyru\cyryu\cyrshch
+ \cyre\cyrishrt\ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextbefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyre\cyrd
+ \cyrsh\cyre\cyrs\cyrt\cyrv\cyru\cyryu\cyrshch\cyre\cyrishrt}%
+ {\cyrp\cyrr\cyre\cyrd\cyrery\cyrd\cyru\cyrshch\cyre\cyrishrt}%
+ \ \cyrs\cyrt\cyrr\cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrerev\cyrt\cyro
+ \cyrishrt}{\cyrd\cyra\cyrn\cyrn\cyro\cyrishrt}\ \cyrs\cyrt\cyrr
+ \cyra\cyrn\cyri\cyrc\cyre}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyrr\cyra\cyrn
+ \cyri\cyrc\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\cyrs~\ref{#1}\ \cyrp\cyro~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The text for slovak defaults was contributed by Miroslav Sedivy\\
+% (\verb=<miro@slovensko.com>=).
+% \changes{v1.4b}{2002/03/11}{Contributed defaults added}
+% \begin{macrocode}
+\DeclareOption{slovak}
+ {\vref@addto\extrasslovak{%
+ \def\reftextfaceafter {na \reftextvario{proti\v lahlej}%
+ {nasleduj\'ucej} strane}%
+ \def\reftextfacebefore{na \reftextvario{proti\v lahlej}%
+ {predch\'adzaj\'ucej} strane}%
+ \def\reftextafter {na \reftextvario{nasleduj\'ucej}%
+ {\v dal\v sej} strane}%
+ \def\reftextbefore {na \reftextvario{predch\'adzaj\'ucej}%
+ {predo\v slej} strane}%
+ \def\reftextcurrent {na tejto strane}%
+ \def\reftextfaraway#1{na strane~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na stran\'ach~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a\v z~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The text for slovene defaults was contributed by Roman Maurer\\
+% (\verb=<roman.maurer@amis.net>=).
+% \changes{v1.4a}{2002/03/05}{Contributed defaults added}
+% \begin{macrocode}
+\DeclareOption{slovene}
+ {\vref@addto\extrasslovene{%
+ \def\reftextfaceafter {na naslednji strani}%
+ \def\reftextfacebefore{na prej\v{s}nji strani}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {na \reftextvario{tej}{trenutni} strani}%
+ \def\reftextfaraway#1{na strani~\pageref{#1}}%
+ \def\reftextpagerange#1#2{na straneh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{od~\ref{#1} do~\ref{#2}}%
+ }}
+% \end{macrocode}
+% Text for spanish defaults was contributed by Julio Sanchez
+% (\verb=jsanchez@gmv.es=) and Fernando Dobladez (\verb=<ferd@fuego.com>=).
+% \changes{v1.0f}{1994/03/16}{Inserted missing hash mark}
+% \changes{v1.0k}{1994/06/05}{Corrected misspelled cmd `extrasspanish}
+% \changes{v1.4a}{2002/03/05}{Missing defaults added}
+% \changes{v1.4o}{2005/11/26}{Single hyphen in range}
+% \begin{macrocode}
+\DeclareOption{spanish}
+ {\vref@addto\extrasspanish{%
+ \def\reftextfaceafter {en la p\'agina siguiente}%
+ \def\reftextfacebefore{en la p\'agina anterior}%
+ \let\reftextafter \reftextfaceafter
+ \let\reftextbefore \reftextfacebefore
+ \def\reftextcurrent {en esta p\'agina}%
+ \def\reftextfaraway#1{en la p\'agina~\pageref{#1}}%
+ \def\reftextpagerange#1#2{en las p\'aginas~\pageref{#1}%
+ -\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} a~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The text for swedish was contributed by Mats Dahlgren
+% (\verb=matsd@sssk.se=).
+% \changes{v1.0p}{1995/01/10}{Added swedish strings}
+% \changes{v1.2a}{1998/08/22}{Added swedish defaults for
+% \cs{reftextpagerange} and \cs{reftextlabelrange}}
+% \begin{macrocode}
+\DeclareOption{swedish}
+ {\vref@addto\extrasswedish{%
+ \def\reftextfaceafter {p\aa\ \reftextvario{motst\aa ende}%
+ {n\"{a}sta} sida}%
+ \def\reftextfacebefore{p\aa\ \reftextvario{motst\aa ende}%
+ {f\"{o}reg\aa ende} sida}%
+ \def\reftextafter {p\aa\ \reftextvario{f\"{o}ljande}%
+ {n\"{a}sta} sida}%
+ \def\reftextbefore {p\aa\ f\"{o}reg\aa ende sida}%
+ \def\reftextcurrent {p\aa\ denna sida}%
+ \def\reftextfaraway#1{p\aa\ sidan~\pageref{#1}}%
+ \def\reftextpagerange#1#2{p\aa\
+ sidorna~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} till~\ref{#2}}%
+ }}
+\DeclareOption{turkish}
+ {\vref@excuse{turkish}%
+ \vref@addto\extrasturkish{%
+ \def\reftextfaceafter {on the \reftextvario{facing}{next} page}%
+ \def\reftextfacebefore{on the \reftextvario{facing}{preceding}
+ page}%
+ \def\reftextafter {on the \reftextvario{following}{next} page}%
+ \def\reftextbefore {on the \reftextvario{preceding}{previous} page}%
+ \def\reftextcurrent {on \reftextvario{this}{the current} page}%
+ \def\reftextfaraway#1{on page~\pageref{#1}}%
+ \def\reftextpagerange#1#2{on pages~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\ref{#1} to~\ref{#2}}%
+ }}
+% \end{macrocode}
+% The text for Ukrainian defaults was contributed by Mykola Lyakhovych\\
+% (\verb=<lyakhovych@mail.ru>=).
+% \changes{v1.4l}{2005/04/24}{Contributed defaults added}
+% \begin{macrocode}
+\DeclareOption{ukrainian}
+ {\vref@addto\extrasukrainian{%
+ \def\reftextfaceafter{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
+ {\cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt
+ \cyro\cyrr\cyri\cyrn\cyrc\cyrii}%
+ \def\reftextfacebefore{\cyrn\cyra\ \reftextvario{\cyrp\cyrr\cyro
+ \cyrt\cyri\cyrl\cyre\cyrzh\cyrn\cyrii\cyrishrt}%
+ {\cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd\cyrn\cyrii\cyrishrt}\
+ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextafter{\cyrn\cyra\ \cyrn\cyra\cyrs\cyrt\cyru\cyrp\cyrn
+ \cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextbefore{\cyrn\cyra\ \cyrp\cyro\cyrp\cyre\cyrr\cyre\cyrd
+ \cyrn\cyrii\cyrishrt\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn\cyrc\cyrii}%
+ \def\reftextcurrent{\cyrn\cyra\ \reftextvario{\cyrc\cyrii\cyrishrt}%
+ {\cyrd\cyra\cyrn\cyrii\cyrishrt}\ \cyrs\cyrt\cyro\cyrr\cyrii\cyrn
+ \cyrc\cyrii}%
+ \def\reftextfaraway#1{\cyrn\cyra\ \cyrs.~\pageref{#1}}%
+ \def\reftextpagerange#1#2{\cyrn\cyra\ \cyrs\cyrt\cyro\cyrr\cyrii
+ \cyrn\cyrk\cyra\cyrh~\pageref{#1}--\pageref{#2}}%
+ \def\reftextlabelrange#1#2{\cyrz~\ref{#1}\ \cyrd\cyro~\ref{#2}}%
+ }}
+% \end{macrocode}
+% We support francais as an alternative to french since people
+% might be used to it, but we discurrage it.
+% \begin{macrocode}
+\DeclareOption{francais}{%
+ \typeout{Please use `french' instead of `francais'}%
+ \ExecuteOptions{french}}
+\DeclareOption{germanb}{%
+ \typeout{Please use `german' instead of `germanb'}%
+ \ExecuteOptions{german}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% During document preparation errors due to |\vref| are usually of
+% not much interest. For this reason the draft option turns them into
+% warnings by issuing a |\vrefwarning| command. The final option
+% (default) stops with an error message when varioref detects a possible
+% loop.
+% \changes{v1.1h}{1998/08/01}{Added draft and final options}
+% \begin{macrocode}
+\DeclareOption{draft}{\AtEndOfPackage\vrefwarning}
+\DeclareOption{final}{\AtEndOfPackage\vrefshowerrors} % the default
+% \end{macrocode}
+%
+%
+% Whether or not \pkg{varioref} uses its own white space and
+% removes the one in the source document is handeled by the
+% following two options. For historical reasons the default is to
+% handle the space, but the recommendation these days is to use
+% \texttt{nospace}.
+% \changes{v1.6a}{2019/08/25}{Provide options \texttt{space} and \texttt{nospace}}
+% \begin{macrocode}
+\newif\if@vrefhandlespace
+\DeclareOption{space} {\@vrefhandlespacetrue}
+\DeclareOption{nospace}{\@vrefhandlespacefalse}
+% \end{macrocode}
+%
+%
+%
+%
+% After all options are declared we execute the default option
+% \texttt{english} to set up the defaults and then call
+% |\ProcessOptions*| to handle any option passed to the package.
+% The star form is used since we want to execute the options in the
+% order they are given (in case this isn't used together with the
+% \pkg{babel} package).
+% \begin{macrocode}
+\ExecuteOptions{english,final,space}
+\ProcessOptions*
+% \end{macrocode}
+%
+%
+% \subsection{Defining the main macros}
+%
+% \begin{macro}{\vr@cnt}
+% To generate new labels we use a counter and construct the
+% internal label names by prefixing the current counter value with
+% the string |vr@|. We need a \LaTeX{} counter to get |\include|s
+% handled correctly.
+% \changes{v0.1e}{1992/11/15}{use LaTeX counter}
+% \begin{macrocode}
+\newcounter{vrcnt}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpageref}
+% \changes{v1.3a}{2001/04/12}{Scan for star form}
+% \begin{macro}{\vp@geref}
+% The command |\vpageref| generates the appropriate string by first
+% parsing the optional arguments (if any) and then compares the
+% internal and the user label. This command should be robust since
+% the user might put it anywhere.
+%
+% We now start by scanning for a star and then call either
+% |\vp@gerefstar| or |\vp@geref|.
+% The space handling logic is a bit twisted these days: if the
+% option \texttt{space} is
+% in force then preceding spaces in the document are removed and
+% the star means that the command should not add its own
+% space. However, with option \texttt{nospace} any space already in the
+% source will be left alone and the command doesn't add its own
+% space either. Thus in this case the star form doesn't
+% have any effect and below |\vp@gerefstar| is let to
+% |\vp@geref|. This allows a package like \pkg{hyperef} to redefine
+% it and useit for its own tasks (like denoting that no link should
+% be produced).
+% \begin{macrocode}
+\DeclareRobustCommand\vpageref{\@ifstar
+ {\let\vref@maybe@space\@empty\vp@gerefstar}%
+ {\let\vref@maybe@space\space \vp@geref}}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\vp@geref{\@ifnextchar[%
+% \end{macrocode}
+% The default for the first optional argument is the string hidden
+% in the macro |\reftextcurrent|.
+% \begin{macrocode}
+ \@vpageref{\@vpageref[\reftextcurrent]}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\vref@space}
+% \changes{v1.4a}{2002/03/06}{Default added}
+% A default for |\vref@space|. This isn't really needed except in
+% the case that somebody has hooked into the \pkg{varioref}
+% interfaces at a lower level (which isn't really supported,
+% but\ldots). So giving a default will prevent an error message in
+% that case (and should hopefully produce the same behavior as before).
+% \begin{macrocode}
+\let\vref@space\space
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@vpageref}
+% More parsing\ldots
+% \begin{macrocode}
+\def\@vpageref[#1]{\@ifnextchar[%
+% \end{macrocode}
+% By default the second optional argument is empty.
+% \changes{v1.0h}{1994/06/11}{Pass first argument in both cases}
+% \changes{v1.0i}{1994/06/20}{Do it correctly}
+% \changes{v1.6a}{2019/08/25}{Default for optional argumet changed}
+% \begin{macrocode}
+ {\@@vpageref{#1}}{\@@vpageref{#1}[]}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@vpageref}
+% The |\@@vpageref| macro finally generates the references by
+% comparing the value of an internal label with the value of the
+% user label.
+% \changes{v1.0h}{1994/06/11}{Change internal interface}
+% \begin{macrocode}
+\def\@@vpageref#1[#2]#3{%
+% \end{macrocode}
+% First it switches to horizontal mode if necessary. If there was a
+% preceding space we remember its size in |\@tempskipa| and then remove it for
+% reinsertion later.
+% \changes{v1.6a}{2019/08/25}{Don't drop a preceding space completely
+% but reinsert it later after setting a label}
+% \begin{macrocode}
+ \leavevmode
+ \@tempskipa\lastskip \unskip
+% \end{macrocode}
+% Then it advances the counter |\c@vrcnt| by one which is used to
+% generate internal label names.
+% \begin{macrocode}
+ \global\advance\c@vrcnt\@ne
+% \end{macrocode}
+% Then it checks if for the current value of |\c@vrcnt| a label
+% command was issued in the last run. If not it pretends that there
+% was one with the value |{??}{??}|. Thereafter it stores the
+% pageref value for this label in the macro |\@tempa|.
+% \begin{macrocode}
+ \vref@pagenum\@tempa{\the\c@vrcnt @vr}%
+% \end{macrocode}
+% Here we check that the generated text is not going across a page
+% boundary.
+% \changes{v0.1f}{1993/01/01}{Add another label to catch cross-overs}
+% \begin{macrocode}
+ \vref@pagenum\@tempb{\the\c@vrcnt @xvr}%
+% \end{macrocode}
+% \changes{v1.0l}{1994/07/07}{Explicitly expand `label argument for
+% babel}
+% In version 1.0l the label string has been turned around so that
+% the number comes first. This was done to allow easy explicit
+% expansion of the number before it is passed to the |\label|
+% command. In the babel system the argument of |label| was not
+% expanded with the result that wrong label strings have been
+% generated. This is a general problem that might need a completely
+% different solution in babel but for now the change below (and in
+% some other places in the code) should solve the problem for this
+% special combination of packages.
+%
+% These days we actually use |\vref@label| instead of |\label| as
+% this avoids problems with Babel or \pkg{amsmath} redefining
+% the latter command.
+% \changes{v1.4e}{2003/01/08}{Use \cs{vref@label} instead of
+% \cs{label} (pr/3489)}
+% \begin{macrocode}
+ \vref@label{\the\c@vrcnt @xvr}%
+% \end{macrocode}
+% Since we have removed
+% any leading space above we now insert a space here after the
+% label. It is done here so that it is still visible from following
+% code---the space before the label would be hidden.
+% What kind of space depends on the options to the
+% package. If \texttt{space} was specified, we insert our own
+% space, namely |\vref@maybe@space|. This will typeset a space
+% unless the star form of the current command was used.
+% \begin{macrocode}
+ \if@vrefhandlespace
+ \vref@maybe@space
+ \else
+% \end{macrocode}
+% But if \texttt{nospace} is in force we simply use the same space
+% value that was used in the source document (unless that was zero
+% or non-existent.
+% \begin{macrocode}
+ \ifdim\@tempskipa=\z@ \else
+ \hskip\@tempskipa
+ \fi
+ \fi
+% \end{macrocode}
+% \changes{v1.1g}{1998/05/10}{Test if inside AMS display (pr2175)}
+% Inside displays of the \pkg{amsmath} package the |\label| command
+% is redefined which makes the test for loops incorrect if a |\vref|
+% is used in, say, |\intertext|. So we test this condition first and
+% only do the test if |\label| doesn't have a special meaning.
+% [This is no longer necessary as |\label| isn't used any more]
+% \begin{macrocode}
+% \ifx\label\label@in@display\else
+ \ifx\@tempa\@tempb
+ \let\vref@may@loop\relax
+ \else
+% \end{macrocode}
+% If both points do not fall onto the same page with either issue
+% an error or a warning message.
+% However, we do no longer issue that warning now but wait until we
+% are sure that both labels aren't ``far away'' because in that
+% case it doesn't matter. So we just save that info in a macro now.
+% \changes{v1.0g}{1994/05/27}{Looping pages shown in wrong order}
+% \changes{v1.5c}{2016/02/16}{Delay generating the looping warning
+% until we know more}
+% \begin{macrocode}
+ \edef\vref@may@loop{%
+ \noexpand\vref@err{\noexpand\vref or \noexpand\vpageref
+ at page boundary
+ \@tempb-\@tempa\space (may loop)%
+ }%
+ }%
+ \fi
+% \fi
+% \end{macrocode}
+% Same game for the user requested label; this time the page
+% reference is saved in |\thevpagerefnum|.
+% \changes{v1.4c}{2002/06/14}{Use \cs{thevpagerefnum} instead of \cs{@tempb}}
+% \begin{macrocode}
+ \vrefpagenum\thevpagerefnum{#3}%
+% \end{macrocode}
+% Now after the internal label has served its purpose if would be
+% nice to free the memory it occupies by using something like
+% \begin{verbatim}
+% \global\expandafter\let
+% \csname r@\the\c@vrcnt @vr\endcsname\@empty
+%\end{verbatim}
+% But this is not possible because it would result in getting
+% `Labels may have changed\ldots' warnings for every run. Now we
+% are ready to produce the textual strings.
+% \begin{macrocode}
+ \ifx\@tempa\thevpagerefnum
+% \end{macrocode}
+% If they are the same we insert the first argument into the input
+% stream. Otherwise we insert the second argument. Recall that
+% those are the two optional arguments of |...|. However, if the
+% user explicitly requested an empty text string using the optional
+% argument we cancel any preceding space since in this case we are
+% otherwise likely to end up with spaces one before and one after
+% |\vpageref|.
+% \changes{v1.2f}{2000/07/07}{Don't output space if optional argument
+% empty (pr/3230)}
+% \begin{macrocode}
+ \def\@tempc{#1}%
+ \ifx\@tempc\@empty
+ \unskip
+ \else
+ #1%
+ \fi
+ \else
+% \end{macrocode}
+% If |#2| is empty we do nothing otherwise we insert it followed by
+% a space.
+% \begin{macrocode}
+ \def\@tempc{#2}%
+ \ifx\@tempc\@empty \else
+ #2\vref@space
+ \fi
+% \end{macrocode}
+% Now we check if the page number of the referenced object (stored
+% in |\thevpagerefnum| is a single positive number.
+% \begin{macrocode}
+ \is@pos@number\thevpagerefnum
+ {%
+% \end{macrocode}
+% If so, we check if the current position (stored in |\@tempa|) is
+% a positive number. If this is the case we assign this number to
+% the counter register |\@tempcnta| and add one to it.
+% \begin{macrocode}
+ \is@pos@number\@tempa
+ {\@tempcnta\@tempa
+ \advance\@tempcnta\@ne
+ }%
+% \end{macrocode}
+% If it is not a positive number we assign the largest possible
+% number to |\@tempcnta| and thereby pretending that label and
+% reference are miles away from each other.
+% \begin{macrocode}
+ {\@tempcnta\maxdimen}%
+% \end{macrocode}
+% Now we are ready to check if reference and object are on nearby
+% pages. |\thevpagerefnum| will expand to the page number of the object
+% (and we know that this is a number) and |\@tempcnta| is either
+% one higher than the reference page or completely out of bounds.
+% So if both represent the same value then the object lies one page
+% after its reference.
+% \begin{macrocode}
+ \ifnum \thevpagerefnum =\@tempcnta
+% \end{macrocode}
+% Thus if the object falls onto an odd page then the reference is
+% on the facing even page (and so we insert |\reftextfaceafter|),
+% otherwise the object can not be seen from the reference (and we
+% in insert |\reftextafter|). Don't be surprised if we are not
+% using |\thevpagerefnum| in the check. Since |\@tempcnta| has the same
+% value it is faster to use the register instead of parsing the
+% macro contents anew.
+% \begin{macrocode}
+ \ifodd\@tempcnta
+% \end{macrocode}
+% In fact we are going to use |\reftextfaceafter| only if we are
+% doing two-sided printing, otherwise |\reftextafter| is always
+% used.
+% Since the value of |\if@twoside| is evaluated before reading in
+% packages we could do better (saving some tokens) by defining
+% the current macro in dependence of this boolean.
+% \begin{macrocode}
+ \if@twoside
+ \reftextfaceafter
+ \else
+ \reftextafter
+ \fi
+ \else
+ \reftextafter
+ \fi
+% \end{macrocode}
+% If the object is not on the page following the reference we check
+% if it is on the page before the reference. In \LaTeX{} this
+% situation is not too common, for example with floats it normally
+% does not occur, but of course it isn't impossible if you more
+% than one reference to the same object, or if you have back
+% references to sections, theorems, etc. To test this we now
+% subtract two from the current value of |\@tempcnta| (which was
+% set to one higher as the reference page number). Note, that
+% subtraction is also possible if the value was |\maxdimen| --- we
+% still get something that is much larger than any sensible page
+% number.
+% \begin{macrocode}
+ \else
+ \advance\@tempcnta-2
+% \end{macrocode}
+% If now |\thevpagerefnum| and |\@tempcnta| have the same value then the
+% object lies one page before the reference.
+% \begin{macrocode}
+ \ifnum \thevpagerefnum =\@tempcnta
+% \end{macrocode}
+% Again we have to check for odd or even pages to distinguish
+% between the facing and the non-facing situation.
+% \begin{macrocode}
+ \ifodd\@tempcnta
+ \reftextbefore
+ \else
+% \end{macrocode}
+% Again the |\reftextfacebefore| only if |@twoside| evaluates to
+% true.
+% \begin{macrocode}
+ \if@twoside
+ \reftextfacebefore
+ \else
+ \reftextbefore
+ \fi
+ \fi
+% \end{macrocode}
+% If the above test also returns false then we have object and
+% references on pages which are far away or don't contain simple
+% page numbers. Therefore we generate the |\reftextfaraway| string
+% and drop any possible ``looping warning'' in |\vref@may@loop|.
+% Recall that this is a macro which has the user label as an
+% argument.
+% \begin{macrocode}
+ \else
+ \let\vref@may@loop\relax % added
+ \reftextfaraway{#3}%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% We do the same if our first test (that the page with the object
+% has a positive page number) turns out to be false.
+% \begin{macrocode}
+ {%
+ \let\vref@may@loop\relax %added
+ \reftextfaraway{#3}}%
+ \fi
+% \end{macrocode}
+% Finally we generate the internal label so that it can be check on
+% the next run. This means that we compare the position after the
+% string with the position of the referenced object. There is one
+% thing to note: to conserve space we locally make |\@currentlabel|
+% empty since we are only interested in the page number value of
+% this internal label.
+% \changes{v1.0l}{1994/07/07}{Explicitly expand \cs{label} argument for babel}
+%
+% These days we actually use |\vref@label| instead of |\label| as
+% this avoids problems with Babel or \pkg{amsmath} redefining
+% the latter command.
+% \changes{v1.4e}{2003/01/08}{Use \cs{vref@label} instead of
+% \cs{label} (pr/3489)}
+% \changes{v1.5c}{2016/02/16}{}
+% \begin{macrocode}
+ \vref@label{\the\c@vrcnt @vr}%
+% \end{macrocode}
+% Finally we run |\vref@may@loop| which is either |\relax| or generates
+% a ``may loop'' warning or error as appropriate.
+% \begin{macrocode}
+ \vref@may@loop
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\vp@gerefstar}
+% The default code for the star form is identical to the previous
+% macro |\vp@geref|. It only produces a different result because
+% before calling it we set |\vref@maybe@space| to do nothing.
+%
+% The \pkg{hyperref} package can then change the meaning of this
+% command to suppress a hyperlink.
+%
+% It is is also a good way to check if we are running with a new
+% \pkg{varioref} by testing
+%\begin{verbatim}
+% \ifdefined\vp@gerefstar
+% ... code fore noew varioref
+% \else
+% ... code for old varioref
+% \fi
+%\end{verbatim}
+%
+% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
+% \begin{macrocode}
+\let\vp@gerefstar\vp@geref
+% \end{macrocode}
+% \end{macro}
+%
+%
+
+% \begin{macro}{\vref@label}
+% \changes{v1.4e}{2003/01/08}{Macro added (pr/3489)}
+% This macro is like |\label| in the kernel but without passing on
+% |\@currentlabel|, ie useful if all we are interested in is the
+% page number. It also has the effect that it is unaffected by
+% \pkg{amsmath} or Babel redefining the |\label| command.
+% \begin{macrocode}
+\def\vref@label#1{\@bsphack
+ \protected@write\@auxout{}%
+ {\string\newlabel{#1}{{}{\thepage}}}%
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\vpagerefnum}
+% \changes{v1.4c}{2002/06/14}{Macro added}
+% This macro allows to define |\reftextafter| and friends to refer
+% to the page number rather than producing a textual reference.
+% \begin{macrocode}
+\let\thevpagerefnum\@empty
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\vrefwarning}
+% \changes{v0.1g}{1993/02/14}{Macro added}
+% \begin{macro}{\vrefshowerrors}
+% \changes{v1.1h}{1998/08/01}{Macro added}
+% \begin{macro}{\vref@err}
+% \changes{v0.1g}{1993/02/14}{Macro added}
+% When the |\vref| command detects a possible crossing over a page
+% boundary it will call |\vref@err| to generate an error message.
+% During document preparation one can turn such errors into
+% warnings by issuing a |\vrefwarning| declaration.
+% \changes{v1.0g}{1993/02/14}{Macro added}
+% \begin{macrocode}
+\def\vrefwarning{\def\vref@err{\PackageWarning{varioref}}}
+% \end{macrocode}
+% \begin{macrocode}
+\def\vrefshowerrors{\def\vref@err##1{\PackageError{varioref}{##1}%
+ {Please check the pages in question. You might need to replace
+ the \string\vref\MessageBreak
+ or \noexpand\vpageref by a normal \noexpand\(page)ref to
+ stop LaTeX running forever.}}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\vref}
+% We start by scanning for a star form and then continue in a
+% different macro depending on the result.
+% \changes{v1.3a}{2001/04/12}{Scan for star form}
+% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
+% \begin{macrocode}
+\DeclareRobustCommand\vref{\@ifstar
+ {\vref@star}{\vr@f}}
+% \end{macrocode}
+% \end{macro}
+
+
+
+% \begin{macro}{\vref@star}
+%
+% The star form is easy (and just a convenient shortcut), just call
+% |\ref| followed by |\vpageref| and pass the optional argument to
+% the latter. We don't support the second optional argument of
+% |\vpageref|, it that is needed one has to call both commands
+% explicitly
+% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
+% \begin{macrocode}
+\newcommand\vref@star[2][]{%
+ \ref{#2}
+ \vpageref[#1]{#2}}
+% \end{macrocode}
+% \end{macro}
+
+% \begin{macro}{\vr@f}
+% The normal case is a little bit more elaborated \ldots
+% \changes{v1.3c}{2001/09/04}{Correct typo in name}
+% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
+% \begin{macrocode}
+\def\vr@f{%
+ \leavevmode
+% \end{macrocode}
+% If option \texttt{space} is used then we remove a preceding space
+% and add our own unbreakable space instead. Otherwise we don't do
+% any space-handling.
+% \begin{macrocode}
+ \if@vrefhandlespace
+ \unskip \nobreakspace
+ \fi
+% \end{macrocode}
+% The use of|\nobreakspace| or |~| after the |\unskip| means that
+% this command will always produce a normal space while
+% something like |\nobreak\space| will
+% react to settings of |\nonfrenchspacing|.
+% Unfortunately the latter will also act in cases where one really
+% wants a normal space, e.g., in |Fig.~\vref{..}|, resulting in
+% a large extra space after the dot. For this reason the first solution
+% is used.
+% \changes{v1.1e}{1998/03/09}{Don't use \cs{nobreakspace} (pr/1866)}
+% \changes{v1.2a}{1998/11/27}{Use \cs{nobreakspace} (pr/2909)}
+% \changes{v1.2a}{1998/11/27}{Add \cs{leavevmode}}
+%
+% After having handled (or not handled) the spacing we call
+% |\vref@star| to scan the optional arguments and do the rest.
+% If that command has been altered by \pkg{hyperref} then the
+% current one needs altering too and does the argument scanning explicitly.
+% \begin{macrocode}
+ \vref@star % in hyperref this needs to be explicit
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\is@pos@number}
+% The utility macro |\is@pos@number| takes three arguments: a
+% string that is tested for being a valid non-negative integer and the
+% actions to be taken in case the test comes out true or false.
+%
+% We start by passing the string to the macro |\is@pos@num| after
+% prefixing it with a \texttt{0} and adding a space after it. To have
+% a well-defined ending point we also add |\@nil| at the end.
+%\label{isposnumber}
+% \begin{macrocode}
+\def\is@pos@number#1{\is@pos@num0#1\space\@nil}
+% \end{macrocode}
+% Now we parse the enlarged string into a counter register. To get
+% control back after everything that is regarded by \TeX{} as a
+% number is put into that register we assign |\is@pos@num@| to the
+% |\afterassignment| token. Since the string started with 0, we
+% can be sure that the register assignment will be carried out
+% without an error message. In case of counter assignments leading
+% zeros are discarded.
+% \begin{macrocode}
+\def\is@pos@num{\afterassignment\is@pos@num@ \count@}
+% \end{macrocode}
+% Now we have to check whether or not the whole string was parsed
+% into that register or some remainder was left over. Since we have
+% added a |\@nil| token at the very end we can use that to delimit
+% the argument of |\is@pos@num@|. Note, that the added space in
+% |\is@pos@number| \vpageref[above]{isposnumber} gets parsed away
+% by the counter assignment. If it would be missing, and the full
+% string would consist of a number, \TeX{}would try to replace
+% |\@nil| by its definition to see if it would contain additional
+% digits and thus we would be in trouble at this point.
+% \begin{macrocode}
+\def\is@pos@num@#1\@nil{%
+% \end{macrocode}
+% Now we have to check if the argument is empty. We can do this
+% with an |\ifx| (i.e., in an expandable way) since we know for
+% sure that it can not start with |\@nil|.
+% \changes{v1.4j}{2004/05/08}{Use \cs{@nil} for testing}
+% \begin{macrocode}
+ \ifx\@nil#1\@nil
+% \end{macrocode}
+% Depending on the result we execute the second or third argument
+% of the command |\is@pos@number| using a technique that removes
+% the |\else| or |\fi| from the input stream first, so that in
+% principle input stream parsing could be done from within the
+% arguments.
+% \begin{macrocode}
+ \expandafter\@firstoftwo \else
+ \expandafter\@secondoftwo \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\reftextvario}
+% This macro gives a little bit of random variation in the text
+% because the outcome depends on the number of |\vref| commands
+% seen before.
+% \begin{macrocode}
+\def\reftextvario#1#2{\ifodd\c@vrcnt #1\else#2\fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\fullref}
+% And here is the primitive command that always produces a |\ref|
+% and a |\pageref|.
+% \begin{macrocode}
+\def\fullref#1{\ref{#1} \reftextfaraway{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsubsection{Supporting ranges}
+%
+% \begin{macro}{\vref@pagenum}
+% \changes{v1.2a}{1998/08/01}{Macro added}
+% This command takes a label as |#1| extracts the page number
+% associated with it and saves the result in a csname which is
+% passed as |#1|. If the label isn't associated with a page number
+% it essentially associates it with |??| for both the label number
+% and the page, thus defining the label this way. This means that
+% no label warning is generated for this label in case it is
+% undefined.
+% \begin{macrocode}
+\def\vref@pagenum#1#2{%
+ \@ifundefined{r@#2}{\@namedef{r@#2}{{??}{??}}}{}%
+% \end{macrocode}
+% Extracting and saving the page number turned out to be a source of subtle
+% bugs. Initially it was done through an |\edef| with a bunch of
+% |\expandafter| commands inside. This posed a problem if the page number
+% itself contained code which needed protection (e.g., pr/4080) so this got
+% changed to use |\protected@edef|. However, that in turn failed with Babel
+% (pr/4093)
+% if the label contained active characters, e.g., a ``:'' in French. So now
+% we use even more |\expandafter| commands to avoid any expansion other
+% than what is absolutely required---I'm sure there is now a simpler way
+% to code this, but \ldots\ in fact we didn't use enough initially resulting in another
+% bug (pr/4159):
+% \changes{v1.4w}{2009/09/13}{Use \cs{protected@edef} to avoid problems
+% in complicated setups, e.g., microtype (pr/4080)}
+% \changes{v1.4y}{2010/11/12}{Avoid even \cs{protected@edef} to pacify french
+% babel (pr/4093)}
+% \changes{v1.4z}{2011/10/02}{Previous fix need one more expansion
+% (pr/4159,pr/4171)}
+% \begin{macrocode}
+ \expandafter\expandafter\expandafter\vref@@pagenum
+ \csname r@#2\endcsname{}{}\@nil#1%
+}
+\def\vref@@pagenum#1#2#3\@nil#4{%
+ \def#4{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vrefpagenum}
+% \changes{v1.2a}{1998/08/01}{Macro added}
+% Same as the above but this time we generate a warning for
+% undefined labels.
+% \begin{macrocode}
+\def\vrefpagenum#1#2{%
+ \@ifundefined{r@#2}%
+ {\G@refundefinedtrue
+ \@latex@warning{Reference `#2' on page \thepage \space
+ undefined}}{}%
+ \vref@pagenum{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\vpagerefrange}
+% \begin{macro}{\@vpagerefrange}
+% \begin{macro}{\@svpagerefrange}
+% \changes{v1.2a}{1998/08/01}{Macro added}
+% \changes{v1.3b}{2001/04/14}{Scan for star form}
+% \changes{v1.4s}{2007/08/07}
+% {Prevent loss of brackets}
+% If both labels refer to the same page then we produce a
+% |\vpageref|. Otherwise we produce the result of
+% |\reftextpagerange|.
+%
+% One could think of making this command even more clever by
+% producing a special string if the difference between the two page
+% number is one (but this is not done).
+%
+% We need two versions to implement a star form:
+% \begin{macrocode}
+\newcommand\@svpagerefrange[3][\reftextcurrent]{%
+ \vrefpagenum\@tempa{#2}%
+ \vrefpagenum\@tempb{#3}%
+ \ifx\@tempa\@tempb
+ \vpageref*[{#1}]{#2}%
+ \else
+ \reftextpagerange{#2}{#3}%
+ \fi
+}
+% \end{macrocode}
+% And the same but using |\vpageref|:
+% \begin{macrocode}
+\newcommand\@vpagerefrange[3][\reftextcurrent]{%
+ \vrefpagenum\@tempa{#2}%
+ \vrefpagenum\@tempb{#3}%
+ \ifx\@tempa\@tempb
+ \vpageref[{#1}]{#2}%
+ \else
+ \reftextpagerange{#2}{#3}%
+ \fi
+}
+% \end{macrocode}
+% And here we put things together.
+% \begin{macrocode}
+\newcommand\vpagerefrange{\@ifstar\@svpagerefrange\@vpagerefrange}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\vrefrange}
+% \changes{v1.2a}{1998/08/01}{Macro added}
+% \changes{v1.4s}{2006/08/07}
+% {Prevent loss of brackets}
+% \begin{macrocode}
+\newcommand\vrefrange[3][\reftextcurrent]
+ {\reftextlabelrange{#2}{#3} \vpagerefrange[{#1}]{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\Vref}
+% \changes{v1.4a}{2002/02/24}{Macro added}
+% |\Vref| is the counterpart to |\vref| with |\ref| replaced by
+% |\Ref| in its definition.
+% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
+% \begin{macrocode}
+\DeclareRobustCommand\Vref{\@ifstar
+ {\Vref@star}%
+ {\Vr@f}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Vref@star}
+% \changes{v1.6a}{2019/08/25}{Command added to support hyperref better}
+% \begin{macrocode}
+\newcommand\Vref@star[2][]{%
+ \Ref{#2}
+ \vpageref[#1]{#2}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\Vr@f}
+% \changes{v1.4a}{2002/02/24}{Macro added}
+% \changes{v1.4x}{2010/08/04}{Correct spacing -- same mistake as in \cs{vref}
+% (pr/4123)}
+% \changes{v1.6a}{2019/08/25}{Adjusted for new spacing regime}
+% \begin{macrocode}
+\def\Vr@f{%
+ \if@vrefhandlespace
+ \unskip \vref@space
+ \fi
+ \Vref@star % in hyperref this needs to be explicit
+}
+% \end{macrocode}
+% \end{macro}
+
+
+% \begin{macro}{\vpagerefcompare}
+%
+% \changes{v1.6a}{2019/08/25}{Macro added}
+% \begin{macrocode}
+\DeclareRobustCommand\vpagerefcompare[2]{% label1, label2, TRUE, FALSE
+ \vrefpagenum\@tempa{#1}%
+ \vrefpagenum\@tempb{#2}%
+ \ifx\@tempa\@tempb
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\vpagerefnearby}
+% \changes{v1.6a}{2019/08/25}{Macro added}
+% Test if |\vpageref| is going to be at most $\pm1$ off from
+% current page.
+% \begin{macrocode}
+\DeclareRobustCommand\vpagerefnearby[1]{% label, TRUE, FALSE
+ \leavevmode
+ \@tempskipa\lastskip \unskip
+ \global\advance\c@vrcnt\tw@ % keep oddness to not disturb \vrefvario
+ \vref@label{\the\c@vrcnt @vn}%
+ \ifdim\@tempskipa=\z@ \else
+ \hskip\@tempskipa
+ \fi
+ \vref@pagenum\@tempa{\the\c@vrcnt @vn}%
+ \is@pos@number\@tempa
+ {%
+ \vrefpagenum\@tempb{#1}%
+ \is@pos@number\@tempb
+ {%
+ \ifcase\numexpr \@tempa -\@tempb+1\relax
+ \or \or \else \expandafter \@thirdofthree \fi
+ \@firstoftwo
+ }%
+ {\@secondoftwo}%
+ }%
+ {\@secondoftwo}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+
+% \begin{macro}{\vpagerefcomparenearby}
+% \changes{v1.6a}{2019/08/25}{Macro added}
+% True if the two pages have arabic page numbers are at most off by
+% one so that |\vpageref| would produce a special string.
+%
+% This is n some sense a general version of |\vpagerefnearby| for
+% use in more complex situations. I.e., if you try to determine if
+% a larger set of references would be close to the current page and
+% you use each time |\vpagerefnearby| then you generate a lot of
+% internal labels for the current point. Thus by setting the label
+% yourself you can save processing time and space. On the other
+% hand you have to be careful to place the label into the right
+% place which can be a bit complicated if you look at the
+% definition of |\vpagerefnearby| that does all this automatically
+% for you. This is why the current macro is not discussed in the
+% user interface section as it is really just for package
+% developers.
+% \begin{macrocode}
+\DeclareRobustCommand\vpagerefcomparenearby[2]{% label1, label2, TRUE, FALSE
+ \vrefpagenum\@tempa{#1}%
+ \is@pos@number\@tempa
+ {%
+ \vrefpagenum\@tempb{#2}%
+ \is@pos@number\@tempb
+ {%
+ \ifcase\numexpr \@tempa -\@tempb+1\relax
+ \or \or \else \expandafter \@thirdofthree \fi
+ \@firstoftwo
+ }%
+ {\@secondoftwo}%
+ }%
+ {\@secondoftwo}%
+}
+% \end{macrocode}
+% \end{macro}
+
+%
+%
+% \subsubsection{Compatibility with older \LaTeX{} formats}
+%
+%
+% \begin{macro}{\labelformat}
+% \begin{macro}{\Ref}
+% \begin{macro}{\refstepcounter}
+% We don't need to define \cs{labelformat} and \cs{Ref} or change the
+% definition of \cs{refstepcounter} any longer because this is now
+% done in the \LaTeX{} kernel. However, if this package is used
+% together with an older kernel, this is not true, so for this
+% special case we keep the definitions.
+% \begin{macrocode}
+\ifx\labelformat\@undefined % assume we are in an older kernel
+ \def\labelformat#1{\expandafter\def\csname p@#1\endcsname##1}
+ \DeclareRobustCommand\Ref[1]{\protected@edef\@tempa{\ref{#1}}%
+ \expandafter\MakeUppercase\@tempa}
+ \def\refstepcounter#1{\stepcounter{#1}%
+ \protected@edef\@currentlabel
+ {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}}
+\fi
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \Finale
+%
+\endinput
+
diff --git a/macros/latex-dev/required/tools/varioref.ins b/macros/latex-dev/required/tools/varioref.ins
new file mode 100644
index 0000000000..e436202e4d
--- /dev/null
+++ b/macros/latex-dev/required/tools/varioref.ins
@@ -0,0 +1,76 @@
+%%
+%% This file will generate fast loadable files and documentation
+%% driver files from the doc files in this package when run through
+%% LaTeX or TeX.
+%%
+%% Copyright (C) 1993-2019
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file is part of the Standard LaTeX `Tools Bundle'.
+%% -------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% https://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2008 or later.
+%%
+%% As this file contains legal notices, it is NOT PERMITTED to modify
+%% this file in any way that the legal information placed into
+%% generated files is changed (i.e., the files generated when the
+%% original file is executed). This restriction does not apply if
+%% (parts of) the content is reused in a different WORK producing its
+%% own generated files.
+%%
+%% The list of all files belonging to the `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\input docstrip
+
+\keepsilent
+
+\usedir{tex/latex/tools}
+
+\preamble
+
+This is a generated file.
+
+The source is maintained by the LaTeX Project team and bug
+reports for it can be opened at https://latex-project.org/bugs/
+(but please observe conditions on bug reports sent to that address!)
+
+Copyright (C) 1993-2019
+The LaTeX3 Project and any individual authors listed elsewhere
+in this file.
+
+This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+--------------------------------------------------------------------------
+
+It may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3c or later is part of all distributions of LaTeX
+version 2005/12/01 or later.
+
+This file may only be distributed together with a copy of the LaTeX
+`Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+without such generated files.
+
+The list of all files belonging to the LaTeX `Tools Bundle' is
+given in the file `manifest.txt'.
+
+\endpreamble
+
+
+\generateFile{varioref.sty}{t}{\from{varioref.dtx}{package}}
+
+
+\endbatchfile
diff --git a/macros/latex-dev/required/tools/varioref.pdf b/macros/latex-dev/required/tools/varioref.pdf
new file mode 100644
index 0000000000..2346645c1b
--- /dev/null
+++ b/macros/latex-dev/required/tools/varioref.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/verbatim.dtx b/macros/latex-dev/required/tools/verbatim.dtx
new file mode 100644
index 0000000000..1dc8682f79
--- /dev/null
+++ b/macros/latex-dev/required/tools/verbatim.dtx
@@ -0,0 +1,1858 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+%
+%\iffalse % this is a METACOMMENT !
+%
+%
+%% Package `verbatim' to use with LaTeX2e
+%% Copyright (C) 1989--2003 by Rainer Sch\"opf. All rights reserved.
+%
+% Copying of this file is authorized only if either
+% (1) you make absolutely no changes to your copy, including name, or
+% (2) if you do make changes, you name it something other than
+% verbatim.dtx.
+% This restriction helps ensure that all styles developed here
+% remain identical.
+%
+%
+%
+% \section{Producing the documentation}
+%
+% We provide a short driver file that can be extracted by the
+% \textsf{DocStrip} program using the conditional `\textsf{driver}'.
+%
+% \begin{macrocode}
+%<*driver>
+\documentclass{ltxdoc}
+
+\pagestyle{myheadings}
+
+\title{A New Implementation of \LaTeX{}'s \\ \texttt{verbatim}
+ and \texttt{verbatim*} Environments.}
+\author{Rainer Sch\"opf\\
+ \and
+ Bernd Raichle\\
+ \and
+ Chris Rowley}
+
+\date{2001/03/12}
+\begin{document}
+\markboth{Verbatim style option}{Verbatim style option}
+\MaintainedByLaTeXTeam{tools}
+\maketitle
+ \DocInput{verbatim.dtx}
+\end{document}
+%</driver>
+% \end{macrocode}
+%
+%
+%\fi
+%
+%
+% \changes{v1.5q}{2003/08/22}{Reintroduced \cs{@noligs}, by popular
+% request.}
+% \changes{v1.5i}{1996/06/04}{Move setting of verbatim font and
+% \cs{@noligs}.}
+% \changes{v1.5g}{1995/04/26}{Removed \cs{fileversion} and
+% \cs{filedate} from running head in
+% driver file, as these are no longer
+% defined.}
+% \changes{v1.5f}{1994/10/25}{Removed extra \cs{typeout} commands.}
+% \changes{v1.5e}{1994/06/10}{Added missing closing verbtest guard.}
+% \changes{v1.5d}{1994/05/30}{\cs{NeedsTeXFormat} and
+% \cs{ProvidesPackage} added.}
+% \changes{v1.5d}{1994/05/30}{\cs{addto@hook} removed, now in kernel.}
+% \changes{v1.5a}{1993/10/12}{Included \cs{newverbtext} command, as
+% written by Chris Rowley.}
+% \changes{v1.5}{1993/10/11}{Included vrbinput style option by Bernd
+% Raichle.}
+%
+% \changes{v1.4j}{1992/06/30}{Used \cs{lowercase}\{\cs{endgroup}
+% \ldots\} trick proposed by Bernd Raichle; changed all \cs{gdef}
+% to \cs{def} since no longer necessary.}
+% \changes{v1.4g}{1991/11/21}{Several improvements in the
+% documentation.}
+% \changes{v1.4f}{1991/08/05}{Corrected bug in documentation.
+% Found by Bernd Raichle.}
+% \changes{v1.4e}{1991/07/24}{Avoid reading this file twice.}
+% \changes{v1.4d}{1991/04/24}{\cs{penalty}\cs{interlinepenalty} added to
+% definition of \cs{par} in \cs{@verbatim}.
+% Necessary to avoid page breaks in
+% the scope of a \cs{samepage} declaration.}
+% \changes{v1.4c}{1990/10/18}{Added \cs{leavevmode} to definition of
+% backquote macro.}
+% \changes{v1.4b}{1990/07/14}{Converted nearly all \cs{verb}'s to
+% \texttt{\protect\string!|\ldots\protect\string!|}.}
+% \changes{v1.4a}{1990/04/04}{Added a number of percent characters
+% to suppress blank space at the end of some code lines.}
+% \changes{v1.4}{1990/03/07}{\cs{verb} rewritten.}
+%
+% \changes{v1.3a}{1990/02/04}{Removed \texttt{verbatimwrite} environment
+% from the code. Now only shown as an example.}
+%
+% \changes{v1.2g}{1990/02/01}{Revised documentation.}
+% \changes{v1.2e}{1990/01/15}{Added \cs{every@verbatim} hook.}
+% \changes{v1.2d}{1989/11/29}{Use token register \cs{@temptokena}
+% instead of macro \cs{@tempb}.}
+% \changes{v1.2d}{1989/11/29}{Use token register \cs{verbatim@line}
+% instead of macro \cs{@tempd}.}
+% \changes{v1.2b}{1989/10/25}{\cs{verbatimfile} renamed to
+% \cs{verbatiminput}. Suggested by Reinhard Wonneberger.}
+%
+% \changes{v1.1a}{1989/10/16}{\cs{verb} added.}
+% \changes{v1.1}{1989/10/09}{Made the code more modular (as suggested by
+% Chris Rowley): introduced
+% \cs{verbatim@addtoline}, etc. Added
+% \cs{verbatimwrite} environment.}
+%
+% \changes{v1.0e}{1989/07/17}{Fixed bug in \cs{verbatimfile} (*-form
+% handling, discovered by Dirk Kreimer).}
+% \changes{v1.0d}{1989/05/16}{Revised documentation, fixed silly bug
+% in \cs{verbatim@@@}.}
+% \changes{v1.0c}{1989/05/12}{Added redefinition of \cs{@sverb}, change
+% in end-of-line handling.}
+% \changes{v1.0b}{1989/05/09}{Change in \cs{verbatim@rescan}.}
+% \changes{v1.0a}{1989/05/07}{Change in \cs{verbatim@@testend}.}
+%
+%
+% \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~}
+% \DoNotIndex{\@M,\@empty,\@flushglue,\@gobble,\@ifstar,\@ifundefined}
+% \DoNotIndex{\@namedef,\@spaces,\@tempa,\@tempb,\@tempc,\@tempd}
+% \DoNotIndex{\@temptokena,\@totalleftmargin,\@warning,\active}
+% \DoNotIndex{\aftergroup,\arabic,\begingroup,\catcode,\char,\closein}
+% \DoNotIndex{\csname,\def,\do,\docdate,\dospecials,\edef,\else}
+% \DoNotIndex{\endcsname,\endgraf,\endgroup,\endinput,\endlinechar}
+% \DoNotIndex{\endtrivlist,\expandafter,\fi,\filedate,\fileversion}
+% \DoNotIndex{\frenchspacing,\futurelet,\if,\ifcat,\ifeof,\ifnum}
+% \DoNotIndex{\ifx,\immediate,\item,\kern,\lccode,\leftskip,\let}
+% \DoNotIndex{\lowercase,\m@ne,\makeatletter,\makeatother,\newread}
+% \DoNotIndex{\newread,\next,\noexpand,\noindent,\openin,\parfillskip}
+% \DoNotIndex{\parindent,\parskip,\penalty,\read,\relax,\rightskip}
+% \DoNotIndex{\sloppy,\space,\string,\the,\toks@,\trivlist,\tt,\typeout}
+% \DoNotIndex{\vskip,\write,\z@}
+%
+% \begin{abstract}
+% This package reimplements the \LaTeX{} \texttt{verbatim} and
+% \texttt{verbatim*} environments.
+% In addition it provides a \texttt{comment} environment
+% that skips any commands or text between
+% |\begin{comment}|
+% and the next |\end{comment}|.
+% It also defines the command \texttt{verbatiminput} to input a whole
+% file verbatim.
+% \end{abstract}
+%
+% \section{Usage notes}
+%
+% \let\docDescribeMacro\DescribeMacro
+% \let\docDescribeEnv\DescribeEnv
+% \def\DescribeMacro#1{}
+% \def\DescribeEnv#1{}
+% \LaTeX's \texttt{verbatim} and \texttt{verbatim*} environments
+% have a few features that may give rise to problems. These are:
+% \begin{itemize}
+% \item
+% Due to the method used to detect the closing |\end{verbatim}|
+% (i.e.\ macro parameter delimiting) you cannot leave spaces
+% between the |\end| token and |{verbatim}|.
+% \item
+% Since \TeX{} has to read all the text between the
+% |\begin{verbatim}| and the |\end{verbatim}| before it can output
+% anything, long verbatim listings may overflow \TeX's memory.
+% \end{itemize}
+% Whereas the first of these points can be considered
+% only a minor nuisance the other one is a real limitation.
+%
+%
+% \DescribeEnv{verbatim}
+% \DescribeEnv{verbatim*}
+% This package file contains a reimplementation of the \texttt{verbatim}
+% and \texttt{verbatim*} environments which overcomes these
+% restrictions.
+% There is, however, one incompatibility between the old and the
+% new implementations of these environments: the old version
+% would treat text on the same line as the |\end{verbatim}|
+% command as if it were on a line by itself.
+% \begin{center}
+% \bf This new version will simply ignore it.
+% \end{center}
+% (This is the price one has to pay for the removal of the old
+% \texttt{verbatim} environment's size limitations.)
+% It will, however, issue a warning message of the form
+% \begin{verbatim}
+%LaTeX warning: Characters dropped after \end{verbatim*}!
+%\end{verbatim}
+% This is not a real problem since this text can easily be put
+% on the next line without affecting the output.
+%
+% This new implementation also solves the second problem mentioned
+% above: it is possible to leave spaces (but \emph{not} begin a new
+% line) between the |\end| and the |{verbatim}| or |{verbatim*}|:
+% \begin{verbatim}
+%\begin {verbatim*}
+% test
+% test
+%\end {verbatim*}
+%\end{verbatim}
+%
+% \DescribeEnv{comment}
+% Additionally we introduce a \texttt{comment} environment, with the
+% effect that the text between |\begin{comment}| and |\end{comment}|
+% is simply ignored, regardless of what it looks like.
+% At first sight this seems to be quite different from the purpose
+% of verbatim listing, but actually the implementation of these two
+% concepts turns out to be very similar.
+% Both rely on the fact that the text between |\begin{...}| and
+% |\end{...}| is read by \TeX{} without interpreting any commands or
+% special characters.
+% The remaining difference between \texttt{verbatim} and
+% \texttt{comment} is only that the text is to be typeset in the
+% first case and to be thrown away in the latter. Note that these
+% environments cannot be nested.
+%
+% \DescribeMacro{\verbatiminput}
+% |\verbatiminput| is a command with one argument that inputs a file
+% verbatim, i.e.\ the command |verbatiminput{xx.yy}|
+% has the same effect as\\[2pt]
+% \hspace*{\MacroIndent}|\begin{verbatim}|\\
+% \hspace*{\MacroIndent}\meta{Contents of the file \texttt{xx.yy}}\\
+% \hspace*{\MacroIndent}|\end{verbatim}|\\[2pt]
+% This command has also a |*|-variant that prints spaces as \verb*+ +.
+%
+%
+% \StopEventually{}
+%
+%
+% \section{Interfaces for package writers}
+%
+% The \texttt{verbatim} environment of \LaTeXe{} does not
+% offer a good interface to programmers.
+% In contrast, this package provides a simple mechanism to
+% implement similar features, the \texttt{comment} environment
+% implemented here being an example of what can be done and how.
+%
+%
+% \subsection{Simple examples}
+%
+% It is now possible to use the \texttt{verbatim} environment to define
+% environments of your own.
+% E.g.,
+%\begin{verbatim}
+% \newenvironment{myverbatim}%
+% {\endgraf\noindent MYVERBATIM:%
+% \endgraf\verbatim}%
+% {\endverbatim}
+%\end{verbatim}
+% can be used afterwards like the \texttt{verbatim} environment, i.e.
+% \begin{verbatim}
+%\begin {myverbatim}
+% test
+% test
+%\end {myverbatim}
+%\end{verbatim}
+% Another way to use it is to write
+% \begin{verbatim}
+%\let\foo=\comment
+%\let\endfoo=\endcomment
+%\end{verbatim}
+% and from that point on environment \texttt{foo} is the same as the
+% comment environment, i.e.\ everything inside its body is ignored.
+%
+% You may also add special commands after the |\verbatim| macro is
+% invoked, e.g.
+%\begin{verbatim}
+%\newenvironment{myverbatim}%
+% {\verbatim\myspecialverbatimsetup}%
+% {\endverbatim}
+%\end{verbatim}
+% though you may want to learn about the hook |\every@verbatim| at
+% this point.
+% \changes{v1.5h}{1995/09/21}{Clarified documentation on use of other
+% environments to define new verbatim-type ones.}
+% However, there are still a number of restrictions:
+% \begin{enumerate}
+% \item
+% You must not use the |\begin| or the |\end| command inside a
+% definition, e.g.~the following two examples will \emph{not} work:
+%\begin{verbatim*}
+%\newenvironment{myverbatim}%
+%{\endgraf\noindent MYVERBATIM:%
+% \endgraf\begin{verbatim}}%
+%{\end{verbatim}}
+%\newenvironment{fred}
+%{\begin{minipage}{30mm}\verbatim}
+%{\endverbatim\end{minipage}}
+%\end{verbatim*}
+% If you try these examples, \TeX{} will report a
+% ``runaway argument'' error.
+% More generally, it is not possible to use
+% |\begin|\ldots\allowbreak|\end|
+% or the related environments in the definition of the new
+% environment. Instead, the correct way to define this environment
+% would be
+% \begin{verbatim*}
+%\newenvironment{fred}
+%{\minipage{30mm}\verbatim}
+%{\endverbatim\endminipage}
+%\end{verbatim*}
+% \item
+% You can\emph{not} use the \texttt{verbatim} environment inside
+% user defined \emph{commands}; e.g.,
+% \changes{v1.4g}{1991/11/21}{Corrected wrong position of optional
+% argument to \cs{newcommand}. Discovered by Piet van Oostrum.}
+% \begin{verbatim*}
+%\newcommand{\verbatimfile}[1]%
+% {\begin{verbatim}\input{#1}\end{verbatim}}
+%\end{verbatim*}
+% does \emph{not} work; nor does
+% \begin{verbatim}
+%\newcommand{\verbatimfile}[1]{\verbatim\input{#1}\endverbatim}
+%\end{verbatim}
+% \item The name of the newly defined environment must not contain
+% characters with category code other than $11$ (letter) or
+% $12$ (other), or this will not work.
+% \end{enumerate}
+%
+%
+% \subsection{The interfaces}
+%
+% \DescribeMacro{\verbatim@font}
+% Let us start with the simple things.
+% Sometimes it may be necessary to use a special typeface for your
+% verbatim text, or perhaps the usual computer modern typewriter shape
+% in a reduced size.
+%
+% You may select this by redefining the macro |\verbatim@font|.
+% This macro is executed at the beginning of every verbatim text to
+% select the font shape.
+% Do not use it for other purposes; if you find yourself abusing this
+% you may want to read about the |\every@verbatim| hook below.
+%
+% By default, |\verbatim@font| switches to the typewriter font and
+% disables the ligatures contained therein.
+%
+%
+% \DescribeMacro{\every@verbatim}
+% \DescribeMacro{\addto@hook}
+% There is a hook (i.e.\ a token register) called |\every@verbatim|
+% whose contents are inserted into \TeX's mouth just before every
+% verbatim text.
+% Please use the |\addto@hook| macro to add something to this hook.
+% It is used as follows:\\[2pt]
+% \hspace*{\MacroIndent}|\addto@hook|\meta{name of the hook}^^A
+% |{|\meta{commands to be added}|}|
+% \vspace*{2pt}
+%
+%
+%
+% \DescribeMacro{\verbatim@start}
+% After all specific setup, like switching of category codes, has been
+% done, the |\verbatim@start| macro is called.
+% This starts the main loop of the scanning mechanism implemented here.
+% Any other environment that wants to make use of this feature should
+% execute this macro as its last action.
+%
+%
+% \DescribeMacro{\verbatim@startline}
+% \DescribeMacro{\verbatim@addtoline}
+% \DescribeMacro{\verbatim@processline}
+% \DescribeMacro{\verbatim@finish}
+% These are the things that concern the start of a verbatim
+% environment.
+% Once this (and other) setup has been done, the code in this package
+% reads and processes characters from the input stream in the
+% following way:
+% \begin{enumerate}
+% \item Before the first character of an input line is read, it
+% executes the macro |\verbatim@startline|.
+% \item After some characters have been read, the macro
+% |\verbatim@addtoline| is called with these characters as its only
+% argument.
+% This may happen several times per line (when an |\end| command is
+% present on the line in question).
+% \item When the end of the line is reached, the macro
+% |\verbatim@processline| is called to process the characters that
+% |\verbatim@addtoline| has accumulated.
+% \item Finally, there is the macro |\verbatim@finish| that is called
+% just before the environment is ended by a call to the |\end|
+% macro.
+% \end{enumerate}
+%
+%
+% To make this clear let us consider the standard \texttt{verbatim}
+% environment.
+% In this case the three macros above are defined as follows:
+% \begin{enumerate}
+% \item |\verbatim@startline| clears the character buffer
+% (a token register).
+% \item |\verbatim@addtoline| adds its argument to the character
+% buffer.
+% \item |\verbatim@processline| typesets the characters accumulated
+% in the buffer.
+% \end{enumerate}
+% With this it is very simple to implement the \texttt{comment}
+% environment:
+% in this case |\verbatim@startline| and |\verbatim@processline| are
+% defined to be
+% no-ops whereas |\verbatim@addtoline| discards its argument.
+%
+%
+% Let's use this to define a variant of the |verbatim|
+% environment that prints line numbers in the left margin.
+% Assume that this would be done by a counter called |VerbatimLineNo|.
+% Assuming that this counter was initialized properly by the
+% environment, |\verbatim@processline| would be defined in this case as
+% \begin{verbatim}
+%\def\verbatim@processline{%
+% \addtocounter{VerbatimLineNo}{1}%
+% \leavevmode
+% \llap{\theVerbatimLineNo\ \hskip\@totalleftmargin}%
+% \the\verbatim@line\par}
+%\end{verbatim}
+%
+% A further possibility is to define a variant of the |verbatim|
+% environment that boxes and centers the whole verbatim text.
+% Note that the boxed text should be less than a page otherwise you
+% have to change this example.
+%
+%\begin{verbatim}
+%\def\verbatimboxed#1{\begingroup
+% \def\verbatim@processline{%
+% {\setbox0=\hbox{\the\verbatim@line}%
+% \hsize=\wd0
+% \the\verbatim@line\par}}%
+% \setbox0=\vbox{\parskip=0pt\topsep=0pt\partopsep=0pt
+% \verbatiminput{#1}}%
+% \begin{center}\fbox{\box0}\end{center}%
+% \endgroup}
+%\end{verbatim}
+%
+% As a final nontrivial example we describe the definition of an
+% environment called \texttt{verbatimwrite}.
+% It writes all text in its body to a file whose name is
+% given as an argument.
+% We assume that a stream number called |\verbatim@out| has already
+% been reserved by means of the |\newwrite| macro.
+%
+% Let's begin with the definition of the macro |\verbatimwrite|.
+% \begin{verbatim}
+%\def\verbatimwrite#1{%
+%\end{verbatim}
+% First we call |\@bsphack| so that this environment does not influence
+% the spacing.
+% Then we open the file and set the category codes of all special
+% characters:
+% \begin{verbatim}
+% \@bsphack
+% \immediate\openout \verbatim@out #1
+% \let\do\@makeother\dospecials
+% \catcode`\^^M\active
+%\end{verbatim}
+% The default definitions of the macros
+% \begin{verbatim}
+% \verbatim@startline
+% \verbatim@addtoline
+% \verbatim@finish
+%\end{verbatim}
+% are also used in this environment.
+% Only the macro |\verbatim@processline| has to be changed before
+% |\verbatim@start| is called:
+% \begin{verbatim}
+% \def\verbatim@processline{%
+% \immediate\write\verbatim@out{\the\verbatim@line}}%
+% \verbatim@start}
+%\end{verbatim}
+% The definition of |\endverbatimwrite| is very simple:
+% we close the stream and call |\@esphack| to get the spacing right.
+% \begin{verbatim}
+%\def\endverbatimwrite{\immediate\closeout\verbatim@out\@esphack}
+%\end{verbatim}
+%
+% \section{The implementation}
+%
+% \let\DescribeMacro\docDescribeMacro
+% \let\DescribeEnv\docDescribeEnv
+%
+% \changes{v1.4e}{1991/07/24}{Avoid reading this file twice.}
+% The very first thing we do is to ensure that this file is not read
+% in twice. To this end we check whether the macro |\verbatim@@@| is
+% defined. If so, we just stop reading this file. The `package'
+% guard here allows most of the code to be excluded when extracting
+% the driver file for testing this package.
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{verbatim}
+ [2014/10/28 v1.5q LaTeX2e package for verbatim enhancements]
+\@ifundefined{verbatim@@@}{}{\endinput}
+% \end{macrocode}
+%
+% We use a mechanism similar to the one implemented for the
+% |\comment|\ldots\allowbreak|\endcomment| macro in \AmSTeX:
+% We input one line at a time and check if it contains the |\end{...}|
+% tokens.
+% Then we can decide whether we have reached the end of the verbatim
+% text, or must continue.
+%
+%
+% \subsection{Preliminaries}
+%
+% \begin{macro}{\every@verbatim}
+% The hook (i.e.\ token register) |\every@verbatim|
+% is initialized to \meta{empty}.
+% \begin{macrocode}
+\newtoks\every@verbatim
+\every@verbatim={}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@makeother}
+% \changes{v1.1a}{1989/10/16}{\cs{@makeother} added.}
+% |\@makeother| takes as argument a character and changes
+% its category code to $12$ (other).
+% \begin{macrocode}
+\def\@makeother#1{\catcode`#112\relax}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@vobeyspaces}
+% \changes{v1.5}{1993/10/11}{Changed definition to not use \cs{gdef}.}
+% \changes{v1.1a}{1989/10/16}{\cs{@vobeyspaces} added.}
+% The macro |\@vobeyspaces| causes spaces in the input
+% to be printed as spaces in the output.
+% \begin{macrocode}
+\begingroup
+ \catcode`\ =\active%
+ \def\x{\def\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
+ \expandafter\endgroup\x
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@xobeysp}
+% \changes{v1.1a}{1989/10/16}{\cs{@xobeysp} added.}
+% The macro |\@xobeysp| produces exactly one space in
+% the output, protected against breaking just before it.
+% (|\@M| is an abbreviation for the number $10000$.)
+% \begin{macrocode}
+\def\@xobeysp{\leavevmode\penalty\@M\ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim@line}
+% \changes{v1.2d}{1989/11/29}{Introduced token register
+% \cs{verbatim@line}.}
+% We use a newly defined token register called |\verbatim@line|
+% that will be used as the character buffer.
+% \begin{macrocode}
+\newtoks\verbatim@line
+% \end{macrocode}
+% \end{macro}
+%
+% The following four macros are defined globally in a way suitable for
+% the \texttt{verbatim} and \texttt{verbatim*} environments.
+% \begin{macro}{\verbatim@startline}
+% \begin{macro}{\verbatim@addtoline}
+% \begin{macro}{\verbatim@processline}
+% |\verbatim@startline| initializes processing of a line
+% by emptying the character buffer (|\verbatim@line|).
+% \begin{macrocode}
+\def\verbatim@startline{\verbatim@line{}}
+% \end{macrocode}
+% |\verbatim@addtoline| adds the tokens in its argument
+% to our buffer register |\verbatim@line| without expanding
+% them.
+% \begin{macrocode}
+\def\verbatim@addtoline#1{%
+ \verbatim@line\expandafter{\the\verbatim@line#1}}
+% \end{macrocode}
+% Processing a line inside a \texttt{verbatim} or \texttt{verbatim*}
+% environment means printing it.
+% \changes{v1.2c}{1989/10/31}{Changed \cs{@@par} to \cs{par} in
+% \cs{verbatim@processline}. Removed \cs{leavevmode} and \cs{null}
+% (i.e.\ the empty \cs{hbox}).}
+% Ending the line means that we have to begin a new paragraph.
+% We use |\par| for this purpose. Note that |\par|
+% is redefined in |\@verbatim| to force \TeX{} into horizontal
+% mode and to insert an empty box so that empty lines in the input
+% do appear in the output.
+% \changes{v1.2f}{1990/01/31}{\cs{verbatim@startline} removed.}
+% \begin{macrocode}
+\def\verbatim@processline{\the\verbatim@line\par}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@finish}
+% As a default, |\verbatim@finish| processes the remaining
+% characters.
+% When this macro is called we are facing the following problem:
+% when the |\end{verbatim}|
+% command is encountered |\verbatim@processline| is called
+% to process the characters preceding the command on the same
+% line. If there are none, an empty line would be output if we
+% did not check for this case.
+%
+% If the line is empty |\the\verbatim@line| expands to
+% nothing. To test this we use a trick similar to that on p.\ 376
+% of the \TeX{}book, but with |$|\ldots|$| instead of
+% the |!| tokens. These |$| tokens can never have the same
+% category code as a |$| token that might possibly appear in the
+% token register |\verbatim@line|, as such a token will always have
+% been read with category code $12$ (other).
+% Note that |\ifcat| expands the following tokens so that
+% |\the\verbatim@line| is replaced by the accumulated
+% characters
+% \changes{v1.2d}{1989/11/29}{Changed \cs{ifx} to \cs{ifcat} test.}
+% \changes{v1.1b}{1989/10/18}{Corrected bug in if test (found by CRo).}
+% \begin{macrocode}
+\def\verbatim@finish{\ifcat$\the\verbatim@line$\else
+ \verbatim@processline\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{The \texttt{verbatim} and \texttt{verbatim*} environments}
+%
+% \begin{macro}{\verbatim@font}
+% \changes{v1.2f}{1990/01/31}{\cs{@lquote} macro removed.}
+% \changes{v1.1b}{1989/10/18}{\cs{@noligs} removed. Code inserted
+% directly into \cs{verbatim@font}.}
+% \changes{v1.1a}{1989/10/16}{\cs{verbatim@font} added.}
+% \changes{v1.1a}{1989/10/16}{\cs{@noligs} added.}
+% \changes{v1.1a}{1989/10/16}{\cs{@lquote} added.}
+% We start by defining the macro |\verbatim@font| that is
+% to select the font and to set font-dependent parameters.
+% Then we expand |\@noligs| (defined in the \LaTeXe{} kernel). Among
+% possibly other things, it will go through |\verbatim@nolig@list|
+% to avoid certain ligatures.
+% |\verbatim@nolig@list| is a macro defined in the \LaTeXe{} kernel
+% to expand to
+% \begin{verbatim}
+% \do\`\do\<\do\>\do\,\do\'\do\-
+%\end{verbatim}
+% All the characters in this list can be part of a ligature in some
+% font or other.
+% \changes{v1.2f}{1990/01/31}{\cs{@lquote} macro removed.}
+% \changes{v1.4c}{1990/10/18}{Added \cs{leavevmode}.}
+% \changes{v1.4k}{1992/07/13}{Replaced Blank after $96$ by \cs{relax}.
+% (Proposed by Dan Dill.)}
+% \changes{v1.5}{1993/10/11}{Definition changed according to new code
+% in latex.tex and to avoid global definition.}
+% \changes{v1.5c}{1994/02/07}{Changed to use new font switching
+% commands.}
+% \changes{v1.5m}{2000/01/07}{Disable hyphenation even if the font
+% allows it.}
+% \changes{v1.5q}{2003/08/22}{Use \cs{@noligs}, as it is by now properly
+% defined in the \LaTeXe{} kernel.}
+% \begin{macrocode}
+\def\verbatim@font{\normalfont\ttfamily
+ \hyphenchar\font\m@ne
+ \@noligs}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\@verbatim}
+% \changes{v1.1a}{1989/10/16}{\cs{@verbatim} added.}
+% The macro |\@verbatim| sets up things properly.
+% First of all, the tokens of the |\every@verbatim| hook
+% are inserted.
+% Then a \texttt{trivlist} environment is started and its first
+% |\item| command inserted.
+% Each line of the \texttt{verbatim} or \texttt{verbatim*}
+% environment will be treated as a separate paragraph.
+% \changes{v1.2e}{1990/01/15}{Added \cs{every@verbatim} hook.}
+% \changes{v1.5b}{1994/01/24}{Removed optional argument of \cs{item}.}
+% \begin{macrocode}
+\def\@verbatim{\the\every@verbatim
+ \trivlist \item \relax
+% \end{macrocode}
+% \changes{v1.5b}{1994/01/24}{Set \texttt{@inlabel} switch to false.}
+% \changes{v1.5f}{1994/10/25}{Removed setting of \texttt{@inlabel}
+% switch again.}
+% \changes{v1.3c}{1990/02/26}{Removed extra vertical space.
+% Suggested by Frank Mittelbach.}
+% \changes{v1.5h}{1995/09/21}{Added the space again, since it is
+% necessary for correct vertical spacing if \texttt{verbatim}
+% is nested inside \texttt{quote}.}
+% The following extra vertical space is for compatibility with the
+% \LaTeX kernel: otherwise, using the |verbatim| package changes
+% the vertical spacing of a |verbatim| environment nested within a
+% |quote| environment.
+% \begin{macrocode}
+ \if@minipage\else\vskip\parskip\fi
+% \end{macrocode}
+% \changes{v1.4k}{1992/07/13}{Added setting for
+% \cs{@beginparpenalty}. Suggested by Frank Mittelbach.}
+% The paragraph parameters are set appropriately:
+% the penalty at the beginning of the environment,
+% left and right margins, paragraph indentation, the glue to
+% fill the last line, and the vertical space between paragraphs.
+% The latter space has to be zero since we do not want to add
+% extra space between lines.
+% \begin{macrocode}
+ \@beginparpenalty \predisplaypenalty
+ \leftskip\@totalleftmargin\rightskip\z@
+ \parindent\z@\parfillskip\@flushglue\parskip\z@
+% \end{macrocode}
+% \changes{v1.1b}{1989/10/18}{Added resetting of \cs{parshape}
+% if at beginning of a list.
+% (Problem pointed out by Chris Rowley.)}
+% There's one point to make here:
+% the \texttt{list} environment uses \TeX's |\parshape|
+% primitive to get a special indentation for the first line
+% of the list.
+% If the list begins with a \texttt{verbatim} environment
+% this |\parshape| is still in effect.
+% Therefore we have to reset this internal parameter explicitly.
+% We could do this by assigning $0$ to |\parshape|.
+% However, there is a simpler way to achieve this:
+% we simply tell \TeX{} to start a new paragraph.
+% As is explained on p.~103 of the \TeX{}book, this resets
+% |\parshape| to zero.
+% \changes{v1.1c}{1989/10/19}{Replaced explicit resetting of
+% \cs{parshape} by \cs{@@par}.}
+% \begin{macrocode}
+ \@@par
+% \end{macrocode}
+% We now ensure that |\par| has the correct definition,
+% namely to force \TeX{} into horizontal mode
+% and to include an empty box.
+% This is to ensure that empty lines do appear in the output.
+% Afterwards, we insert the |\interlinepenalty| since \TeX{}
+% does not add a penalty between paragraphs (here: lines)
+% by its own initiative. Otherwise a |verbatim| environment
+% could be broken across pages even if a |\samepage|
+% declaration were present.
+%
+% However, in a top-aligned minipage, this will result in an extra
+% empty line added at the top. Therefore, a slightly more
+% complicated construct is necessary.
+% One of the important things here is the inclusion of
+% |\leavevmode| as the first macro in the first line, for example,
+% a blank verbatim line is the first thing in a list item.
+% \changes{v1.2c}{1989/10/31}{Definition of \cs{par} added.
+% Ensures identical behaviour for
+% verbatim and \cs{verbatiminput}.
+% Problem pointed out by Chris.}
+% \changes{v1.4d}{1991/04/24}{\cs{penalty}\cs{interlinepenalty} added.
+% Necessary to avoid page breaks in
+% the scope of a \cs{samepage} declaration.}
+% \changes{v1.5b}{1994/01/24}{Improved definition of \cs{par} to work
+% under all circumstances.}
+% \changes{v1.5f}{1994/10/25}{\cs{leavevmode} added for first line.}
+% \begin{macrocode}
+ \def\par{%
+ \if@tempswa
+ \leavevmode\null\@@par\penalty\interlinepenalty
+ \else
+ \@tempswatrue
+ \ifhmode\@@par\penalty\interlinepenalty\fi
+ \fi}%
+% \end{macrocode}
+% But to avoid an error message when the environment
+% doesn't contain any text, we redefine |\@noitemerr|
+% which will in this case be called by |\endtrivlist|.
+% \changes{v1.4j}{1992/06/30}{Introduced warning instead of error
+% for empty body of verbatim text.
+% Suggested by Nelson Beebe.}
+% \begin{macrocode}
+ \def\@noitemerr{\@warning{No verbatim text}}%
+% \end{macrocode}
+% Now we call |\obeylines| to make the end of line character
+% active,
+% \begin{macrocode}
+ \obeylines
+% \end{macrocode}
+% change the category code of all special characters,
+% to $12$ (other).
+% \changes{v1.5i}{1996/06/04}{Moved \cs{verbatim@font} after
+% \cs{dospecials}.}
+% \begin{macrocode}
+ \let\do\@makeother \dospecials
+% \end{macrocode}
+% and switch to the font to be used.
+% \begin{macrocode}
+ \verbatim@font
+% \end{macrocode}
+% To avoid a breakpoint after the labels box, we remove the penalty
+% put there by the list macros: another use of |\unpenalty|!
+% \changes{v1.5f}{1994/10/25}{Change to \cs{everypar} added.}
+% \begin{macrocode}
+ \everypar \expandafter{\the\everypar \unpenalty}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim}
+% \begin{macro}{\verbatim*}
+% Now we define the toplevel macros.
+% |\verbatim| is slightly changed:
+% after setting up things properly it calls
+% |\verbatim@start|.
+% \changes{v1.5l}{1999/12/14}{Added \cs{begingroup} for cases where
+% \cs{verbatim} is used directly, rather than in \cs{begin}: see
+% pr/3115.}
+% This is done inside a group, so that |\verbatim| can be used
+% directly, without |\begin|.
+% \begin{macrocode}
+\def\verbatim{\begingroup\@verbatim \frenchspacing\@vobeyspaces
+ \verbatim@start}
+% \end{macrocode}
+% |\verbatim*| is defined accordingly.
+% \begin{macrocode}
+\@namedef{verbatim*}{\begingroup\@verbatim\verbatim@start}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\endverbatim}
+% \begin{macro}{\endverbatim*}
+% To end the \texttt{verbatim} and \texttt{verbatim*}
+% environments it is only necessary to finish the
+% \texttt{trivlist} environment started in |\@verbatim| and
+% close the corresponding group.
+% \changes{v1.5l}{1999/12/14}{Added \cs{endgroup} for cases where
+% \cs{endverbatim} is used directly, rather than in \cs{end}: see
+% pr/3115.}
+% \changes{v1.5n}{2000/08/03}{Added \cs{@endpetrue}: needed when
+% faking such a \cs{end} (pr/3234).}
+% \changes{v1.5o}{2000/08/23}{Changed \cs{@endpetrue} to \cs{@doendpe}:
+% see (pr/3234).}
+% \begin{macrocode}
+\def\endverbatim{\endtrivlist\endgroup\@doendpe}
+\expandafter\let\csname endverbatim*\endcsname =\endverbatim
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{The \texttt{comment} environment}
+%
+% \begin{macro}{\comment}
+% \begin{macro}{\endcomment}
+% \changes{v1.1c}{1989/10/19}{Added \cs{@bsphack}/\cs{@esphack} to the
+% \texttt{comment} environment. Suggested by Chris Rowley.}
+% The |\comment| macro is similar to |\verbatim*|.
+% However, we do not need to switch fonts or set special
+% formatting parameters such as |\parindent| or |\parskip|.
+% We need only set the category code of all special characters
+% to $12$ (other) and that of |^^M| (the end of line character)
+% to $13$ (active).
+% The latter is needed for macro parameter delimiter matching in
+% the internal macros defined below.
+% In contrast to the default definitions used by the
+% |\verbatim| and |\verbatim*| macros,
+% we define |\verbatim@addtoline| to throw away its argument
+% and |\verbatim@processline|, |\verbatim@startline|,
+% and |\verbatim@finish| to act as no-ops.
+% Then we call |\verbatim@|.
+% But the first thing we do is to call |\@bsphack| so that
+% this environment has no influence whatsoever upon the spacing.
+% \changes{v1.1c}{1989/10/19}{Changed \cs{verbatim@start} to
+% \cs{verbatim@}. Suggested by Chris Rowley.}
+% \changes{v1.1c}{1989/10/19}{\cs{verbatim@startline} and
+% \cs{verbatim@finish} are now
+% also redefined to do nothing.}
+% \begin{macrocode}
+\def\comment{\@bsphack
+ \let\do\@makeother\dospecials\catcode`\^^M\active
+ \let\verbatim@startline\relax
+ \let\verbatim@addtoline\@gobble
+ \let\verbatim@processline\relax
+ \let\verbatim@finish\relax
+ \verbatim@}
+% \end{macrocode}
+% |\endcomment| is very simple: it only calls
+% |\@esphack| to take care of the spacing.
+% The |\end| macro closes the group and therefore takes care
+% of restoring everything we changed.
+% \begin{macrocode}
+\let\endcomment=\@esphack
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{The main loop}
+%
+% Here comes the tricky part:
+% During the definition of the macros we need to use the special
+% characters |\|, |{|, and |}| not only with their
+% normal category codes,
+% but also with category code $12$ (other).
+% We achieve this by the following trick:
+% first we tell \TeX{} that |\|, |{|, and |}|
+% are the lowercase versions of |!|, |[|, and |]|.
+% Then we replace every occurrence of |\|, |{|, and |}|
+% that should be read with category code $12$ by |!|, |[|,
+% and |]|, respectively,
+% and give the whole list of tokens to |\lowercase|,
+% knowing that category codes are not altered by this primitive!
+%
+% But first we have ensure that
+% |!|, |[|, and |]| themselves have
+% the correct category code!
+% \changes{v1.3b}{1990/02/07}{Introduced \cs{vrb@catcodes} instead
+% of explicit setting of category codes.}
+% To allow special settings of these codes we hide their setting in
+% the macro |\vrb@catcodes|. If it is already defined our new
+% definition is skipped.
+% \begin{macrocode}
+\@ifundefined{vrb@catcodes}%
+ {\def\vrb@catcodes{%
+ \catcode`\!12\catcode`\[12\catcode`\]12}}{}
+% \end{macrocode}
+% This trick allows us to use this code for applications where other
+% category codes are in effect.
+%
+% We start a group to keep the category code changes local.
+% \begin{macrocode}
+\begingroup
+ \vrb@catcodes
+ \lccode`\!=`\\ \lccode`\[=`\{ \lccode`\]=`\}
+% \end{macrocode}
+% \changes{v1.2f}{1990/01/31}{Code for TABs removed.}
+% We also need the end-of-line character |^^M|,
+% as an active character.
+% If we were to simply write |\catcode`\^^M=\active|
+% then we would get an unwanted active end of line character
+% at the end of every line of the following macro definitions.
+% Therefore we use the same trick as above:
+% we write a tilde |~| instead of |^^M| and
+% pretend that the
+% latter is the lowercase variant of the former.
+% Thus we have to ensure now that the tilde character has
+% category code $13$ (active).
+% \begin{macrocode}
+ \catcode`\~=\active \lccode`\~=`\^^M
+% \end{macrocode}
+% The use of the |\lowercase| primitive leads to one problem:
+% the uppercase character `|C|' needs to be used in the
+% code below and its case must be preserved.
+% So we add the command:
+% \begin{macrocode}
+ \lccode`\C=`\C
+% \end{macrocode}
+% Now we start the token list passed to |\lowercase|.
+% We use the following little trick (proposed by Bernd Raichle):
+% The very first token in the token list we give to |\lowercase| is
+% the |\endgroup| primitive. This means that it is processed by
+% \TeX{} immediately after |\lowercase| has finished its operation,
+% thus ending the group started by |\begingroup| above. This avoids
+% the global definition of all macros.
+% \begin{macrocode}
+ \lowercase{\endgroup
+% \end{macrocode}
+% \begin{macro}{\verbatim@start}
+% The purpose of |\verbatim@start| is to check whether there
+% are any characters on the same line as the |\begin{verbatim}|
+% and to pretend that they were on a line by themselves.
+% On the other hand, if there are no characters remaining
+% on the current line we shall just find an end of line character.
+% |\verbatim@start| performs its task by first grabbing the
+% following character (its argument).
+% This argument is then compared to an active |^^M|,
+% the end of line character.
+% \begin{macrocode}
+ \def\verbatim@start#1{%
+ \verbatim@startline
+ \if\noexpand#1\noexpand~%
+% \end{macrocode}
+% If this is true we transfer control to |\verbatim@|
+% to process the next line. We use
+% |\next| as the macro which will continue the work.
+% \begin{macrocode}
+ \let\next\verbatim@
+% \end{macrocode}
+% Otherwise, we define |\next| to expand to a call
+% to |\verbatim@| followed by the character just
+% read so that it is reinserted into the text.
+% This means that those characters remaining on this line
+% are handled as if they formed a line by themselves.
+% \begin{macrocode}
+ \else \def\next{\verbatim@#1}\fi
+% \end{macrocode}
+% Finally we call |\next|.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@}
+% The three macros |\verbatim@|, |\verbatim@@|,
+% and |\verbatim@@@| form the ``main loop'' of the
+% \texttt{verbatim} environment.
+% The purpose of |\verbatim@| is to read exactly one line
+% of input.
+% |\verbatim@@| and |\verbatim@@@| work together to
+% find out whether the four characters
+% |\end| (all with category code $12$ (other)) occur in that
+% line.
+% If so, |\verbatim@@@| will call
+% |\verbatim@test| to check whether this |\end| is
+% part of |\end{verbatim}| and will terminate the environment
+% if this is the case.
+% Otherwise we continue as if nothing had happened.
+% So let's have a look at the definition of |\verbatim@|:
+% \changes{v1.1a}{1989/10/16}{Replaced \cs{verbatim@@@} by \cs{@nil}.}
+% \begin{macrocode}
+ \def\verbatim@#1~{\verbatim@@#1!end\@nil}%
+% \end{macrocode}
+% Note that the |!| character will have been replaced by a
+% |\| with category code $12$ (other) by the |\lowercase|
+% primitive governing this code before the definition of this
+% macro actually takes place.
+% That means that
+% it takes the line, puts |\end| (four character tokens)
+% and |\@nil| (one control sequence token) as a
+% delimiter behind it, and
+% then calls |\verbatim@@|.
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@}
+% |\verbatim@@| takes everything up to the next occurrence of
+% the four characters |\end| as its argument.
+% \begin{macrocode}
+ \def\verbatim@@#1!end{%
+% \end{macrocode}
+% That means: if they do not occur in the original line, then
+% argument |#1| is the
+% whole input line, and |\@nil| is the next token
+% to be processed.
+% However, if the four characters |\end| are part of the
+% original line, then
+% |#1| consists of the characters in front of |\end|,
+% and the next token is the following character (always remember
+% that the line was lengthened by five tokens).
+% Whatever |#1| may be, it is verbatim text,
+% so |#1| is added to the line currently built.
+% \begin{macrocode}
+ \verbatim@addtoline{#1}%
+% \end{macrocode}
+% The next token in the input stream
+% is of special interest to us.
+% Therefore |\futurelet| defines |\next| to be equal
+% to it before calling |\verbatim@@@|.
+% \begin{macrocode}
+ \futurelet\next\verbatim@@@}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@@}
+% \changes{v1.1a}{1989/10/16}{Replaced \cs{verbatim@@@} by
+% \cs{@nil} where used as delimiter.}
+% |\verbatim@@@| will now read the rest of the tokens on
+% the current line,
+% up to the final |\@nil| token.
+% \begin{macrocode}
+ \def\verbatim@@@#1\@nil{%
+% \end{macrocode}
+% If the first of the above two cases occurred, i.e.\ no
+% |\end| characters were on that line, |#1| is empty
+% and |\next| is equal to |\@nil|.
+% This is easily checked.
+% \begin{macrocode}
+ \ifx\next\@nil
+% \end{macrocode}
+% If so, this was a simple line.
+% We finish it by processing the line we accumulated so far.
+% Then we prepare to read the next line.
+% \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
+% \begin{macrocode}
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% Otherwise we have to check what follows these |\end|
+% tokens.
+% \begin{macrocode}
+ \else
+% \end{macrocode}
+% Before we continue, it's a good idea to stop for a moment
+% and remember where we are:
+% We have just read the four character tokens |\end|
+% and must now check whether the name of the environment (surrounded
+% by braces) follows.
+% To this end we define a macro called |\@tempa|
+% that reads exactly one character and decides what to do next.
+% This macro should do the following: skip spaces until
+% it encounters either a left brace or the end of the line.
+% But it is important to remember which characters are skipped.
+% The |\end|\meta{optional spaces}|{| characters
+% may be part of the verbatim text, i.e.\ these characters
+% must be printed.
+%
+% Assume for example that the current line contains
+% \begin{verbatim*}
+% \end {AVeryLongEnvironmentName}
+%\end{verbatim*}
+% As we shall soon see, the scanning mechanism implemented here
+% will not find out that this is text to be printed until
+% it has read the right brace.
+% Therefore we need a way to accumulate the characters read
+% so that we can reinsert them if necessary.
+% The token register |\@temptokena| is used for this purpose.
+%
+% Before we do this we have to get rid of the superfluous
+% |\end| tokens at the end of the line.
+% \changes{v1.4j}{1992/06/30}{Removed use of \cs{toks@}. Suggested by
+% Bernd Raichle.}
+% To this end we define a temporary macro whose argument
+% is delimited by |\end\@nil| (four character tokens
+% and one control sequence token) to be used below
+% on the rest of the line, after appending a |\@nil| token to it.
+% (Note that this token can never appear in |#1|.)
+% We use the following definition of
+% |\@tempa| to get the rest of the line (after the first
+% |\end|).
+% \begin{macrocode}
+ \def\@tempa##1!end\@nil{##1}%
+% \end{macrocode}
+% We mentioned already that we use token register
+% |\@temptokena|
+% to remember the characters we skip, in case we need them again.
+% We initialize this with the |\end| we have thrown away
+% in the call to |\@tempa|.
+% \begin{macrocode}
+ \@temptokena{!end}%
+% \end{macrocode}
+% We shall now call |\verbatim@test|
+% to process the characters
+% remaining on the current line.
+% But wait a moment: we cannot simply call this macro
+% since we have already read the whole line.
+% Therefore we have to first expand the macro |\@tempa| to insert
+% them again after the |\verbatim@test| token.
+% A |^^M| character is appended to denote the end of the line.
+% (Remember that this character comes disguised as a tilde.)
+% \changes{v1.2}{1989/10/20}{Taken local definition of \cs{@tempa} out
+% of \cs{verbatim@@@} and introduced
+% \cs{verbatim@test} instead.}
+% \begin{macrocode}
+ \def\next{\expandafter\verbatim@test\@tempa#1\@nil~}%
+% \end{macrocode}
+% That's almost all, but we still have to
+% now call |\next| to do the work.
+% \begin{macrocode}
+ \fi \next}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatim@test}
+% \changes{v1.2}{1989/10/20}{Introduced \cs{verbatim@test}.}
+% We define |\verbatim@test| to investigate every token
+% in turn.
+% \begin{macrocode}
+ \def\verbatim@test#1{%
+% \end{macrocode}
+% First of all we set |\next| equal to |\verbatim@test|
+% in case this macro must call itself recursively in order to
+% skip spaces.
+% \begin{macrocode}
+ \let\next\verbatim@test
+% \end{macrocode}
+% We have to distinguish four cases:
+% \begin{enumerate}
+% \item The next token is a |^^M|, i.e.\ we reached
+% the end of the line. That means that nothing
+% special was found.
+% Note that we use |\if| for the following
+% comparisons so that the category code of the
+% characters is irrelevant.
+% \begin{macrocode}
+ \if\noexpand#1\noexpand~%
+% \end{macrocode}
+% We add the characters accumulated in token register
+% |\@temptokena| to the current line. Since
+% |\verbatim@addtoline| does not expand its argument,
+% we have to do the expansion at this point. Then we
+% |\let| |\next| equal to |\verbatim@|
+% to prepare to read the next line.
+% \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
+% \begin{macrocode}
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena}%
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% \item A space character follows.
+% This is allowed, so we add it to |\@temptokena|
+% and continue.
+% \begin{macrocode}
+ \else \if\noexpand#1
+ \@temptokena\expandafter{\the\@temptokena#1}%
+% \end{macrocode}
+% \changes{v1.2f}{1990/01/31}{Code for TABs removed.}
+% \item An open brace follows.
+% This is the most interesting case.
+% We must now collect characters until we read the closing
+% brace and check whether they form the environment name.
+% This will be done by |\verbatim@testend|, so here
+% we let |\next| equal this macro.
+% Again we will process the rest of the line, character
+% by character.
+% \changes{v1.2}{1989/10/20}{Moved the initialization of
+% \cs{@tempc} from \cs{verbatim@testend} into
+% \cs{verbatim@test}.}
+% The characters forming the name of the environment will
+% be accumulated in |\@tempc|.
+% We initialize this macro to expand to nothing.
+% \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
+% \begin{macrocode}
+ \else \if\noexpand#1\noexpand[%
+ \let\@tempc\@empty
+ \let\next\verbatim@testend
+% \end{macrocode}
+% Note that the |[| character will be a |{| when
+% this macro is defined.
+% \item Any other character means that the |\end| was part
+% of the verbatim text.
+% Add the characters to the current line and prepare to call
+% |\verbatim@| to process the rest of the line.
+% \changes{v1.0f}{1989/10/09}{Fixed \cs{end} \cs{end} bug
+% found by Chris Rowley}
+% \begin{macrocode}
+ \else
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena}%
+ \def\next{\verbatim@#1}%
+ \fi\fi\fi
+% \end{macrocode}
+% \end{enumerate}
+% The last thing this macro does is to call |\next|
+% to continue processing.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@testend}
+% |\verbatim@testend| is called when
+% |\end|\meta{optional spaces}|{| was seen.
+% Its task is to scan everything up to the next |}|
+% and to call |\verbatim@@testend|.
+% If no |}| is found it must reinsert the characters it read
+% and return to |\verbatim@|.
+% The following definition is similar to that of
+% |\verbatim@test|:
+% it takes the next character and decides what to do.
+% \changes{v1.2}{1989/10/20}{Removed local definition of \cs{@tempa}
+% from \cs{verbatim@testend} which now
+% does the work itself.}
+% \begin{macrocode}
+ \def\verbatim@testend#1{%
+% \end{macrocode}
+% Again, we have four cases:
+% \begin{enumerate}
+% \item |^^M|: As no |}| is found in the current line,
+% add the characters to the buffer. To avoid a
+% complicated construction for expanding
+% |\@temptokena|
+% and |\@tempc| we do it in two steps. Then we
+% continue with |\verbatim@| to process the
+% next line.
+% \changes{v1.2f}{1990/01/31}{Added \cs{verbatim@startline}.}
+% \begin{macrocode}
+ \if\noexpand#1\noexpand~%
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc}%
+ \verbatim@processline
+ \verbatim@startline
+ \let\next\verbatim@
+% \end{macrocode}
+% \item |}|: Call |\verbatim@@testend| to check
+% if this is the right environment name.
+% \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
+% \begin{macrocode}
+ \else\if\noexpand#1\noexpand]%
+ \let\next\verbatim@@testend
+% \end{macrocode}
+% \changes{v1.0f}{1989/10/09}{Introduced check for
+% {\tt\string\verb!\string|!\string\!\string|} to fix
+% single brace bug found by Chris Rowley}
+% \item |\|: This character must not occur in the name of
+% an environment. Thus we stop collecting characters.
+% In principle, the same argument would apply to other
+% characters as well, e.g., |{|.
+% However, |\| is a special case, since it may be
+% the first character of |\end|. This means that
+% we have to look again for
+% |\end{|\meta{environment name}|}|.
+% Note that we prefixed the |!| by a |\noexpand|
+% primitive, to protect ourselves against it being an
+% active character.
+% \changes{v1.3b}{1990/02/07}{\cs{noexpand} added.}
+% \begin{macrocode}
+ \else\if\noexpand#1\noexpand!%
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc}%
+ \def\next{\verbatim@!}%
+% \end{macrocode}
+% \item Any other character: collect it and continue.
+% We cannot use |\edef| to define |\@tempc|
+% since its replacement text might contain active
+% character tokens.
+% \begin{macrocode}
+ \else \expandafter\def\expandafter\@tempc\expandafter
+ {\@tempc#1}\fi\fi\fi
+% \end{macrocode}
+% \end{enumerate}
+% As before, the macro ends by calling itself, to
+% process the next character if appropriate.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@@testend}
+% Unlike the previous macros |\verbatim@@testend| is simple:
+% it has only to check if the |\end{|\ldots|}|
+% matches the corresponding |\begin{|\ldots|}|.
+% \begin{macrocode}
+ \def\verbatim@@testend{%
+% \end{macrocode}
+% We use |\next| again to define the things that are
+% to be done.
+% Remember that the name of the current environment is
+% held in |\@currenvir|, the characters accumulated
+% by |\verbatim@testend| are in |\@tempc|.
+% So we simply compare these and prepare to execute
+% |\end{|\meta{current environment}|}|
+% macro if they match.
+% Before we do this we call |\verbatim@finish| to process
+% the last line.
+% We define |\next| via |\edef| so that
+% |\@currenvir| is replaced by its expansion.
+% Therefore we need |\noexpand| to inhibit the expansion
+% of |\end| at this point.
+% \begin{macrocode}
+ \ifx\@tempc\@currenvir
+ \verbatim@finish
+ \edef\next{\noexpand\end{\@currenvir}%
+% \end{macrocode}
+% Without this trick the |\end| command would not be able
+% to correctly check whether its argument matches the name of
+% the current environment and you'd get an
+% interesting \LaTeX{} error message such as:
+% \begin{verbatim}
+%! \begin{verbatim*} ended by \end{verbatim*}.
+%\end{verbatim}
+% But what do we do with the rest of the characters, those
+% that remain on that line?
+% We call |\verbatim@rescan| to take care of that.
+% Its first argument is the name of the environment just
+% ended, in case we need it again.
+% |\verbatim@rescan| takes the list of characters to be
+% reprocessed as its second argument.
+% (This token list was inserted after the current macro
+% by |\verbatim@@@|.)
+% Since we are still in an |\edef| we protect it
+% by means of|\noexpand|.
+% \begin{macrocode}
+ \noexpand\verbatim@rescan{\@currenvir}}%
+% \end{macrocode}
+% If the names do not match, we reinsert everything read up
+% to now and prepare to call |\verbatim@| to process
+% the rest of the line.
+% \begin{macrocode}
+ \else
+ \expandafter\verbatim@addtoline
+ \expandafter{\the\@temptokena[}%
+ \expandafter\verbatim@addtoline
+ \expandafter{\@tempc]}%
+ \let\next\verbatim@
+ \fi
+% \end{macrocode}
+% Finally we call |\next|.
+% \begin{macrocode}
+ \next}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@rescan}
+% In principle |\verbatim@rescan| could be used to
+% analyse the characters remaining after the |\end{...}|
+% command and pretend that these were read
+% ``properly'', assuming ``standard'' category codes are in
+% force.\footnote{Remember that they were all read with
+% category codes $11$ (letter) and $12$ (other) so
+% that control sequences are not recognized as such.}
+% But this is not always possible (when there are unmatched
+% curly braces in the rest of the line).
+% Besides, we think that this is not worth the effort:
+% After a \texttt{verbatim} or \texttt{verbatim*} environment
+% a new line in the output is begun anyway,
+% and an |\end{comment}| can easily be put on a line by itself.
+% So there is no reason why there should be any text here.
+% For the benefit of the user who did put something there
+% (a comment, perhaps)
+% we simply issue a warning and drop them.
+% The method of testing is explained in Appendix~D, p.\ 376 of
+% the \TeX{}book. We use |^^M| instead of the |!|
+% character used there
+% since this is a character that cannot appear in |#1|.
+% The two |\noexpand| primitives are necessary to avoid
+% expansion of active characters and macros.
+%
+% One extra subtlety should be noted here: remember that
+% the token list we are currently building will first be
+% processed by the |\lowercase| primitive before \TeX{}
+% carries out the definitions.
+% This means that the `|C|' character in the
+% argument to the |\@warning| macro must be protected against
+% being changed to `|c|'. That's the reason why we added the
+% |\lccode`\C=`\C| assignment above.
+% We can now finish the argument to |\lowercase| as well as the
+% group in which the category codes were changed.
+% \begin{macrocode}
+ \def\verbatim@rescan#1#2~{\if\noexpand~\noexpand#2~\else
+ \@warning{Characters dropped after `\string\end{#1}'}\fi}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{The \cs{verbatiminput} command}
+%
+% \begin{macro}{\verbatim@in@stream}
+% We begin by allocating an input stream (out of the 16 available
+% input streams).
+%\iffalse
+% Vorstellbar ist auch der Aufruf von |`verbatiminput| innerhalb eines
+% |`verbatiminput| (z.B: wenn man |`input|-Anweisungen im zu lesenden
+% File hat und auch diese Files automatisch lesen will). Dies kann
+% man jedoch nur ermoeglichen, wenn man einen besseren Mechanismus
+% verwendet als es das simple, statische |`newread| darstellt.
+% Vorstellbar fuer eine neuere \LaTeX-Version ist eine (lokale)
+% Allokation des Streams durch ein |`open| und eine Freigabe des
+% Streams durch |`close| oder Verlassen der Gruppe.
+%\fi
+% \begin{macrocode}
+\newread\verbatim@in@stream
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@readfile}
+% The macro |\verbatim@readfile| encloses the main loop by calls to
+% the macros |\verbatim@startline| and |\verbatim@finish|,
+% respectively. This makes sure
+% that the user can initialize and finish the command when the file
+% is empty or doesn't exist. The \texttt{verbatim} environment has a
+% similar behaviour when called with an empty text.
+% \begin{macrocode}
+\def\verbatim@readfile#1{%
+ \verbatim@startline
+% \end{macrocode}
+% When the file is not found we issue a warning.
+% \begin{macrocode}
+ \openin\verbatim@in@stream #1\relax
+ \ifeof\verbatim@in@stream
+ \typeout{No file #1.}%
+ \else
+% \end{macrocode}
+% At this point we pass the name of the file to |\@addtofilelist|
+% so that its appears appears in the output of a |\listfiles|
+% command.
+% \changes{v1.5j}{1996/09/25}{Add \cs{@addtofilelist} and
+% \cs{ProvidesFile} so that the name of the file
+% read in appears in the \cs{listfiles} output (Omission pointed
+% out by Patrick W.~Daly).}
+% In addition, we use |\ProvidesFile| to make a log entry in the
+% transcript file and to distinguish files read in via
+% |\verbatiminput| from others.
+% \begin{macrocode}
+ \@addtofilelist{#1}%
+ \ProvidesFile{#1}[(verbatim)]%
+% \end{macrocode}
+% While reading from the file it is useful to switch off the
+% recognition of the end-of-line character. This saves us stripping
+% off spaces from the contents of the line.
+% \begin{macrocode}
+ \expandafter\endlinechar\expandafter\m@ne
+ \expandafter\verbatim@read@file
+ \expandafter\endlinechar\the\endlinechar\relax
+ \closein\verbatim@in@stream
+ \fi
+ \verbatim@finish
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@read@file}
+% All the work is done in |\verbatim@read@file|. It reads the input
+% file line by line and recursively calls itself until the end of
+% the file.
+% \begin{macrocode}
+\def\verbatim@read@file{%
+ \read\verbatim@in@stream to\next
+ \ifeof\verbatim@in@stream
+ \else
+% \end{macrocode}
+% For each line we call |\verbatim@addtoline| with the contents of
+% the line. \hskip0pt plus 3cm\penalty0\hskip0pt plus -3cm
+% |\verbatim@processline| is called next.
+% \begin{macrocode}
+ \expandafter\verbatim@addtoline\expandafter{\next}%
+ \verbatim@processline
+% \end{macrocode}
+% After processing the line we call |\verbatim@startline| to
+% initialize all before we read the next line.
+% \begin{macrocode}
+ \verbatim@startline
+% \end{macrocode}
+% Without |\expandafter| each call of |\verbatim@read@file| uses
+% space in \TeX's input stack.\footnote{A standard \TeX\ would
+% report an overflow error if you try to read a file with more than
+% ca.\ 200~lines. The same error occurs if the first line of code
+% in \S 390 of \textsl{``TeX: The Program''\/} is missing.}
+% \begin{macrocode}
+ \expandafter\verbatim@read@file
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\verbatiminput}
+% |\verbatiminput| first starts a group to keep font and category
+% changes local.
+% Then it calls the macro |\verbatim@input| with additional
+% arguments, depending on whether an asterisk follows.
+% \begin{macrocode}
+\def\verbatiminput{\begingroup
+ \@ifstar{\verbatim@input\relax}%
+ {\verbatim@input{\frenchspacing\@vobeyspaces}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\verbatim@input}
+% \changes{1.5k}{1997/04/30}{Have \cs{verbatim@input} check for
+% existence of file.}
+% |\verbatim@input| first checks whether the file exists, using
+% the standard macro |\IfFileExists| which leaves the name of the
+% file found in |\@filef@und|.
+% Then everything is set up as in the |\verbatim| macro.
+% \begin{macrocode}
+\def\verbatim@input#1#2{%
+ \IfFileExists {#2}{\@verbatim #1\relax
+% \end{macrocode}
+% Then it reads in the file, finishes off the \texttt{trivlist}
+% environment started by |\@verbatim| and closes the group.
+% This restores everything to its normal settings.
+% \begin{macrocode}
+ \verbatim@readfile{\@filef@und}\endtrivlist\endgroup\@doendpe}%
+% \end{macrocode}
+% If the file is not found a more or less helpful message is
+% printed. The final |\endgroup| is needed to close the group
+% started in |\verbatiminput| above.
+% \begin{macrocode}
+ {\typeout {No file #2.}\endgroup}}
+%</package>
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{Getting verbatim text into arguments.}
+%
+% One way of achieving this is to define a macro (command) whose
+% expansion is the required verbatim text. This command can then be
+% used anywhere that the verbatim text is required. It can be used in
+% arguments, even moving ones, but it is fragile (at least, the
+% version here is).
+%
+% Here is some code which claims to provide this. It is a much revised
+% version of something I (Chris) did about 2 years ago. Maybe it needs
+% further revision.
+%
+% It is only intended as an extension to |\verb|, not to the
+% \texttt{verbatim} environment. It should therefore, perhaps, treat
+% line-ends similarly to whatever is best for |\verb|.
+%
+% \begin{macro}{\newverbtext}
+% This is the command to produce a new macro whose expansion is
+% verbatim text. This command itself cannot be used in arguments,
+% of course! It is used as follows:
+%
+% \begin{verbatim}
+% \newverbtext{\myverb}"^%{ &~_\}}@ #"
+% \end{verbatim}
+%
+% The rules for delimiting the verbatim text are the same as those for
+% |\verb|.
+%
+% \begin{macrocode}
+%<*verbtext>
+\def \newverbtext {%
+ \@ifstar {\@tempswatrue \@verbtext }{\@tempswafalse \@verbtext *}%
+}
+% \end{macrocode}
+% \end{macro}
+% I think that a temporary switch is safe here: if not, then
+% suitable |\let|s can be used.
+% \changes{v1.5i}{1996/06/04}{Moved processing of
+% \cs{verbatim@nolig@list} after \cs{dospecials}.}
+% \changes{v1.5p}{2001/03/12}{Added missing right brace in
+% definition of \cs{@verbtext} (PR 3314).}
+% \begin{macrocode}
+\def \@verbtext *#1#2{%
+ \begingroup
+ \let\do\@makeother \dospecials
+ \let\do\do@noligs \verbatim@nolig@list
+ \@vobeyspaces
+ \catcode`#2\active
+ \catcode`~\active
+ \lccode`\~`#2%
+ \lowercase
+% \end{macrocode}
+% We use a temporary macro here and a trick so that the definition of
+% the command itself can be done inside the group and be a local
+% definition (there may be better ways to achieve this).
+% \begin{macrocode}
+ {\def \@tempa ##1~%
+ {\whitespaces
+% \end{macrocode}
+% If these |\noexpand|s were |\noexpand\protect\noexpand|, would
+% this make these things robust?
+% \begin{macrocode}
+ \edef #1{\noexpand \@verbtextmcheck
+ \bgroup
+ \if@tempswa
+ \noexpand \visiblespaces
+ \fi
+ \noexpand \@verbtextsetup
+ ##1%
+ \egroup}%
+ }%
+ \expandafter\endgroup\@tempa
+ }
+}
+% \end{macrocode}
+% This sets up the correct type of group for the mode: it must not
+% be expanded at define time!
+% \begin{macrocode}
+\def \@verbtextmcheck {%
+ \relax\ifmmode
+ \hbox
+ \else
+ \leavevmode
+ \null
+ \fi
+}
+% \end{macrocode}
+% This contains other things which should not be expanded during the
+% definition.
+% \begin{macrocode}
+\def \@verbtextsetup {%
+ \frenchspacing
+ \verbatim@font
+ \verbtextstyle
+}
+% \end{macrocode}
+% The command |\verbtextstyle| is a document-level hook which can be
+% used to override the predefined typographic treatment of commands
+% defined with |\newverbtext| commands.
+%
+% |\visiblespaces| and |\whitespaces| are examples of possible values
+% of this hook.
+% \begin{macrocode}
+\let \verbtextstyle \relax
+\def \visiblespaces {\chardef \ 32\relax}
+\def \whitespaces {\let \ \@@space}
+\let \@@space \ %
+%</verbtext>
+% \end{macrocode}
+%
+%
+% \section{Testing the implementation}
+%
+% For testing the implementation and for demonstration we provide
+% an extra file. It can be extracted by using the conditional
+% `\textsf{testdriver}'. It uses a small input file called
+% `\texttt{verbtest.tst}' that is distributed separately.
+% Again, we use individual `+' guards.
+% \begin{macrocode}
+%<*testdriver>
+\documentclass{article}
+
+\usepackage{verbatim}
+
+\newenvironment{myverbatim}%
+ {\endgraf\noindent MYVERBATIM:\endgraf\verbatim}%
+ {\endverbatim}
+
+\makeatletter
+
+\newenvironment{verbatimlisting}[1]%
+ {\def\verbatim@startline{\input{#1}%
+ \def\verbatim@startline{\verbatim@line{}}%
+ \verbatim@startline}%
+ \verbatim}{\endverbatim}
+
+\newwrite\verbatim@out
+
+\newenvironment{verbatimwrite}[1]%
+ {\@bsphack
+ \immediate\openout \verbatim@out #1
+ \let\do\@makeother\dospecials\catcode`\^^M\active
+ \def\verbatim@processline{%
+ \immediate\write\verbatim@out{\the\verbatim@line}}%
+ \verbatim@start}%
+ {\immediate\closeout\verbatim@out\@esphack}
+
+\makeatother
+
+\addtolength{\textwidth}{30pt}
+
+\begin{document}
+
+\typeout{}
+\typeout{===> Expect ``characters dropped''
+ warning messages in this test! <====}
+\typeout{}
+
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin{verbatim}
+ test
+ \end{verbatim*}
+ test
+ \end{verbatim
+ test of ligatures: <`!`?`>
+ \endverbatim
+ test
+ \end verbatim
+ test
+ test of end of line:
+ \end
+ {verbatim}
+ \end{verbatim} Further text to be typeset: $\alpha$.
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin{verbatim*}
+ test
+ test
+ \end {verbatim*}
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin{verbatim*} bla bla
+ test
+ test
+ \end {verbatim*}
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+
+First of Chris Rowley's fiendish tests:
+\begin{verbatim}
+the double end test<text>
+\end\end{verbatim} or even \end \end{verbatim}
+%
+%not \end\ended??
+%\end{verbatim}
+
+Another of Chris' devils:
+\begin{verbatim}
+the single brace test<text>
+\end{not the end\end{verbatim}
+%
+%not \end}ed??
+%\end{verbatim}
+Back to my own tests:
+ \begin{myverbatim}
+ test
+ test
+ \end {myverbatim} rest of line
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+
+Test of empty verbatim:
+\begin{verbatim}
+\end{verbatim}
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin {verbatimlisting}{verbtest.tex}
+ Additional verbatim text
+ ...
+ \end{verbatimlisting}
+And here for listing a file:
+ \verbatiminput{verbtest.tex}
+And again, with explicit spaces:
+ \verbatiminput*{verbtest.tex}
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin{comment}
+ test
+ \end{verbatim*}
+ test
+ \end {comment
+ test
+ \endverbatim
+ test
+ \end verbatim
+ test
+ \end {comment} Further text to be typeset: $\alpha$.
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+ \begin{comment} bla bla
+ test
+ test
+ \end {comment}
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+Text Text Text Text Text Text Text Text Text Text Text
+
+\begin{verbatimwrite}{verbtest.txt}
+asfa<fa<df
+sdfsdfasd
+asdfa<fsa
+\end{verbatimwrite}
+
+\end{document}
+%</testdriver>
+% \end{macrocode}
+%
+%
+% \Finale
+%
+\endinput
+%%
diff --git a/macros/latex-dev/required/tools/verbatim.pdf b/macros/latex-dev/required/tools/verbatim.pdf
new file mode 100644
index 0000000000..14ed89c8ec
--- /dev/null
+++ b/macros/latex-dev/required/tools/verbatim.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xr.dtx b/macros/latex-dev/required/tools/xr.dtx
new file mode 100644
index 0000000000..417a98c1c1
--- /dev/null
+++ b/macros/latex-dev/required/tools/xr.dtx
@@ -0,0 +1,186 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: xr.dtx Copyright (C) 1993-2019 David Carlisle
+%
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{xr}
+%<package> [2019/07/22 v5.05 eXternal References (DPC)]
+%
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{xr}
+\GetFileInfo{xr.sty}
+\begin{document}
+\title{The \textsf{xr} package\thanks{This file
+ has version number \fileversion, last
+ revised \filedate.}}
+\author{David Carlisle\thanks{%
+ The Author of Versions 1--4 was Jean-Pierre Drucbert}}
+\date{\filedate}
+\MaintainedByLaTeXTeam{tools}
+\maketitle
+\DocInput{xr.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \changes{v5.00}{1993/07/07}
+% {First DPC version (by agreement with J-PD). New mechanism
+% (\cmd{\read} instead of \cmd\input).}
+%
+% \changes{v5.01}{1993/07/20}{Fix bug added by DPC, v5.00 did not import
+% aux files of \cmd\include'ed files. (Reported by J-PD)}
+%
+% \changes{v5.02}{1994/05/28}{Update for LaTeX2e}
+% \changes{v5.03}{2018/10/01}{Fix for conditionals in aux file}
+% \changes{v5.05}{2019/07/20}{include xcite}
+%
+%
+% This package implements a system for eXternal References.
+%
+% If one document needs to refer to sections of another, say |aaa.tex|,
+% then this package may be loaded in the main file, and the command\\
+% |\externaldocument{aaa}|\\
+% given in the preamble.
+%
+% Then you may use |\ref| and |\pageref| to refer to anything which has
+% been given a |\label| in either |aaa.tex| or the main document.
+% You may declare any number of such external documents.
+%
+% If any of the external documents, or the main document, use the same
+% |\label| then an error will occur as the label will be multiply
+% defined. To overcome this problem |\externaldocument| has an optional
+% argument. If you declare |\externaldocument[A-]{aaa}| Then all
+% references from |aaa| are prefixed by |A-|. So for instance, if a
+% section of |aaa| had |\label{intro}|, then this could be referenced
+% with |\ref{A-intro}|. The prefix need not be |A-|, it can be any
+% string chosen to ensure that all the labels imported from external
+% files are unique. Note however that if your style declares certain
+% active characters (|:| in French, |"| in German) then these
+% characters can not usually be used in |\label|, and similarly may not
+% be used in the optional argument to |\externaldocument|.
+%
+% As first suggested in Enrico Gregorio's |xcite| package, the current version
+% also allows |\cite| to reference |\bibitem| in the external document.
+% For fcompatibility with |xcite|, |\externalcitedocument| is made available
+% as an alias for |\externaldocument|
+%
+% \StopEventually{}
+%
+% \section{The macros}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% Check for the optional argument.
+% \begin{macrocode}
+\def\externaldocument{\@ifnextchar[\XR@{\XR@[]}}
+\let\externalcitedocument\externaldocument
+% \end{macrocode}
+%
+% Save the optional prefix. Start processing the first |aux| file.
+% \begin{macrocode}
+\def\XR@[#1]#2{{%
+ \makeatletter
+ \def\XR@prefix{#1}%
+ \XR@next#2.aux\relax\\}}
+% \end{macrocode}
+%
+% Process the next |aux| file in the list and remove it from the head of
+% the list of files to process.
+% \begin{macrocode}
+\def\XR@next#1\relax#2\\{%
+ \edef\XR@list{#2}%
+ \XR@loop{#1}}
+% \end{macrocode}
+%
+% Check whether the list of |aux| files is empty.
+% \begin{macrocode}
+\def\XR@aux{%
+ \ifx\XR@list\@empty\else\expandafter\XR@explist\fi}
+% \end{macrocode}
+%
+
+% Expand the list of aux files, and call |\XR@next| to process the first
+% one.
+% \begin{macrocode}
+\def\XR@explist{\expandafter\XR@next\XR@list\\}
+% \end{macrocode}
+%
+% If the |aux| file exists, loop through line by line, looking for
+% |\newlabel| and |\@input|. Otherwise process the next file in the
+% list.
+% \begin{macrocode}
+\def\XR@loop#1{\openin\@inputcheck#1\relax
+ \ifeof\@inputcheck
+ \PackageWarning{xr}{^^JNo file #1^^JLABELS NOT IMPORTED.^^J}%
+ \expandafter\XR@aux
+ \else
+ \PackageInfo{xr}{IMPORTING LABELS FROM #1}%
+ \expandafter\XR@read\fi}
+% \end{macrocode}
+%
+% Read the next line of the aux file.
+% \begin{macrocode}
+\def\XR@read{%
+ \read\@inputcheck to\XR@line
+% \end{macrocode}
+% The |...| make sure that |\XR@test| always has sufficient arguments.
+% \begin{macrocode}
+ \expandafter\XR@test\XR@line...\XR@}
+% \end{macrocode}
+%
+% Look at the first token of the line.
+% If it is |\newlabel|, do the |\newlabel|. If it is |\@input|, add the
+% filename to the list of files to process. Otherwise ignore.
+% Go around the loop if not at end of file. Finally process the next
+% file in the list.
+%
+% 2018 update: make sure the arguments are handled outside the |\ifx| test,
+% \begin{macrocode}
+\long\def\XR@test#1#2#3#4\XR@{%
+ \let\XR@tempa\@gobbletwo
+ \ifx#1\newlabel
+ \let\XR@tempa\@firstoftwo
+ \else\ifx#1\bibcite
+ \let\XR@tempa\@firstoftwo
+ \else\ifx#1\@input
+ \let\XR@tempa\@secondoftwo
+ \fi\fi\fi
+ \XR@tempa{#1{\XR@prefix#2}{#3}}{\edef\XR@list{\XR@list#2\relax}}%
+ \ifeof\@inputcheck\expandafter\XR@aux
+ \else\expandafter\XR@read\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
+%
+
diff --git a/macros/latex-dev/required/tools/xr.pdf b/macros/latex-dev/required/tools/xr.pdf
new file mode 100644
index 0000000000..c051173362
--- /dev/null
+++ b/macros/latex-dev/required/tools/xr.pdf
Binary files differ
diff --git a/macros/latex-dev/required/tools/xspace.dtx b/macros/latex-dev/required/tools/xspace.dtx
new file mode 100644
index 0000000000..0745caf507
--- /dev/null
+++ b/macros/latex-dev/required/tools/xspace.dtx
@@ -0,0 +1,507 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 1993-2019
+%
+% The LaTeX3 Project and any individual authors listed elsewhere
+% in this file.
+%
+% This file is part of the Standard LaTeX `Tools Bundle'.
+% -------------------------------------------------------
+%
+% It may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+% The list of all files belonging to the LaTeX `Tools Bundle' is
+% given in the file `manifest.txt'.
+%
+% \fi
+% \iffalse
+%% File: xspace.dtx Copyright (C) 1991-1997 David Carlisle
+%% File: xspace.dtx Copyright (C) 2004-2006 David Carlisle,
+%% Morten H\o gholm
+%
+%<*dtx>
+ \ProvidesFile{xspace.dtx}
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{xspace}
+%<driver>\ProvidesFile{xspace.drv}
+% \fi
+% \ProvidesFile{xspace.dtx}
+ [2014/10/28 v1.13 Space after command names (DPC,MH)]
+%
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\makeatletter
+\providecommand*\eTeX{{%
+ \if b\expandafter\@car\f@series\@nil\boldmath\fi$\m@th
+ \varepsilon$-\TeX}}
+\makeatother
+\usepackage{xspace}[2006/05/08]
+\begin{document}
+\DocInput{xspace.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{xspace.dtx}
+% \title{The \textsf{xspace} package\thanks{This file
+% has version number \fileversion, last
+% revised \filedate.}}
+% \author{David Carlisle \and Morten H\o gholm}
+% \date{\filedate}
+% \MaintainedByLaTeXTeam{tools}
+% \maketitle
+%
+% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+%
+% \changes{v1.00}{1991/08/30}{Initial version}
+% \changes{v1.01}{1992/06/26}{Re-issue for the new doc and docstrip}
+% \changes{v1.02}{1994/01/31}{Re-issue for LaTeX2e (no change to
+% code)}
+% \changes{v1.07}{2004/12/07}{Make extensible. tools/3712}
+% \changes{v1.07}{2004/12/07}{Fix active characters. tools/3747}
+% \changes{v1.07}{2004/12/07}{Update documentation}
+% \changes{v1.08}{2005/05/07}{Better fix for active characters}
+% \changes{v1.09}{2005/07/26}{Improve test by exiting if
+% \cs{@let@token} is a letter}
+% \changes{v1.10}{2005/10/04}{Use higher level functions for
+% conditional processing}
+% \changes{v1.10}{2005/10/04}{Improve expansion method}
+%
+% \begin{abstract}
+% |\xspace| should be used at the end of a macro designed to
+% be used mainly in text. It adds a space unless the macro is
+% followed by certain punctuation characters.
+% \end{abstract}
+%
+% \section{Introduction}
+% \newcommand{\gb}{Great Britain\xspace}\DescribeMacro{\xspace}
+% After defining |\newcommand{\gb}{Great Britain\xspace}|,
+% the command |\gb| will determine when to insert a space
+% after itself and when not. Thus the input
+% \begin{quote}
+% |\gb is a very nice place to live.\\| \\
+% |\gb, a small island off the coast of France.\\|\\
+% |\gb\footnote{The small island off the coast of France.}|\\
+% |is a very nice place to live.|
+% \end{quote}
+% results in the output
+% \begin{quote}
+% \gb is a very nice place to live. \\
+% \gb, a small island off the coast of France.\\
+% \gb\footnote{The small island off the coast of France.}
+% is a very nice place to live.
+% \end{quote}
+% |\xspace| saves the user from having to type \verb*+\ + or
+% |{}| after most occurrences of a macro name in text.
+% However if either of these constructions follows |\xspace|,
+% a space is not added by |\xspace|. This means that it is
+% safe to add |\xspace| to the end of an existing macro
+% without making too many changes in your document. In particular,
+% |\xspace| will always insert a space if the thing following it is
+% a normal letter which is the usual case.
+%
+% Sometimes |\xspace| may make the wrong decision, and add a
+% space when it is not required. There may be different
+% reasons for this behavior but it can always be handled by
+% following the macro with |{}|, as this has the effect of
+% suppressing the space.
+%
+%
+% \subsection{Adding new exceptions}
+%
+% One of the most common reasons for |\xspace| to add an
+% unwanted space is when it is followed by a macro not on its
+% list of exceptions.
+% \DescribeMacro{\xspaceaddexceptions}%
+% With |\xspaceaddexceptions| you can add new commands or
+% characters to be recognized by |\xspace|'s scanning
+% mechanism. Users of advanced footnote packages like
+% \textsf{manyfoot} will often define new footnote macros
+% that should not cause a command ``enhanced'' with |\xspace|
+% to insert a space. If you define the additional footnote
+% macros |\footnoteA| and |\footnoteB|, simply add the
+% following line to your preamble:
+% \begin{quote}
+% |\xspaceaddexceptions{\footnoteA \footnoteB}|
+% \end{quote}
+%
+%
+% \subsection{Support for active characters}
+%
+%
+% The other common instance of |\xspace| not working quite right
+% happens with active characters. Generally this package must be
+% loaded \emph{after} any language (or other) packages that make
+% punctuation characters `active'. This makes it difficult for
+% \textsf{xspace} to work flawlessly with the popular \textsf{babel}
+% package especially since the punctuation characters can switch
+% between being `active' and `other'. Starting at \textsf{xspace}
+% version~1.08 there are two different ways to handle this depending
+% on which engine your \LaTeX-format uses:
+% \begin{description}
+% \item[\TeX] The punctuation characters are added to the
+% exception list in both their normal and active states thus
+% ensuring that they are always recognized.
+% \item[\eTeX] The characters are re-read when going through
+% the exception list which means the internal comparison will test
+% against the current state of the character. This works for
+% whatever category code tricks some packages may use.
+% \end{description}
+%
+% At the time of writing all major \TeX\ distributions are using
+% \eTeX\ as engine for \LaTeX\ so usually everything should work out
+% of the box. If you find that you're running normal \TeX\ and
+% |\xspace| seems to be making the wrong choice then either use |{}|
+% as described above to fix it or add the character to the list but
+% with the desired category code. See the implementation for an example
+% of how to do that.
+%
+% \subsection{Still not satisfied?}
+%
+% Some people don't like the default list of exceptions so they can
+% remove one item at a time with the command
+% \DescribeMacro{\xspaceremoveexception}^^A
+% \cs{xspaceremoveexception}\marg{token}. Furthermore the command
+% \DescribeMacro{\@xspace@hook}\cs{@xspace@hook} can be redefined to
+% scan forward in the input stream in case you want to check more
+% tokens. It is called after \cs{xspace} has determined if it needed
+% to insert a space or if an exception was found (the default
+% definition is for \cs{@xspace@hook} to be empty). Hence you can use
+% \cs{unskip} to remove the space inserted if \cs{@let@token} matches
+% something special. Below is an example of how one can make sure an
+% endash gets a space inserted before it but a single dash not.
+% \begin{verbatim}
+% \xspaceremoveexception{-}
+% \makeatletter
+% \renewcommand*\@xspace@hook{%
+% \ifx\@let@token-%
+% \expandafter\@xspace@dash@i
+% \fi
+% }
+% \def\@xspace@dash@i-{\futurelet\@let@token\@xspace@dash@ii}
+% \def\@xspace@dash@ii{%
+% \ifx\@let@token-%
+% \else
+% \unskip
+% \fi
+% -%
+% }
+% \makeatother
+% \end{verbatim}
+%
+%
+% \StopEventually{}
+%
+% \section{The Macros}
+%
+% |\xspace| peeks ahead for the next token. If the token is in our
+% exception list we break the loop and do nothing; else we try to
+% expand the token once and start over again. If this leads us to an
+% unexpandable token without finding one of the exceptions we insert a
+% space.
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \begin{macro}{\xspace}
+% |\xspace| just looks ahead, and then calls |\@xspace|.
+% \changes{v1.03}{1994/11/15}{Make robust}
+% \begin{macrocode}
+\DeclareRobustCommand\xspace{\@xspace@firsttrue
+ \futurelet\@let@token\@xspace}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@xspace@first}
+% \changes{v1.11}{2006/02/12}{Added macro}
+% \begin{macro}{\@xspace@simple}
+% \changes{v1.11}{2006/02/12}{Added macro}
+% Some helpers to avoid multiple calls of |\@xspace@eTeX@setup|.
+% \begin{macrocode}
+\newif\if@xspace@first
+\def\@xspace@simple{\futurelet\@let@token\@xspace}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@xspace@exceptions@tlp}
+% \changes{v1.07}{2004/12/07}{Added macro}
+% The exception list. If the scanning mechanism finds one of
+% these, it won't insert a space after the command. The
+% \texttt{tlp} in the name means `token list pointer.'
+% \begin{macrocode}
+\def\@xspace@exceptions@tlp{%
+ ,.'/?;:!~-)\ \/\bgroup\egroup\@sptoken\space\@xobeysp
+ \footnote\footnotemark
+ \xspace@check@icr
+}
+% \end{macrocode}
+% And here we get the non-empty definition of \cs{check@icr}.
+% \changes{v1.13}{2009/10/20}{fix for "tools/3895": `text font commands fool xspace'}
+% \begin{macrocode}
+\begingroup
+ \text@command\relax
+ \global\let\xspace@check@icr\check@icr
+\endgroup
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xspaceaddexceptions}
+% \changes{v1.07}{2004/12/07}{Added macro}
+% The user command, which just adds tokens to the list.
+% \begin{macrocode}
+\newcommand*\xspaceaddexceptions{%
+ \g@addto@macro\@xspace@exceptions@tlp
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\xspaceremoveexception}
+% \changes{v1.10}{2005/10/04}{Use higher level functions for
+% conditional processing}
+% This command removes an exception globally.
+% \begin{macrocode}
+\newcommand*\xspaceremoveexception[1]{%
+% \end{macrocode}
+% First check that it is in the list at all.
+% \begin{macrocode}
+ \def\reserved@a##1#1##2##3\@@{%
+ \@xspace@if@q@nil@NF##2{%
+% \end{macrocode}
+% It's in the list, remove it.
+% \begin{macrocode}
+ \def\reserved@a####1#1####2\@@{%
+ \gdef\@xspace@exceptions@tlp{####1####2}}%
+ \expandafter\reserved@a\@xspace@exceptions@tlp\@@
+ }%
+ }%
+ \expandafter\reserved@a\@xspace@exceptions@tlp#1\@xspace@q@nil\@@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xspace@break@loop}
+% \changes{v1.08}{2005/04/28}{Added macro}
+% \changes{v1.10}{2005/10/04}{Use quark instead}
+% To stop the loop.
+% \begin{macrocode}
+\def\@xspace@break@loop#1\@nil{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xspace@hook}
+% \changes{v1.09}{2005/07/26}{Added macro}
+% A hook for users with special needs.
+% \begin{macrocode}
+\providecommand*\@xspace@hook{}
+% \end{macrocode}
+% \end{macro}
+%
+% Now we check if we're running \eTeX. We can't use \cs{@ifundefined}
+% as that will lock catcodes and we need to change some of those.
+% As there is a small risk that someone already set \cs{eTeXversion}
+% to \cs{relax} by accident we make sure we check for that case but
+% without setting it to \cs{relax} if it wasn't already.
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname eTeXversion\endcsname\relax
+% \end{macrocode}
+% If we are running normal \TeX\ we add the most common cases of active
+% punctuation characters. First we make them active.
+% \begin{macrocode}
+ \begingroup
+ \catcode`\;=\active \catcode`\:=\active
+ \catcode`\?=\active \catcode`\!=\active
+% \end{macrocode}
+% The \texttt{alltt} environment also makes |,|, |'|, and |-| active
+% so we add them as well.
+% \begin{macrocode}
+ \catcode`\,=\active \catcode`\'=\active \catcode`\-=\active
+ \xspaceaddexceptions{;:?!,'-}
+ \endgroup
+ \let\@xspace@eTeX@setup\relax
+% \end{macrocode}
+% \begin{macro}{\@xspace@eTeX@setup}
+% \changes{v1.10}{2005/10/04}{Added macro}
+% \changes{v1.12}{2006/05/08}{Bug fix for verbatim in output routine}
+% When we're running \eTeX, we have the advantage of \cs{scantokens}
+% which will rescan tokens with current catcodes. This little
+% expansion trick makes sure that the exception list is redefined to
+% itself but with the contents of it exposed to the current catcode
+% regime. That is why we must make sure the catcode of space is 10,
+% since we have a \verb*|\ | inside the list.
+% \begin{macrocode}
+\else
+ \def\@xspace@eTeX@setup{%
+ \begingroup
+ \everyeof{}%
+ \endlinechar=-1\relax
+ \catcode`\ =10\relax
+ \makeatletter
+% \end{macrocode}
+% We may also be so unfortunate that the re-reading of the list takes
+% place when the catcodes of |\|, |{| and |}| are ``other,'' e.g., if
+% it takes place in a header and the output routine was called in the
+% middle of a \texttt{verbatim} environment.
+% \begin{macrocode}
+ \catcode`\\\z@
+ \catcode`\{\@ne
+ \catcode`\}\tw@
+ \scantokens\expandafter{\expandafter\gdef
+ \expandafter\@xspace@exceptions@tlp
+ \expandafter{\@xspace@exceptions@tlp}}%
+ \endgroup
+ }
+\fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@xspace}
+% \changes{v1.03}{1994/11/15}{Add exclamation mark}
+% \changes{v1.04}{1996/05/17}{Add slash}
+% \changes{v1.05}{1996/12/06}{Add space for alltt etc. tools/2322}
+% \changes{v1.06}{1997/10/13}{Add normal space. tools/2632}
+% \changes{v1.07}{2004/12/07}{Now runs through a list of exceptions}
+% \changes{v1.07}{2004/12/07}{Added \cs{footnote} and
+% \cs{footnotemark}}
+% \changes{v1.08}{2005/05/07}{Use recursive loop instead of \cs{@tfor}}
+% \changes{v1.09}{2005/07/26}{Only check non-letters and add hook}
+% \changes{v1.10}{2005/10/04}{Use higher level functions for
+% conditional processing}
+% \changes{v1.10}{2005/10/04}{Improve expansion method}
+% If the next token is one of a specified list of characters,
+% do nothing, otherwise add a space. With version~1.07 the
+% approach was altered dramatically to run through the
+% exception list |\@xspace@exceptions@tlp| and check each
+% token one at a time.
+% \begin{macrocode}
+\def\@xspace{%
+% \end{macrocode}
+% Before we start checking the exception list it makes sense to
+% perform a quick check on the token in question. Most of the time
+% \cs{xspace} is used in regular text so \cs{@let@token} is set equal
+% to a letter. In that case there is no point in checking the list
+% because it will definitely not contain any tokens with catcode~11.
+%
+% You may wonder why there are special functions here instead of
+% simpler \cs{ifx} conditionals. The reason is that a)~this way we
+% don't have to add many, many \cs{expandafter}s to get the nesting
+% right and b)~we don't get into trouble when \cs{@let@token} has been
+% let equal to \cs{if} etc.
+% \begin{macrocode}
+ \@xspace@lettoken@if@letter@TF \space{%
+% \end{macrocode}
+% Otherwise we start testing after setting up a few things. If running
+% \eTeX{} we rescan the catcodes but only the first time around.
+% \begin{macrocode}
+ \if@xspace@first
+ \@xspace@firstfalse
+ \let\@xspace@maybespace\space
+ \@xspace@eTeX@setup
+ \fi
+ \expandafter\@xspace@check@token
+ \@xspace@exceptions@tlp\@xspace@q@nil\@nil
+% \end{macrocode}
+% If an exception was found \cs{@xspace@maybespace} is let to
+% \cs{relax} and we do nothing.
+% \begin{macrocode}
+ \@xspace@token@if@equal@NNT \space \@xspace@maybespace
+% \end{macrocode}
+% Otherwise we check to see if we found something expandable and try
+% again with that token one level expanded. If no expandable token is
+% found we insert a space and then execute the hook.
+% \begin{macrocode}
+ {%
+ \@xspace@lettoken@if@expandable@TF
+ {\expandafter\@xspace@simple}%
+ {\@xspace@maybespace\@xspace@hook}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xspace@check@token}
+% \changes{v1.07}{2004/12/07}{Added macro}
+% \changes{v1.08}{2005/05/07}{Made function recursive}
+% \changes{v1.10}{2005/10/04}{Use higher level functions for
+% conditional processing}
+% \changes{v1.11}{2006/02/12}{Modified so the \cs{@let@token} can be
+% \cs{outer}}
+% This macro just checks the current item in the exception list
+% against the \cs{@let@token}. If they are equal we make sure that no
+% space is inserted and break the loop.
+% \begin{macrocode}
+\def\@xspace@check@token #1{%
+ \ifx\@xspace@q@nil#1%
+ \expandafter\@xspace@break@loop
+ \fi
+ \expandafter\ifx\csname @let@token\endcsname#1%
+ \let\@xspace@maybespace\relax
+ \expandafter\@xspace@break@loop
+ \fi
+ \@xspace@check@token
+}
+% \end{macrocode}
+% \end{macro}
+%
+% That's all, folks! That is, if we were running \LaTeX3. In that case
+% we would have had nice functions for all the conditionals but here
+% we must define them ourselves. We also optimize them here as
+% \cs{@let@token} will always be the argument in some cases.
+%
+% \begin{macro}{\@xspace@if@lettoken@letter@TF}
+% \begin{macro}{\@xspace@if@lettoken@expandable@TF}
+% \begin{macro}{\@xspace@cs@if@equal@NNF}
+% First a few comparisons.
+% \begin{macrocode}
+\def\@xspace@lettoken@if@letter@TF{%
+ \ifcat\noexpand\@let@token @% letter
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi}
+\def\@xspace@lettoken@if@expandable@TF{%
+ \expandafter\ifx\noexpand\@let@token\@let@token%
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+\def\@xspace@token@if@equal@NNT#1#2{%
+ \ifx#1#2%
+ \expandafter\@firstofone
+ \else
+ \expandafter\@gobble
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@xspace@q@nil}
+% \begin{macro}{\@xspace@if@q@nil@NF}
+% Some macros dealing with quarks.
+% \begin{macrocode}
+\def\@xspace@q@nil{\@xspace@q@nil}
+\def\@xspace@if@q@nil@NF#1{%
+ \ifx\@xspace@q@nil#1%
+ \expandafter\@gobble
+ \else
+ \expandafter\@firstofone
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \Finale
diff --git a/macros/latex-dev/required/tools/xspace.pdf b/macros/latex-dev/required/tools/xspace.pdf
new file mode 100644
index 0000000000..bba3d6c5f4
--- /dev/null
+++ b/macros/latex-dev/required/tools/xspace.pdf
Binary files differ